本教程适用于以下操作系统版本

  • Ubuntu 22.04(Jammy Jellyfish)
  • Ubuntu 17.10(Artful Aardvark)

本页内容

  • 先决条件
  • 第 1 步 - 配置防火墙
  • 第 2 步 - 安装 Docker 和 Docker Compose
  • 第 3 步 - 配置 Docker Registry 创建用户目录 创建 Amazon S3 Bucket 创建 Docker Compose 文件 设置认证
  • 第 4 步 - 安装 SSL 将 Dhparam 文件复制到容器
  • 第 5 步 - 配置 Nginx
  • 第 6 步 - 启动 Docker Registry
  • 第 7 步 - 从客户端机器访问并使用 Docker registry
  • 结语
  • 创建用户目录
  • 创建 Amazon S3 Bucket
  • 创建 Docker Compose 文件
  • 设置认证
  • 将 Dhparam 文件复制到容器

如果你在一家组织工作,并希望将 Docker 镜像保留在内部以便快速部署,那么托管一个私有 Docker 仓库是理想的选择。拥有私有 docker registry 可以让你掌控自己的镜像分发管道,并对镜像的存储和分发进行更严格的控制。你可以将 registry 与 CI/CD 系统集成,从而改进你的工作流。

本教程将教你如何在 Ubuntu 22.04 服务器上使用 Amazon S3 作为存储位置来搭建并使用私有 Docker registry。

先决条件

  • 两台运行 Ubuntu 22.04 的 Linux 服务器。其中一台作为 registry 主机,另一台作为客户端,用于向主机发送请求并接收镜像。
  • 一个指向主机服务器的已注册域名。本教程中我们将使用 registry.example.com。
  • 两台机器上均具有 sudo 权限的非 root 用户。
  • 确保系统已更新。$ sudo apt update $ sudo apt upgrade
  • 系统需要安装的一些软件包。$ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y 其中部分软件包可能已经在你的系统上安装过了。

两台运行 Ubuntu 22.04 的 Linux 服务器。其中一台作为 registry 主机,另一台作为客户端,用于向主机发送请求并接收镜像。

一个指向主机服务器的已注册域名。本教程中我们将使用 registry.example.com。

两台机器上均具有 sudo 权限的非 root 用户。

确保系统已更新。

$ sudo apt update
$ sudo apt upgrade

系统需要安装的一些软件包。

$ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y

其中部分软件包可能已经在你的系统上安装过了。

第 1 步 - 配置防火墙

第一步是配置防火墙。Ubuntu 默认自带 ufw(Uncomplicated Firewall)。

检查防火墙是否正在运行。

$ sudo ufw status

你应该会看到如下输出。

Status: inactive

允许 SSH 端口,以免启用防火墙时中断当前的连接。

$ sudo ufw allow OpenSSH

同时允许 HTTP 和 HTTPS 端口。

$ sudo ufw allow http
$ sudo ufw allow https

启用防火墙

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

再次检查防火墙的状态。

$ sudo ufw status

你应该会看到类似的输出。

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

第 2 步 - 安装 Docker 和 Docker Compose

服务器和客户端机器都需要执行此步骤。

Ubuntu 22.04 自带的 Docker 版本较旧。要安装最新版本,首先导入 Docker 的 GPG 密钥。

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

创建 Docker 仓库文件。

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

更新系统仓库列表。

$ sudo apt update

安装最新版本的 Docker。

$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

验证它是否正在运行。

$ sudo systemctl status docker
? docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2023-04-13 09:37:09 UTC; 3min 47s ago
TriggeredBy: ? docker.socket
       Docs: https://docs.docker.com
   Main PID: 2106 (dockerd)
      Tasks: 7
     Memory: 26.0M
        CPU: 267ms
     CGroup: /system.slice/docker.service
             ??2106 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

默认情况下,Docker 需要 root 权限。如果你想避免每次运行 docker 命令时都使用 sudo,可以将你的用户名加入 docker 组。

$ sudo usermod -aG docker $(whoami)

你需要注销服务器并以同一用户重新登录以使更改生效,或者使用以下命令。

$ su - ${USER}

确认你的用户已加入 Docker 组。

$ groups
navjot wheel docker

第 3 步 - 配置 Docker Registry

创建用户目录

创建一个用于 registry 配置的目录。

$ mkdir ~/docker-registry

切换到 docker-registry 目录。

$ cd ~/docker-registry

创建一个目录,用于存储 HTTP 认证密码、Nginx 配置文件和 SSL 证书。

$ mkdir auth

创建另一个目录用于存储 Nginx 日志。

$ mkdir logs

创建 Amazon S3 Bucket

你可以将 registry 数据和镜像存储在自己的服务器上,也可以使用云服务。在本教程中,我们将使用 Amazon S3 云服务。

下一步是创建配置文件并设置一些重要选项。这些设置也可以定义在 docker-compose.yml 文件中,但单独使用一个文件会更好。

按以下设置创建一个 bucket。

  • ACL 应处于禁用状态。
  • bucket 的公开访问应处于禁用状态。
  • bucket 版本控制应处于禁用状态。
  • 启用使用 Amazon S3 托管密钥的 bucket 加密。(SSE-S3)
  • 对象锁定应处于禁用状态。

创建一个具有以下策略的 IAM 用户。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketLocation",
        "s3:ListBucketMultipartUploads"
      ],
      "Resource": "arn:aws:s3:::S3_BUCKET_NAME"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject",
        "s3:ListMultipartUploadParts",
        "s3:AbortMultipartUpload"
      ],
      "Resource": "arn:aws:s3:::S3_BUCKET_NAME/*"
    }
  ]
}

将 S3_BUCKET_NAME 替换为你的 S3 bucket 名称。

记下你的 bucket 的 secret key、secret value 以及 bucket 所在的区域,以便后续使用。

创建 Docker Compose 文件

创建 docker-compose.yml 文件并打开进行编辑。

$ nano docker-compose.yml

将以下代码粘贴进去。

services:
  registry:
    image: registry:2
    restart: always
    environment:
      - REGISTRY_STORAGE=s3
      - REGISTRY_STORAGE_S3_REGION=us-west-2
      - REGISTRY_STORAGE_S3_BUCKET=hf-docker-registry
      - REGISTRY_STORAGE_S3_ENCRYPT=true
      - REGISTRY_STORAGE_S3_CHUNKSIZE=5242880
      - REGISTRY_STORAGE_S3_SECURE=true
      - REGISTRY_STORAGE_S3_ACCESSKEY=AKIA3FIG4NVFNXKQXMSJ
      - REGISTRY_STORAGE_S3_SECRETKEY=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
      - REGISTRY_STORAGE_S3_V4AUTH=true
      - REGISTRY_STORAGE_S3_ROOTDIRECTORY=/image-registry
      - REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR=inmemory
      - REGISTRY_HEALTH_STORAGEDRIVER_ENABLED=false
  nginx:
    image: "nginx:alpine"
    ports:
      - 443:443
    links:
      - registry:registry
    volumes:
      - ./auth:/etc/nginx/conf.d
      - ./auth/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./logs:/var/log/nginx
      - /etc/letsencrypt:/etc/letsencrypt

按下 Ctrl + X 保存文件,并在提示时输入 Y。

下面我们来看看在 compose 文件中设置的内容。

  • 第一步是从 hub 获取 Docker registry 第 2 版的最新镜像。我们没有使用 latest 标签,因为在主版本升级时这可能会带来问题。将其设置为 2 可以让你获取所有 2.x 更新,同时避免被自动升级到下一个主版本,从而防止出现破坏性变更。
  • registry 容器被设置为在故障或意外关闭时始终自动重启。
  • 我们为 Amazon S3 存储设置了多个环境变量。下面快速看一下它们。REGISTRY_STORAGE 设置存储类型。由于我们使用 Amazon S3,因此选择了 s3。REGISTRY_STORAGE_S3_REGION 设置你的 S3 bucket 所在区域。REGISTRY_STORAGE_S3_BUCKET 设置你的 S3 bucket 名称。REGISTRY_STORAGE_S3_ENCRYPT - 如果你启用了 bucket 加密,则将其设为 true。REGISTRY_STORAGE_S3_CHUNKSIZE 设置上传分块的大小。它应大于 5MB(5 * 1024 * 1024)。REGISTRY_STORAGE_S3_SECURE - 如果你将使用 HTTPS,则将其设为 true。REGISTRY_STORAGE_S3_ACCESSKEY 和 REGISTRY_STORAGE_S3_SECRETKEY - 创建 IAM 用户后获取的凭据。REGISTRY_STORAGE_S3_V4AUTH - 如果你使用 AWS 认证的第 4 版,则将其设为 true。如果遇到与 S3 登录相关的错误,请将其设为 false。REGISTRY_STORAGE_S3_ROOTDIRECTORY - 设置 bucket 中用于存储 registry 数据的根目录。REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR - 设置缓存的位置。在本例中,我们将其存储在内存中。你也可以将其设置为使用 Redis。REGISTRY_HEALTH_STORAGEDRIVER_ENABLED - 将其设为 false 以禁用 Registry 的存储健康检查服务。Registry 存在一个缺陷,如果不将其设为 false 可能会导致问题。
  • Docker registry 通过 5000 端口通信,我们已在服务器上将该端口暴露给 docker。
  • ./auth:/etc/nginx/conf.d 映射确保容器内可以使用 Nginx 的全部配置。
  • ./auth/nginx.conf:/etc/nginx/nginx.conf:ro 以只读方式将系统中的 Nginx 配置文件映射到容器内的对应文件。
  • ./logs:/var/log/nginx 通过映射到容器内的 Nginx 日志目录,从而可以访问系统中的 Nginx 日志。
  • Docker registry 的配置存储在容器内 /etc/docker/registry/config.yml 文件中,我们已将其映射到当前目录下的 config.yml 文件,该文件将在下一步创建。

第一步是从 hub 获取 Docker registry 第 2 版的最新镜像。我们没有使用 latest 标签,因为在主版本升级时这可能会带来问题。将其设置为 2 可以让你获取所有 2.x 更新,同时避免被自动升级到下一个主版本,从而防止出现破坏性变更。

registry 容器被设置为在故障或意外关闭时始终自动重启。

我们为 Amazon S3 存储设置了多个环境变量。下面快速看一下它们。

  • REGISTRY_STORAGE 设置存储类型。由于我们使用 Amazon S3,因此选择了 s3。
  • REGISTRY_STORAGE_S3_REGION 设置你的 S3 bucket 所在区域。
  • REGISTRY_STORAGE_S3_BUCKET 设置你的 S3 bucket 名称。
  • REGISTRY_STORAGE_S3_ENCRYPT - 如果你启用了 bucket 加密,则将其设为 true。
  • REGISTRY_STORAGE_S3_CHUNKSIZE 设置上传分块的大小。它应大于 5MB(5 * 1024 * 1024)。
  • REGISTRY_STORAGE_S3_SECURE - 如果你将使用 HTTPS,则将其设为 true。
  • REGISTRY_STORAGE_S3_ACCESSKEY 和 REGISTRY_STORAGE_S3_SECRETKEY - 创建 IAM 用户后获取的凭据。
  • REGISTRY_STORAGE_S3_V4AUTH - 如果你使用 AWS 认证的第 4 版,则将其设为 true。如果遇到与 S3 登录相关的错误,请将其设为 false。
  • REGISTRY_STORAGE_S3_ROOTDIRECTORY - 设置 bucket 中用于存储 registry 数据的根目录。
  • REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR - 设置缓存的位置。在本例中,我们将其存储在内存中。你也可以将其设置为使用 Redis。
  • REGISTRY_HEALTH_STORAGEDRIVER_ENABLED - 将其设为 false 以禁用 Registry 的存储健康检查服务。Registry 存在一个缺陷,如果不将其设为 false 可能会导致问题。

Docker registry 通过 5000 端口通信,我们已在服务器上将该端口暴露给 docker。

./auth:/etc/nginx/conf.d 映射确保容器内可以使用 Nginx 的全部配置。

./auth/nginx.conf:/etc/nginx/nginx.conf:ro 以只读方式将系统中的 Nginx 配置文件映射到容器内的对应文件。

./logs:/var/log/nginx 通过映射到容器内的 Nginx 日志目录,从而可以访问系统中的 Nginx 日志。

Docker registry 的配置存储在容器内 /etc/docker/registry/config.yml 文件中,我们已将其映射到当前目录下的 config.yml 文件,该文件将在下一步创建。

设置认证

要设置 HTTP 认证,你需要安装 httpd-tools 软件包。

$ sudo apt install apache2-utils -y

在 ~/docker-registry/auth 目录中创建密码文件。

$ htpasswd -Bc ~/docker-registry/auth/nginx.htpasswd user1
New password:
Re-type new password:
Adding password for user user1

-c 标志指示命令创建一个新文件,-B 标志用于使用 Docker 支持的 bcrypt 算法。请将 user1 替换为你自己选择的用户名。

如果你想添加更多用户,请再次运行该命令,但不要带 -c 标志。

$ htpasswd -B ~/docker-registry/auth/registry.password user2

现在,该文件将被映射到 registry 容器用于认证。

第 4 步 - 安装 SSL

我们需要安装 Certbot 来生成 SSL 证书。你可以使用 Ubuntu 的仓库安装 Certbot,也可以通过 Snapd 工具获取最新版本。我们将使用 Snapd 版本。

Ubuntu 22.04 默认已安装 Snapd。运行以下命令以确保你的 Snapd 版本是最新的。

$ sudo snap install core && sudo snap refresh core

安装 Certbot。

$ sudo snap install --classic certbot

使用以下命令创建指向 /usr/bin 目录的符号链接,以确保可以运行 Certbot 命令。

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

运行以下命令生成 SSL 证书。

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m 
[email protected]
 -d registry.example.com

上述命令会将证书下载到服务器上的 /etc/letsencrypt/live/registry.example.com 目录。

生成 Diffie-Hellman 组证书。

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

检查 Certbot 续期调度服务。

$ sudo systemctl list-timers

你会发现 snap.certbot.renew.service 是计划运行的服务之一。

NEXT                        LEFT          LAST                        PASSED        UNIT                      ACTIVATES
.....
Sun 2023-04-14 00:00:00 UTC 19min left    Sat 2023-02-25 18:04:05 UTC n/a          snap.certbot.renew.timer  snap.certbot.renew.service
Sun 2023-04-14 00:00:20 UTC 19min left    Sat 2023-02-25 10:49:23 UTC 14h ago      apt-daily-upgrade.timer   apt-daily-upgrade.service
Sun 2023-04-14 00:44:06 UTC 3h 22min left Sat 2023-02-25 20:58:06 UTC 7h ago       apt-daily.timer           apt-daily.service

对该过程进行一次预演(dry run),以检查 SSL 续期是否正常工作。

$ sudo certbot renew --dry-run

如果没有看到错误,说明一切就绪。你的证书将自动续期。

将 Dhparam 文件复制到容器

将 Diffie-Hellman 组证书复制到 ~/docker-registry/auth 目录,该目录将被映射到容器。

$ sudo cp /etc/ssl/certs/dhparam.pem ~/docker-registry/auth

第 5 步 - 配置 Nginx

下一步是将 Nginx 服务器配置为 Docker registry 服务器的前端代理。Docker registry 自带一个运行在 5000 端口的内置服务器。我们将其放在 Nginx 后面。

创建并打开 ~/docker-registry/auth/nginx.conf 文件进行编辑。

$ sudo nano ~/docker-registry/auth/nginx.conf

将以下代码粘贴进去。

events {
    worker_connections  1024;
}

http {

  upstream docker-registry {
    server registry:5000;
  }

  ## Set a variable to help us decide if we need to add the
  ## 'Docker-Distribution-Api-Version' header.
  ## The registry always sets this header.
  ## In the case of nginx performing auth, the header is unset
  ## since nginx is auth-ing before proxying.
  map $upstream_http_docker_distribution_api_version $docker_distribution_api_version {
    '' 'registry/2.0';
  }

  server {
    listen 443 ssl http2;
    server_name registry.example.com;

    # SSL
    ssl_certificate /etc/letsencrypt/live/registry.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/registry.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/registry.example.com/chain.pem;

    access_log  /var/log/nginx/registry.access.log;
    error_log   /var/log/nginx/registry.error.log;

    # Recommendations from https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers on;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_session_cache shared:SSL:10m;
    ssl_dhparam /etc/nginx/conf.d/dhparam.pem;
    resolver 8.8.8.8;

    # disable any limits to avoid HTTP 413 for large image uploads
    client_max_body_size 0;

    # required to avoid HTTP 411: see Issue #1486 (https://github.com/moby/moby/issues/1486)
    chunked_transfer_encoding on;

    location /v2/ {
      # 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;
      }

      # To add basic authentication to v2 use auth_basic setting.
      auth_basic "Registry realm";
      auth_basic_user_file /etc/nginx/conf.d/nginx.htpasswd;

      ## If $docker_distribution_api_version is empty, the header is not added.
      ## See the map directive above where this variable is defined.
      add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always;

      proxy_pass                          http://docker-registry;
      proxy_set_header  Host              $http_host;   # required for docker client's sake
      proxy_set_header  X-Real-IP         $remote_addr; # pass on real client's IP
      proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
      proxy_set_header  X-Forwarded-Proto $scheme;
      proxy_read_timeout                  900;
    }
  }
}

完成后按下 Ctrl + X 保存文件,并在提示时输入 Y。

第 6 步 - 启动 Docker Registry

切换到 Docker Registry 的目录。

$ cd ~/docker-registry

启动 docker 容器。

$ docker compose up -d

检查容器的状态。

$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS              PORTS                                      NAMES
3328b7e36bb2   nginx:alpine   "/docker-entrypoint.…"   About a minute ago   Up 3 seconds        80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   docker-registry-nginx-1
bf7cdfc0e013   registry:2     "/entrypoint.sh /etc…"   About a minute ago   Up About a minute   5000/tcp                                 docker-registry-registry-1

登录到 Docker registry。

$ docker login -u=user1 -p=password https://registry.example.com

你将看到如下输出。

WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /home/username/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

你也可以在浏览器中打开 URL https://registry.example.com/v2/,它会要求输入用户名和密码。你应该会看到一个内容为 {} 的空页面。

你可以使用 curl 在终端中检查该 URL。

$ curl -u user1 -X GET https://registry.example.com/v2/
Enter host password for user 'user1':
{}

下载最新的 Ubuntu docker 镜像。

$ docker pull ubuntu:latest

为该镜像打上用于私有 registry 的标签。

$ docker tag ubuntu:latest registry.example.com/ubuntu2204

将镜像推送到 registry。

$ docker push registry.example.com/ubuntu2204

测试推送是否成功。

$ curl -u user1 -X GET https://registry.example.com/v2/_catalog
Enter host password for user 'user1':
{"repositories":["ubuntu2204"]}

在提示时输入你的 Nginx 认证密码,你将看到可通过 registry 访问的仓库列表。

通过终端注销以清除凭据。

$ docker logout https://registry.example.com
Removing login credentials for registry.example.com

查看当前可用 Docker 镜像列表。

$ docker images
REPOSITORY                            TAG       IMAGE ID       CREATED       SIZE
registry                             2         8db46f9d7550   2 weeks ago   24.2MB
nginx                                alpine    8e75cbc5b25c   2 weeks ago   41MB
ubuntu                               latest    08d22c0ceb15   5 weeks ago   77.8MB
registry.example.com/ubuntu2204      latest    08d22c0ceb15   5 weeks ago   77.8MB

第 7 步 - 从客户端机器访问并使用 Docker registry

登录到你的客户端服务器。在第 1 步中,我们已在客户端机器上安装了 Docker。

从客户端机器登录到私有 Docker registry。

$ docker login -u=user1 -p=password https://registry.example.com

从 registry 拉取 Ubuntu 镜像。

$ docker pull registry.example.com/ubuntu2204

列出客户端机器上的所有镜像。

$ docker images
REPOSITORY                        TAG        IMAGE ID       CREATED         SIZE
registry.example.com/ubuntu2204   latest     08d22c0ceb15   5 weeks ago   77.8MB

使用下载的镜像创建并启动一个容器。

$ docker run -it registry.example.com/ubuntu2204 /bin/bash

你将登录到 Ubuntu 容器内部的 Shell。

root@647899f255db:

运行以下命令检查 Linux 版本。

root@a2da49fdbea9$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.2 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.2 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy

现在,你可以开始从客户端机器使用你的 Docker registry 了。

结语

至此,关于在 Ubuntu 22.04 服务器上使用 Amazon S3 作为存储来搭建私有 Docker registry 的教程就结束了。如果你有任何问题,请在下方评论中留言。