本地以两个 Ubuntu Server 22.04.1 虚拟机为例,分别为 A、B,并将 A 中的 hello-world 镜像迁移到 B 的 Docker 中。
环境准备
克隆两个虚拟机,分别设置 IP 为 192.168.137.151
和 192.168.137.152
:
# 修改网络配置文件
$ sudo vim /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
ethernets:
ens33:
# IP
addresses:
- 192.168.137.151/24
# 过期的网关配置
# gateway4: 192.168.137.2
# 网关
routes:
- to: default
via: 192.168.137.2
# DNS
nameservers:
addresses:
- 114.114.114.114
- 8.8.8.8
search: []
version: 2
# 更新网络配置
$ sudo netplan apply
然后安装 Docker 和镜像、容器:
# 安装依赖
$ sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# 安装 GPG 证书
$ curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 添加软件源仓库
$ sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# 安装 docker
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
# 将当前用户添加到 docker 组中,后续运行就无需 sudo 开头
$ sudo gpasswd -a username docker
# 更新 docker 用户组
$ newgrp docker
# A 服务器:运行 hello-world(会自动 pull 并 run)
$ sudo docker run hello-world
Hello from Docker!
……
容器迁移
A 服务器
# 查看所有容器
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc1ca561603c hello-world "/hello" 2 hours ago Exited (0) 2 hours ago busy_haibt
# 提交容器变更,并将其保存为镜像
$ docker commit fc1ca561603c bakimage
sha256:de196a3e36e29bdfbe374250986713c6a109d1865592a9b6bd0747e01ea4ace0
# 将镜像保存为 tar 文件
$ docker save bakimage > /tmp/bakimage.tar
# 将 tar 文件移动到 B 服务器中,可使用 FTP、SCP 等
$ scp /tmp/bakimage.tar username@192.168.137.152:/tmp
# 安装查看容器启动命令的软件
$ pip install runlike
# 将 pip 安装目录添加到环境变量
$ export PATH="$HOME/.local/bin:$PATH"
# 查看容器的启动命令
$ runlike -p fc1ca561603c
docker run \
--name=busy_haibt \
--hostname=fc1ca561603c \
--env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
--restart=no \
--runtime=runc \
hello-world \
/hello
B 服务器
# 加载镜像
$ docker load < /tmp/bakimage.tar
# 查看导入的镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
bakimage latest c2c30d20bf60 1 minutes ago 13.3kB
# 重命名镜像
$ docker tag c2c30d20bf60 hello-world
# 删除多余的镜像
$ docker rmi bakimage
# 按照 A 服务器中此容器的启动命令来启动即可,如果有 --volume 的话,需要将 A 服务器中对应的目录也拷贝过来
$ docker run \
--name=busy_haibt \
--hostname=fc1ca561603c \
--env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
--restart=no \
--runtime=runc \
hello-world \
/hello
Hello from Docker!
……
评论区