使用 Let's Encrypt SSL 在 CentOS 7 上运行 Docker 注册表使用 Let's Encrypt SSL 在 CentOS 7 上运行 Docker 注册表使用 Let's Encrypt SSL 在 CentOS 7 上运行 Docker 注册表使用 Let's Encrypt SSL 在 CentOS 7 上运行 Docker 注册表
  • 业务
  • 目标
  • 支持
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容

使用 Let's Encrypt SSL 在 CentOS 7 上运行 Docker 注册表

发表 admin at 2025年2月28日
类别
  • 未分类
标签

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

©2015-2025 Norria support@norria.com