使用Docker迁移服务到离线服务器的过程

2023-12-01 0 987
目录
  • 前言
  • 基本信息
  • 离线安装docker
  • 导出镜像
    • 补充一下这俩方式的具体区别
    • 应用场景区别
  • 打包数据
    • 导入镜像
      • 启动容器
        • 配置周边组件
          • 参考资料

            前言

            最近遇到的这个场景,需要把之前开发的一套系统迁移到一个离线的服务器上,这个服务器有点麻烦,接入VPN后通过堡垒机才能访问,速度也很慢,遇到不少坑,本文记录一下迁移过程。

            基本信息

            原本这套系统也挺简单的,Django 写的后端接口,搭配Vue+Echarts大屏,数据库用 Mysql 和 Redis 作为缓存,这些在原服务器上都是用 docker 部署的。

            这台离线的服务器是 Centos7.9 系统的,虽然不能访问外网,但还好有个本地的 yum 仓库,可惜 yum 官方源少得可怜,只能安装很有限的几个软件。

            现在除了前端不需要迁移之外,其他的服务都需要迁移到这个离线的服务器上。

            迁移步骤:

            • 在离线服务器上安装 docker
            • 在原服务器上导出容器镜像
            • 在离线服务器上传并导入镜像
            • 在离线服务器上传各种docker配置并启动容器
            • 配置周边组件,如 nginx

            离线安装docker

            前面说到这个服务器是有 yum 本地镜像的,但里面并没有 docker,所以需要自行下载 docker 的 RPM 安装包。

            在这个地址:https://download.docker.com/linux/centos/7/x86_64/stable/Packages/

            需要下载以下安装包(版本号本文撰写时的最新版,请读者自行下载当下的最新版本)

            • containerd.io-1.6.21-3.1.el7.x86_64
            • docker-buildx-plugin-0.10.5-1.el7.x86_64
            • docker-ce-24.0.2-1.el7.x86_64
            • docker-ce-cli-24.0.2-1.el7.x86_64
            • docker-ce-rootless-extras-24.0.2-1.el7.x86_64
            • docker-compose-plugin-2.18.1-1.el7.x86_64

            然后把这些安装包都上传到服务器

            执行命令安装

            sudo yum install containerd.io-1.6.21-3.1.el7.x86_64.rpm docker-ce-24.0.2-1.el7.x86_64.rpm # 以及其他…

            就是把全部文件都放在同一个 install 命令后面,因为这些包是有相互依赖要求的,如果一个个装的话可能会因为顺序问题报错。

            安装之后启动一下 docker

            sudo systemctl enable docker
            sudo systemctl start docker

            添加用户组啥的也属于安装 docker 后的常规操作了

            sudo groupadd docker
            sudo usermod -aG docker $USER
            newgrp docker

            之后就可以不使用 root 用户来执行 docker 命令了

            导出镜像

            导出镜像有两种方式

            • docker export – 对应 docker import 导入镜像
            • docker save – 对应 docker load 导入镜像

            PS:这俩的导出导入命令的匹配的,不能混用

            前者主要用于制作基础镜像,导出后是没有历史记录和元数据的,也没有 entrypoint 所以无法直接运行,这次迁移服务使用 save 方式。

            操作命令

            docker save <container_id> -o image.tar

            也可以重定向

            docker save <container_id> > image.tar

            补充一下这俩方式的具体区别

            • 文件大小不同,export 导出的镜像文件体积小于 save 保存的镜像,因为 save 会把所有 layer 都导出
            • save 可以把多个镜像打包到一个文件,export 不可以
            • export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作
            • save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)

            应用场景区别

            • docker export 的应用场景:主要用来制作基础镜像,比如我们从一个ubuntu镜像启动一个容器,然后安装一些软件和进行一些设置后,使用docker export保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
            • docker save 的应用场景:如果我们的应用是使用docker-compose.yml编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用docker save将用到的镜像打个包,然后拷贝到客户服务器上使用docker load载入。

            打包数据

            在旧的服务器上,使用了 docker 来部署 MySQL 服务,并且将 data 映射出来,需要把 data 也一并迁移到新的服务器上。

            MySQL docker 的 volumes 配置

            volumes:
            – ./data:/var/lib/mysql

            因为VPN带宽很低,这次使用 tar + bzip2 来打包压缩

            tar -cjvf ./data data.tar.bz2

            命令参数说明:

            • -c: 建立一个压缩档案的参数指令 (create)
            • -j: 使用 bzip2 压缩
            • -v: 压缩的过程中显示详情 (verbose)
            • -f: 指定文件名,这个参数后面就不能再带其他参数了

            然后将这个data.tar.bz2上传到新的服务器。

            解压命令我也贴一下

            tar -xjvf data.tar.bz2

            这个命令会在当前目录生成 data 目录。

            命令参数说明:

            • -x: 表示解压 (extract)
            • 其他的参数上面有了

            导入镜像

            把前面导出的 docker 镜像上传后,执行导入命令

            docker load &lt; image.tar

            之后执行docker images看看是否导入成功

            启动容器

            把原本的几个 docker-compose 配置上传

            之前为了方便更新,Django项目是上传代码之后在服务器直接 build,像这样

            version: \”3.6\”
            services:
            web:
            restart: always
            build: .
            environment:
            – ENVIRONMENT=docker
            – URL_PREFIX=demo/api
            – DEBUG=false
            – DEFAULT_DATABASE=mysql
            command: uwsgi uwsgi.ini
            volumes:
            – .:/code

            但在离线服务器上,没有网络肯定是没法 build 了

            所以要把build .改成image: 镜像名称

            搞定后顺利启动~

            配置周边组件

            只提供接口的话,也没啥啦,再安装个 nginx 就好

            然而众所周知 yum 的默认源连 nginx 都没有,要安装 nginx 的话还得添加 epel-release 源

            sudo yum install epel-release

            万幸,离线服务器的本地源有这个东西

            sudo yum update
            sudo yum install nginx

            搞定~

            然后还是老套路,用systemctl启动 nginx,不重复了。

            这个服务器很折腾的,既然搞定了,得测试一下,但是接口都不开放,ssh链接也是通过多层跳转的,好像没法开启 ssh-tunnel 转发在本地测试。

            所以只能用 curl 之类的工具来测试一下。

            不过我这次另辟蹊径,用命令行浏览器来试试能不能打开项目的网页。

            分别试了这俩:

            • w3m
            • lynx

            成功打开了网页,这俩浏览器的效果都差不多。

            参考资料

            • https://www.hangge.com/blog/cache/detail_2411.html
            • https://www.cnblogs.com/52linux/archive/2012/03/04/2379738.html
            • https://docs.docker.com/engine/install/centos/#install-from-a-package

            到此这篇关于使用Docker迁移服务到离线服务器的文章就介绍到这了,更多相关Docker迁移服务到离线服务器内容请搜索悠久资源网以前的文章或继续浏览下面的相关文章希望大家以后多多支持悠久资源网!

            收藏 (0) 打赏

            感谢您的支持,我会继续努力的!

            打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
            点赞 (0)

            悠久资源 Linux服务器 使用Docker迁移服务到离线服务器的过程 https://www.u-9.cn/server/linux/2557.html

            常见问题

            相关文章

            发表评论
            暂无评论
            官方客服团队

            为您解决烦忧 - 24小时在线 专业服务