1. 程式人生 > >手把手教你搭建Docker Registry私服

手把手教你搭建Docker Registry私服

〇、前言

Build, Ship and Run any App, Anywhere

關於Docker更多的概念將不在本文贅述了,作為虛擬化市場的一顆冉冉升起的新星,Docker得到了越來越多企業的青睞,越來越多的開發者決定擁入Docker的懷抱。

“集裝箱”是Docker設計哲學之所在,它讓一臺物理機(或者虛擬機器)同時執行多個彼此隔離的應用變得更為輕鬆簡單,當然這一切還是多虧Linux的相關底層技術,當然,也包括OS X,Windows這兩個作業系統。

Docker的相關教程已經夠多了,但是由於Docker近年來發展迅猛,版本迭代速度較快,多個版本之間還存在不相容的情況,如果在網上找部落格文章,未必能解決自己遇到的問題。

當然,對於Docker的環境安裝,基礎命令之類的內容,是完全沒有問題的,通讀官網文件內容基本都能順利掌握。然而,當筆者嘗試著搭建一套基於SSL的Docker Registry(官網推薦的做法)卻遇到了不少的麻煩,對於這部分內容,大多數部落格文件內容都是直接跳過了SSL的環節,採用了HTTP的訪問形式。

特此分享,通讀完了此篇文章後,對於搭建Docker Registry就不再是問題了。

> docker --version

Docker version 18.03.1-ce, build 9ee9f40

以上是我的Docker環境,建議安裝Docker1.6+以上版本。

除此之外,讀者還需要:

1、一臺安裝了CentOS_7_64bit作業系統的主機(或者虛擬機器);

2、申請一個域名。不然,可以改HOST檔案,但不保證能成功。筆者在阿里雲申請了一個個人域名,包了5年,價值¥105;

3、如果申請了域名,順便拿一個免費的CA證書,因為需要實現HTTPS訪問,SSL證書是必須的,同樣,阿里雲上有免費證書申請。不然,可以使用OpenSSL自己生成,這也是很多博文所提到的做法,不保證成功;

4、再裝上一個nginx做代理,可選。

5、熟悉Docker的基本概念和常用命令,但不必瞭解Dockerfile,Compose,Swarm,Kubernetes等高階知識。

一、從Docker映象說起

抽象的概念闡述不多說了,筆者舉兩個例子,讓大家感受一下:

1、我們從系統之家下載來的ISO檔案,除了基礎的作業系統,還可能內建了多個預裝軟體;

2、在使用maven管理jar包依賴的時候,為了避免每次都從中央倉庫拉取依賴包,使用了nexus做了代理倉庫。

可以認為,Docker映象就是一系列軟體(檔案)的組合,只要將它們放在合適的宿主上,即可做到開箱即用。

關於本文需要的Docker映象操作,有五個常用的命令:

a、拉取映象,後跟映象倉庫名稱,如果要指定某個版本,可以帶上tag。

> docker pull <repo>[:tag]

b、列出所有映象,能得到映象的相關基本資訊。

> docker images
REPOSITORY                   TAG             IMAGE ID          CREATED        SIZE
redis                       latest          bfcb1f6df2db      3 weeks ago     107MB
registry                      2             d1fd7d86a825      4 months ago    33.3MB
hyper/docker-registry-web   latest          0db5683824d8      19 months ago   599MB

c、刪除映象。可以根據映象ID,或者映象倉庫名稱進行刪除。

> docker rmi <IMAGE ID>/<repo>

d、映象打標。可以將此操作與Git打標進行類比,相當於是release一個可用的映象版本。

> docker tag <repo> <new_repo>[:tag]

e、映象推送。同樣是可以借鑑Git領域的push操作,將打包好的映象推送給遠端倉庫(即為Docker Registry)。

> docker push <new_repo>[:tag]

以上五個命令只做簡單介紹,不是本文的重點。更多映象操作命令,可以自行查閱之。

進行接下來的操作之前,請讀者先將registry映象pull下來。

> docker pull registry:2
2: 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:2

此過程會持續幾分鐘,視網路狀況而定,請讀者耐心等候。

注意:筆者在pull的時候,指定了TAG,即為使用v2版本的registry,對於v1版本的registry,讀者大可不必在意了,基本上是淘汰了。

二、先睹為快

對於急切想看一下Docker Registry執行效果的讀者,可以先閱讀本節內容。

執行如下命令即可:

> docker run -d \
 -p 5000:5000 \
 -v /usr/local/registry:/var/lib/registry \
 --restart=always \
 --name registry \
 registry:2

這是一條典型的run命令,不出意外的話,Registry就在5000埠啟動了。

為了驗證,讀者可以拉取一個busybox映象(因為體積小),進行實驗。

> docker pull busybox

拉取最新的busybox映象後,再給其打標,準備釋出到Registry中。

> docker tag busybox localhost:5000/bosybox:v1.0

最後再推送給Registry。

> docker push localhost:5000/bosybox:v1.0

此時,Registry就有了busybox:v1.0映象了,這時可以不用再去Docker Hub上面拉取了,通過自建的Registry即可。

> docker pull localhost:5000/bosybox:v1.0

如果想檢視遠端倉庫有哪些映象,可以執行如下命令:

> curl http://localhost:5000/v2/_catalog

窺一斑而見全豹,通過以上命令,我們能得出一個重要的結論:

對Registry的訪問都是通過一系列REST API完成的。

到此為止,我們已經搭建了一個Docker Registry的“半成品”,說是“半成品”是因為這個Registry只能在本機正常工作,如果在其他主機上試圖推送映象上來,結果是失敗的。

如果要做到externally-accessible,就必須使用CA安全證書

三、基於SSL證書改造Registry

在進行本節的操作前,請讀者確認是否滿足了文章開頭所列的條件。

筆者申請了一個域名:iwendao.vip,並映射出來了一個二級域名:registry.iwendao.vip,專門用來作為Docker Registry的訪問,然後基於此二級域名申請CA證書。

不出意外的話,從阿里雲申請的免費證書都是由Symantec頒發的,將證書下載下來後,壓縮包內有兩份檔案:xxxxxx.pem、xxxxxx.key。

將其更名為server.key,server.pem,通過ftp工具上傳至主機,假設存放的目錄是:/usr/local/certs。

> ll /usr/local/certs
- rw-r--r-- 1 root root 1678 May 28 13:42 server.key
- rw-r--r-- 1 root root 3662 May 28 13:42 server.pem

因為頒發的是intermediate certificate,會發現沒有crt檔案,可以使用如下命令得到:

> cat server.pem > server.crt

直接將pem檔案內作為crt檔案的內容輸入,生成了server.crt檔案。

至此,域名及其證書已準備就緒。

如果想使用nginx做代理,需要更改一下nginx.conf檔案,以下是筆者的配置內容:

user  root root;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    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  logs/access.log  main;
    sendfile        on;
    keepalive_timeout 60;
    gzip  on;
    server {
        listen 443;
        server_name i-wendao;
        ssl on;
        root html;
        index index.html index.htm;
        ssl_certificate   /usr/local/certs/server.pem;
        ssl_certificate_key  /usr/local/certs/server.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        location ~  {
            proxy_pass_header Server;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Scheme $scheme;
            proxy_pass https://registry;
        }
    }
    upstream registry {
        server 127.0.0.1:5000;
    }
}

在nginx.conf配置檔案中,需要注意兩個地方:

1、開啟nginx的ssl,只需要配置之前下載好的pem和key檔案,這是阿里雲官方給出的示例,親測有效;

2、因為對Registry的訪問都是通過REST API完成的,而且是HTTPS的訪問協議,所以location節點的配置中,proxy_pass配置的是https://registry,如果配置成http://registry,一旦Docker Registry啟用了SSL後,是訪問不通的。

宿主機的配置已經完成了,接下來對Docker容器進行配置。

對於Docker Registry Server的部署,官方給了兩個途徑:

其一,針對引數不多的情況,可以直接在docker run命令指定;

另一個是通過yaml配置檔案,可以一次性配置多個引數。

在本節,筆者將使用第一種方式部署,第二種方式的部署可以參見文末的附文。

> docker run -d \
  -p 5000:5000 \
  -v /usr/local/registry:/var/lib/registry \
  -v /usr/local/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/server.key \
  --restart=always \
  --name registry \
  registry:2

如果沒有安裝nginx的讀者,可執行這條命令:

> docker run -d \
  -p 443:443 \
  -v /usr/local/registry:/var/lib/registry \
  -v /usr/local/certs:/certs \
  -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/server.key \
  --restart=always \
  --name registry \
  registry:2

可以看到,Docker Registry Server啟用SSL的時候,用到的是crt、key兩個證書檔案。

接下來,我們實驗一下。

> docker tag busybox registry.iwendao.vip/bosybox:v1.0

最後再推送給Registry。

> docker push registry.iwendao.vip/bosybox:v1.0

檢視遠端倉庫有哪些映象。

> curl https://registry.iwendao.vip/v2/_catalog

在另外一臺主機,重複上述步驟,依然可以成功,說明已經搭建成功了。

四、Authentication的加持

通過對Registry Server的搭建,我們能明顯感覺得到,Docker對於安全控制有足夠的重視,這在全網HTTPS化的背景下是恰合時宜的做法。

這節是進階知識,目的是將Docker的安全機制做得更徹底——加上登入校驗機制。

很明顯,既然是私服,就意味著不是每個人都能提交映象的,只有憑藉登入使用者和密碼才行。

當然,登入校驗機制的前提是有HTTPS協議,否則,使用者名稱和密碼都將會明文傳輸。

Docker的認證機制也有很多實現,可以直接用代理(比如nginx)在Registry之前進行攔截驗證,高階的一些的是有Token服務端,引導使用者授權登入,實現難度較大。

本文以最簡單的htpasswd在實現登入校驗機制。關於htpasswd的更多介紹不在本文的範疇,請讀者自行查閱之。

如果主機上沒有安裝此命令工具,可以執行如下命令:

> yum install httpd-tools

因為htpasswd是Apache2的附屬工具命令,如果安裝了Apache2,此命令理應是可以用的。

如果讀者不想安裝了,可以直接使用registry映象,其內建了httpd。

假設密碼檔案存放在/usr/local/auth目錄下面,執行如下命令

> htpasswd -Bbn admin 123456 > /usr/local/auth/passwd

使用registry映象內建的httpd,如下:

> docker run --entrypoint htpasswd registry:2 -Bbn admin 123456 > /usr/local/auth/passwd

兩種方式都能達到同樣的目的:在/usr/local/auth/passwd檔案中生成使用者名稱和密碼。

命令中的admin是使用者名稱,123456即為密碼。

檢視passwd檔案內容:

> cat /usr/local/auth/passwd
admin:$2y$05$/2H8DTcY.1JROHm0MnnK8.UulmbSclib63qTe8FGyWnnE9XWBz3cy

雖然是同樣的命令,但在不同的主機,生成的結果並不相同。因此,在主機A上生成的密碼檔案不能用作主機B上進行認證。

接下來要啟動registry容器了:

> docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /usr/local/auth:/auth \
  -e REGISTRY_AUTH=htpasswd \
  -e REGISTRY_AUTH_HTPASSWD_REALM=Registry_Realm \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/passwd \
  -v /usr/local/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/server.key \
  registry:2

啟動成功後,如果試圖直接檢視遠端倉庫有哪些映象,會提示未認證,如下:

> curl https://registry.iwendao.vip/v2/_catalog
{
    "errors": [{
        "code": "UNAUTHORIZED",
        "message": "authentication required",
        "detail": [{
            "Type": "registry",
            "Class": "",
            "Name": "catalog",
            "Action": "*"
        }]
    }]
}

包括pull,push操作也都受限了。因此,在做操作之前,需要進行登入。

> docker login https://registry.iwendao.vip

既然有登入,當然就有登出了。

> docker logout https://registry.iwendao.vip

五、WEB UI for Registry

當我們把Registry Server搭建好了之後,就意味著要開始管理我們的映象了。這個時候會發現,並沒有一個視覺化的工具幫助使用者進行映象管理。

目前已經有很多開源的WEB UI管理工具:

1、docker-registry-frontend。截止到目前(2018年5月),其功能主要是映象列表檢視,標籤檢視,還未開放映象刪除功能,在GitHub上開源,stars 1k+。

2、docker-registry-web。相比docker-registry-frontend專案,此專案提供了映象刪除功能,還接入了角色系統,功能有了進一步完善,在GitHub上開源,stars 300+。

3、Rancher。這個平臺的定位類似Kubernetes,不僅僅是映象管理這麼簡單了,對於整個Docker容器管理都是能勝任的。

4、shipyard。很可惜,作者已經沒有精力維護了,從GitHub上的stars,不難看出其昔日的輝煌。

關於WEB UI的安裝部署就不再贅述了,都有其對應的文件。如果對於映象管理沒有什麼特別要求,可以不用WEB UI,或者使用前兩個之一。

六、總結

本文詳述了Docker Registry私服搭建的過程,總結了來自各類部落格,官網的學習資料,幫助讀者順利搭建Docker Registry私服。

附:

1、使用yaml檔案啟動registry server

假設配置檔案的存放路徑是:/usr/local/registry/config.yml

編輯其內容,如下:

version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
    maxthreads: 100
  delete:
    enabled: true
http:
  addr: 0.0.0.0:5000
  host: https://registry.iwendao.vip
  secret: yoogurt-taxi-123[email protected]#
  headers:
    X-Content-Type-Options: [nosniff]
  tls:
    certificate: /certs/214709594090104.crt
    key: /certs/214709594090104.key
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3

配置檔案中的配置項是可以對應到前文中-e引數的環境變數,其規則就是:

1、變數名由大寫字母組成;

2、字首固定加上REGISTRY;

3、將YAML中的配置項的冒號(:)變成了下劃線(_)。

比如:

REGISTRY_HTTP_TLS_CERTIFICATE,對應的是http: tls: certificate配置項;

REGISTRY_AUTH_HTPASSWD_PATH,對應的是auth: htpasswd: path配置項。

值得注意的是,配置檔案中所涉及的路徑都是針對容器內的,這就意味著,在啟動registry映象的時候,需要通過-v引數指定掛載目錄。

儲存配置檔案後,即可啟動容器:

> docker run -d -p 5000:5000 --restart=always --name registry \
             -v /usr/local/certs:/certs
             -v /usr/local/registry/config.yml:/etc/docker/registry/config.yml \
             registry:2

2、介紹關於Docker的書籍

  • 《第一本Docker書(修訂版)》,當之無愧的Docker啟蒙書。零基礎入門者可以著重看前五章基礎部分,掌握Docker的相關原理及其使用,可用作工具書。讀此書,建議跟著內容同步進行實踐,入門以後,能夠建立起對Docker的興趣,以便持續學習下去。
  • 《Docker 容器與容器雲(第2版)》,知識內容有所進階。第一部分內容為基礎知識,可以快速過一遍。本書對於容器雲的概念做了各方面反覆的解釋,非常精彩,可以吸收之。接下來就是容器編排、部署的內容了,可以加之實踐,培養感覺。
  • 《Kubernetes權威指南(第2版)》,當之無愧的Kubernetes入門書籍。讀完了《Docker 容器與容器雲(第2版)》的Kubernetes部分,再來讀此書,會輕鬆一些。

關注我們

相關推薦

手把手搭建Docker Registry

〇、前言 Build, Ship and Run any App, Anywhere 關於Docker更多的概念將不在本文贅述了,作為虛擬化市場的一顆冉冉升起的新星,Docker得到了越來越多企業的青睞,越來越多的開發者決定擁入Docker的懷抱

大數據江湖之即席查詢與分析(下篇)--手把手搭建即席查詢與分析Demo

dmi 安裝centos 用戶 author sla repo 相關 中文 plugin 上篇小弟分享了幾個“即席查詢與分析”的典型案例,引起了不少共鳴,好多小夥伴迫不及待地追問我們:說好的“手把手教你搭建即席查詢與分析Demo”啥時候能出?說到就得做到,差啥不能差

[轉]手把手搭建Hive Web環境

方式 啟動 list apach pre 手動 cli 找不到 interface 了解Hive的都知道Hive有三種使用方式——CLI命令行,HWI(hie web interface)瀏覽器 以及 Thrift客戶端連接方式。 為了體驗

0基礎手把手搭建webpack運行打包項目(未完待續)

蘊含 必須 asc 工具 過程 更多 關系圖 本地服務 spa   這些天在項目之余的時間學習了webpack打包項目的東西,非常榮幸的找到一些大神的文章來學習,死勁嚼了幾天,終於略知一二。在以後的工作上還需繼續學習,下面我將分享我這幾天學到的一點東西,希望能讓我一個還不算

2018年最新手把手搭建中小型互聯網公司後臺服務架構與運維架構

前端 詳細 token 使用詳解 restful jedis 以及 tom mvc 本課程主要是針對如何從無到有搭建中小型互聯網公司後臺服務架構和運維架構的課程,課程所涉及的內容均是當前應用最廣泛的技術和工具。本課程所講解的技術體系已經在多個中小型互聯網公司中實戰運行使用,

centos7手把手搭建zabbix監控

centos7手把手教你搭建zabbixCentos7安裝部署zabbix3.4centos系統版本: 1、安裝前需要先關閉selinux和firewall.1.1[root@zabbix ~]# vi /etc/selinux/config 將SELINUX=enforcing改為SELINUX=disa

手把手搭建一個加密貨幣交易模擬器,不用投錢就能玩

box NPU nec idp reat 監控 最簡 data- 自己 手把手教你搭建一個加密貨幣交易模擬器,不用投錢就能玩 大數據文摘,編譯:汪小七、黃文暢、小魚 我雖然不是交易員,但對加密貨幣的交易非常感興趣。然而,我不會在自己什麽都不清楚的時候就盲目投

手把手搭建HEXO免費博客

默認 鏡像 教程 環境 生成密鑰 文本 註冊 工具 即使 一、環境搭建 node安裝 百度搜索node,進入官網。下載穩定版: 下載好後直接打開安裝 我這裏將其安裝在D盤(可以自己選擇安裝位置) 可以看到安裝包中已經自帶n

手把手搭建 Selenuim 自動化環境

提示 for ESS down bmi dem def import docs 看完這篇文章,你將學到如何在 Windows 上搭建基本的 Selenium 自動化環境。 1.本次使用的系統環境是最新的 Windows 10 17134 系統; 2.本次使用的 Python

手把手搭建React Native 開發環境 - ios篇 (React [email&#

由於之前我是h5的,沒接觸過ios和安卓, 也不瞭解xcode配置,所以 建議學reace-native之前還是先去了解一下ios和安卓開發環境搭建等問題。 環境下載及配置 nodejs:https://nodejs.org/en/download/ 設定淘寶映象 $ npm con

手把手搭建 vue 環境

out ash npm ctr ref cli href http 沒有 第一步 node環境安裝 1.1 如果本機沒有安裝node運行環境,請下載node 安裝包進行安裝1.2 如果本機已經安裝node的運行換,請更新至最新的node 版本下載地址:https://no

手把手搭建 Hex0 + GitHub 部落格

1.環境安裝 1.1 Git Windows: https://gitforwindows.org/ 如果是 Mac 電腦的話,請先安裝 Xcode,因為 Xcode 自帶 Git. 1.2 Node.js 下載對應系統的 node 安裝包,一路 next 無腦安裝即

手把手搭建可自動化構建的微服務框架

詳細說明如何從零搭建微服務框架。 本文你將學到什麼? 本文將以原理+實戰的方式,首先對“微服務”相關的概念進行知識點掃盲,然後開始手把手教你搭建這一整套的微服務系統。 這套微服務框架能幹啥? 這套系統搭建完之後,那可就厲害了: 微服務架構你的整個應用程式將會被拆分成一個個功能獨立的子系統,獨立

手把手搭建vue專案

先下載node  node.js  下載完後直接傻瓜式安裝 儘量安到c盤不然還得更改環境變數。 然後再下載git https://git-scm.com/download/win  找到您對應的系統下載  git

手把手搭建springCloud--註冊中心使用eureka

  此文章寫的相對比較簡便,主要是為了方便新手開發,如果將所有內容一股腦全放出來,反而增加了新手開發的複雜度,個人認為這樣通俗易懂,我們都是先將服務搭建起來之後再去了解其中的技術要點 如果需要已經搭建好的專案,去這裡下載:https://download.csdn.net/down

手把手搭建S2-057 漏洞除錯環境

準備工具: eclipse、 (文末有附件連結) 1、解壓struts-2.5.16-all.zip,找到其中的示例應用,解壓後的目錄結構如下圖(app裡是打包好的jar包,src裡面包含示例檔案的原始碼) 2、進入src之後,找到這兩個工程所在目錄,直接匯入到e

手把手搭建與整合SSM框架(文末附原始碼)(Spring MVC + Spring + MyBatis)

目錄 1.匯入jar包 2.專案目錄總覽 3.配置Spring IoC容器 4.連線資料庫配置 5.整合mybatis環境 5.1配置對映器  5.2建立Mapper介面 5.3建立資料庫表和實體類 6.整合Spring MVC 6.1配置&nb

媽媽再也不用擔心爬蟲被封號了!手把手搭建Cookies池

很多時候,在爬取沒有登入的情況下,我們也可以訪問一部分頁面或請求一些介面,因為畢竟網站本身需要做SEO,不會對所有頁面都設定登入限制。 但是,不登入直接爬取會有一些弊端,弊端主要有以下兩點。 設定了登入限制的頁面無法爬取。如某論壇設定了登入才可檢視資源,某部落格設定了登入才可檢視全文

手把手搭建Vue框架

Vue專案環境搭建 1、 安裝Node.js雙擊安裝node-v8.9.1-x64.exe。 安裝完成後輸入命令 node -v ,若顯示Node.js版本,既安裝成功。 2、 基於node.js,利用淘寶npm映象安裝相關依賴。控制檯命令: 在cmd裡直接輸入:npm install -

手把手搭建eclipse中的php環境

1.下載eclipse  建議下載 Eclipse Standard (標準版) 2.在eclipse中下載 PDT(php development tools) help->Install