1. 本地操作:将镜像打包为压缩文件
# 查看本地镜像列表
docker images
# 打包指定镜像(替换 your_image:tag 为实际镜像名称和标签)
docker save your_image:tag | gzip > my_image.tar.gz
- 示例:
docker save nginx:latest | gzip > nginx.tar.gz
2. 传输压缩包到服务器
使用 scp
命令传输(确保服务器已开启 SSH):
scp my_image.tar.gz user@server_ip:/目标路径/
user
:服务器用户名server_ip
:服务器 IP 地址/目标路径/
:服务器存放目录(如~/
或/tmp/
)
3. 服务器操作:加载镜像并运行容器
(1) 登录服务器
ssh user@server_ip
(2) 加载 Docker 镜像
# 解压并加载镜像
gunzip -c my_image.tar.gz | docker load
# 验证镜像是否加载成功
docker images
(3) 运行容器
# 根据镜像启动容器(按需添加参数)
docker run -d --name my_container \
-p 8080:80 \ # 端口映射
-v /host/data:/data \ # 卷挂载(可选)
your_image:tag # 加载的镜像名
- 关键参数:
-d
:后台运行-p 宿主机端口:容器端口
:端口映射-v 宿主机目录:容器目录
:数据持久化
完整流程示例
# 本地打包并传输
docker save nginx:latest | gzip > nginx.tar.gz
scp nginx.tar.gz ubuntu@192.168.1.100:/tmp/
# 服务器操作
ssh ubuntu@192.168.1.100
gunzip -c /tmp/nginx.tar.gz | docker load
docker run -d --name my_nginx -p 8080:80 nginx:latest
常见问题解决
权限不足:
- 在
docker
命令前加sudo
- 将用户加入
docker
组:sudo usermod -aG docker $USER
- 在
端口冲突:
- 检查服务器端口占用:
ss -tuln | grep 8080
- 修改
-p
参数(如-p 8081:80
)
- 检查服务器端口占用:
镜像加载失败:
- 检查文件完整性:
gunzip -t my_image.tar.gz
- 重新传输压缩包
- 检查文件完整性:
替代方案(更高效)
直接通过 SSH 传输镜像(无需压缩文件)
# 本地直接推送镜像到服务器
docker save your_image:tag | ssh user@server_ip "docker load"
使用容器仓库(推荐生产环境使用)
# 1. 推送镜像到 Docker Hub
docker tag your_image:tag username/repo:tag
docker push username/repo:tag
# 2. 在服务器拉取镜像
ssh user@server_ip "docker pull username/repo:tag"