現場(環境):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