如何在 Ubuntu 18.04 LTS 上设置私有 Docker 注册表
在此页
- 第 1 步 - 安装包依赖项
- 第 2 步 - 安装 Docker 和 Docker-compose
- 第 3 步 - 设置私有 Docker 注册表
- 第 4 步 - 测试
- 参考资料
Docker Registry 或 Registry 是一个开源且高度可扩展的服务器端应用程序,可用于存储和分发 Docker 镜像。它是 Docker Hub 背后的服务器端应用程序。在大多数用例中,如果您想在应用程序开发中实施 CI/CD 系统,Docker Registry 是一个很好的解决方案。 Private Docker Registry 通过将应用程序的所有自定义 Docker 映像集中在一个地方,为开发和生产周期提供更多性能。
在本教程中,我们将向您展示如何在 Ubuntu 18.04 服务器上安装和配置私有 Docker 注册表。我们将使用 Nginx 网络服务器并使用用户名和密码(基本身份验证)保护注册表。
先决条件
- Ubuntu 18.04 服务器
- 根权限
我们将要做什么?
- 安装依赖项
- 安装 Docker 和 Docker-compose
- 设置私有 Docker 注册表
- 测试
第 1 步 - 安装包依赖项
首先,我们要安装一些包依赖项来部署 Private Docker Registry。
使用以下命令安装包依赖项。
sudo apt install -y gnupg2 pass apache2-utils httpie
gnupg2 和 pass 包将用于将密码身份验证存储到 docker 注册表。 apache2-utils 将用于生成基本身份验证,httpie 将用于测试。
第 2 步 - 安装 Docker 和 Docker-compose
现在我们要从官方 Ubuntu 存储库安装 docker 和 docker-compose。
通过运行以下命令安装 Docker 和 Docker-compose。
sudo apt install -y docker.io docker-compose -y
安装完成后,启动docker服务并将其添加到开机时间。
sudo systemctl start docker
sudo systemctl enable docker
Docker 已启动并运行,Docker-compose 已安装。使用下面的命令检查。
docker version
docker-compose version
您将看到系统上安装的 Docker 和 Docker-compose 版本。

第 3 步 - 设置私有 Docker 注册表
在这一步中,我们将通过创建一些目录环境来配置 Docker Registry 环境,并创建一些配置,包括 docker-compose.yml、nginx 虚拟主机和其他配置等。
- 创建项目目录
为名为 registry 的项目创建一个新目录,并在其中创建 nginx 和 auth 目录。
mkdir -p registry/{nginx,auth}
之后,转到目录注册表并在 nginx 中再次创建新目录。
cd registry/
mkdir -p nginx/{conf.d/,ssl}
结果,项目目录如下图所示。
tree

- 创建 Docker-compose 脚本
现在我们要创建一个新的 docker-compose.yml 脚本来部署 Docker Registry。
进入registry目录,新建配置文件docker-compose.yml。
cd registry/
vim docker-compose.yml
首先,定义您要使用的组合版本和服务。
version: '3'
services:
之后,添加名为 registry 的第一个服务。 Docker Registry 服务将使用由 docker team registry:2 提供的 docker 镜像。它将挂载 docker 卷 registrydata 和名为 auth 的本地目录,其中包含基本身份验证文件 registry.passwd。最后,它将在名为 mynet 的自定义 docker 镜像上运行,并在容器和主机上公开端口 5000。
#Registry
registry:
image: registry:2
restart: always
ports:
- "5000:5000"
environment:
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry-Realm
REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.passwd
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
volumes:
- registrydata:/data
- ./auth:/auth
networks:
- mynet
接下来,nginx 服务的配置将运行 HTTP 和 HTTPS 端口并挂载本地目录 conf.d 用于虚拟主机配置,以及用于 ssl 证书的 ssl。
#Nginx Service
nginx:
image: nginx:alpine
container_name: nginx
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d/:/etc/nginx/conf.d/
- ./nginx/ssl/:/etc/nginx/ssl/
networks:
- mynet
最后,使用网桥驱动程序定义自定义网络 mynet,使用本地驱动程序定义注册表数据。
#Docker Networks
networks:
mynet:
driver: bridge
#Volumes
volumes:
registrydata:
driver: local
保存并关闭配置。
下面是完整的配置:
version: '3'
services:
#Registry
registry:
image: registry:2
restart: always
ports:
- "5000:5000"
environment:
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry-Realm
REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.passwd
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
volumes:
- registrydata:/data
- ./auth:/auth
networks:
- mynet
#Nginx Service
nginx:
image: nginx:alpine
container_name: nginx
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d/:/etc/nginx/conf.d/
- ./nginx/ssl/:/etc/nginx/ssl/
networks:
- mynet
#Docker Networks
networks:
mynet:
driver: bridge
#Volumes
volumes:
registrydata:
driver: local
- 配置 Nginx 虚拟主机
创建 docker-compose 脚本后,我们将为 nginx 服务创建虚拟主机和附加配置。
转到 nginx/conf.d/ 目录并创建一个名为 registry.conf 的新虚拟主机文件。
cd nginx/conf.d/
vim registry.conf
粘贴以下配置。
upstream docker-registry {
server registry:5000;
}
server {
listen 80;
server_name registry.hakase-labs.io;
return 301 https://registry.hakase-labs.io$request_uri;
}
server {
listen 443 ssl http2;
server_name registry.hakase-labs.io;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
# Log files for Debug
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
location / {
# Do not allow connections from docker 1.5 and earlier
# docker pre-1.6.0 did not properly set the user agent on ping, catch "Go *" user agents
if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) {
return 404;
}
proxy_pass http://docker-registry;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 900;
}
}
保存并关闭。
接下来,创建一个额外的配置来增加 nginx 上的 max_body_size。这将允许您上传最大大小为 2GB 的 docker 图像。
vim additional.conf
下面粘贴配置。
client_max_body_size 2G;
保存并关闭。
- 配置 SSL 证书和基本身份验证
将您域的 SSL 证书文件复制到 ssl 目录。
cp /path/to/ssl/fullchain.pem ssl/
cp /path/to/ssl/privkey.pem ssl/
现在转到 auth 目录并生成新的密码文件 registry.passwd。
cd auth/
为用户 hakase 生成新密码。
htpasswd -Bc registry.passwd hakase
TYPE THE STRONG PASSWORD

至此部署Private Docker Registry的环境搭建完成。
下面是我们环境文件和目录的截图。
tree

- 运行 Docker 注册表
使用下面的 docker-compose 命令运行 Docker Registry。
docker-compose up -d
你会得到如下结果。

之后,确保注册表和 nginx 服务已启动并正在运行。使用以下命令检查。
docker-compose ps
netstat -plntu
并且您将看到注册表服务在端口 5000 上运行,nginx 服务将公开 HTTP 和 HTTPS 端口,如下所示。

第 4 步 - 测试
在我们测试我们的私有 Docker 注册表之前,我们需要将 Root CA 证书添加到 docker 本身和系统中。
如果您使用 pem 文件证书,请使用 OpenSSL 命令将其导出到 .crt 文件。
openssl x509 -in rootCA.pem -inform PEM -out rootCA.crt
现在为 docker 证书创建一个新目录并将根 CA 证书复制到其中。
mkdir -p /etc/docker/certs.d/registry.hakase-labs.io/
cp rootCA.crt /etc/docker/certs.d/registry.hakase-labs.io/
然后创建一个新目录 /usr/share/ca-certificate/extra 并将 Root CA 证书复制到其中。
mkdir -p /usr/share/ca-certificates/extra/
cp rootCA.crt /usr/share/ca-certificates/extra/
之后,重新配置 ca-certificate 包并重启 Docker 服务。
dpkg-reconfigure ca-certificates
systemctl restart docker

- 下载 Docker 镜像
使用以下命令下载新的 Docker 映像。
docker pull ubuntu:16.04
完成后,使用以下命令标记私有注册表的映像。
docker image tag ubuntu:16.04 registry.hakase-labs.io/ubuntu16
再次检查系统上的 Docker 镜像列表,您将获得如下新镜像。
docker images

- 将图像推送到私有本地注册表
使用以下命令登录到私有 Docker 注册表。
docker login https://registry.hakase-labs.io/v2/
根据 registry.htpasswd 文件键入用户名和密码。
现在检查注册表中可用的 docker 镜像。
http -a hakase https://registry.hakase-labs.io/v2/_catalog
并且 Registry 上没有 docker 镜像。

现在将我们的自定义镜像推送到 Private Docker Registry。
docker push registry.hakase-labs.io/ubuntu16
再次检查并确保您在私有存储库中获得了 ubuntu16 docker 镜像。
http -a hakase https://registry.hakase-labs.io/v2/_catalog

最后,使用 Nginx 和基本身份验证的私有 Docker 注册表的安装和配置已成功完成。
参考
- https://linux教程/tutorial/how-to-create-docker-images-with-dockerfile/