凌云的博客

行胜于言

如何部署自定义 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

参考