如何在 Ubuntu 20.04 上设置私有 Docker 注册表

[ad_1]

平滑 CI/CD 使用 docker 平台进行开发,请考虑使用自托管的 docker 注册服务器。 Docker 注册表是一个存储库,您可以在其中存储 Docker 映像并拉取它们以在服务器上运行应用程序。 为了更快的交付以及安全的基础架构,建议设置您自己的 docker 私有注册表来存储您的 docker 镜像并在组织之间分发。 在本文中,我们将学习如何在 Ubuntu 20.04 上设置私有 docker 注册表

先决条件

  • 用户帐户 sudo 特权
  • Docker 注册表的服务器
  • Docker Registry 服务器上的 Nginx
  • 客户端服务器
  • 两台服务器上的 Docker 和 Docker-Compose。

私有 Docker 注册表

Docker Registry 是一种服务器端应用程序,它允许您将 Docker 镜像本地存储到一个集中位置。 通过设置您自己的 docker 注册服务器,您可以在无需连接到 Docker 集线器的情况下拉取和推送 docker 镜像,从而节省您的带宽并防止您受到安全威胁。

还阅读如何在 Ubuntu 20.04 / 20.10 上安装和使用 Docker

在你开始之前

在开始之前,我确保您已经在客户端服务器和本地注册服务器上安装了 Docker 和 Docker-Compose。 为了验证您是否安装了所需的软件,您可以运行以下命令来检查软件版本。

$ docker version
$ docker-compose version

此外,您需要确保 docker 服务已启动并设置为在启动时启用:

$ sudo systemctl start docker
$ sudo systemctl enable docker

安装和配置私有 Docker 注册表

要配置私有 Docker 注册表,请按照下列步骤操作:

创建注册表目录

配置将托管私有注册表的服务器。 创建一个新目录,用于存储所有必需的配置文件。

使用以下命令创建一个新的项目目录 ‘我的注册表‘ 和两个子目录 ‘nginx‘ 和 ‘授权’。 您可以对项目名称有自己的假设。

$ mkdir -p my-registry/{nginx, auth}

现在导航到项目目录并在 nginx 中创建新目录:

$ cd my-registry/
$ mkdir -p nginx/{conf.d/, ssl}

创建 Docker-Compose 脚本和服务

你需要创建一个新的 docker-compose.yml 定义 docker-compose 版本和设置私有注册表所需的服务的脚本。

创建一个新文件“docker-compose.yml“里面”我的注册表” 带有 vi 编辑器的目录。

$ vi docker-compose.yml

在 docker-compose 文件中将您的服务定义为:

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:
      - myregistrydata:/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:
  myregistrydata:
    driver: local

Save 和 close 文件

设置nginx端口转发

我们需要为 nginx web 服务创建 nginx 虚拟主机配置。 转到上一步创建的 nginx/conf.d/ 目录。

$ cd nginx/conf.d/

现在用你的文本编辑器创建一个 nginx 虚拟主机文件。 在这个例子中,我将命名它 myregistry.conf。 你可以有你自己的假设。

$ vi myregistry.conf

添加以下内容:

upstream docker-registry {
    server registry:5000;
}
server {
    listen 80;
    server_name registry.linuxtechi.com;
    return 301 https://registry.linuxtechi.com$request_uri;
}
server {
    listen 443 ssl http2;
    server_name registry.linuxtechi.com;
    ssl_certificate /etc/nginx/ssl/certificate.crt;
    ssl_certificate_key /etc/nginx/ssl/private.key;
    # Log files for Debug
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    location / {
        if ($http_user_agent ~ "^(docker/1.(3|4|5(?!.[0-9]-dev))|Go ).*$" )  {
            return 404;
        }
        proxy_pass                          https://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;
    }
}

用 server_name 参数替换您的域名并保存文件。

增加nginx文件上传大小

默认情况下,nginx 上传文件的限制为 1mb。 当docker镜像超过这个限制时,需要在nginx配置文件中增加上传大小。 在这个例子中,我将创建一个额外的 nginx 配置文件,上传限制为 2GB。

进入nginx配置目录

$ cd myregistry/nginx/conf.d
$ vi additional.conf

添加以下行并保存文件

client_max_body_size 2G;

配置 SSL 证书和身份验证

创建 nginx 配置文件后,现在我们需要设置一个 ssl 证书。 您应该有一个带有私钥的有效 ssl 证书文件。 将您的证书文件和私钥复制到 nginx/ssl 目录,如下所示:

$ cd myregistry/nginx/ssl
$ cp /your-ssl-certificate-path/certificate.crt .
$ cp /your-private-key-path/private.key .

如果您没有购买的有效 ssl 证书,您可以生成自己的自签名 ssl 证书。 请记住,不建议在生产环境中使用自签名 ssl 证书。 要生成自签名 ssl 证书,请运行以下命令:

$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout 
 /etc/ssl/private/nginx-private.key -out /etc/ssl/certs/nginx-certificate.crt

您将被要求提交一些详细信息,例如国家/地区代码、域名、电子邮件 ID。 填写详细信息并继续。

现在将基本身份验证设置为:

进入授权目录

$ cd auth

请求一个名为的新密码文件 注册表.密码 为您的用户。 在这个例子中,我将使用 linux技术 用户。

$ htpasswd -Bc registry.password linuxtechi

如果你得到 ‘htpasswd 未找到命令‘,在终端中运行以下命令并重试。

$  sudo apt install apache2-utils -y

输入一个强密码并再次输入以确认您的密码。 您已为 docker 注册表添加了一个基本身份验证用户。

运行 Docker 注册表

您已完成设置。 您可以使用 docker-compose 命令构建注册表。

转到我们创建 docker-compose.yml 文件的目录

$ cd myregistry

现在运行以下命令:

$ docker-compose up -d

Docker 注册表现已启动,您可以使用以下命令验证正在运行的容器:

$ docker ps -a

您将获得以下输出:

从 Docker Hub 拉取镜像到私有注册中心

要将镜像从 Docker hub 存储到私有注册表,请使用 docker pull 命令从 docker hub 拉取 docker 镜像。 在这个例子中,我将拉取 centos 的 docker 镜像。

$ docker pull centos

从 docker hub 成功拉取镜像后,标记一个镜像以将其标记为私有注册表。

在这个例子中,我要将 centos 图像标记为: registry.linuxtechi.com/linuxtechi-centos

$ docker 镜像标签 [image name] registry.linuxtechi.com/[new-image-name]

例子:

$ docker images tag centos registry.linuxtechi.com/linuxtechi-centos

要检查 docker 镜像是否在本地可用,请运行以下命令。

$ docker images

将 docker 镜像推送到私有注册表

您已经从 docker hub 拉取了 docker 镜像并为私有注册表创建了一个标签。 现在您需要将本地 docker 镜像推送到私有注册表。

首先,使用以下命令登录到您的私人注册表:

$ docker login https://registry.linuxtechi.com/v2/

使用您自己的注册表 URL 代替“https://registry.linuxtechi.com”

系统将提示您输入用户名和密码; 您将收到登录成功消息:

现在您可以将您的 docker 镜像推送到私有注册表。 要推送图像,请运行以下命令:

$ docker push registry.linuxtechi.com/linuxtechi-centos

在“docker push”之后替换您的图像名称

推送完成后,您可以转到浏览器并输入网址:

https://registry.linuxtechi.com/v2/_catalog

将 registry.linuxtechi.com 替换为您自己的 url 并提供基本身份验证。 您会发现存储库列表如下:

从私有注册表中拉取 docker 镜像

您已将本地 docker 映像推送到您的私有 docker 注册表。 以同样的方式,您可以将 docker 镜像从您的 docker 私有注册表中提取到本地服务器。

运行以下命令以登录您的私有注册服务器。

$ docker login https://registry.linuxtechi.com

将 registry.linuxtechi.com 替换为您自己的私有注册表 URL 并提供基本身份验证。 登录成功后,运行以下命令从私有注册表中拉取 docker 镜像。 在这个例子中,我将在本地服务器中拉取之前推送的 docker 镜像。 您可以对 docker 镜像名称有自己的假设。

$ docker pull registry.linuxtechi.com/linuxtechi-centos

您将获得类似于以下内容的输出:

结论:

在这篇文章中,您已经了解了如何托管您自己的私有 docker 注册表。 您还知道如何将图像从 docker hub 拉到本地服务器,标记图像并推送到私有注册表中。 您还学习了如何从本地服务器的私有注册表中提取 docker 镜像。

还阅读如何在 Ubuntu 20.04 LTS 服务器上安装 KVM (Focal Fossa)

[ad_2]

Related Posts