搭建私有 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