凌云的博客

行胜于言

如何部署自定义 Docker 镜像服务器

分类:docker| 发布时间:2024-12-30 19:04:00

前提条件

以下操作需要先成功安装 docker

以 Ubuntu 22.04 为例子,安装命令为:

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

部署自定义 Docker 镜像服务器

可以通过以下命令创建一个 Docker 镜像服务器:

docker run -d -p 5000:5000 --restart=always --name registry registry:2
  • -d 是 --detach 的简写,表示容器将在后台运行。容器会被启动并在后台运行,而不会阻塞终端
  • -p 5000:5000 -p 用来映射容器的端口到主机的端口,这里表示将容器内的 5000 端口映射到宿主机的 5000 端口
  • --restart=always 设置 Docker 容器的重启策略。它的作用是在容器异常退出或 Docker 服务重启时,自动重启该容器
  • --name 用于给容器指定一个名称。在这个例子中,容器的名称被设置为 registry
  • registry:2:使用名为 registry 的镜像,版本为 2

可以通过如下命令查看 registry 容器的日志

$ docker logs -f registry

自定义存储

指定存储路径

默认情况下,您的 Registry 数据作为 Docker 卷持久化存储在主机文件系统上。 如果您希望将 Registry 内容存储在主机文件系统的特定位置(例如,您有一个 SSD 或 SAN 挂载到特定目录),您可以选择使用绑定挂载(bind mount)。 绑定挂载更依赖于 Docker 主机的文件系统布局,但在许多情况下性能更好。 以下示例将主机目录 /mnt/registry 绑定挂载到 Registry 容器中的 /var/lib/registry/ 目录。

$ docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /mnt/registry:/var/lib/registry \
  registry:2
自定义存储后端

默认情况下,无论您使用绑定挂载点还是逻辑卷,Registry 都会将其数据存储在本地文件系统上。 您可以通过使用存储驱动将 Registry 数据存储在 Amazon S3 存储桶、Google Cloud Platform 或其他存储后端中。

有关更多信息,请参见存储配置选项。

运行一个可外部访问的 Registry

仅在本地主机上可访问的 Registry 功能有限。为了使您的 Registry 对外部主机可访问,您必须首先使用 TLS 对其进行安全保护。

以下示例假设以下情况:

  • 您的 Registry URL 是 https://myregistry.domain.com/。
  • 您的 DNS、路由和防火墙设置允许访问 Registry 主机的 443 端口。
  • 您已经从证书颁发机构(CA)获得了证书。
  • 如果您获得的是中间证书,请参见使用中间证书。

1、创建证书目录

$ mkdir -p certs

将 .crt 和 .key 文件从证书颁发机构复制到 certs 目录中。以下步骤假设文件命名为 domain.crt 和 domain.key。

2、停止正在运行的 Registry

$ docker container stop registry

3、重启 Registry,并指示它使用 TLS 证书

此命令将 certs/ 目录绑定挂载到容器中的 /certs/,并设置环境变量,告诉容器在哪里找到 domain.crt 和 domain.key 文件。Registry 将在 443 端口(默认的 HTTPS 端口)上运行。

$ docker run -d \
  --restart=always \
  --name registry \
  -v "$(pwd)"/certs:/certs \
  -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  -p 443:443 \
  registry:2

4、现在,Docker 客户端可以使用外部地址从您的 Registry 拉取和推送镜像

以下命令演示了这一点:

$ docker pull ubuntu:16.04
$ docker tag ubuntu:16.04 myregistry.domain.com/my-ubuntu
$ docker push myregistry.domain.com/my-ubuntu
$ docker pull myregistry.domain.com/my-ubuntu

使用中间证书

证书颁发机构可能会向您提供中间证书。在这种情况下,您必须将您的证书与中间证书连接在一起,形成一个证书包。 您可以使用 cat 命令来完成此操作:

cat domain.crt intermediate-certificates.pem > certs/domain.crt

您可以像在之前的示例中使用 domain.crt 文件一样使用证书包。

支持 Let’s Encrypt

Registry 支持使用 Let’s Encrypt 自动获取浏览器信任的证书。

有关 Let’s Encrypt 的更多信息,请参见 Let’s Encrypt 官方网站 和 Registry 配置 的相关部分。

使用不安全的 Registry(仅限测试)

可以使用自签名证书,或在不安全的环境中使用 Registry。 除非您为自签名证书设置了验证,否则这仅限于测试。 请参见 运行不安全的 Registry。

上传镜像到自定义 Docker 镜像服务器

下面演示下如何将 Docker 镜像上传到我们部署的 Docker 镜像服务器,为了方便演示,我们直接从官方拉取一个公共镜像并发布到我们部署的镜像服务器

$ docker pull ubuntu
$ docker tag ubuntu localhost:5000/ubuntu
$ docker push localhost:5000/ubuntu

现在我们可以使用以下命令本地已有的镜像:

$ docker images
REPOSITORY              TAG       IMAGE ID       CREATED       SIZE
ubuntu                  latest    b1d9df8ab815   5 weeks ago   78.1MB
localhost:5000/ubuntu   latest    b1d9df8ab815   5 weeks ago   78.1MB
registry                2.7       b8604a3fe854   3 years ago   26.2MB

现在通过以下命令删除本地镜像: localhost:5000/ubuntu:latest

$ docker rmi localhost:5000/ubuntu
Untagged: localhost:5000/ubuntu:latest
Untagged: localhost:5000/ubuntu@sha256:b0c08a4b639b5fca9aa4943ecec614fe241a0cebd1a7b460093ccaeae70df698

再次验证镜像是否已经删除

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    b1d9df8ab815   5 weeks ago   78.1MB
registry     2.7       b8604a3fe854   3 years ago   26.2MB

最后从本地服务器拉取镜像,并验证是否成功

$ docker pull localhost:5000/ubuntu
Using default tag: latest
latest: Pulling from ubuntu
Digest: sha256:b0c08a4b639b5fca9aa4943ecec614fe241a0cebd1a7b460093ccaeae70df698
Status: Downloaded newer image for localhost:5000/ubuntu:latest
localhost:5000/ubuntu:latest
$ docker images 
REPOSITORY              TAG       IMAGE ID       CREATED       SIZE
ubuntu                  latest    b1d9df8ab815   5 weeks ago   78.1MB
localhost:5000/ubuntu   latest    b1d9df8ab815   5 weeks ago   78.1MB
registry                2.7       b8604a3fe854   3 years ago   26.2MB

参考