Skip to content

18 Docker 私有仓库

  • Docker 官方的 Dockerhub 是一个用于管理公共镜像的仓库,我们可以从上面拉取镜像到本地,也可以把我们自己的镜像推送上去。
  • 但是,有时候我们的服务器无法访问互联网,或者你不希望将自己的镜像放到公网当中,那么我们就需要搭建自己的私有仓库来存储和管理自己的镜像。

搭建私有仓库

docker-compose.yml

yaml
version: "3"

services:
  registry:
    image: registry:2 # 使用官方 Registry 镜像
    container_name: my-registry # 容器名称
    restart: always
    ports:
      - "5000:5000" # 将本地端口 5000 映射到容器端口 5000
    volumes:
      - ./data:/var/lib/registry # 持久化存储 Registry 数据
    environment:
      REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt # 使用自签名证书
      REGISTRY_HTTP_TLS_KEY: /certs/domain.key
      REGISTRY_COMPATIBILITY_SCHEMA1_MANIFESTS: "true" # 允许使用 v1 镜像格式


    # 如果需要使用基本身份验证,创建一个名为 auth 的目录,然后在其中运行以下命令生成 htpasswd 文件
    # docker run --entrypoint htpasswd registry:2 -Bbn YOUR_USERNAME YOUR_PASSWORD > auth/htpasswd
    # # REGISTRY_AUTH: htpasswd
    # REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
    # REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm

docker run

bash
# 创建持久化存储卷
 docker volume create my-registry-data

# 启动Registry容器
 docker run -d -p 5000:5000 \
  --name my-registry \
  -v my-registry-data:/var/lib/registry \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  -e REGISTRY_COMPATIBILITY_SCHEMA1_MANIFESTS=true \
  -e REGISTRY_AUTH=htpasswd \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
  --restart=always \
  registry:2

# 如果启用了基本身份验证,创建一个名为 auth 的目录,并在其中运行以下命令生成 htpasswd 文件
# docker run --entrypoint htpasswd registry:2 -Bbn YOUR_USERNAME YOUR_PASSWORD > auth/htpasswd

信任私有仓库

bash
echo '{ "insecure-registries": ["<私有仓库地址ip>:5000"] }' | sudo tee /etc/docker/daemon.json
sudo service docker restart

如果私有仓库使用自签名证书,你需要将证书添加到 Docker 的信任存储中。

bash
# 将证书复制到 /etc/docker/certs.d/<私有仓库地址>/ 目录中
sudo mkdir -p /etc/docker/certs.d/<私有仓库地>/
sudo cp <.../证书.crt> /etc/docker/certs.d/<私有仓库地>/.crt

# 重新启动 Docker
sudo service docker restart

验证

bash
 docker pull <私有仓库地>/<镜像>:<>

上传镜像到私有仓库

  1. 为镜像打标签。

    bash
     docker tag my-image registry.example.com/my-repo/my-image:v1.0
    
    # docker image tag ubuntu localhost:5000/myfirstimage
  2. 登录到私有仓库

    bash
     docker login registry.example.com
  3. 推送镜像到私有仓库

    bash
     docker push registry.example.com/my-repo/my-image:v1.0
    # or
     docker push <私有仓库地址 ip>:5000/my-repo/my-image:v1.0
    
    # docker push localhost:5000/myfirstimage

从私有仓库拉取镜像

bash
# 登录
docker login <私有仓库地>

# 从私有仓库拉取镜像
docker pull <私有仓库地>/<>/<镜像>:<>

# docker pull localhost:5000/myfirstimage

例如,如果私有仓库地址为 registry.example.com,路径为 /my-repo,镜像名为 my-image,标签为 v1.0

bash
docker pull registry.example.com/my-repo/my-image:v1.0