在 Docker 主机上使用私有 Docker 注册中心(Docker Registry)

我们将私有 Docker 注册表添加到我们创建注册中心(Docker Registry)容器的同一个 Docker 主机 docker-01.onitroad.com 上。

将私有 Docker Registry 的 IP 地址添加到 Docker 主机的本地 DNS 解析器。

[root@docker-01 ~]# cat >> /etc/hosts << EOF
> 172.17.0.2 docker-registry.onitroad.com docker-registry
> EOF

在 Docker 主机上安装数字安全证书如下:

[root@docker-01 ~]# mkdir -p /etc/docker/certs.d/docker-registry.onitroad.com:5000
[root@docker-01 ~]# cp /opt/docker/containers/docker-registry/certs/docker-registry.crt /etc/docker/certs.d/docker-registry.onitroad.com:5000/ca.crt

从 Docker Hub 拉取镜像。
我们稍后会将此镜像推送到我们的私有 Docker 注册中心(Docker Registry)。

[root@docker-01 ~]# docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
697743189b6d: Pull complete
Digest: sha256:061ca9704a714ee3e8b80523ec720c64f6209ad3f97c0ff7cb9ec7d19f15149f
Status: Downloaded newer image for busybox:latest

为 busybox 镜像创建另一个标签,这样我们就可以将它推送到我们的私有 Docker 注册注册中心(Docker Registry)中。

[root@docker-01 ~]# docker tag busybox:latest docker-registry.onitroad.com:5000/busybox

使用 docker 命令登录到 docker-registry.onitroad.com。

[root@docker-01 ~]# docker login docker-registry.onitroad.com:5000
Username: docker_user
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded

将 busybox 镜像推送到私有 Docker 注册注册中心(Docker Registry)。

[root@docker-01 ~]# docker push docker-registry.onitroad.com:5000/busybox
The push refers to repository [docker-registry.onitroad.com:5000/busybox]
adab5d09ba79: Pushed
latest: digest: sha256:4415a904b1aca178c2450fd54928ab362825e863c0ad5452fd020e92f7a6a47e size: 527

列出本地可用的 busybox 图像。

[root@docker-01 ~]# docker images | grep busybox
busybox                                    latest              d8233ab899d4        3 weeks ago         1.2MB
docker-registry.onitroad.com:5000/busybox   latest              d8233ab899d4        3 weeks ago         1.2MB

我们可以看到 busybox 镜像可从两个不同的 Docker 注册中心(Docker Registry)中获得。

在 CentOS 7 上配置私有 Docker 注册中心(Registry)

Docker 从镜像创建容器。

这些镜像由 Docker Hub 提供,Docker Hub 是一个集中式公共登记中心,其中包含世界上几乎所有软件的许多官方和非官方镜像。

但是,在某些情况下,我们需要配置本地私有 Docker 注册表以在我们的组织单位之间创建和共享自定义 Docker 镜像。

与 Docker Hub 相比,私有 Docker Registry 有很多优势,其中一些是:

  • 由于 Docker Registry 位于本地,因此它提高了可用性和速度。
  • 组织的私有图像保存在组织内。
  • 提供用户身份验证以限制未经授权的访问。

在本文中,我们将在 CentOS 7 上为我们的本地 Docker 主机配置一个私有 Docker Registry。

为私有 Docker 注册中心(Docker Registry)配置 TLS

我们想通过用户身份验证来保护我们的私有 Docker 注册中心。
因此,我们需要首先配置 TLS(传输层安全)作为用户身份验证的准备工作。

如果我们已经为网络配置了证书颁发机构 (CA),那么我们可以生成证书签名请求 (CSR) 并让该 CA(证书颁发机构)签署 CSR。

但是,为了简单起见,我们将在本文中生成一个自签名证书并将其导入到 Docker 主机中。

登录到 Docker 主机。
并运行以下命令以生成自签名数字证书。

[root@docker-01 ~]# mkdir -p /opt/docker/containers/docker-registry/certs
[root@docker-01 ~]# openssl req 
> -newkey rsa:2048 \
> -nodes -sha256 \
> -x509 -days 365 \
> -keyout /opt/docker/containers/docker-registry/certs/docker-registry.key \
> -out /opt/docker/containers/docker-registry/certs/docker-registry.crt
Generating a 2048 bit RSA private key
........................................................................+++
........................+++
writing new private key to 'docker-registry.key'
----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
----
Country Name (2 letter code) [XX]:PK
State or Province Name (full name) []:Sindh
Locality Name (eg, city) [Default City]:Karachi
Organization Name (eg, company) [Default Company Ltd]:JackLi's SysAdmin Recipes
Organizational Unit Name (eg, section) []:ITLAB
Common Name (eg, your name or your server's hostname) []:docker-registry.onitroad.com
Email Address []:root@docker-01.onitroad.com

我们已经为我们的 Private Docker Registry 服务生成了一个自签名数字证书。
稍等片刻,稍后我们将在为我们的 Private Docker Registry 创建注册表容器时使用它。

为私有 Docker 登记中心 配置基本 HTTP 身份验证

我们创建一个目录,然后其中创建一个 passwd 文件。
我们将在 registry 容器上挂载此目录,为我们的 Private Docker Registry 实现基本的 HTTP 身份验证。

[root@docker-01 ~]# mkdir -p /opt/docker/containers/docker-registry/auth
[root@docker-01 ~]# docker run \
> --entrypoint htpasswd \
> registry -Bbn docker_user 123 > /opt/docker/containers/docker-registry/auth/htpasswd
https://onitroad.com 更多教程

创建一个目录来保存私有 Docker Registry数据

在 Docker 主机上创建一个目录。
我们将在注册表容器中挂载这个目录,它将保存与我们的私有 Docker 注册中心(Docker Registry)有关的所有数据。

[root@docker-01 ~]# mkdir /opt/docker/containers/docker-registry/registry

通过将此目录与注册中心(Docker Registry)的容器分离,我们可以轻松地将其与从注册中心(Docker Registry)的镜像派生的其他容器重用。
因此,如果我们移除我们的容器,它不会破坏我们私有 Docker Registry 中的数据。

在 CentOS 7 上创建私有 Docker Registry 容器

从 Docker Hub 拉取注册表镜像。

[root@docker-01 certs]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
c87736221ed0: Pull complete
1cc8e0bb44df: Pull complete
54d33bcb37f5: Pull complete
e8afc091c171: Pull complete
b4541f6d3db6: Pull complete
Digest: sha256:3b00e5438ebd8835bcfa7bf5246445a6b57b9a50473e89c02ecc8e575be3ebb5
Status: Downloaded newer image for registry:latest

为 Private Docker Registry 创建一个容器。

[root@docker-01 ~]# docker run -d \
> --name docker-registry \
> --restart=always \
> -p 5000:5000 \
> -v /opt/docker/containers/docker-registry/registry:/var/lib/registry \
> -v /opt/docker/containers/docker-registry/auth:/auth \
> -e "REGISTRY_AUTH=htpasswd" \
> -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
> -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
> -v /opt/docker/containers/docker-registry/certs:/certs \
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/docker-registry.crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/docker-registry.key \
> registry
c1bf649e8277bc39133ab40c6338b3f07ea88f30628bb91060f33b77b3aeee0c

配置环境

  • 主机名 - docker-01.onitroad.com
  • IP 地址 - 192.168.1.140/24
  • 操作系统 - CentOS 7.6
  • Docker 版本 - Docker CE 18

我们已经将Docker CE安装在此服务器上。

日期:2020-09-17 00:16:25 来源:oir作者:oir