建立自己的 Docker 私有库

若想在 production 上使用 Docker,必然需要使用使用私有的 Registry。
Docker 提供了一个很棒的 Registry Image, 使用他可以快速的建立自己的私有库。

准备工作

htpasswd

因为这个私有库需要从公网进行访问,所以必然要做些鉴权的处理。我们简单实用 htpasswd 实现的 HTTP Basic Authentication 来进行鉴权。

使用以下命令来生成一个 md5 加密的密码文件

docker run --entrypoint htpasswd registry:2 \
-Bbn testuser testpasswd > auth/htpasswd

你可以多次运行来添加多个账号密码。

HTTP TLS

因为 HTTP Basic Authentication 是以明文来传递密码信息的,所以需要Web应用打开 HTTP TLS。

具体的工作是我们要生成两个文件,可以通过 Let's Encrypt 来免费获得。

  • server.crt # CA证书文件
  • server.key # 秘钥文件

执行Docker命令

运行一下命令:

docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v "$(pwd)/auth:/auth" \
  -v "$(pwd)/ssl:/ssl" \
  -v registry:/var/lib/registry \
  -e REGISTRY_AUTH=htpasswd \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/ssl/server.crt \
  -e REGISTRY_HTTP_TLS_KEY=/ssl/server.key \
  registry:2

执行后运行 docker ps 可以在输出中看到。

验证

执行以下命令输入密码后尝试是否能成功。

docker login -u testuser yourdomain.com:5000

发布 image 到私有库

先给本地 image 加标签,再 push 到私有库即可。

docker pull hello-world
docker tag hello-world yourdomain.com:5000/hello-world
docker push yourdomain.com:5000/hello-world

使用私有库

就像使用共有库一样只是前面要加上私有库域名信息。

docker run yourdomain.com:5000/hello-world