Docker 201 - Deploy With Private Registry

docker

发布选型

Docker Image Build 好了,并且在本地 Run 起来木牛问题,如何发布到服务器端呢?

有以下选择:

  1. Docker Hub <hub.docker.com>
  2. 第三方 Hub
  3. Export & Import Images
  4. Private Registry

前两种,如果许可,当然是最好的,但网络和信任问题,无法选用。Export & Import 方案比较 Low,首先步骤特别繁琐,其次每次 Save 都会存储完整的 Image Layer。而无法选择增量导出,导出的文件特别大。

最终只能选定自建 Docker Registry。

Run Registry with Docker Way

这里说明下 Registry V1 有漏洞,列在已经被废弃了,V2 虽然仍叫这个名字,但其项目名已经改为了 Docker Distribution,在使用 Registry Docker Image 时,一定记得带上 Tag 为 2

1
2
3
4
5
6
$ docker run -d -p 5000:5000 --restart=always --name registry registry:2
# You can now use it with docker.
# To stop your registry, you would:
$ docker stop registry && docker rm -v registry

这时,Registry 理论上就跑起来了,可以通过 5000 端口来查看。

但 Docker 访问 Registry 限制了 HTTP 协议,必须使用 HTTPS 访问,也就是说这时候
Docker CLI 仍是无法使用的。可以通过设置 insecure-registry 的方式来跳过 SSL 进行交互,但测试下来很不方便,就跳过这种方式,接下来会用 Nginx 作为 Proxy 来添加 SSL 加密。

Nginx Proxy with SSL

通过上两篇的关于 CA 和 SSL Cert 的介绍,我们有网站的根证书,把其配置到 Nginx 中:

配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# nginx proxy to docker registry
upstream docker-registry {
server localhost:5000;
}
server {
listen 443 ssl;
server_name d2labs.cn;
# SSL
ssl on;
ssl_certificate /etc/nginx/ssl/d2labs.cn.crt;
ssl_certificate_key /etc/nginx/ssl/d2labs.cn.key;
# disable any limits to avoid HTTP 413 for large image uploads
client_max_body_size 0;
# required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486)
chunked_transfer_encoding on;
add_header Docker-Distribution-Api-Version registry/2.0 always;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Original-URI $request_uri;
proxy_set_header Docker-Distribution-Api-Version registry/2.0;
proxy_read_timeout 900;
location / {
# To add basic authentication to v2 use auth_basic setting plus add_header
proxy_pass http://docker-registry;
}
}

将配置文件 d2labs.cn.conf 放置到 /etc/nginx/sites-available,然后创建软连。

1
$ sudo ln -s /etc/nginx/sites-available/d2labs.cn.conf /etc/nginx/sites-enabled/d2labs.cn.conf

Restart Docker Service

记得一定要重启 Docker Service,不然仍会有关于 HTTPS 的错误。

1
$ sudo service docker restart

Testing

浏览打开,调用 Registry API,看到如下,就表示正确了:

同样,通过 Docker 命令行来进行操作,用来上传、下载制作好的 Images。

- Prepare

1
2
3
4
5
# Get any image from the hub
$ docker pull ubuntu
# Tag it to point to your registry
$ docker tag ubuntu d2labs.cn/ubuntu

- Push to Your Registry:

1
$ docker push d2labs.cn/ubuntu

- Pull from New Registry:

1
$ docker pull d2labs.cn/ubuntu

REF::

关于证书,参考: