Ubuntu Docker容器迁移的完整流程
容器迁移是将Docker容器从一个Ubuntu主机迁移到另一个Ubuntu主机的过程,需确保容器状态、数据及网络配置的一致性。以下是两种主流迁移方案及详细步骤:
首先在源主机上停止目标容器(避免数据不一致),再将其文件系统导出为压缩包:
# 停止容器(替换<container_name>为实际容器名)
docker stop <container_name>
# 导出容器为tar文件(替换<container_name>和<export_file>)
docker export <container_name> > <export_file>.tar
说明:docker export会保存容器的文件系统快照,但不包含镜像历史或元数据(如环境变量、端口映射等)。
使用scp(或其他工具如rsync)将导出的tar文件复制到目标主机的指定目录:
# 替换<user>为目标主机用户名、<target_host>为目标主机IP、<path>为目标路径
scp <export_file>.tar <user>@<target_host>:<path>
在目标主机上导入tar文件为镜像,再启动容器:
# 导入tar文件为镜像(替换<import_file>和<image_name>)
cat <path>/<import_file>.tar | docker import - <image_name>
# 运行容器(替换<image_name>、<new_container_name>和<port>)
docker run -d --name <new_container_name> -p <host_port>:<container_port> <image_name>
说明:若需保留原容器的环境变量、端口映射等配置,可通过docker inspect <container_name>查看原配置,并在docker run时添加对应参数(如-e ENV_VAR=value、-p host_port:container_port)。
若容器包含数据卷(如MySQL的/var/lib/mysql、Nginx的/usr/share/nginx/html),需额外迁移数据卷以确保数据不丢失:
将容器保存为镜像(包含文件系统和元数据):
# 替换<container_id>(通过`docker ps -a`获取)和<image_name>
docker commit <container_id> <image_name>
# 导出镜像为tar文件
docker save -o <image_name>.tar <image_name>
# 传输到目标主机
scp <image_name>.tar <user>@<target_host>:<path>
# 导入镜像
docker load -i <path>/<image_name>.tar
# 查看镜像的数据卷信息(替换<image_name>)
docker inspect <image_name> | grep -i "mountpoint\|volume"
说明:Mountpoint字段显示容器数据卷的宿主机路径(如/var/lib/docker/volumes/...)。
将源主机的数据卷目录复制到目标主机的相同路径(需提前在目标主机创建对应目录):
# 复制数据卷(替换<volume_path>和<user>、<target_host>)
scp -r <volume_path> <user>@<target_host>:<target_volume_path>
# 运行容器时挂载数据卷(替换<image_name>、<new_container_name>、<volume_path>)
docker run -d --name <new_container_name> -v <target_volume_path>:/container/mount/point <image_name>
说明:-v参数将目标主机的数据卷目录挂载到容器的指定路径,确保数据一致性。
若需频繁迁移或跨多主机部署,建议使用容器编排工具(如Docker Swarm、Kubernetes)或镜像仓库(如Docker Hub、私有仓库):
# 标记镜像(替换<image_name>、<registry_url>)
docker tag <image_name> <registry_url>/<image_name>:<tag>
# 登录仓库(替换<user>、<password>)
docker login <registry_url> -u <user> -p <password>
# 推送镜像
docker push <registry_url>/<image_name>:<tag>
# 在目标主机拉取镜像
docker pull <registry_url>/<image_name>:<tag>
# 运行容器
docker run -d --name <new_container_name> <registry_url>/<image_name>:<tag>
docker swarm init
docker network create -d overlay my_overlay
docker service create --name my_service --network my_overlay --replicas 3 <image_name>
deployment.yaml文件(定义容器镜像、副本数、数据卷等):apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: <registry_url>/<image_name>:<tag>
volumeMounts:
- name: data-volume
mountPath: /container/mount/point
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: my-pvc
kubectl apply -f deployment.yaml
通过以上方案,可根据容器复杂度选择合适的迁移方式,实现Ubuntu主机间的Docker容器迁移。