close

現場(環境):CentOS 7.4           套件:Docker

 


其實Docker Registry就是Docker 官方提供出來讓我們做私有倉庫的Docker image

我們將Docker套件裝好,再運用他進行相關設定就可以了。

Docker Registry的用途在於儲存&發派Docker image

 


Step 1. 安裝Docker 套件

#yum install docker-io

 

安裝這個docker-io,不要安裝docker-ce。不然後面操作會有問題

安裝完成就可以啟動Docker 。並設定開啟啟用

#systemctl start docker

#systemctl enable docker

 


Step 2. 安裝nginx

要使用nginx提供的安全驗證功能,就必須要有地方放帳號&密碼

而這個帳號密碼在CentOS我們透過http-tools建立。

這邊分享一個尋找指令的好方法

#yum provides [指令]

 

這邊我們要尋找htpasswd這個指令

#yum provides htpasswd

可以找到在httpd-tools這個套件中

 

#yum install httpd-tools

安裝Nginx  & Docker Redistry

Nginx  :  要用他做Proxy的功能導向頁面

# yum install nginx

 


Step 3. 建立Docker registry Container

這邊需要將image 掛載到實體路徑上來。

所以要創建data資料夾,用來掛載。

#mkdir -p /opt/dockerRegistry/data

conf資料夾是用來放帳密&未來的憑證之用。(選用,我是沒有用)

#mkdir -p /opt/dockerRegistry/conf

#docker run -d -p 5000:5000 -v /opt/dockerRegistry/data:/data --name dockerRegistry docker.io/registry:2

 

檢查下Docker image

#docker image list

 


Step 4. 設定訪問Nginx htpasswd

因為這邊沒有打算讓其他人直接連結TCP:5000 ,造成Dokcer Image外洩。

所以要用Proxy反向代理的方式做驗證,並且將PORT導到80

這邊要先設定登入驗證密碼的部份

-c 表示首次創立,要建立檔案的意思

公式:htpasswd -c 檔案路徑 [創建帳號]

#htpasswd -c /opt/dockerRegistry/registry.htpasswd quentin

這樣就完成一個帳號的建立

 

可以看到檔案內有帳號 & 加密的密碼

 

要建立第二個就不用 -c ,因為-c用在建立檔案(第一次)

如果檔案已經存在。就不用-c

#htpasswd /opt/dockerRegistry/registry.htpasswd joe

 

 


Step 5. Client 端設定指向 Docker Registry

在使用Nginx 導向&驗證之前,我們來測試一下Docker Registry的運作狀況。

透過Client來設定Docker Registry指向位置。

 

方法1: (使用方法1最後的作法)

這個方式測試後無法啟動服務。

修改 docker文件配置,

CentOS7當中,如果安裝的是docker-ce 而不是docker-io

那設定檔文件就不會在/etc/sysconfig/docker or /etc/default/docker下面。

而是要想辦法設定/usr/lib/systemd/system/docker.service

網路資料說針對ExecStart 這邊做調整

原本只是/usr/bin/dockerd

若這裡要改成連接到私有倉庫的話,

# ExecStart=/usr/bin/docker daemon -H fd:// --insecure-registry 172.16.130.139:5000

 

接著重啟Docker Service

#systemctl daemon-reload  && systemctl restart docker

這邊就會服務啟動錯誤。

 

之後再次測試,改成下面方式,重啟服務就可以了

# ExecStart=/usr/bin/dockerd --insecure-registry 172.16.130.139:5000

 


方法2:  (測試成功)

Docker Registry 設定成insecure

#vim /etc/docer/daemon.json  (如果失敗,直接設定/etc/sysconfig/docker就好)

原本的內容只有 {}

修改成{ "insecure-registries":["172.16.130.138:5000"] }

修改完後重啟Docker

#systemctl restart docker

參考網頁: https://legacy.gitbook.com/book/ljhcj/mynote/details

 

#vim /etc/sysconfig/docker (可以設定)

把原本的OPTIONS註解,修改為下面的設定。

後面172.16.130.138:5000 為這邊這次主機的IP位址&Port

如果導向是是https網址也可以輸入(https://xxx.it001.com)

=!====

OPTIONS='--selinux-enabled --insecure-registry 172.16.130.138:5000'

====!=

上面設定好之後,就可以使用tag的方法上傳。

 

假設 docker.io 是我們設計好的dokcer image

(其實是用docker pull ubuntu抓回來的)

透過image list檢查就可以看到它(ubuntu)存在本機端這邊的列表

#docker image list

 

接著要準備上傳

將製作好的docker image [docker.io]修改成[ IP o r網址]的格式,

#docker tag docker.io/ubuntu 172.16.130.138:5000/ubuntu

接著直接使用push image 推上該推上去的地方

#docker push  172.16.130.138:5000/ubuntu

 

最後在docker registry檢查一下,檔案是否正確上傳。

@Server

# curl 172.16.130.138:5000/v2/_catalog

可以看到ubuntu確實已經被我們推上Docker Registry

 

這是最簡單的上傳方式。

 

就是當docker Registry建立好之後就可以這樣直接使用。

如果沒有在/etc/docker/daemon.json 或者 /etc/sysconfig/docker 設定好的話

會出下面的錯誤。

 

反之有設定正確的話,就可以正常的上傳。

 

@Server端檢查

接著我們就要試著使用nginx 驗證&代理導向Port的方式來進行。

 


Step 6.設定 nginx

 

# vim /etc/nginx/nginx.conf

upstream 部份是指設定原來的IP(網址) + Port

(也就是被proxy代理修改前的網址)

upstream 後面的 webserver是可以自行定義名稱的。

 

這邊如果有多台Docker Registry 可以依序設定在upstream裡面,

這樣就可以透過nginx 達到LoadBalance的效果。

因為這邊要導向的是本機端。所以可以設定127.0.0.1

 

=!===

 upstream dockerservice {

      server 127.0.0.1:5000;

       }

===!=

 

導向方面。主要是針對Server內的location做設定

 

有一個重點server_name 一定要輸入,沒有的話服務啟動會失敗。

(輸入網址 or IP都可以,如果是要用https就一定是要網址

 

auth_basic 表示驗證時的提示訊息

auth_basic_user_file 表示驗證的檔案再哪,這邊是透過htpasswd做出來的。

proxy_pass 就是導向那邊 (這邊沒有網址。就直接導向原本的IP。主要只是為了導Port

 

先將http (80 Port全部導向https)

 

重點是做return 301那一行。

 

=!===

    server {

        listen       80 default_server;

        #listen       [::]:80 default_server;

        server_name  xxx.it001.com;

        #root         /usr/share/nginx/html;

 

        # Load configuration files for the default server block.

        #include /etc/nginx/default.d/*.conf;

 

        return 301 https://$server_name$request_uri;

===!=

 

設定https服務,並且進行導頁的動作

=!===

# 這邊是進行https設定的地方

    server {

        listen       443 ssl http2 default_server;

#        listen       [::]:443 ssl http2 default_server;

        server_name  xxx.it001.com;

#        root         /usr/share/nginx/html;

#

        ssl_certificate "/etc/nginx/server.chain.cer";

        ssl_certificate_key "/etc/nginx/server.key";

        ssl_session_cache shared:SSL:1m;

        ssl_session_timeout  10m;

        ssl_ciphers HIGH:!aNULL:!MD5;

        ssl_prefer_server_ciphers on;

#

#        # Load configuration files for the default server block.

#        include /etc/nginx/default.d/*.conf#;

#

 

        location / {

         if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*\$" ) {

            return 404;

        }

#這一塊主要再進行登入驗證作業

        auth_basic "Registry";

        auth_basic_user_file  /opt/dockerRegistry/conf/registry.htpasswd;

        add_header Docker-Distribution-Api-Version  registry/2.0    always;

 

#這一塊proxy進行的就是導到dockerservice(localhost:5000)的設定

        proxy_pass http://dockerservice;

        proxy_set_header  Host              $http_host;

        proxy_set_header  X-Real-IP         $remote_addr;

        proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;

        proxy_set_header  X-Forwarded-Proto $scheme;

        proxy_read_timeout                  900;

 

        }

 

#        error_page 404 /404.html;

#            location = /40x.html {

#        }

#

#        error_page 500 502 503 504 /50x.html;

#            location = /50x.html {

#        }

    }

}

 

===!=

 

 

# 這邊是進行https設定的地方

 

#這一塊主要再進行登入驗證作業

 

#這一塊proxy進行的就是導到dockerservice(localhost:5000)的設定

 

在這個server之外,還有更重要的。就是上層http的設定。

 

===!=

http {

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

 

    access_log  /var/log/nginx/access.log  main;

 

    sendfile            on;

    tcp_nopush          on;

    tcp_nodelay         on;

    keepalive_timeout   65;

    types_hash_max_size 2048;

 

    include             /etc/nginx/mime.types;

    default_type        application/octet-stream;

 

    include /etc/nginx/conf.d/*.conf;

    client_max_body_size 0;

    chunked_transfer_encoding on;

 

=!===

如果沒有設定好。縱使你可以登入。也無法正確的上傳

 

如果沒有在http{}內設定好上面的設定。會出現如下方 413的存取錯誤。

 

把設定值加進去就可以解決了。

參考網址:http://blog.51cto.com/tntdba/1732696

參考網址內有說到。沒有設定這兩個項目會出現什麼樣的錯誤訊息。

 

=!===

#disable any limits to avoid HTTP 413 for large image uploads

client_max_body_size 0;

 

#required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486)

chunked_transfer_encoding on;

===!=

剛好我們的413錯誤就是沒有設定  client_max_body_size 0; 這個參數。

 


這邊設定完成後重啟Nginx就可以進行登入驗證。

#systemctl restart nginx

直接用https://[網域]/v2/_catalog 在瀏覽器上查看,

會發現要使用帳密登入,而已轉https已經成功。

(圖片中式已經先push兩個docker image的畫面。)

 

若是發現一直轉不過去,在LOG中看到下方訊息。

 

#vim /var/log/nginx/error.log

 

=!===

(13: Permission denied) while connecting to upstream

===!=

 

只要出現13:Permission denied 就可以確定是SELINUX權限設定沒有開啟導致。

最簡單的方法就是把Seliunx關掉,就會一切正常。

如果不要關掉Selinux的話,輸入下列布林指令。

#setsebool -P httpd_can_network_connect 1
這樣就可以開啟權限了。

 

下圖為被Selinux阻擋後會出現的畫面。

 

 

https設定完成後。我們要再回頭修改  #vim /etc/sysconfig/docker

將原本的5000改成導向https網址(https://xxx.it001.com)

=!====

OPTIONS='--selinux-enabled --insecure-registry https://xxx.it001.com'

====!=

 

重啟服務後,嘗試登入並Push Docker image

#systemctl restart docker

push的方法一樣要先用tag

#docker tag [本機docker image] [網址/docker image]

EX:   #docker tag centos xxx.it001.com/centos

接著就可以上傳了。

#docker push xxx.it001.com/centos

 

建置方面到這邊算是完成了。

但是在建立Docker Registry時,使用的憑證一定要外部核發過的才行。

不然會一直出現docker login 失敗的狀況。

這邊需要多注意。

 

<本篇完>

 


參考網址:

https://docs.docker.com/install/linux/docker-ce/centos/

https://blog.gtwang.org/linux/centos-linux-7-install-docker-tutorial/

https://blog.csdn.net/xingwangc2014/article/details/50449851

http://www.it610.com/article/3383038.htm

http://bluedest.iteye.com/blog/740302

https://blog.csdn.net/farYang/article/details/75949611

https://blog.csdn.net/kozazyh/article/details/79795559

https://my.oschina.net/yyflyons/blog/656280

 

arrow
arrow
    全站熱搜

    IT001 發表在 痞客邦 留言(0) 人氣()