配置一個私有的Docker倉庫

g6c45w6c0e 8年前發布 | 30K 次閱讀 Docker Nginx

來自: http://dockone.io/article/1086

我們在本地開發時,如果內網能部署一臺Docker服務器,無疑會極大的方便鏡像的分享發布,有些私有鏡像就是可以直接放到內網服務器上,省去了不必要的網絡下載。

本課程需要配兩個虛擬機,一臺作為私有倉庫部署,一臺作為工作機。

```

//Docker倉庫部署-虛擬機

docker-machine create -d virtualbox registry

//Docker工作機

docker-machine create -d virtualbox default

```

Setup1 安裝并配置Registry

```

mkdir ~/docker-registry && cd $_

mkdir data

```

//mate指的是textmate -我在MAC上做了一個軟鏈接,方便使用

//類似也可以將chrome瀏覽器做軟鏈接 這樣就可以直接在命令行啟動chrome www.baidu.com

mate docker-compose.yml

registry:

 image: registry

 ports:

  - 127.0.0.1:5000:5000

 environment:

  REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data

 volumes:

  - ./data:/data

執行

docker-compose up

Setp2配置Nginx容器

mkdir ~/docker-registry/nginx

mate docker-compose.yml

```

nginx:

image: "nginx"

ports:

- 443:443

links:

- registry:registry

volumes:

- ./nginx/:/etc/nginx/conf.d:ro

registry:

image: registry

ports:

- 5000:5000

environment:

REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data

volumes:

- ./data:/data

```

mate ~/docker-registry/nginx/registry.conf

```

upstream docker-registry {

server registry:5000;

}

server {

listen 443;

server_name registry.51yixiao.com;

# SSL

# ssl on;

# ssl_certificate /etc/nginx/conf.d/domain.crt;

# ssl_certificate_key /etc/nginx/conf.d/domain.key;

# disable any limits to avoid HTTP 413 for large image uploads

client_max_body_size 0;

# required to avoid HTTP 411: see Issue #1486 ( https://github.com/docker/docker/issues/148 6)

chunked_transfer_encoding on;

location /v2/ {

# Do not allow connections from docker 1.5 and earlier

# docker pre-1.6.0 did not properly set the user agent on ping, catch "Go

" user agents

$" ) {

return 404;

}

# To add basic authentication

# auth_basic "registry.localhost";

# auth_basic_user_file /etc/nginx/conf.d/registry.password;

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

proxy_pass http://docker-registry;

proxy_set_header Host $http_host; # required for docker client's sake

proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto $scheme;

proxy_read_timeout 900;

}

}

```

執行

docker-compose up

//測試

curl http://www.registry.com:443

curl http://www.registry.com:5000

Setup3 設置HTTP驗證

```

cd ~/docker-registry/nginx

htpasswd -c registry.password USERNAME

//USERNAME替換自己想添加的用戶名,比如:markthink,如果要繼續添加其他用戶

//htpasswd registry.password USERNAME

```

mate ~/docker-registry/nginx/registry.conf

```

#To add basic authentication

auth_basic "registry.localhost";

auth_basic_user_file /etc/nginx/conf.d/registry.password;

add_header 'Docker-Distribution-Api-Version' 'registry' always;

```

執行

cd ~/docker-registry

docker-compose up

curl http://www.registry.com:443/

<html>

<head><title>401 Authorization Required</title></head>

<body bgcolor="white">

<center><h1>401 Authorization Required</h1></center>

<hr><center>nginx/1.9.11</center>

</body>

</html>

//使用HTTP驗證訪問-用上面配置的用戶名和密碼

curl123456a@www.registry.com:443/" rel="nofollow" target="_blank">http://markthink: 123456a@www.regist ry.com:443/

Setup4設置SSL驗證

使用HTTP驗證并不安全,因為連接沒有加密傳輸,下面啟用SSL配置

mate ~/docker-registry/nginx/registry.conf

```

# SSL

ssl on;

ssl_certificate /etc/nginx/conf.d/domain.crt;

ssl_certificate_key /etc/nginx/conf.d/domain.key;

```

為我們的域名購買一個證書或申請一個 免費SSL證書

Setup5申請免費證書

沃通CA(WoSign CA) 

https://buy.wosign.com/free/#myorder

https://buy.wosign.com/FreeSSL.html

用申請好的證書更新nginx配置文件

Setup6配置域名

mate /etc/hosts

//宿主機添加

192.168.99.100 registry.51yixiao.com

Setup7測試

```

docker-machine start default

//重新分配IP

docker-machine regenerate-certs default

docker-machine ssh default

sudo -i

vi /etc/hosts

192.168.99.100 registry.51yixiao.com

docker login https://registry.51yixiao.com

//輸入前面配置的用戶和密碼 登陸成功

Setup8從工作機推送鏡像至服務器

eval $(docker-machine env default)

docker images

//為本地鏡像打標簽

docker pull busybox

docker tag busybox registry.51yixiao.com/busybox

//登陸服務器

docker login https://registry.51yixiao.com

//向服務器推送鏡像

docker push registry.51yixiao.com/busybox

curl https://markthink:123456a%40re ... m/v2/

//網頁直接訪問

https://markthink:123456a%40re ... m/v2/

//退出服務器

docker logout https://registry.51yixiao.com

//查看鏡像倉庫已有的鏡像

https://markthink:123456a%40re ... talog

Setup9從鏡像服務器下載鏡像至工作機

docker-machine start default

docker-machine regenerate-certs default

docker-machine ssh default

sudo -i

vi /etc/hosts

//添加IP地址

192.168.99.100 registry.51yixiao.com

//登陸服務器

docker login https://registry.51yixiao.com

//下載鏡像

docker pull registry.51yixiao.com/busybox

//鏡像改名

docker tag registry.51yixiao.com/busybox busybox

```

制作自己的證書(比較復雜不推薦)

由于Dokcer目前不允許使用自簽名的SSL證書,這一步比平時更加復雜,我們必須建立自己的系統,對我們自己的證書簽名授權。

1.生成根密鑰

cd ~/docker-registry/nginx

//生成新的根密鑰

openssl genrsa -out devdockerCA.key 2048

2.生成根證書-Common Name填寫證書簽發者的域名 比如: www.trjcn.com

openssl req -x509 -new -nodes -key devdockerCA.key -days 10000 -out devdockerCA.crt

3.為nginx生成ssl密鑰

//生成nginx域名的SSL證書

openssl genrsa -out domain.key 2048

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

4.為nginx生成證書簽署請求

//生成ssl_certificate_key證書 

openssl req -new -key domain.key -out dev-docker-registry.com.csr

需要注意的是Common Name必須輸入我們要授予證書的服務器IP或域名

5.私有CA根據請求來簽發證書

```

//簽署證書申請

openssl x509 -req -in dev-docker-registry.com.csr -CA devdockerCA.crt -CAkey devdockerCA.key -CAcreateserial -out domain.crt -days 10000

``

此過程用到了前兩步生成的根密鑰和根證書

至此SSL證書制作完成,但是我們生成的證書沒有已經的證書頒發機構驗證,因此需要在Docker Registry中注冊。

下面是基于centsos的部署過程

scp ./devdockerCA.crt registry:/home/docker/

docker-machine ssh registry

sudo -i

mkdir /usr/local/share/ca-certificates/docker-dev-cert

mv /home/docker/devdockerCA.crt /usr/local/share/ca-certificates/docker-dev-cert/

//update-ca-certificates

重啟Docker daemon守護進程

docker-machine restart registry

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