Docker-镜像迁移的三种方式=>备份恢复&公有仓库&私有仓库

制作好的镜像要被别人使用,有三种方式:

1.先备份镜像,别人通过u盘或者其它方式拷贝后,再恢复镜像,这种方式比较麻烦

2.将制作的镜像上传到公共镜像仓库,被别人拉取后使用,但可能存在网络不通畅或者安全性问题

3.将制作的镜像上传到私有镜像仓库,被内部人员拉取后使用

下面我将介绍下这三种的具体操作步骤

文章目录

镜像备份,再恢复

镜像迁移涉及到两个步骤,备份和恢复。

我们可以将任何一个Docker镜像从一台机器迁移到另一台机器。在迁移的过程中,首先我们把容器构建为Docker镜像。然后,该Docker镜像被作为tar包文件保存到本地。此时只需要拷贝或移动该镜像到我们想要的机器上,恢复该镜像并运行容器即可

第一步:镜像备份

使用 docker save将指定的镜像保存成tar归档文件

docker save [OPTIONS] IMAGE [IMAGE...]

docker save -o /root/mycentos7.tar mycentos:7

-o:镜像打包后的归档文件输出的目录

第二步:镜像恢复

使用docker load导入docker save命令导出的镜像归档的文件

docker load [OPTIONS]

docker load -i mycentos7.tar

--input,-i:指定导入的文件

--quiet,-q:精简输出信息

公共仓库上传再拉取

注册docker hub仓库

登录https://hub.docker.com/signup上注册

创建仓库repository

注册登录后,点击repositories选项选择创建仓库

到创建仓库页面,主要输入仓库名称即可

待创建好以后到转到自己创建好的仓库内,里面已经为我们写好上传镜像的指令
docker push cyl01/test-cyl:tagname

上传镜像到仓库

我将本地的mysql5.7镜像添加到docker hub仓库内,我首先先登录docker hub

输入指令 sudo docker login

执行指令打标签sudo docker tag mysql:5.7 cyl01/test-cyl:1.0.0

标签打完后再上传 sudo docker push cyl01/test-cyl:1.0.0

验证上传的镜像

登录到docker hub上查看自己的repository,tags标签页下出现镜像1.0.0即上传成功

退出登录

通过docker logout命令退出DockerHub

私有仓库上传再拉取

DockerHub为我们提供了官方镜像和我们上传的镜像,我们可以下载机构或者个人提供的镜像,也可以上传我们的本地镜像,但缺点是

1.网络原因,从dockerHub下载和上传镜像速度比较慢

2.安全原因,我们不想被外部人员获取我们的代码和配置信息,只允许内部开发人员下载

为了解决以上问题,docker官方提供了registry的镜像用于搭建本地私有仓库使用。

拉取私有仓库镜像

输入指令docker pull registry 拉取registry镜像

修改配置

etc/docker/daemon.json添加以下内容,用于让docker 信任私有仓库地址,保存退出

shell 复制代码
{
 # 192.168.0.120私有仓库的ip地址,5000是端口号
 "insecure-registries":["192.168.0.120:5000"]
}

重新加载配置信息以及重启docker服务

shell 复制代码
# 重新加载某个服务的配置文件
sudo systemctl daemon-reload
# 重新启动docker
sudo systemctl restart docker

创建私有仓库的容器

输入sudo docker run -di --name registry -p 5000:5000 -v /cyl/docker/docker_registry:/var/lib/registry registry

在浏览器输入http://ip:5000/v2/_catalog,出现如下结果即创建成功

推送镜像到私有仓库

先给镜像设置标签 docker tag local-image:tagname new-repo:tagname

再将镜像推送到私有仓库 docker push new-repo:tagname

例如我要将mysql5.7的镜像推送私有仓库

shell 复制代码
# 打标签
sudo docker tag mysql:5.7 192.168.0.122:5000/mysql:1.0.0
# 推送
sudo docker push 192.168.0.122:5000/mysql:1.0.0

输入http://ip:5000/v2/_catalog,私有仓库下存在了mysql镜像

配置私有仓库认证

私有仓库搭建好了,但是要确保仓库的安全性,还需要一个安全认证证书,防止发生意想不到的事情。所以需要在搭建私有仓库的docker主机上生成自签名证书

创建证书存储目录

shell 复制代码
sudo mkdir -p /usr/local/registry/certs

生成自签名证书命令

shell 复制代码
sudo openssl req -newkey rsa:2048 -nodes -sha256 -keyout /usr/local/registry/certs/domain.key -x509 -days 365 -out /usr/local/registry/certs/domain.crt
  • openssl req:创建证书签名请求等功能;
    -newkey:创建 CSR 证书签名文件和 RSA 私钥文件;
    rsa:2048:指定创建的 RSA 私钥长度为 2048;
  • -nodes:对私钥不进行加密;
  • -sha256:使用 SHA256 算法;
  • -keyout:创建的私钥文件名称及位置;
  • -x509:自签发证书格式;
  • -days:证书有效期;
  • -out:指定 CSR 输出文件名称及位置;
    通过 openssl 先生成自签名证书,运行命令以后需要填写一些证书信息,里面最关键的部分是:Common Name (eg, your name or your server's hostname) []:192.168.0.122,这里填写的是私有仓库的地址。

生成鉴权文件

shell 复制代码
# 创建存储鉴权密码文件目录
sudo mkdir -p /usr/local/registry/auth
# 如果没有 htpasswd 功能需要安装 httpd
sudo yum install -y httpd
# 创建用户和密码,-c创建文件,-b使用命令行中的密码,而不是提示输入密码,-B强制bcrypt加密密码(非常安全)
# 第一次生成时使用-c参数创建用户及密码文件,下次再生成时无需使用-c参数会追加至文件
sudo htpasswd -cbB /usr/local/registry/auth/htpasswd root root

htpasswd 是 apache http 的基本认证文件,使用 htpasswd 命令可以生成用户及密码文件

创建私有仓库容器

shell 复制代码
docker run -di --name registry -p 5000:5000 \
   -v /mydata/docker_registry:/var/lib/registry \
   -v /usr/local/registry/certs:/certs \
   -v /usr/local/registry/auth:/auth \
   -e "REGISTRY_AUTH=htpasswd" \
   -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
   -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
   -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
   -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
   registry

验证是否添加认证成功

此时在浏览器中输入https:私有仓库地址:5000/v2/_catalog,需要输入用户名和密码,均为root

此时上传镜像时需要先登录,否则会出现no basic auth credentials异常

登录私有仓库

登录时使用指令sudo docker login -u root -p root ip:5000

注意必须指定私有仓库地址,否则默认登陆的是docker hub

上传镜像

登陆成功后,先打标签,再上传
sudo docker tag mysql:5.7 192.168.0.122:5000/mysql:1.0.0
sudo docker push 192.168.0.122:5000/mysql:1.0.0

登陆私有仓库现在有mysql这个镜像了

登出私有仓库

通过docker logout命令退出私有仓库

总结

本文主要讲解了镜像迁移的三种方式,镜像的备份和恢复不好管理且不利于合作开发,公共镜像仓库方式由于有网络和安全方面问题,企业级项目一般不使用,通常企业内一般会自己设置私有仓库,安全且上传或下载的速度也比较快。不过使用私有仓库时也需要进行安全认证,防止意想不到的事情发生

相关推荐
Lary_Rock3 分钟前
Android 编译问题 prebuilts/clang/host/linux-x86
android·linux·运维
绵绵细雨中的乡音16 分钟前
Linux进程学习【基本认知】
linux·运维·学习
matrixlzp27 分钟前
K8S Service 原理、案例
云原生·容器·kubernetes
GnixAij1 小时前
Docker SSH端口转发
docker·ssh
珹洺1 小时前
Linux操作系统从入门到实战(三)Linux基础指令(上)
linux·运维·服务器
剁椒排骨1 小时前
win11什么都不动之后一段时间黑屏桌面无法显示,但鼠标仍可移动,得要熄屏之后才能进入的四种解决方法
运维·windows·经验分享·计算机外设·win11·win10
angushine2 小时前
让Docker端口映射受Firewall管理而非iptables
运维·docker·容器
归寻太乙2 小时前
Linux环境变量
linux·运维·服务器
m0Java门徒2 小时前
面向对象编程核心:封装、继承、多态与 static 关键字深度解析
java·运维·开发语言·intellij-idea·idea
Sapphire~2 小时前
Linux-06 ubuntu 系统截图软件使用简单记录
linux·运维·ubuntu