一库继、環(huán)境準備
#1.nexus3容器版
sonatype/nexus3
#2.nginx容器版
nginx
#從官方下載以上工具并安裝docker-compose部署
#3.docker20.10.7版本
二、客戶端使用操作
#1.客戶端主機操作
echo "192.168.0.210 mydocker.io" |tee -a /etc/hosts
mkdir -p /etc/docker/certs.d/mydocker.io
#在(192.168.0.210)拷貝root.crt至客戶端
scp -r /home/nexus3-nginx/conf.d/ssl/mydocker.io.crt 客戶端IP:/etc/docker/certs.d/mydocker.io/
#2.客戶端使用
#用戶是在nexus3中創(chuàng)建
#登錄
docker login -u autumner -p 1234qwer mydocker.io
#打標簽
docker tag image:label mydocker.io/image:label
#推送
docker push mydocker.io/image:label
#拉取
docker pull mydocker.io/image:label
#注:
#因客戶端不具備上網(wǎng)功能所以不能直接進行docker search image搜索窜醉,只能通過代理遠程拉取,具體操作
docker pull mydocker.io/image:label
三制跟、docker私庫配置操作
3.1.nexus3準備工作
#1.docker-compose啟動nexus3
vim docker-compose.yml
version: '3.1'
services:
nexus:
restart: always
image: sonatype/nexus3
container_name: nexus3
ports:
- 80:8081
volumes:
- nexus-data:/nexus-data
volumes:
nexus-data:
#2.啟動nexus3
docker-compose -f docker-compose.yml up -d
#停止
docker-compose -f docker-compose.yml down
#3.瀏覽器訪問nexus3
http://192.168.0.210
#修改admin用戶密碼
#進入nexus3容器查看默認密碼
docker exec -it nexus3 sh
sh-4.4$ cat /opt/sonatype/sonatype-work/admin.password
#然后在瀏覽器進行admin用戶密碼修改
3.2.blob存儲創(chuàng)建
#瀏覽器
http://192.168.0.210 用戶名:admin 密碼:1234qwer點擊配置
Repository-Blob Stores-Create blob store-Name("docker-blob")-Create blob store
#定義一個Name,其它內(nèi)容會自動補全
3.3.創(chuàng)建hosted類型Docker倉庫
Repository-Repositories-Create repository-docker(hosted)
Name: 定義一個名稱docker-local
Online: 勾選酱虎。這個開關(guān)可以設(shè)置這個Docker repo是在線還是離線雨膨。
Repository Connectors(HTTP 8083):連接器允許docker客戶端直接連接到docker倉庫,并實現(xiàn)一些請求操作读串,如docker pull, docker push, API查詢等聊记。但這個連接器并不是一定需要配置的撒妈,尤其是我們后面會用group類型的docker倉庫來聚合它。
把HTTP這里勾選上排监,然后設(shè)置端口為8083
Allow anonymous docker pull:不勾選狰右。這樣的話就不允許匿名訪問了,執(zhí)行docker pull或 docker push之前舆床,都要先登錄:docker login
Docker Registry API Support:Docker registry默認使用的是API v2, 但是為了兼容性棋蚌,我們可以勾選啟用API v1。
Storage-Blob store:下拉選擇前面創(chuàng)建好的專用blob:docker-blob
Hosted-Delpoyment policy:開發(fā)環(huán)境允許運行重復(fù)發(fā)布,因此選擇Allow redeploy挨队。
最后保存
3.4.創(chuàng)建proxy類型Docker倉庫
Repository-Repositories-Create repository-docker(proxy)
#proxy類型倉庫谷暮,可以幫助我們訪問不能直接到達的網(wǎng)絡(luò),如官方的dockerhub鏡像庫。
Name: docker-proxy
Repository Connectors: 不設(shè)置盛垦。
Docker Registry API Support-Enable Docker V1 API:勾選
Proxy-
Remote Storage: docker hub的proxy湿弦,這里填寫: https://registry-1.docker.io 這個是官方默認的一個鏈接
Docker Index: Use Docker Hub
Storage:idocker-hub
Auto blocking enabled:勾選
Storage-Blob store:下拉選擇前面創(chuàng)建好的專用blob:docker-blob
Negative Cache-Not found cache enabled:勾選
最后保存
3.5.創(chuàng)建group類型Docker倉庫
Repository-Repositories-Create repository-docker(group)
#group類型的docker倉庫,是一個聚合類型的倉庫腾夯。將前面創(chuàng)建的2個倉庫聚合成一個URL對外提供服務(wù)颊埃,可以屏蔽后端的差異性,實現(xiàn)類似透明代理的功能蝶俱。
name:docker-group
Repository Connectors(8082):啟用了一個監(jiān)聽在8082端口的http連接器班利;
把HTTP這里勾選上,然后設(shè)置端口為8082
Docker Registry API Support-Enable Docker V1 API:勾選
Storage-Blob store:下拉選擇前面創(chuàng)建好的專用blob:docker-blob
group : 將左邊可選的2個倉庫榨呆,添加到右邊的members下罗标。
最后保存
3.6.創(chuàng)建docker私庫用戶
#1.設(shè)置nexus3的web端管理權(quán)限
Security-Realms-右側(cè)
把Docker Bearer Token Realm 增加到Active中然后點擊Save保存
#2.創(chuàng)建規(guī)則
Security-Roles-右側(cè)Create role
Role ID: nx-docker-role #必填,nx-docker-role自定義的
Role name: nx-docker-hub-role #必填,nx-docker-hub-role自定義的
Privileges:
把Filter中的
nx-repository-admin-docker-docker-group-*
nx-repository-admin-docker-docker-local-*
nx-repository-admin-docker-docker-proxy-*
nx-repository-view-docker-*-*
增加到Given中然后點擊Save保存
#3.創(chuàng)建docker用戶
Security-Users-右側(cè)Create local user
ID: 必填
First name: 必填
last name: 必填
email: 必填
Password: 必填
confirm password: 必填
Status:Active
Roles:
nx-anonymous
nx-docker-hub-role增加到Granted中
然后點擊Create local user保存完成
**最后docker的3個私有倉庫建立完成,但在推送和拉取時需要各自地址操作愕提,使用起來非常不方便馒稍,解決辦法我們可以通過nginx代理來實現(xiàn)**
四、nginx代理訪問Docker私有倉庫
4.1.nginx安裝
#本例通過容器模式部署nginx浅侨,直接通過dockerhub拉取鏡像
4.2.證書生成
#通過工具一鍵生成證書
#創(chuàng)建配置文件和日志目錄
mkdir -p /home/nexus3-nginx/conf.d/ssl
mkdir -p /home/nexus3-nginx/logs
cd /home/nexus3-nginx/conf.d/ssl
#一鍵生成證書
./gencer.sh
[root@nexus-nfs ssl]# ./gencer.sh
Enter your domain [www.example.com]:mydocker.io
Enter your serverName [nginx]:mydocker.io
Create server key...
Generating RSA private key, 1024 bit long modulus
............++++++
附件:gencer.sh源碼
#!/bin/sh
# create self-signed server certificate:
read -p "Enter your domain [www.example.com]:" DOMAIN
read -p "Enter your serverName [nginx]:" SERVERNAME
echo "Create server key..."
openssl genrsa -des3 -out $SERVERNAME.key 2048
echo "Create server certificate signing request..."
SUBJECT="/C=CN/ST=TJ/L=TJ/O=AUTUMNER/OU=ECW/CN=$DOMAIN"
openssl req -new -subj $SUBJECT -key $SERVERNAME.key -out $SERVERNAME.csr
echo "Remove password..."
mv $SERVERNAME.key $SERVERNAME.origin.key
openssl rsa -in $SERVERNAME.origin.key -out $SERVERNAME.key
echo "Sign SSL certificate..."
openssl x509 -req -days 3650 -in $SERVERNAME.csr -signkey $SERVERNAME.key -out $SERVERNAME.crt
openssl x509 -in $SERVERNAME.crt -out $SERVERNAME.cer -outform der
openssl x509 -inform der -in $SERVERNAME.cer -out $SERVERNAME.pem
4.3.nginx配置
#在主機/home/nexus3-nginx/conf.d目錄創(chuàng)建dockerhub.conf
cd /home/nexus3-nginx/conf.d
vim dockerhub.conf #粘貼以下內(nèi)容
#ip地址換成本服務(wù)器主機ip
upstream nexus_docker_get {
server 192.168.0.210:8082;
}
upstream nexus_docker_put {
server 192.168.0.210:8083;
}
server {
listen 80;
listen 443 ssl;
server_name mydocker.io;
access_log /var/log/nginx/mydocker.io.log;
# 證書
ssl_certificate /etc/nginx/conf.d/ssl/mydocker.io.crt; # 證書路徑根據(jù)上面生成的來定
ssl_certificate_key /etc/nginx/conf.d/ssl/mydocker.io.key;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers '!aNULL:kECDH+AESGCM:ECDH+AESGCM:RSA+AESGCM:kECDH+AES:ECDH+AES:RSA+AES:';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
# 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/1486)
chunked_transfer_encoding on;
# 設(shè)置默認使用推送代理
set $upstream "nexus_docker_put";
# 當請求是GET纽谒,也就是拉取鏡像的時候,這里改為拉取代理如输,如此便解決了拉取和推送的端口統(tǒng)一
if ( $request_method ~* 'GET') {
set $upstream "nexus_docker_get";
}
# 只有本地倉庫才支持搜索鼓黔,所以將搜索請求轉(zhuǎn)發(fā)到本地倉庫,否則出現(xiàn)500報錯
if ($request_uri ~ '/search') {
set $upstream "nexus_docker_put";
}
index index.html index.htm index.php;
location / {
proxy_pass http://$upstream;
proxy_set_header Host $host;
proxy_connect_timeout 3600;
proxy_send_timeout 3600;
proxy_read_timeout 3600;
proxy_set_header X-Real-IP $remote_addr;
proxy_buffering off;
proxy_request_buffering off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto http;
}
}
4.4.nginx啟動
#編輯nexus3和nginx的docker-compose文件
#停止nexus3的容器
docker-compose -f docker-compose.yml down
#編輯docker-compose.yml文件
version: '3.1'
services:
nexus:
restart: always
image: sonatype/nexus3
container_name: nexus3
ports:
- 80:8081
- 8082:8082 #開啟docker的group類型端口
- 8083:8083 #開啟docker的hosted類型端口
volumes:
- nexus-data:/nexus-data
dockerhub: #增加nginx容器
restart: always
image: nginx
container_name: dockernginx
depends_on:
- nexus
ports:
- 443:443 #開啟https端口
volumes:
- /home/nexus3-nginx/logs:/var/log/nginx:rw #掛載日志目錄
- /home/nexus3-nginx/conf.d:/etc/nginx/conf.d:ro #掛載nginx配置文件和證書
volumes:
nexus-data:
#啟動docker-compose
docker-compose -f docker-compose.yml up -d
五不见、客戶端機驗證參考第二章節(jié)客戶操作
#1.拉取鏡像報如下錯誤
Error response from daemon: Head https://mydocker.io/v2/busybox/manifests/latest: no basic auth credentials
#解決方法
#登錄
docker login -u autumner -p 1234abcD mydocker.io
#2.直接搜索鏡像報錯
docker search redis
Error response from daemon: Get https://index.docker.io/v1/search?q=redis&n=25: dial tcp: lookup index.docker.io on 219.150.32.132:53: read udp 192.168.0.217:56157->219.150.32.132:53: i/o timeout
#解決方法
docker search mydocker.io/redis #帶上mydocker.io標簽實現(xiàn)代理下載redis