1. 程式人生 > >[Docker] docker 配置私有倉庫

[Docker] docker 配置私有倉庫

什麼是 Docker Registry

Registry 是一個開源的,無狀態的(stateless),高可擴充套件的(highly scalable)伺服器端應用,用來儲存和獲取你的分散式 Docker 映象。

Registry 是一個儲存(storage)和內容分發(content delivery)系統,持有命名的(named)Docker 映象,通過使用不同的標籤版本來區分。

Example: the image distribution/registry, with tags 2.0 and 2.1.

使用 docker 的 pushpull

命令來和倉庫互動。

Example: docker pull registry-1.docker.io/distribution/registry:2.1.

理解映象命名

在 docker 命令中使用映象名稱來反映他們的來源:

  • docker pull ubuntu 表示 docker 從官方的 Docker Hub 中拉取名稱為 ubuntu 的映象。這是命令 docker pull docker.io/library/ubuntu 的簡寫。
  • docker pull myregistrydomain:port/foo/bar 表示 docker 從位於 myregistrydomain:port
    的倉庫中尋找映象 foo/bar

部署倉庫伺服器

部署倉庫之前,需要在主機上安裝 Docker,一個倉庫是一個執行在 Docker 中的 registry 映象。

執行一個本地倉庫

使用如下命令列來開始一個倉庫容器:

$ docker run -d -p 5000:5000 --restart=always --name registry registry:2

這樣倉庫便準備好被使用。

從 Docker Hub 中複製一個映象到你的倉庫中

  1. 從 Docker Hub 中拉取 ubuntu:16.04 映象:

    $ docker pull ubuntu:16.04
  2. 將映象重新標籤為 localhost:5000/my-ubuntu

    。這將建立一個當前映象的額外標籤。

    $ docker tag ubuntu:16.04 localhost:5000/my-ubuntu
  3. 將映象推送到執行在 localhost:5000 的本地倉庫中:

    $ docker push localhost:5000/my-ubuntu
  4. 刪除本地快取的 ubuntu:16.04localhost:5000/my-ubuntu 映象,這樣你便可以從你的倉庫中拉取映象。這不會刪除你倉庫中的 localhost:5000/my-ubuntu 映象。

    $ docker image remove ubuntu:16.04
    $ docker image remove localhost:5000/my-ubuntu
  5. 從你本地倉庫中拉取 localhost:5000/my-ubuntu 映象。

    $ docker pull localhost:5000/my-ubuntu

如果出現無法從私有倉庫 pull 或者 push,有如下報錯情況:

Error response from daemon: Get myregistryhost:5000/v1/_ping: http: server gave HTTP response to HTTPS client

這是因為啟動的 registry 服務不是安全可信賴的,需要在 docker 的 /etc/docker 目錄下編輯deamon.json,新增下面內容:

$ tee /etc/docker/daemon.json << EOF
{ "insecure-registries":["myregistryhost:5000"] }
EOF

停止一個本地倉庫

使用停止容器的命令來停止倉庫:

$ docker container stop registry

使用 docker container m 刪除容器:

$ docker container stop registry \
&& docker container rm -v registry

基本配置

可以通過在 docker run 命令中新增引數和選項來配置容器

倉庫自動啟動

通過使用 --restart=always 來設定倉庫隨 Docker 自動重啟。

定製釋出的埠

如果 5000 埠已被佔用,或者要啟動多個倉庫,可以定製倉庫的埠。通過 -p 來設定,第一部分是倉庫在主機執行的埠,第二部分是倉庫在容器內的監聽埠。

docker run -d -p 5001:5000 \
--name registry-test registry:2

定製本地儲存

在預設情況下,你的倉庫資料被持久化在主機檔案系統的 docker volume,可以通過 bind mount 將主機的某個目錄 bind-mount 到倉庫容器的 /var/lib/registry/(倉庫資料在容器中的位置):

$ docker run -d -p 5000:5000 \
    --restart=always --name registry \
    -v /mnt/registry:/var/lib/registry \
    registry:2

本地認證訪問控制

為了使本地倉庫可以對其它主機可用,在網路間安全使用,需要使用 TLS 來進行配置。本文暫不介紹 TLS 配置外部可訪問性,詳見官網

本地認證訪問控制使用 htpasswd 來儲存密文:

  1. 為使用者 testuser 建立一個密碼檔案,密碼為 testpasswd

    $ mkdir auth
    $ docker run --entrypoint htpasswd \
    registry:2 -Bbn testuser testpasswd > auth/htpasswd
  2. 停止倉庫:

    $ docker container stop registry
  3. 使用基礎認證啟動倉庫:

    $ docer run -d -p 5000:5000 \
    --restart=always --name registry \
    -v \`pwd\`/auth:/auth \
    -e "REGISTRY_AUTH=htpasswd" \
    -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
    -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
    -v \`pwd\`/registry:/var/lib/registry \
    registry:2
  4. 嘗試使用 pull 或者 push,都會失敗。需要登入倉庫:

    $ docker login myregistrydomain.com:5000

    退出倉庫:

    docker logout myregistrydomain.com:5000

參考資料

[1] https://docs.docker.com/registry/deploying/#/running-a-domain-registry “Deploy a registry server”
[2] https://www.jianshu.com/p/7918c9af45a3 “docker私有倉庫搭建並且配置倉庫認證”