Docker-registry-v2+Nginx私有倉(cāng)庫搭建

本例子使用兩臺(tái)centos7服務(wù)器作為測(cè)試

node1:192.168.56.102

registry沒有認(rèn)證方式的啟動(dòng)

使用域名搭建https的私有倉(cāng)庫

1毫炉、node1作為私服服務(wù)器,配置主機(jī)hosts映射

192.168.56.102 abiao.com

既然使用https,那么我們需要生成證書,本文講解的是使用openssl自簽名證 書,當(dāng)然也可以使用諸如 Let’s Encrypt 等工具生成證書,首先在node1機(jī) 器上生成生成密鑰文件::

[root@iz51hzu4zdjgpnz ~]# mkdir -p /srv/data/registry/certs
[root@iz51hzu4zdjgpnz ~]# cd /srv/data/registry/certs
[root@iz51hzu4zdjgpnz certs]# openssl req -newkey rsa:4096 -nodes 
-sha256 -keyout ./abiao.key -x509 -days 365 -out ./abiao.crt

輸入信息

Country Name (2 letter code) [XX]:86 State or Province Name (full name) []:Beijing
Locality Name (eg, city) [Default City]:Changping
Organization Name (eg, company) [Default Company Ltd]:foo
Organizational Unit Name (eg, section) []:bar 
Common Name (eg, your name or your server's hostname) []:abiao.com
Email Address []:xxxxx@xxx.com

這樣自簽名證書就制作完成了茧痒。

由于是自簽名證書,默認(rèn)是不受Docker信任的,故而需要將證書添加到Docker 的根證書中,Docker在CentOS 7中,證書存放路徑是 :

node1 端:

[root@iz51hzu4zdjgpnz certs]# mkdir -p /etc/docker/certs.d/abiao.com:5000
[root@iz51hzu4zdjgpnz certs]# cp abiao.crt /etc/docker/certs.d/abiao.com:5000/

制作registry2 的docke-compose.yml文件

[root@iz51hzu4zdjgpnz certs]# mkdir -p /srv/docker-compose/registry
[root@iz51hzu4zdjgpnz certs]# cd /srv/docker-compose/registry/
[root@iz51hzu4zdjgpnz certs]# vim docker-compose.yml

docker-compose.yml的詳情如下:

version: '2.0'

services: 
    server-registry:
        restart:  unless-stopped
        image: docker.io/registry:2.6.2
        ports: 
            - 5000:5000
        environment:
            REGISTRY_HTTP_TLS_CERTIFICATE: /certs/abiao.crt
            REGISTRY_HTTP_TLS_KEY: /certs/abiao.key
        volumes:
            - /srv/data/registry/registry-data:/var/lib/registry
            - /srv/data/registry/certs:/certs       

啟動(dòng)registry2容器

[root@iz51hzu4zdjgpnz registry]# docker-compose up -d

測(cè)試一下

[root@iz51hzu4zdjgpnz registry]# docker pull hello-world
[root@iz51hzu4zdjgpnz registry]# docker tag docker.io/hello-world abiao.com:5000/hello-world
[root@iz51hzu4zdjgpnz registry]# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos             latest              e934aafc2206        4 weeks ago         199 MB
docker.io/docker             latest              cf0bbd4500c6        6 weeks ago         135 MB
docker.io/registry           2.6.2               d1fd7d86a825        3 months ago        33.3 MB
abiao.com:5000/hello-world   latest              f2a91732366c        5 months ago        1.85 kB
docker.io/hello-world        latest              f2a91732366c        5 months ago        1.85 kB

將剛tag的鏡像上傳至私有倉(cāng)庫

[root@iz51hzu4zdjgpnz certs]# docker push abiao.com:5000/hello-world
The push refers to a repository [abiao.com:5000/hello-world]
f999ae22f308: Pushed 
latest: digest: sha256:8072a54ebb3bc136150e2f2860f00a7bf45f13eeb917cca2430fcd0054c8e51b size: 524

在node0上進(jìn)行測(cè)試

<pre>docker pull lhdocker.com/kitematic/hello-world-nginx</pre>

![image](http://upload-images.jianshu.io/upload_images/10149265-608cabbb46b02ca5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

到這里我們的docker私有倉(cāng)庫就搭建完成了谨朝。

這是沒有認(rèn)證方式的啟動(dòng)方式楼咳。

registry帶有認(rèn)證方式

在很多場(chǎng)景下,我們需要用戶登錄后才能訪問私有倉(cāng)庫,那么我們可以如下操作: 建立在上文生成證書,同時(shí)重啟過Docker服務(wù)的前提下,我們講解一下如何配置:

[root@iz51hzu4zdjgpnz docker-compose]# cd ~
[root@iz51hzu4zdjgpnz ~]# cd /srv/data/registry/
[root@iz51hzu4zdjgpnz registry]# mkdir auth
[root@iz51hzu4zdjgpnz registry]# docker run --entrypoint htpasswd registry:2.2 -Bbn miss 123123 > auth/htpasswd

修改之前的docker-compose.yml文件

version: '2.0'

services: 
    server-registry:
        restart:  unless-stopped
        image: docker.io/registry:2.6.2
        ports: 
            - 5000:5000
        environment:
            REGISTRY_HTTP_TLS_CERTIFICATE: /certs/abiao.crt
            REGISTRY_HTTP_TLS_KEY: /certs/abiao.key
            REGISTRY_AUTH: htppasswd
            REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm  
            REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
        volumes:
            - /srv/data/registry/registry-data:/var/lib/registry
            - /srv/data/registry/certs:/certs
            - /srv/data/registry/auth:/auth

停掉已經(jīng)運(yùn)行的registry容器娃弓,并刪除容器辟汰,運(yùn)行docker-compose命令

[root@iz51hzu4zdjgpnz registry]# docker-compose up -d

這個(gè)時(shí)候再次測(cè)試向私有倉(cāng)庫上傳鏡像

[root@iz51hzu4zdjgpnz certs]# docker push abiao.com:5000/hello-world

不出意外會(huì)出現(xiàn)如下提示

The push refers to a repository [abiao.com:5000/hello-world]
f999ae22f308: Preparing 
no basic auth credentials

在執(zhí)行push操作之前需要登錄一下,輸入上面的用戶和密碼就可以了

[root@iz51hzu4zdjgpnz certs]# docker login abiao.com:5000
Username: miss
Password: 
Login Succeeded

再次執(zhí)行push操作

[root@iz51hzu4zdjgpnz certs]# docker push abiao.com:5000/hello-world
The push refers to a repository [abiao.com:5000/hello-world]
f999ae22f308: Pushed 
latest: digest: sha256:8072a54ebb3bc136150e2f2860f00a7bf45f13eeb917cca2430fcd0054c8e51b size: 524

如果要停止registry服務(wù)列敲,執(zhí)行下面的命令就行了

[root@iz51hzu4zdjgpnz certs]# docker stop registry && docker rm -v registry

httpd-tools工具
docker-registry-htpasswd文件中存儲(chǔ)用戶名和密碼的格式為每一個(gè)用戶名阱佛、密碼對(duì):

user1:password1
user2:password2

password字段存儲(chǔ)的并不是明文帖汞,是使用crypt函數(shù)加密過的字符串,要生成加密后的字符串凑术,可以是htpasswd工具翩蘸。在Centos中年由httpd-tools提供。
安裝httpd-tools

yum install httpd-tools -y

我們?cè)囍趧?chuàng)建一個(gè)用戶淮逊,并添加加密

[root@iz51hzu4zdjgpnz registry]# htpasswd auth/htpasswd wang
New password: 
Re-type new password: 
Adding password for user wang
//這樣我們便添加了一個(gè)用戶‘wang’催首,并設(shè)置了密碼扶踊。

用添加的這個(gè)用戶登錄,發(fā)現(xiàn)登錄并不會(huì)成功郎任,研究發(fā)現(xiàn)容器內(nèi)的驗(yàn)證機(jī)制與宿主機(jī)不一致秧耗,可以用nginx代理轉(zhuǎn)發(fā)來解決這個(gè)問題

Nginx+registry代理轉(zhuǎn)發(fā)搭建私有倉(cāng)庫

具體步驟

1、編寫docker-compose文件

version: '2.0'

services:
    registry:
      restart:  always
      image: library/registry:2.3.1 
      volumes:
        - /srv/data/registry/registry-data:/var/lib/registry
      ports:
        - 5000:5000
        - 5001:5001 # required to access debug service

    nginx:
     restart:  always
     image: nginx:1.10.1
     environment:
        REGISTRY_HOST: "docker-registry" 
        REGISTRY_PORT: "5000"
        SERVER_NAME: "localhost"

     links:
        - registry
     volumes:
        - /srv/data/nginx/conf/docker-registry.htpasswd:/etc/nginx/.htpasswd:ro
        - /srv/data/nginx/conf/conf.d:/etc/nginx/conf.d
        - /srv/data/registry/certs:/etc/nginx/ssl:ro
     ports:
       - 443:443

注意:先要在宿主機(jī)中新建.htpasswd文件舶治,然后掛載到容器中去分井,筆者的文件創(chuàng)建在/srv/data/nginx/conf/目錄下。

2霉猛、編寫registry.conf配置文件

upstream docker-registry {               
       server 192.168.56.101:5000;                
       }

    server {
       listen 443 ssl;
       server_name docker-registry;

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

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

       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_set_header X-Original-URI $request_uri;
       proxy_set_header Docker-Distribution-Api-Version registry/2.0;

       location / {
         auth_basic "please input username/password";
         auth_basic_user_file /etc/nginx/.htpasswd;
         proxy_pass http://docker-registry;
       }

        error_page 404 /404.html;
           location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
     }

在宿主機(jī)/srv/data/nginx/conf/目錄下尺锚,新建conf.目錄,將registry.conf放入conf.d目錄下惜浅,再將宿主機(jī)的該目錄掛載到容器中瘫辩,如上的docker-compose.yml文件所示。

3坛悉、驗(yàn)證

用curl命令驗(yàn)證伐厌,查詢成功,容器中的鏡像是之前上傳的(倉(cāng)庫的掛載文件夾依舊是原來的)

[root@iz51hzu4zdjgpnz certs]$ curl --cacert abiao.crt --user 
miss:123 https://abiao.com:443/v2/_catalog
{"repositories":["hello-world"]}

用不存在的用戶等一下裸影,可以發(fā)現(xiàn)提示用戶不認(rèn)證不通過

[root@iz51hzu4zdjgpnz conf]# docker login abiao.com
Username: wulei
Password: 
Error response from daemon: Get https://abiao.com/v1/users/: x509: certificate signed by unknown authority

新建一個(gè)用戶

[root@iz51hzu4zdjgpnz conf]# cd /srv/data/nginx/conf/
[root@iz51hzu4zdjgpnz conf]# htpasswd docker-registry.htpasswd chen
New password: 
Re-type new password: 
Adding password for user chen
//這樣我們便添加了一個(gè)用戶‘chen’弧械,并設(shè)置了密碼。

用創(chuàng)建的用戶來登錄

[root@iz51hzu4zdjgpnz abiao.com:5000]# docker login abiao.com
Username: chen
Password: 
Login Succeeded

向私有倉(cāng)庫上傳鏡像

//先打tag
[root@iz51hzu4zdjgpnz ~]$ docker tag docker.io/hello-world abiao.com/abiao/happy-world
//abiao.com/abiao/happy-world表示空民,上傳到abiao.com的鏡像庫刃唐,鏡像庫空間標(biāo)識(shí)為abiao,鏡像名稱為happy-world
//上傳鏡像
[root@iz51hzu4zdjgpnz ~]$ docker push abiao.com/abiao/happy-world

瀏覽器端查看界轩,由于是自簽名證書画饥,故需要添加安全信任,注意訪問方式是https

用戶認(rèn)證浊猾,輸入用戶名和密碼

圖片.png

如下所示抖甘,請(qǐng)求/v2/_catalog可查看到私有倉(cāng)庫鏡像

至此,搭建完成葫慎,希望文章能給正在學(xué)習(xí)搭建docker私有倉(cāng)庫的同學(xué)提供幫助衔彻。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市偷办,隨后出現(xiàn)的幾起案子艰额,更是在濱河造成了極大的恐慌,老刑警劉巖椒涯,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柄沮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)祖搓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門狱意,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拯欧,你說我怎么就攤上這事详囤。” “怎么了镐作?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵纬纪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我滑肉,道長(zhǎng)包各,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任靶庙,我火速辦了婚禮问畅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘六荒。我一直安慰自己护姆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布掏击。 她就那樣靜靜地躺著卵皂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪砚亭。 梳的紋絲不亂的頭發(fā)上灯变,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音捅膘,去河邊找鬼添祸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛寻仗,可吹牛的內(nèi)容都是我干的刃泌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼署尤,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼耙替!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起曹体,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤俗扇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后混坞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狐援,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年究孕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了啥酱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡厨诸,死狀恐怖镶殷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情微酬,我是刑警寧澤绘趋,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站颗管,受9級(jí)特大地震影響陷遮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜垦江,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一帽馋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧比吭,春花似錦绽族、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赏表,卻和暖如春检诗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓢剿。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工岁诉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人跋选。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓涕癣,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親前标。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坠韩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容