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命令退出私有仓库

总结

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

相关推荐
ac.char1 分钟前
在 Ubuntu 下使用 Tauri 打包 EXE 应用
linux·运维·ubuntu
Youkiup28 分钟前
【linux 常用命令】
linux·运维·服务器
qq_2975046132 分钟前
【解决】Linux更新系统内核后Nvidia-smi has failed...
linux·运维·服务器
_oP_i37 分钟前
.NET Core 项目配置到 Jenkins
运维·jenkins·.netcore
weixin_437398211 小时前
Linux扩展——shell编程
linux·运维·服务器·bash
小燚~1 小时前
ubuntu开机进入initramfs状态
linux·运维·ubuntu
年薪丰厚1 小时前
如何在K8S集群中查看和操作Pod内的文件?
docker·云原生·容器·kubernetes·k8s·container
小林熬夜学编程1 小时前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
zhangj11251 小时前
K8S Ingress 服务配置步骤说明
云原生·容器·kubernetes
岁月变迁呀1 小时前
kubeadm搭建k8s集群
云原生·容器·kubernetes