使用 Let's Encrypt SSL 在 CentOS 7 上运行 Docker 注册表
Docker 注册表是一个存储和内容交付系统,它保存命名的 Docker 映像,有不同的标记版本。使用 Docker 的用户通过使用 docker push 和 docker pull 命令与注册表进行交互。有时,将 Docker 镜像存储在本地注册表中而不是将其推送到 Docker hub 是有意义的。在本指南中,我们将在 CentOS 7 上设置私有 Docker 注册表,并使用 Let’s Encrypt SSL 证书进行保护。
您将为大型团队节省大量带宽,并保证您不想向公众公开的图像的安全。在 CentOS 7 上创建本地 docker 注册表只需执行以下几个步骤。有关在不同发行版上安装 Docker 的信息,请参阅如何在 Linux 系统上安装 Docker CE。
步骤1:在CentOS 7上安装Docker CE
我们将使用registry 2 Docker镜像在CentOS 7上创建Dockerregistry的运行实例。
更新您的 CentOS 7 系统:
sudo yum -y update
运行以下命令在 CentOS 7 上安装 Docker CE。
sudo curl -o /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
然后安装 Docker CE 包:
sudo yum -y install docker-ce docker-ce-cli containerd.io
如果您想以非 root 用户身份使用 Docker,您现在应该考虑将您的用户添加到“docker”组:
sudo usermod -aG docker $USER
newgrp docker
运行以下命令查看已安装的 docker 版本。
$ docker --version
Docker version 24.0.2, build cb74dfc
启动并启用 docker 服务:
sudo systemctl enable --now docker
状态应为正在运行:
$ systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2023-06-28 15:24:38 UTC; 3s ago
Docs: https://docs.docker.com
Main PID: 1690 (dockerd)
Tasks: 8
Memory: 30.0M
CGroup: /system.slice/docker.service
└─1690 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Jun 28 15:24:38 cent7.mylab.io systemd[1]: Starting Docker Application Container Engine...
Jun 28 15:24:38 cent7.mylab.io dockerd[1690]: time="2023-06-28T15:24:38.443444615Z" level=info msg="Starting up"
Jun 28 15:24:38 cent7.mylab.io dockerd[1690]: time="2023-06-28T15:24:38.483135985Z" level=info msg="Loading containers: start."
Jun 28 15:24:38 cent7.mylab.io dockerd[1690]: time="2023-06-28T15:24:38.768228458Z" level=info msg="Loading containers: done."
Jun 28 15:24:38 cent7.mylab.io dockerd[1690]: time="2023-06-28T15:24:38.794003159Z" level=warning msg="WARNING: bridge-nf-call-iptables is disabled"
Jun 28 15:24:38 cent7.mylab.io dockerd[1690]: time="2023-06-28T15:24:38.794040821Z" level=warning msg="WARNING: bridge-nf-call-ip6tables is disabled"
Jun 28 15:24:38 cent7.mylab.io dockerd[1690]: time="2023-06-28T15:24:38.794087923Z" level=info msg="Docker daemon" commit=659604f graphdriver=overlay2 version=24.0.2
Jun 28 15:24:38 cent7.mylab.io dockerd[1690]: time="2023-06-28T15:24:38.794320719Z" level=info msg="Daemon has completed initialization"
Jun 28 15:24:38 cent7.mylab.io systemd[1]: Started Docker Application Container Engine.
Jun 28 15:24:38 cent7.mylab.io dockerd[1690]: time="2023-06-28T15:24:38.840934454Z" level=info msg="API listen on /run/docker.sock"
第 2 步:生成 Let’s Encrypt SSL 证书
正如之前所承诺的,我们将使用 Let’s Encrypt SSL 证书来保护在 CentOS 7 上运行的 Docker 注册表设置。
安装certbot
工具,该工具将用于请求 Let's Encrypt 证书。
sudo yum -y install epel-release
sudo yum -y install certbot
SSL 证书请求:
export DOMAIN="registry.domain.com"
export EMAIL="[email "
certbot certonly --standalone -d $DOMAIN --preferred-challenges http --agree-tos -n -m $EMAIL --keep-until-expiring
预期证书生成输出:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for registry.computingforgeeks.com
Waiting for verification...
Cleaning up challenges
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/registry.computingforgeeks.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/registry.computingforgeeks.com/privkey.pem
Your cert will expire on 2021-07-28. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
您的证书将保存在 /etc/letsencrypt/live/
下
/etc/letsencrypt/live/registry.domain.com/fullchain.pem
/etc/letsencrypt/live/registry.domain.com/privkey.pem
在哪里 :
- fullchain.pem ⇒ 组合文件
cert.pem
和chain.pem
- chain.pem ⇒ 中级证书
- cert.pem ⇒ SSL 服务器证书(包括公钥)
- privkey.pem ⇒ 私钥文件
步骤 3:在 CentOS 7 上运行 Docker 注册表
您可以使用 SSL 或不使用 SSL 来运行 dockerregistry。我们将演示如何使用任一方法运行 Docker 注册表。
但首先,创建一个用于保存 Docker 注册表映像的目录:
sudo mkdir /var/lib/docker/registry
在没有 SSL 的情况下运行本地 Docker 注册表
docker run -d -p 5000:5000 \
--name docker-registry \
--restart=always \
-v /var/lib/docker/registry:/var/lib/registry \
registry:2
使用 SSL 运行本地 Docker 注册表
在主机上创建目录并放置证书:
export DOMAIN="registry.domain.com"
mkdir /certs
sudo cp /etc/letsencrypt/live/$DOMAIN/fullchain.pem /certs/fullchain.pem
sudo cp /etc/letsencrypt/live/$DOMAIN/privkey.pem /certs/privkey.pem
sudo cp /etc/letsencrypt/live/$DOMAIN/cert.pem /certs/cert.pem
创建 Docker 注册表容器:
docker run -d --name docker-registry --restart=always \
-p 5000:5000 \
-e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain.pem \
-e REGISTRY_HTTP_TLS_KEY=/certs/privkey.pem \
-v /certs:/certs \
-v /var/lib/docker/registry:/var/lib/registry \
registry:2
将 registry.domain.com
替换为您的注册表子域名。
如果不存在,它将下载registry:2 docker镜像并创建一个容器
Unable to find image 'registry:2' locally
2: Pulling from library/registry
ddad3d7c1e96: Pull complete
6eda6749503f: Pull complete
363ab70c2143: Pull complete
5b94580856e6: Pull complete
12008541203a: Pull complete
Digest: sha256:bac2d7050dc4826516650267fe7dc6627e9e11ad653daca0641437abdf18df27
Status: Downloaded newer image for registry:2
ed960bd27529be26e7ef728027844a62b0731b08bafdbbf63dea328dac46e024
检查容器状态:
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ed960bd27529 registry:2 "/entrypoint.sh /etc…" 28 seconds ago Up 27 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp docker-registry
要将镜像推送到Registry Container服务器,请进行如下设置:
$ curl https://$DOMAIN:5000/v2/_catalog
{"repositories":[]}
如果启用了 SELinux,则使用端口 5000 时可能会遇到问题,如果遇到问题,请考虑禁用 SELinux 或将其置于宽松模式。
如果firewalld已启用并正在运行,请允许防火墙上的端口。
sudo firewall-cmd --add-port=5000/tcp --permanent
sudo firewall-cmd --reload
步骤 4:将不安全注册表添加到 Docker 引擎
默认情况下,docker 使用https 连接到 docker 注册表。但在某些情况下,可能会使用不安全的注册表,尤其是当您位于受信任的网络上时。这消除了对供内部使用的 CA 签名证书或在所有 Docker 节点中信任自签名证书的需要。以下是将不安全注册表添加到 Docker 引擎的步骤。
对于 Ubuntu Xenial,编辑 /etc/docker/daemon.json 并更新密钥“insecure-registries”。例如
{
"insecure-registries" : ["registry.domain.com:5000"]
}
对于 CentOS 7,编辑文件 /etc/docker/daemon.json,例如
{
"insecure-registries" : ["registry.domain.com:5000"]
}
对于 Ubuntu trusty,编辑文件/etc/default/docker并更新DOCKER_OPTS,例如
DOCKER_OPTS='--insecure-registry registry.domain.com:5000'
然后重启Docker引擎
sudo systemctl restart docker
步骤5:将Docker镜像推送到本地registry
现在注册表已准备就绪,您可以开始将 docker 映像推送到其中。如果您没有活动的 DNS 服务器,请使用/etc/hosts文件将主机名映射到 IP 地址。
$ sudo vim /etc/hosts
192.168.1.23 registry.domain.com
我将从 Docker hub 下载 ubuntu 最新的 docker 镜像,并将其推送到我的本地 Docker 注册表。
$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
345e3491a907: Pull complete
57671312ef6f: Pull complete
5e9250ddb7d0: Pull complete
Digest: sha256:cf31af331f38d1d7158470e095b132acd126a7180a54f263d386da88eb681d93
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
将映像标记为 registry.domain.com:5000/ubuntu。这将为现有图像创建一个附加标签。当标签的第一部分是主机名和端口时,Docker 在推送时将其解释为注册表的位置。
docker tag ubuntu $DOMAIN:5000/ubuntu
将映像推送到运行于 registry.domain.com:5000/ubuntu 的本地注册表
$ docker push $DOMAIN:5000/ubuntu
Using default tag: latest
The push refers to repository [registry.domain.com:5000/ubuntu]
2f140462f3bc: Pushed
63c99163f472: Pushed
ccdbb80308cc: Pushed
latest: digest: sha256:86ac87f73641c920fb42cc9612d4fb57b5626b56ea2a19b894d0673fd5b4f2e9 size: 943
如果图像上传成功,您应该在最后获得sha256 哈希值。推送的镜像存储在/var/lib/registry/docker/registry/v2/repositories目录下。
$ ls /var/lib/docker/registry/docker/registry/v2/repositories/
ubuntu
这与您用于推送自定义 docker 镜像的方法相同。要在本地注册表上下载 docker 映像,请使用以下命令:
$ docker pull registry-hostname:500/image:tag
#E.g
$ docker pull registry.domain.com:5000/ubuntu
在我的下一篇指南中,我将介绍如何配置 nginx 代理以通过 https 访问存储库。
您还可以查看安装 Docker UI 管理器 – Portainer