项目总结:使用Docker迁移服务到离线服务器
1前言
最近遇到的这个场景,需要将之前开发的系统迁移到离线服务器。这个服务器有点烦人。用VPN连接后只能通过浏览器访问,而且速度很慢。遇到的陷阱有很多。本文记录迁移过程。
2 基本信息
本来这个系统很简单。后端界面采用Django编写,Vue+Echarts大屏,数据库使用Mysql和Redis作为缓存。这些在原来的服务器上都是用Docker部署的。
离线服务器是Centos7.9系统。虽然无法访问外网,但好在本地有 Yum 仓库。不幸的是,官方的Yum源很少,只能安装一些软件。
现在除了前端不需要迁移外,其他服务都需要迁移到这台离线服务器上。
迁移步骤:
- 在离线服务器上安装Docker
- 将容器镜像导出到原服务器
- 将镜像上传并导入到离线服务器
- 将各种Docker配置加载到离线服务器并启动容器
- 配置外围组件,如nginx
3 离线安装docker
前面说过,这台服务器有一个yum本地镜像,但是里面没有docker,所以需要下载RPM docker自己提供的安装包。
此地址: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..-1.el7 .x86_64
- docker-compose -plugin-2.18.1-1.el7.x86_64
然后将这些安装包上传到服务器
执行命令安装同样的安装命令后的文件,因为这些包是 .如果一一安装的话,可能会因为顺序问题而报错。
安装后启动Docker
sudo systemctl enable docker
sudo systemctl start docker
添加用户组也是安装Docker后的常规操作
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
然后就可以不用root用户运行docker命令了
4导出镜像❓两种镜像方式- Docker Export - 相当于 Docker Import 导入镜像
- Docker Save - 相当于 Docker Load 导入镜像
PS:这两个导出和导入命令是匹配的,不能混用
The前者主要使用的是由于创建了基础镜像,导出后没有历史记录和元数据,也没有入口点,所以无法直接执行。本次迁移服务采用的是存储方式。
操作命令
docker save <container_id> -o image.tar
还可以覆盖
docker save <container_id> > image.tar
添加两种方法的具体区别
- 文件大小不同。 “导出”导出的图像文件比“保存”保存的图像小,因为“保存”会导出所有图层。
- save可以将多张图片打包到一个文件中,但export不行。
- Export 根据从容器接收到的镜像导出(Import 导入)。重新导入时,镜像的所有历史记录和元数据信息都会丢失(即只保存了容器当时的快照状态),因此无法进行回滚操作
- 保存(加载)镜像,没有任何影响丢失镜像的历史记录,可以返回上一层(层)
应用场景差异
- Docker导出应用场景:主要用于制作基础镜像。比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件并进行一些设置,使用 docker export 保存为基础镜像。然后将这个镜像分发给其他人使用,比如作为基础开发环境。
- docker save应用场景:如果我们的应用是几个镜像的组合,用docker-compose.yml编排,但是我们要部署的客户端服务器无法连接外网。这时候可以使用 docker save 来打包需要的镜像,然后复制到客户端服务器并加载 docker load。
5 打包数据
在旧服务器上,使用Docker安装MySQL服务并映射数据。数据还必须迁移到新服务器。
MySQL Docker 卷配置
volumes:
- ./data:/var/lib/mysql
因为 VPN 带宽很低,所以这次使用 tar + bzip2 打包压缩
tar -cjvf ./data data.tar.bz2
命令参数说明:
-c 命令:-c 命令压缩存档(create)-j:使用bzip2压缩-v:显示压缩过程中的详细信息(详细)-f-f文件指定此参数无法跟踪带上其他参数
,然后将此data.tar.bz2上传到新服务器。
我也贴出解压命令
tar -xjvf data.tar.bz2
这个命令会在当前目录下生成data目录。
命令参数说明:
-x:表示解压(解压)- 其他参数同上
6 导入图片从dock导入后❀导出之前导入的docker load < image.tar
docker load < image.tar
,运行 docker images 看看导入是否成功
7 启动容器
上传原来的 docker-compose 配置来更新 djan 项目 去之前上传 代码直接构建后服务器,像这样
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
但是在离线服务器上,没有网络肯定没办法构建
所以我们得改构建.图片:镜像名称
顺利启动完成后~
8 配置外围组件
如果只提供一个接口,那没关系,安装nginx就可以了我们知道yum的默认源连nginx都没有,所以你得安装nginx如果所以,需要添加苹果发布源
sudo yum install epel-release
幸亏离线服务器本地源有这个东西
sudo yum update
sudo yum install nginx
完成了~
然后还是老套路,使用systemctl启动nginx,我就不重复了。
这个服务器非常繁琐。现在好了,需要测试一下,但是接口没有开放,ssh链接也跳过了好几层。看来我无法禁用 ssh 隧道转发并在本地测试它。
所以只能使用curl之类的工具来测试。
但这一次我采取了不同的方法,使用命令行浏览器来查看是否可以打开项目的网站。
分别尝试这两个:
- w3m
- lynx
网站打开成功,这两个浏览器的效果类似。
9 参考文献
- https://www.hangge.com/blog/cache/detail_2411.html
- https://www.cnblogs.com/52linux/archive/2012/03/074383。 html
- https://docs.docker.com/engine/install/centos/#install-from-a-package
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网