搭建私有 Docker 倉庫

jopen 9年前發布 | 78K 次閱讀 Docker

簡介

docker是這兩年非常火爆的devops工具。本文記錄如何搭建安全的私有docker倉庫。關于docker技術的介紹,可以參考其官網
docker官方提供了docker hub來管理公共鏡像源。docker和github一樣,托管在其上的鏡像都是開放的。有的時候針對私有項目的場景,我們希望在自己的私有服務器上搭建一套docker倉庫。本文的搭建環境為ubuntu14.04。

第1步:安裝依賴

docker registry本身只是python編寫的一個web服務,所以,需要先安裝python運行環境:

sudo apt-get update
sudo apt-get -y install build-essential python-dev libevent-dev python-pip liblzma-dev swig libssl-dev

第2步:安裝及配置docker registry

首先,采用pip工具安裝docker registry:

sudo pip install docker-registry

docker-registry運行所需的配置文件示例在/usr/local/lib/python2.7/dist-packages/config目錄下,此處直接復制默認配置:

cd /usr/local/lib/python2.7/dist-packages/config
sudo cp config_sample.yml config.yml

第3步: 啟動docker registry服務

docker registry通過gunicorn運行,通過命令行可以直接啟動:

gunicorn --access-logfile - --debug -k gevent -b 0.0.0.0:5000 -w 1 docker_registry.wsgi:application

一般情況下,我們需要將web服務配置為后臺模式運行,這里采用upstart工具設置docker registry自啟動并后臺運行。
首先新建一個目錄存放docker registry的log:

sudo mkdir /var/log/docker-registry

在/etc/init/下新建docker-registry.conf文件,配置其自動啟動docker registry:

description "Docker Registry"

start on runlevel [2345]
stop on runlevel [016]

respawn
respawn limit 10 5

script
exec gunicorn --access-logfile /var/log/docker-registry/access.log --error-logfile /var/log/docker-registry/server.log -k gevent --max-requests 100 --graceful-timeout 3600 -t 3600 -b localhost:5000 -w 8 docker_registry.wsgi:application
end script

配置完成后,就可以通過service命令啟動docker registry了:

sudo service docker-registry start

如果docker倉庫是運行在本地環境,那么至此已經成功搭建可使用的docker registry了。
但是如果我們的私有docker倉庫希望通過外網也可以訪問,那么必須增加一定的安全機制了。

第2步:使用nginx代理web請求

nginx作為常用的代理服務器,其性能和功能都很強大。采用nginx實現的web安全機制,可以增加外網訪問的安全性。首先安裝nginx:

sudo apt-get -y install nginx apache2-utils

創建用戶名及密碼:

sudo htpasswd -c /etc/nginx/docker-registry.htpasswd USERNAME

現在我們在/etc/nginx/docker-registry.htpasswd下新建了一個名字為USERNAME的用戶。后續需要增加用戶時可以隨時執行該命令添加。通過編輯該文件,刪除對應的行也可以刪除用戶。
下面配置nginx讓其使用該認證文件,并且代理對docker registry的訪問。
新建/etc/nginx/sites-available/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 your.docker.registry.com;

 # 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;
 }

}

接下來,配置并重啟服務:

sudo ln -s /etc/nginx/sites-available/docker-registry /etc/nginx/sites-enabled/docker-registry
sudo service nginx restart

此時我們從瀏覽器中已經可以訪問ip:8080,會彈出認證頁面。輸入剛才設置的USERNAME及其密碼,就可以看到”\”docker-registry server\””字樣。證明已經配置成功了!
但是當前是基于HTTP協議的,傳輸協議并未進行加密。為了更安全,我們應該采用https。

第4步:配置ssl加密傳輸(https)

如果你有自己的ssl證書,則可以直接使用。否則需要自己制作一個自認證證書:

openssl req -newkey rsa:2048 -x509 -nodes -days 3560 -out your-docker-registry.com.crt -keyout your-docker-registry.com.key

將生成的key文件和crt文件分別拷貝到/etc/ssl/private/docker-registry和/etc/ssl/certs/docker-registry目錄下。

sudo cp your-docker-registry.com.crt /etc/ssl/certs/docker-registry
sudo cp your-docker-registry.com.key /etc/ssl/private/docker-registry

編輯nginx配置文件/etc/nginx/sites-available/docker-registry,取消其中ssl相關注釋,并將監聽端口修改為https默認的443端口:

server {
      listen 443;
      server_name yourdomain.com;

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

重啟nginx,docker registry就支持ssl了!但是遺憾的是docker目前不支持自認證ssl證書的訪問,所以針對每臺需要訪問registry的服務器,我們需要將自己的證書加入到本機的證書池中以通過證書驗證。

第5步:從其他機器上訪問docker registry

將上一步生成的.crt證書拷貝到其他機器的/usr/share/ca-certificates/extra目錄下,然后更新證書

sudo dpkg-reconfigure ca-certificates

選中新增加的證書,然后確認安裝即可。
接下來重啟docker進程,讓其重新加載證書:

sudo service docker restart

接下來就能夠在其他機器上登錄到我們的私有registry上了。

docker login https://your.docker.registry.com/

當出現“Login Succeeded”字樣則證明登錄成功。
注意:
由于docker依然在高速迭代的過程中,在安裝和使用docker及registry時都盡量保持安裝的是最新版本,否則可能出現docker和docker registry不兼容的問題而出錯。
登錄成功后,就可以使用docker的命令了。docker和私有registry的交互會以tag名以registry域名開頭來區分,比如我們從官方registry下載ubuntu鏡像并上傳到我們的私有registry:

docker pull ubuntu
docker tag ubuntu your.docker.registry.com/ubuntu
docker push your.docker.registry.com/ubuntu

至此,私有docker倉庫就搭建完成了!

來自:http://blog.pandocloud.com/?p=98

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!