掘金 后端 ( ) • 2024-04-16 18:01
  1. 使用Docker Hub分享镜像

  2. 搭建私有注册中心供内部使用

  3. 通过域名访问私有仓库

Docker注册中心(Docker Registry),它是Docker生态系统一个重要组件,负责存储和分发Docker镜像。Docker Registry分为为两种,为公共和私有类型:

  • Docker Hub:Docker官方提供的最大、最知名的公共注册中心,托管了官方和社区提供的Docker镜像。可以在这里搜索、下载镜像,也可以上传自己的镜像供他人使用。

  • 私有注册中心是企业搭建,也可以个人搭建,用于管理和分发内部私有的Docker镜像,不对外公开。私有注册中心的典型代表有:

    • Docker Registry本身提供的开源软件,可以直接部署在服务器上构建私有镜像仓库。

    • Harbor:由VMware公司开源的企业级Docker注册中心项目,提供了身份认证、权限管理、镜像复制、日志审计等一系列企业级功能。

创建了镜像,想分享给朋友,不知道怎么办。通过docker login命令可以登录注册中心。Docker注册中心可以帮你解决。使用docker login命令登录到注册中心,通过命令docker push推送镜像到注册中心,你的朋友就可以在任何有地方使用docker pull拉取镜像。

有些企业不想把镜像公开在互联网,或网络原因,通过网络拉取镜像太慢,可以搭建的Docker中心来解决。

1. 使用Docker Hub分享镜像

  • 注册Docker Hub账号

首先,访问https://hub.docker.com/,注册一个账号,点击右上角sign up,进入注册页面,输入Email(邮箱)、Username(用户名)、Password(密码),勾选Send me occasional product updates and announcements对话框,点击Sign up按钮。

接着,登录注册时填写的邮箱账号,docker注册成功,会向我们邮箱发送一封用于验证邮箱地址的邮件。打开邮件点击Verift Email Address用于验证邮箱属于你。

  • 登录Docker Hub账号

回到首页,点击右上角sign in,输入Username和Password点击按钮Countine登录。

点击页面右上角是邮箱,点击My Account->Security, 点击New Access Token按钮,设置一个token备注(Access Token Description),访问权限默认即可,根据实际情况设置。

接下来,点击Generate按钮,会帮我们生成一个token。窗口信息包含了介绍信息,使用说明,及我们的access token。把token保存起来,比如存到文本文件中。窗口关闭,token无法再查看到。

  • 推送镜像

假如我们注册时,Username是hello。

➜  ~ docker imagesREPOSITORY                                      TAG                       IMAGE ID       CREATED        SIZEhello-go                                        builder                   5a3c1fc3d461   3 days ago     18.1MB

我们本地有一个名称为hello-go:builder的镜像。

docker login -u hello  // hello 为注册时的用户名

使用docker login命令登录到Docker Hub,按照提示输入密码,返回Login Succeeded表示登录成功。密码为上面生成的token。

➜  ~ docker tag hello-go:builder hello/hello-go:builder

接着,给hello-go:builder打标签为hello/hello-go:builder

➜  ~ docker imagesREPOSITORY                                      TAG                       IMAGE ID       CREATED        SIZEhello/hello-go                            builder                   5a3c1fc3d461   3 days ago     18.1MBhello-go                                        builder                   5a3c1fc3d461   3 days ago     18.1MB

通过,docker images查看镜像,多了一个的镜像hello/hello-go:builder

➜  ~ docker push hello/hello-go:builderThe push refers to repository [docker.io/hello/hello-go]ff246f3a95bd: Pushed39e8dc02b56b: Pushedd4fc045c9e3a: Mounted from library/golangbuilder: digest: sha256:5912861727954fdb17fd73e85fa161112c29b5bc385bb8c0ac899f29ec8ead34 size: 945

运行docker push hello/hello-go:builder命令推送到Docker Hub注册中心。

至此,我们已经成功将镜像推送到Docker Hub注册中心中了。

  • 拉取Docker Hub中的镜像

像我们平时拉取镜像一样,使用docker pull命令即可。

➜  ~ docker pull hello/hello-go:builderbuilder: Pulling from hello/hello-goDigest: sha256:5912861727954fdb17fd73e85fa161112c29b5bc385bb8c0ac899f29ec8ead34Status: Downloaded newer image for hello/hello-go:builderdocker.io/hello/hello-go:builder

使用docker pull hello/hello-go:builder命令,就可以拉取到我们在Docker Hub中存储的镜像了。本地已经删除了本地的hello/hello-go:builder镜像。

2. 搭建私有注册中心供内部使用

Docker Hub中为我们提供了搭建自己的Docker Registry注册中心的镜像。使用命令docker pull registry就可以拉取到本地。

  • 启动私有Registry

docker run -d -p 5000:5000 --restart always --name registry registry:2

默认注册地址localhost:5000。接下来就可以像上面推送镜像到Docker Hub中一样。使用我们本地的注册中心了。

➜  ~ docker run -d -p 5000:5000 --restart always --name registry registry:2Unable to find image 'registry:2' locally2: Pulling from library/registry79e9f2f55bf5: Pull complete0d96da54f60b: Pull complete5b27040df4a2: Pull completee2ead8259a04: Pull complete3790aef225b9: Pull completeDigest: sha256:169211e20e2f2d5d115674681eb79d21a217b296b43374b8e39f97fcf866b375Status: Downloaded newer image for registry:2➜  ~ docker psCONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS         PORTS        NAMESa81bf2c80870   registry:2   "/entrypoint.sh /etc…"   4 minutes ago   Up 3 minutes   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   registry➜  ~ docker tag hello-go:builder localhost:5000/hello-go:builder➜  ~ docker push localhost:5000/hello-go:builderThe push refers to repository [localhost:5000/hello-go]ff246f3a95bd: Pushed39e8dc02b56b: Pushedd4fc045c9e3a: Pushedbuilder: digest: sha256:5912861727954fdb17fd73e85fa161112c29b5bc385bb8c0ac899f29ec8ead34 size: 945

docker run -d -p 5000:5000 --restart always --name registry registry:2命令启动本地注册中心。docker ps查看运行状态,可以看到已经启动成功了。

使用docker push localhost:5000/hello-go:builder打标签。

最后,使用docker push localhost:5000/hello-go:builder推送到我们本地的注册中心。推送和拉取同时用Docker Hub注册中心进行推送和拉取是一致的。

3. 通过域名访问私有仓库

为了方便和安全,可以配置Nginx作为反向代理,并使用HTTPS加密传输,这需要为域名配置SSL证书。将Nginx配置指向私有Registry服务的IP和端口,并正确设置相关代理头部。

使用nginx进行反向代理,并配置证书。

server {    listen 80;    listen [::]:80;    server_name hub.x.cn;        listen 443 ssl;    ssl_certificate /root/cert/hub.x.cn.crt;    ssl_certificate_key /root/cert/hub.x.cn.key;        location / {        proxy_pass http://192.168.31.23:5000;        proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        proxy_set_header X-Forwarded-Proto $scheme;    }}

以上是一个nginx示例配置。关于证书生成,推荐百度一下,资料贼多。

如果局域网内搭建,需要在Docker守护进程配置中加入insecure-registries选项,并重启Docker服务,使得客户端能信任此私有Registry的证书。修改/etc/docker/daemon.json

{    "insecure-registries": ["hub.x.cn"]}

重启docker,在系统运行systemctl restart docker。之后就可以使用域名推送到我们的私有仓库了。

这样,无论是公有还是私有环境,都可以有效地管理和分发Docker镜像。对于私有环境,通过域名访问不仅增加了便利性,也增强了安全性。

读完后,忍不住要加个关注!不是我吹,但你会后悔没关注的!