Docker私有倉庫搭建

一、背景

在 Docker 中,當咱們執行 docker pull xxx 的時候,可能會比較好奇,docker 會去哪兒查找並下載鏡像呢?node

它其實是從 registry.hub.docker.com 這個地址去查找,這就是Docker公司爲咱們提供的公共倉庫,上面的鏡像,你們均可以看到,也可使用。因此,咱們也能夠帶上倉庫地址去拉取鏡像,如:docker pull registry.hub.docker.com/library/alpine,不過要注意,這種方式下載的鏡像的默認名稱就會長一些。  若是要在公司中使用 Docker,咱們基本不可能把商業項目上傳到公共倉庫中,那若是要多個機器共享,又能怎麼辦呢?nginx

正由於這種須要,因此私有倉庫也就有用武之地了。docker

所謂私有倉庫,也就是在本地(局域網)搭建的一個相似公共倉庫的東西,搭建好以後,咱們能夠將鏡像提交到私有倉庫中。這樣咱們既能使用 Docker 來運行咱們的項目鏡像,也避免了商業項目暴露出去的風險。json

下面咱們用官方提供的registry鏡像來搭建私有鏡像倉庫,固然還有其它不少方法。vim

二、環境

準備兩臺安裝好docker的服務器: 服務端機器 (主機名爲registry):docker私有倉庫服務器,運行registry容器; 測試端機器 (主機名爲node):普通的docker服務器,在這臺服務器上下載一個測試鏡像nginx,而後上傳到registry服務器進行測試;bash

三、部署(服務端操做)

  1. 下載鏡像registry服務器

    # docker pull registry
    
    Using default tag: latest
    latest: Pulling from library/registry
    81033e7c1d6a: Pull complete 
    b235084c2315: Pull complete 
    c692f3a6894b: Pull complete 
    ba2177f3a70e: Pull complete 
    a8d793620947: Pull complete 
    Digest: sha256:672d519d7fd7bbc7a448d17956ebeefe225d5eb27509d8dc5ce67ecb4a0bce54
    Status: Downloaded newer image for registry:latest
    複製代碼
  2. 查看鏡像curl

    # docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    registry            latest              f32a97de94e1        3 months ago        25.8 MB
    複製代碼
  3. 運行registry容器測試

    # docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latestui

    06a972de6218b1f1c3bf9b53eb9068dc66d147d14e18a89ab51db13e339d3dc9

    參數說明 -itd:在容器中打開一個僞終端進行交互操做,並在後臺運行; -v:把宿主機的/data/registry目錄綁定 到 容器/var/lib/registry目錄(這個目錄是registry容器中存放鏡像文件的目錄),來實現數據的持久化; -p:映射端口;訪問宿主機的5000端口就訪問到registry容器的服務了; --restart=always:這是重啓的策略,假如這個容器異常退出會自動重啓容器; --name registry:建立容器命名爲registry,你能夠隨便命名; registry:latest:這個是剛纔pull下來的鏡像;

  4. 測試鏡像倉庫中全部的鏡像

    # curl http://127.0.0.1:5000/v2/_catalog
    {"repositories":[]}
    如今是空的,由於纔剛運行,裏面沒有任何鏡像內容。

四、測試鏡像倉庫(測試端操做)

  1. 修改源和鏡像倉庫

    # vim /etc/docker/daemon.json
    
    {
    "registry-mirrors": [ "https://registry.docker-cn.com"]
    }
    
    # systemctl restart docker
    複製代碼
  2. 下載nginx鏡像

    # docker pull nginx
    # docker images
    
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    nginx               latest              719cd2e3ed04        2 weeks ago         109MB
    複製代碼
  3. 爲鏡像打標籤

    # docker tag nginx:latest registry服務器:5000/nginx:kurisu
    複製代碼

    格式說明:Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

    nginx:lastest 這是源鏡像,也是剛纔pull下來的鏡像文件;
    registry服務器:5000/nginx:kurisu 這是目標鏡像,也是registry私有鏡像服務器的IP地址和端口;

    查看效果

    # docker images
      
     REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
     registry服務器:5000/nginx   kurisu              719cd2e3ed04        2 weeks ago         109MB
     nginx                      latest              719cd2e3ed04        2 weeks ago         109MB
    複製代碼
  4. 上傳到鏡像服務器

    # docker push registry服務器:5000/nginx
    
    The push refers to repository [registry服務器:5000/nginx]
    Get https://registry服務器:5000/v2/: http: server gave HTTP response to HTTPS client
    複製代碼

    這是報錯了,須要https的方法才能上傳,咱們能夠修改下daemon.json來解決:

    [root@node ~]# vim /etc/docker/daemon.json 
    {
      "registry-mirrors": [ "https://registry.docker-cn.com"],
      "insecure-registries": [ "registry服務器:5000"]
    }
    複製代碼

    添加私有鏡像服務器的地址,注意書寫格式爲json,有嚴格的書寫要求,而後重啓docker服務:
    # systemctl restart docker
    再次上傳:

    # docker push registry服務器:5000/nginx
    The push refers to repository [registry服務器:5000/nginx]
    d7acf794921f: Pushed
    d9569ca04881: Pushed
    cf5b3c6798f7: Pushed
    kurisu: digest: sha256:079aa93463d2566b7a81cbdf856afc6d4d2a6f9100ca3bcbecf24ade92c9a7fe size: 948
    複製代碼
  5. 測試下載鏡像
    上傳測試沒問題了,咱們接下來測試一下從registry服務器上下載剛纔上傳的busybox鏡像,先刪除node主機上的鏡像:

    # docker rmi -f $(docker images -aq)
    Untagged: registry服務器:5000/nginx:kurisu
    Untagged: registry服務器:5000/nginx@sha256:079aa93463d2566b7a81cbdf856afc6d4d2a6f9100ca3bcbecf24ade92c9a7fe
    Untagged: nginx:latest
    Untagged: nginx@sha256:bdbf36b7f1f77ffe7bd2a32e59235dff6ecf131e3b6b5b96061c652f30685f3a
    Deleted: sha256:719cd2e3ed04781b11ed372ec8d712fac66d5b60a6fb6190bf76b7d18cb50105
    Deleted: sha256:e9b6506fb887de50972aefd99d7c5eb56b1a8e757ed953cdfecb86b5359bcb22
    Deleted: sha256:55d9d9692a9615a28d183a42bc3881a72a39393feba3664e669e7affb78daa76
    Deleted: sha256:cf5b3c6798f77b1f78bf4e297b27cfa5b6caa982f04caeb5de7d13c255fd7a1e
    複製代碼

    查看一下node主機上的鏡像所有刪除了:

    # docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    複製代碼

    而後,從registry服務器上下載nginx鏡像:

    # docker pull registry服務器:5000/nginx:kurisu
    kurisu: Pulling from nginx
    fc7181108d40: Pull complete
    c4277fc40ec2: Pull complete
    780053e98559: Pull complete
    Digest: sha256:079aa93463d2566b7a81cbdf856afc6d4d2a6f9100ca3bcbecf24ade92c9a7fe
    Status: Downloaded newer image for registry服務器:5000/nginx:kurisu
    複製代碼

    查看node主機上的鏡像:

    # docker images
    REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
    registry服務器:5000/nginx   kurisu              719cd2e3ed04        2 weeks ago         109MB
    複製代碼

查看遠程倉庫鏡像

  • 列出全部鏡像:
# curl http://registry服務器:5000/v2/_catalog

{"repositories":["nginx"]}
複製代碼
  • 列出nginx鏡像有哪些tag:
# curl http://registry服務器:5000/v2/nginx/tags/list

{"name":"nginx","tags":["kurisu"]}
複製代碼
相關文章
相關標籤/搜索