在使用 K8S 和 Docker 进行快速 CI/CD 的过程中我们需要提交 Docker 镜像. 在公有云上, 我们可以使用阿里云镜像服务. 但本地开发和测试环境, 如果使用阿里云等公有云服务, 在速度和流量费用方面都需要考虑, 因此少不了私有化部署. 常见的私有化方案有2种:
- Docker Registry. 当前最新版本为 Registry 2. 提供核心的仓库服务, 但无节面. 适合开发和测试环境, 以及小团队使用.
- Harbor. Habor 是由VMWare公司开源的容器镜像仓库。事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制,支持 Helm charts, AD/LDAP 集成以及审计日志等。因此, 对于比较大的组织, 或者需要在正式环境使用, 甚至二次开发或对外进行服务, 那么推荐使用Harbor.
一. Docker Registry 安装和启动
Registry 直接使用 docker 安装即可, 需暴露一个端口, 以及将镜像存储的路径 map 到 host 持久化.使用以下命令进行安装:
docker pull registry:2.6.1
docker run -d -p 5000:5000 -v /data2/docker-registry/registry:/tmp/registry --restart=always daocloud.io/registry:2.6.1
如果使用使用国内 DaoCloud镜像, 可将上面的 registry:2.6.1
替换为 daocloud.io/registry:2.6.1
.
完整的 docker-compose.yaml
示例如下:
dockerregistry:
image: registry:2.6.1
privileged: false
restart: always
ports:
- 5000:5000
volumes:
- /data2/docker-registry/registry:/tmp/registry
二. 访问 Registry
2.1 配置本地 docker 允许访问非安全 (http) 服务
在 docker 所在机器编辑 (如没有, 可以新建) /etc/docker/daemon.json
(假设为 Linux 系统):
{
"insecure-registries" : ["ttg12:5000"]
}
2.2 提交一个镜像(image)
现在示例把 registry:2.6.1
这个镜像打上私有仓库的标签, 并且提交:
docker tag registry:2.6.1 ttg12:5000/registry:2.6.1
docker push ttg12:5000/registry:2.6.1
输出类似如下:
The push refers to repository [ttg12:5000/registry]
423c48d36423: Pushed
cec8f96b3c39: Pushed
25acfcbca8c9: Pushed
05d392f56700: Pushed
2b0fb280b60d: Pushed
2.6.1: digest: sha256:988247ab20a6b83e57039bea439c37fa3f3b728e9f8aa720bbc381f24ec78db3 size: 1364
三. 增加自签 ssl 证书
3.1 生成自签证书
我们假设域名为 registry.faceless.com
, 指向 IP 为 Docker Registry 所在 host ttg12
的 IP 192.168.31.12
.
利用上面博文给出的脚本生成通配符自签证书 *.faceless.com
:
$ ls ~/.ssh/certs:/certs
-rwxr-xr-x 1 faceless staff 1008 Jul 14 21:06 gencrt.sh
-rw-r--r-- 1 faceless staff 883 Jul 14 21:06 star.faceless.com.crt
-rw-r--r-- 1 faceless staff 668 Jul 14 21:06 star.faceless.com.csr
-rw-r--r-- 1 faceless staff 887 Jul 14 21:06 star.faceless.com.key
-rw-r--r-- 1 faceless staff 963 Jul 14 21:06 star.faceless.com.origin.key
3.2 用自签证书启动 Registry
参考 Run an externally-accessible registry 🔗
mkdir -p certs
docker container stop registry
docker run -d \
--restart=always \
--name dockerregistry \
-v "$(HOME)"/.ssh/certs:/certs \
-e REGISTRY_HTTP_ADDR=0.0.0.0:5443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/star.faceless.com.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/star.faceless.com.key \
-p 443:443 \
registry:2.6.1
完整的 docker-compose.yml
如下:
dockerregistry:
image: registry:2.6.1
privileged: false
restart: always
ports:
- 5443:443
- 5000:5000
volumes:
- /home/faceless/.ssh/certs:/certs
- /data2/docker-registry/registry:/tmp/registry
environment:
- REGISTRY_HTTP_TLS_KEY=/certs/star.faceless.com.key
- REGISTRY_HTTP_ADDR=0.0.0.0:443
- REGISTRY_HTTP_TLS_CERTIFICATE=/certs/star.faceless.com.crt
3.3 访问使用自签证书的 Registry
参考 Use self-signed certificates.
现在在主机 ttg12
上来验证一下, push 一个镜像到注册中心. 首先需要将上面生成的证书star.faceless.com.crt
复制并重名到本主机 /etc/docker/certs.d/registry.faceless.com:5443/ca.crt
. :
# 复制证书到 /etc/docker/certs.d/registry.faceless.com:5443/ca.crt
faceless@ttg12:~/.ssh/certs$ sudo mkdir -p /etc/docker/certs.d/registry.faceless.com:5443/
faceless@ttg12:~/.ssh/certs$ sudo cp star.faceless.com.crt /etc/docker/certs.d/registry.faceless.com:5443/ca.crt
# 先 tag 然后 push 一个镜像到注册中心
faceless@ttg12:~/.ssh/certs$ docker tag nginx:alpine registry.faceless.com:5443/nginx:alpine
faceless@ttg12:~/.ssh/certs$ docker push registry.faceless.com:5443/nginx:alpine
The push refers to repository [registry.faceless.com:5443/nginx]
a181cbf898a0: Pushed
570fc47f2558: Pushed
5d17421f1571: Pushed
7bb2a9d37337: Pushed
3e207b409db3: Pushed
alpine: digest: sha256:ee5a9b68e8d4a4b8b48318ff08ad5489bd1ce52b357bf48c511968a302bc347b size: 1360
现在再从另外一台主机 ttg13
上访问注册中心, 同样需要先将上面生成的证书star.faceless.com.crt
传输到 ttg13
并复制到本主机 /etc/docker/certs.d/registry.faceless.com:5443/ca.crt
.
faceless@ttg13:~$ sudo docker pull registry.faceless.com:5443/nginx:alpine
alpine: Pulling from nginx
cbdbe7a5bc2a: Pull complete
10c113fb0c77: Pull complete
9ba64393807b: Pull complete
262f9908119d: Pull complete
c4a057508f96: Pull complete
Digest: sha256:ee5a9b68e8d4a4b8b48318ff08ad5489bd1ce52b357bf48c511968a302bc347b
Status: Downloaded newer image for registry.faceless.com:5443/nginx:alpine
registry.faceless.com:5443/nginx:alpine
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。