在 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)中获得。
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
创建一个目录来保存私有 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安装在此服务器上。