中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

docker內網私服怎么搭建

發布時間:2022-05-20 15:02:56 來源:億速云 閱讀:156 作者:iii 欄目:大數據

這篇文章主要介紹“docker內網私服怎么搭建”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“docker內網私服怎么搭建”文章能幫助大家解決問題。

1. docker registry 說明

官方提供了docker hub網站來作為一個公開的集中倉庫。然而,本地訪問docker hub速度往往很慢,并且很多時候我們需要一個本地的私有倉庫只供網內使用。

docker倉庫實際上提供兩方面的功能,一個是鏡像管理,一個是認證。前者主要由項目來實現,通過http服務來上傳下載;后者可以通過docker-index(閉源)項目或者利用現成認證方案(如nginx)實現http請求管理。

docker-registry既然也是軟件應用,自然最簡單的方法就是使用官方提供的已經部署好的鏡像registry。官方文檔中也給出了建議,直接運行sudo docker run -p 5000:5000 registry命令。這樣確實能啟動一個registry服務器,但是所有上傳的鏡像其實都是由docker容器管理,放在了/var/lib/docker/….某個目錄下。而且一旦刪除容器,鏡像也會被刪除。因此,我們需要想辦法告訴docker容器鏡像應該存放在哪里。registry鏡像中啟動后鏡像默認位置是/tmp/registry,因此直接映射這個位置即可,比如到本機的/opt/data/registry目錄下。

2. 在centos上搭建docker私服

2.1 安裝docker-registry

方法有多種,直接運行下面的命令:

復制代碼 代碼如下:

# docker run -d -e settings_flavor=dev -e storage_path=/tmp/registry -v /opt/data/registry:/tmp/registry  -p 5000:5000 registry

如果本地沒有拉取過docker-registry,則首次運行會pull registry,運行時會映射路徑和端口,以后就可以從/opt/data/registry下找到私有倉庫都存在哪些鏡像,通過主機的哪個端口可以訪問。

你也可以把項目  克隆到本地,然后使用dockerfile來build鏡像:

# git clone https://github.com/docker/docker-registry.git
# cd docker-registry && mkdir -p /opt/data/registry
# docker build -t "local-sean" .

build完成后,就可以運行這個docker-registry

我們先配置自己的config.yml文件,第一種方法是直接在run的時候指定變量

# cp config/config_sample.yml /opt/data/registry/config.yml
# vi /opt/data/registry/config.yml
##這里可以設置本地存儲settings_flavor=dev,local storage_path:/tmp/registry等待

# docker run -d -v /opt/data/registry:/tmp/registry -p 5000:5000 -e docker_registry_config=/tmp/registry/config.yml registry
或
docker run -d -e settings_flavor=dev -e storage_path=/tmp/registry -v /db/docker-images:/tmp/registry -p 5000:5000 registry

2.2 客戶端使用

要從私服上獲取鏡像或向私服提交鏡像,現在變得非常簡單,只需要在倉庫前面加上私服的地址和端口,形如172.29.88.222:5000/centos6。注意,這里可以選擇不使用ip,而是用hostname,如registry.domain.com:5000,但不能僅用不帶.的主機名registry,docker會認為registry是用戶名,建議使用帶域名的hostname加port來表示。

于是在另外一臺要使用docker的主機上就可以通過這臺私服拉取和推送鏡像了:

從私服上搜索存在哪些可用鏡像

復制代碼 代碼如下:

# curl -x get
{"num_results": 2, "query": "", "results": [{"description": "", "name": "library/centos6"}, {"description": "", "name": "library/nginx"}]}

按條件搜索nginx

# curl -x get http://sean.domain.com:5000/v1/search?q=centos6

拉取image到本地

docker pull library/centos6

## 本地對份鏡像啟動起來,形成container
## 給container去另外一個名字
# docker tag 68edf809afe7 registry.domain.com:5000/centos6-test

## 最后將新的docker images推送到私服上
docker push registry.domain.com:5000/centos6-test

第一次push到私服上時會提示用戶名、密碼和郵箱,創建即可。也可以在docker私服端加入認證機制。

3. 加入nginx認證

(請在實際操作以前,先閱讀完本節,再確定是否在前端加入nginx)

3.1 安裝及配置nginx

從上面的過程可以看到,除非防火墻限制,否則任何主機可以創建賬號并想私服推送鏡像,更安全的做法是在外層加入登錄認證機制。

最好安裝1.4.x版本,不然下面的有些配置可能會不兼容

# yum install nginx

創建兩個登錄用戶

# htpasswd -c /etc/nginx/docker-registry.htpasswd sean
new password: 
re-type new password: 
adding password for user sean

# htpasswd /etc/nginx/docker-registry.htpasswd itsection

為了讓nginx使用這個密碼文件,并且轉發8080端口的請求到docker registry,新增nginx配置文件
vi /etc/nginx/sites-enabled/docker-registry:

# for versions of nginx > 1.3.9 that include chunked transfer encoding support
# replace with appropriate values where necessary

upstream docker-registry {
 server localhost:5000;
}

server {
 listen 8080;
 server_name sean.domain.com; -- your registry server_name

 # ssl on;
 # ssl_certificate /etc/ssl/certs/docker-registry;
 # ssl_certificate_key /etc/ssl/private/docker-registry;

 proxy_set_header host  $http_host; # required for docker client sake
 proxy_set_header x-real-ip $remote_addr; # pass on real client ip

 client_max_body_size 0; # disable any limits to avoid http 413 for large image uploads

 # required to avoid http 411: see issue #1486 (https://github.com/dotcloud/docker/issues/1486)
 chunked_transfer_encoding on;

 location / {
  # let nginx know about our auth file
  auth_basic    "restricted";
  auth_basic_user_file docker-registry.htpasswd;

  proxy_pass http://docker-registry;
 }
 location /_ping {
  auth_basic off;
  proxy_pass http://docker-registry;
 } 
 location /v1/_ping {
  auth_basic off;
  proxy_pass http://docker-registry;
 }
}

讓nginx來使用這個virtual-host

# ln -s /etc/nginx/sites-enabled/docker-registry /etc/nginx/conf.d/docker-registry.conf

重啟nginx來激活虛擬主機的配置

# service nginx restart

3.2 加入認證后使用docker-registry

此時主機的5000端口應該通過防火墻禁止訪問(或者在docker run端口映射時只監聽回環接口的ip -p 127.0.0.1:5000:5000)。

# curl localhost:5000
"docker-registry server (dev) (v0.8.1)"

如果直接訪問訪問將得到未授權的信息:

# curl localhost:8080
<html>
<head><title>401 authorization required</title></head>
<body bgcolor="white">
<center><h1>401 authorization required</h1></center>
<hr><center>nginx/1.4.7</center>
</body>
</html>

帶用戶認證的docker-registry:

# curl http://sean:sean@sean.domain.com:8080/v1/search
{"num_results": 2, "query": "", "results": [{"description": "", "name": "library/centos6"}, {"description": "", "name": "library/nginx"}]}

# docker login registry.domain.com:8080
username: sean
password: 
email: zhouxiao@domain.com
login succeeded

# docker pull registry.domain.com:8080/library/centos6

不出意外的話,上面的docker pull會失敗:

# docker pull registry.domain.com:8080/library/centos6
pulling repository registry.domain.com:8080/library/centos6
2014/11/11 21:00:25 could not reach any registry endpoint

# docker push registry.domain.com:8080/ubuntu:sean
the push refers to a repository [registry.domain.com:8080/ubuntu] (len: 1)
sending image list
pushing repository registry.domain.com:8080/ubuntu (1 tags)
2014/11/12 08:11:32 http code 401, docker will not send auth headers over http.

nginx日志
2014/11/12 07:03:49 [error] 14898#0: *193 no user/password was provided for basic 
authenticatget /v1/repositories/library/centos6/tags http/1.1", host: "registry.domain.com:8080"

本文后的第1篇參考文檔沒有出現這個問題,但評論中有提及。

有人說是backend storage的問題,這里是本地存儲鏡像,不應該。經過查閱大量資料,并反復操作驗證,是docker-registry版本的問題。從v0.10.0開始,docker login雖然succeeded,但pull或push的時候,~/.dockercfg下的用戶登錄信息將不允許通過http明文傳輸。(如果你愿意可以查看v0.10.0的源碼 registry.go,在分支v0.9.1及以前是沒有http code 401, docker will not send auth headers over http的)

目前的辦法三個:

  1. 撤退,這就是為什么先說明在操作前線查看到這的原因了

  2. 換成v0.9.1及以下版本。現在都v1.3.1了,我猜你不會這么做

  3. 修改源碼session.go,去掉相應的判斷行,然后git下來重新安裝。我猜你更不會這么做

  4. 安裝ssl證書,使用https傳輸。這是明智的選擇,新版本docker也推薦我們這么做,往下看。

3.3 為nginx安裝ssl證書

首先打開nginx配置文件中ssl的三行注釋

# vi /etc/nginx/conf.d/docker-registry.conf
...
server {
 listen 8000;
 server_name registry.domain.com;


 ssl on;
 ssl_certificate /etc/nginx/ssl/nginx.crt;
 ssl_certificate_key /etc/nginx/ssl/nginx.key;
...

保存之后,nginx會分別從/etc/nginx/ssl/nginx.crt和/etc/nginx/ssl/nginx.key讀取ssl證書和私鑰。如果你自己愿意花錢買一個ssl證書,那就會變得非常簡單,把證書和私鑰拷貝成上面一樣即可。關于ssl以及簽署ssl證書,請參考其他文章。

這里我們自簽署一個ssl證書,把當前系統作為(私有)證書頒發中心(ca)。

創建存放證書的目錄

# mkdir /etc/nginx/ssl
確認ca的一些配置文件
 
# vi /etc/pki/tls/openssl.cnf
...
[ ca_default ]

dir    = /etc/pki/ca   # where everything is kept
certs   = $dir/certs   # where the issued certs are kept
crl_dir   = $dir/crl    # where the issued crl are kept
database  = $dir/index.txt  # database index file.
#unique_subject = no     # set to 'no' to allow creation of
          # several ctificates with same subject.
new_certs_dir = $dir/newcerts   # default place for new certs.

certificate  = $dir/cacert.pem  # the ca certificate
serial   = $dir/serial   # the current serial number
crlnumber  = $dir/crlnumber  # the current crl number
          # must be commented out to leave a v1 crl
crl    = $dir/crl.pem   # the current crl
private_key  = $dir/private/cakey.pem # the private key
randfile  = $dir/private/.rand # private random number file
...
default_days = 3650     # how long to certify for
...
[ req_distinguished_name ]
countryname      = country name (2 letter code)
countryname_default    = cn
countryname_min     = 2
countryname_max     = 2

stateorprovincename    = state or province name (full name)
stateorprovincename_default  = gd
...[ req_distinguished_name ]部分主要是頒證時一些默認的值,可以不動

(1) 生成根密鑰

# cd /etc/pki/ca/
# openssl genrsa -out private/cakey.pem 2048

為了安全起見,修改cakey.pem私鑰文件權限為600或400,也可以使用子shell生成( umask 077; openssl genrsa -out private/cakey.pem 2048 ),下面不再重復。

(2) 生成根證書

# openssl req -new -x509 -key private/cakey.pem -out cacert.pem

會提示輸入一些內容,因為是私有的,所以可以隨便輸入,最好記住能與后面保持一致。上面的自簽證書cacert.pem應該生成在/etc/pki/ca下。

(3) 為我們的nginx web服務器生成ssl密鑰

# cd /etc/nginx/ssl
# openssl genrsa -out nginx.key 2048

我們的ca中心與要申請證書的服務器是同一個,否則應該是在另一臺需要用到證書的服務器上生成。

(4) 為nginx生成證書簽署請求

 # openssl req -new -key nginx.key -out nginx.csr
...
country name (2 letter code) [au]:cn
state or province name (full name) [some-state]:gd
locality name (eg, city) []:sz
organization name (eg, company) [internet widgits pty ltd]:company
organizational unit name (eg, section) []:it_section
common name (e.g. server fqdn or your name) []:your.domain.com
email address []:

please enter the following 'extra' attributes
to be sent with your certificate request
a challenge password []:
an optional company name []:
...

同樣會提示輸入一些內容,其它隨便,除了commone name一定要是你要授予證書的服務器域名或主機名,challenge password不填。

(5) 私有ca根據請求來簽發證書

# openssl ca -in nginx.csr -out nginx.crt

上面簽發過程其實默認使用了-cert cacert.pem -keyfile cakey.pem,這兩個文件就是前兩步生成的位于/etc/pki/ca下的根密鑰和根證書。

到此我們已經擁有了建立ssl安全連接所需要的所有文件,并且服務器的crt和key都位于配置的目錄下,唯有根證書cacert.pem位置不確定放在centos6下的哪個地方。

經驗證以下幾個位置不行:(adding trusted root certificates to the server)
/etc/pki/ca-trust/source/anchors、/etc/pki/ca-trust/source、/etc/pki/ca-trust/extracted、
/etc/pki/ca-trust/extracted/pem/、/etc/pki/tls/certs/cacert.crt

都會報錯:

# docker login https://registry.domain.com:8000
username (sean): sean
2014/11/14 02:32:48 error response from daemon: invalid registry endpoint: get https://registry.domain.com:8000/v1/_ping: x509: certificate signed by unknown authority

# curl https://sean:sean@registry.domain.com:8000/
curl: (60) peer certificate cannot be authenticated with known ca certificates
more details here: http://curl.haxx.se/docs/sslcerts.html
curl performs ssl certificate verification by default, using a "bundle"
 of certificate authority (ca) public keys (ca certs). if the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
if this https server uses a certificate signed by a ca represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the url).
if you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

(6) 目前讓根證書起作用的只發現一個辦法: 

# cp /etc/pki/tls/certs/ca-bundle.crt{,.bak} 備份以防出錯
# cat /etc/pki/ca/cacert.pem >> /etc/pki/tls/certs/ca-bundle.crt

# curl https://sean:sean@registry.domain.com:8000
"docker-registry server (dev) (v0.8.1)"

cacert.pem根證書追加到ca-bundle.crt后一定要重啟docker后臺進程才行。

如果docker login依然報錯certificate signed by unknown authority,參考running docker with https,啟動docker后臺進程時指定信任的ca根證書:

 # docker -d --tlsverify --tlscacert /etc/pki/ca/cacert.pem

或者將cacert.pem拷貝到~/.docker/ca.pem
# mkdir ~/.docker && cp /etc/pki/ca/cacert.pem ~/.docker/ca.pem
# docker -d
最好重啟一下registry
# docker restart <registry_container_id>

上面用“如果”是因為一開始總提示certificate signed by unknown authority,有人說將根證書放在/etc/docker/certs.d下,還有人說啟動docker daemon收加入--insecure-registry .. 但終究是因為版本差異不成功。但后來又奇跡般的不需要--tlscacert就好了。
這個地方掙扎了很久,重點關注一下這個下面幾個issue:




(7) 最終搞定:

# docker login https://registry.domain.com:8000
username: sean
password: 
email: zhouxiao@domain.com
login succeeded

# curl https://sean:sean@registry.domain.com:8000
"docker-registry server (dev) (v0.8.1)"

# docker push registry.domain.com:8000/centos6:test_priv
the push refers to a repository [registry.domain.com:8000/centos6] (len: 1)
sending image list
pushing repository registry.domain.com:8000/centos6 (1 tags)
511136ea3c5a: image successfully pushed 
5b12ef8fd570: image successfully pushed 
68edf809afe7: image successfully pushed 
40627956f44c: image successfully pushed 
pushing tag for rev [40627956f44c] on {https://registry.domain.com:8000/v1/repositories/centos6/tags/test_priv}

但還有一個小問題沒解決,雖然已經可以正常使用,但每次請求在nginx的error.log中還是會有[error] 8299#0: *27 no user/password was provided for basic authentication,應該是這個版本docker暫未解決的bug。

3.3 其它問題

(1) docker后臺進程意外中斷后,重新docker start <container_id>報錯 

# docker start b36bd796bd3d
error: cannot start container b36bd796bd3d: error getting container b36bd796bd3d463c4fedb70d98621e7318ec3d5cd14b2f60b1d182ad3cbcc652 
from driver devicemapper: error mounting '/dev/mapper/docker-253:0-787676-b36bd796bd3d463c4fedb70d98621e7318ec3d5cd14b2f60b1d182ad3cbcc652' 
on '/var/lib/docker/devicemapper/mnt/b36bd796bd3d463c4fedb70d98621e7318ec3d5cd14b2f60b1d182ad3cbcc652': device or resource busy
2014/11/08 15:14:57 error: failed to start one or more containers

經分析產生這個問題的原因是做了一個操作:在docker后臺進程啟動的終端,繼續回車后會臨時退出后臺進程的日志輸出,我就在這個shell下使用yum安裝軟件包,但由于網絡原因yum卡住不動,于是我就另起了一個終端kill了這個yum進程,不知為何會影響到表面已經退出前臺輸出的docker。解決辦法是umount容器的掛載點:(見這里)

# umount /var/lib/docker/devicemapper/mnt/b36bd796bd3d463c4fedb70d98621e7318ec3d5cd14b2f60b1d182ad3cbcc652
# service docker start  正常

能想到的另外一個辦法是,啟動docker后臺進程時,重定向輸出docker -d > /dev/null 2>&1(/var/log/docker已自動記錄了一份日志)。

(2) 配置完nginx的docker-registry.conf后啟動報錯

# service nginx start
[emerg] 14714#0: unknown directive "upstream" in /etc/nginx/conf.d/docker-registry.conf:4

 原因是nginx版本太低,一些配置指令不兼容,使用yum install nginx默認安裝了1.0.x,卸載重新下載nginx-1.4.7-1.el6.ngx.x86_64.rpm安裝解決。

(3) 網絡設置代理問題

pull, push官網的鏡像時由于gfw的原因需要設置代理,但不是http_proxy而是http_proxy,對于docker來說同時設置這兩個值就會出問題,有時出于安裝軟件包的需要設置http_proxy,就會導致沖突。在docker-registry中如果忘記了當前哪一個在起作用,找遍所有問題都發現不了原因,而docker返回給我們的錯誤也難以判斷。切記~

to-do
如何刪除docker-registry的里的鏡像

關于“docker內網私服怎么搭建”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西贡区| 鄂伦春自治旗| 萨嘎县| 南皮县| 关岭| 蒲城县| 日土县| 夏河县| 泸西县| 黄浦区| 海原县| 凤冈县| 双辽市| 景洪市| 嘉善县| 张掖市| 克山县| 龙山县| 务川| 桦川县| 台前县| 台江县| 昭觉县| 大关县| 晴隆县| 萨迦县| 保山市| 山丹县| 漾濞| 阿克苏市| 精河县| 八宿县| 星子县| 景洪市| 永平县| 洛南县| 个旧市| 柘城县| 朝阳区| 巴彦县| 云林县|