Ubuntu 上 Docker 镜像共享的常用方式
- 离线导出导入 tar 包:用 docker save 导出为 .tar,通过 scp/rsync/USB 拷贝到目标机,再用 docker load 导入。适合无公网、跨网络或临时环境。
- 搭建本地私有仓库 Registry:在局域网一台主机运行 registry:2,其他主机 docker tag + docker push/pull 共享,适合团队与持续交付。
- 推送到公共或私有镜像仓库:如 Docker Hub、云厂商仓库或企业仓库,便于版本化分发与协作。
方式一 离线导出导入 tar 包
- 在源主机导出镜像
- 命令:docker save -o myapp.tar myapp:latest
- 说明:将镜像保存为 tar 归档,保留 仓库名:标签 与历史层信息。
- 拷贝到目标主机
- 命令:scp myapp.tar user@192.168.1.10:/tmp/(示例)
- 在目标主机导入
- 命令:docker load -i /tmp/myapp.tar
- 校验:docker images | grep myapp
- 补充
- 也可使用管道直接传输:docker save myapp:latest | ssh user@host docker load
- 若镜像较大,可用压缩流:docker save myapp:latest | gzip > myapp.tar.gz,目标机:gunzip -c myapp.tar.gz | docker load
- 以上流程适用于 Ubuntu 及其他 Linux 发行版,且 docker load 支持从 tar(含 gzip/bzip2/xz 压缩)归档恢复镜像与标签。
方式二 搭建本地私有仓库 Registry
- 在仓库主机 A(示例 IP 192.168.49.160)启动 Registry
- 命令:docker run -d -p 5000:5000 --restart=always --name registry registry:2
- 说明:默认数据目录为容器内 /var/lib/registry。
- 为镜像打标签(指向仓库主机)
- 命令:docker tag ubuntu:18.04 192.168.49.160:5000/ubuntu:18.04
- 推送与拉取
- 推送:docker push 192.168.49.160:5000/ubuntu:18.04
- 拉取:docker pull 192.168.49.160:5000/ubuntu:18.04
- 查看仓库内容
- 命令:curl http://192.168.49.160:5000/v2/_catalog
- 允许局域网其他主机访问(HTTP 场景)
- 在 A 与 B 的 /etc/docker/daemon.json 中加入:
- { “insecure-registries”: [“192.168.49.160:5000”] }
- 重启 Docker:sudo systemctl restart docker
- 说明
- 生产环境建议使用 HTTPS + 证书;内网测试可用上述 insecure-registries 配置。
方式三 推送到公共或云镜像仓库
- 登录仓库
- 命令:docker login(Docker Hub 或云厂商仓库,按提示输入账号密码/令牌)
- 规范命名并打标签
- Docker Hub:docker tag myapp:latest <你的用户名>/myapp:latest
- 云厂商(示例命名):docker tag myapp:latest .ocir.io///myapp:latest
- 推送与拉取
- 推送:docker push <你的用户名>/myapp:latest
- 拉取:docker pull <你的用户名>/myapp:latest
- 版本固定建议
- 使用 镜像摘要(Digest) 拉取,确保不可变:docker pull ubuntu@sha256:
常见问题与建议
- 镜像体积较大时,优先使用 gzip 压缩流 在导出/导入时减少传输时间与磁盘占用。
- 内网共享强烈建议用 私有 Registry,便于权限控制、审计与自动化流水线集成。
- 需要跨主机快速拷贝少量镜像时,使用 docker save | ssh docker load 可减少中间产物与步骤。
- 推送前统一 镜像命名规范 与 标签策略(如 latest 仅用于稳定版本),避免协作混乱。