- 使用Docker Hub分享镜像
- 搭建私有注册中心供内部使用
- 通过域名访问私有仓库
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 images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-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 images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello/hello-go builder 5a3c1fc3d461 3 days ago 18.1MB
hello-go builder 5a3c1fc3d461 3 days ago 18.1MB
通过,docker images
查看镜像,多了一个的镜像hello/hello-go:builder
➜ ~ docker push hello/hello-go:builder
The push refers to repository [docker.io/hello/hello-go]
ff246f3a95bd: Pushed
39e8dc02b56b: Pushed
d4fc045c9e3a: Mounted from library/golang
builder: digest: sha256:5912861727954fdb17fd73e85fa161112c29b5bc385bb8c0ac899f29ec8ead34 size: 945
运行docker push hello/hello-go:builder
命令推送到Docker Hub注册中心。
至此,我们已经成功将镜像推送到Docker Hub注册中心中了。
- 拉取Docker Hub中的镜像
像我们平时拉取镜像一样,使用docker pull
命令即可。
➜ ~ docker pull hello/hello-go:builder
builder: Pulling from hello/hello-go
Digest: sha256:5912861727954fdb17fd73e85fa161112c29b5bc385bb8c0ac899f29ec8ead34
Status: Downloaded newer image for hello/hello-go:builder
docker.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:2
Unable to find image 'registry:2' locally
2: Pulling from library/registry
79e9f2f55bf5: Pull complete
0d96da54f60b: Pull complete
5b27040df4a2: Pull complete
e2ead8259a04: Pull complete
3790aef225b9: Pull complete
Digest: sha256:169211e20e2f2d5d115674681eb79d21a217b296b43374b8e39f97fcf866b375
Status: Downloaded newer image for registry:2
➜ ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
a81bf2c80870 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:builder
The push refers to repository [localhost:5000/hello-go]
ff246f3a95bd: Pushed
39e8dc02b56b: Pushed
d4fc045c9e3a: Pushed
builder: 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镜像。对于私有环境,通过域名访问不仅增加了便利性,也增强了安全性。
读完后,忍不住要加个关注!不是我吹,但你会后悔没关注的!