nexus3作为docker私服的使用
在開始之前,需要問一個問題:docker的私有倉庫,nexus3和harbor哪個好用?
我的回答是,沒有好與不好之分,只有適合與不適合。就像張戈大佬在回答提問時說的:harbor應該更專業,但是更重,要部署N個組件(雖然也可以用docker部署)。nexus3覆蓋更全面,啥都可以做,是一個混合倉庫,一個能抵多個,主要還是看場景。
因為我之前用nexus3做了maven、yum、npm的私服,所以對我來說,用nexus3是最為方便和快捷的。
一、安裝nexus3
安裝之前已經講過了,有需要可以移步至nexus3的安裝
二、配置nexus
1、創建Blob Stores
和之前maven、npm、yum一樣,這里新建一個blob store專門作為docker的存儲。
1)Type
選擇"File"。
2)Name
就叫docker-blob吧。
3)Enable Soft Quota
限制目錄的大小。我這邊就不限制了。如果要限制的話,就勾選上,并填上限制的條件和限制的值就OK了。
4)Path
在填入Name之后,path會自動生成。
2、創建 一個hosted類型的倉庫
用戶可以把一些鏡像push到宿主倉庫(Hosted Repository)中。
點擊"Repository"–>“Repositories”–>“Create repository”,選擇docker(hosted)。
1)Name
就叫docker-hosted-my吧。
2)Online
勾選,可以設置這個倉庫是在線還是離線。
3)Repository Connectors
包含HTTP和HTTPS兩種port。下面的說明中講的很清楚:是允許客戶端直接連接到hosted倉庫用的,并根據自己的需求選擇是用http還是https。
我這里選擇http,端口設置為9083,用于后面的nginx代理的后端。
4)Allow anonymous docker pull
不勾選,這樣即使是docker pull操作,也需要先用docker login登錄之后才能拉取鏡像。
5)Docker Registry API Support
Docker registry默認是使用API v2,為了兼容性,可以勾選啟用API v1。
6)Storang
Blob store:選擇此倉庫使用的Blob存儲,這里選擇之前創建的docker-blob。
Strict Content Type Validation:驗證上傳內容格式,這里就用默認的勾選。
7)Hosted
Deployment Policy:部署策略,有三個選項,分別是:
Allow Redeploy:允許重新部署
Disable Redeploy:禁止重新部署
Read-Only:只讀
我這里使用默認的"Allow redeploy",如果是生產環境,可以選擇"Allow redeploy"。
8)Cleanup
Cleanup Policies:清除策略,這個是新增的功能,這里先不進行設置。
配置完成后如下圖
3、創建一個proxy類型的倉庫
| 代理倉庫(Proxy Repository)是遠程倉庫的代理,當用戶向這個代理倉庫請求一個依賴包時,這個代理倉庫會先在本地查找,如果存在,會直接提供給用戶進行下載;如果在代理倉庫本地查找不到,就會從配置的遠程中央倉庫中進行下載,下載到私服上之后再提供給用戶下載。所以一般我們把私服架設在內網之中,這樣可以節省外網帶寬,并且大大提高了用戶下載依賴的速度。 |
點擊"Repository"–>“Repositories”–>“Create repository”,選擇docker(proxy)。
1)Name
因為我要代理daocloud的docker鏡像加速地址,所以就叫"docker-proxy-daocloud"。
2)Online
勾選,設置成在線。
3)Allow anonymous docker pull
不勾選,這樣即使是docker pull操作,也需要先用docker login登錄之后才能拉取鏡像。
4)Docker Registry API Support
Docker registry默認是使用API v2,為了兼容性,可以勾選啟用API v1。
5)Proxy
Remote storage:設置遠程倉庫的地址,我這里設置成daocloud的docker鏡像加速地址—http://f1361db2.m.daocloud.io
這里為了確保能夠拉取DockerHub最新的鏡像,我選擇了Use DockerHub這個Index。
其他使用默認配置。
6)Storage
Blob store:選擇docker-blob
Strict Content Type Validation:驗證上傳內容格式,這里就用默認的勾選。
7)Routing Rule,Negative Cache,Cleanup,HTTP
都使用默認配置。
配置完成后如下圖
4、創建一個group類型的倉庫
| 倉庫組(Repository Group)的目的是將多個倉庫(代理倉庫和宿主倉庫)聚合,對用戶暴露統一的地址。當用戶需要獲取某一個鏡像時,請求的是倉庫組的地址,系統將會根據倉庫組配置的倉庫順序依次查找。 |
點擊"Repository"–>“Repositories”–>“Create repository”,選擇docker(gruop)。
1)Name
docker-group-my
2)Online
勾選,設置成在線
3)Repository Connectors
啟用http連接器,端口設置為9082
4)Allow anonymous docker pull
不勾選,這樣即使是docker pull操作,也需要先用docker login登錄之后才能拉取鏡像。
5)Docker Registry API Support
Docker registry默認是使用API v2,為了兼容性,可以勾選啟用API v1。
6)Storage
Blob store:選擇docker-blob
Strict Content Type Validation:使用默認的勾選
7)Group
將左側的Available中的倉庫列表添加到右側的Members中。
OK,到這里,nexus3上docker倉庫的配置基本完成了。但是這樣并不能很好的使用。因為group倉庫并不能推送鏡像,推送自己制作的鏡像到倉庫還得通過本地倉庫(hosted類型的倉庫)的端口去推送,很不方便。
下面是參考張戈博客的一個通過nginx來判斷鏡是推鏡像還是拉鏡像,然后代理到不同的端口,也是非常感謝張戈大佬。
三、配置nginx
在nexus服務器上安裝好nginx之后,我們需要生成自簽名SSL證書,因為后面不想在docker pull的時候還要帶上一個端口!這里就用docker.mynexus.com作為docker倉庫的域名。
生成自簽名證書的方法網上有很多,這里推薦一個一鍵生成的工具,地址為https://github.com/Fishdrowned/ssl,使用的方法作者已經寫的很詳細了。生成方式如下:
[root@nexus3 ~]# cd /usr/local/nginx/conf/# 克隆工具 [root@nexus3 conf]# git clone https://github.com/Fishdrowned/ssl.git Cloning into 'ssl'... remote: Enumerating objects: 112, done. remote: Total 112 (delta 0), reused 0 (delta 0), pack-reused 112 Receiving objects: 100% (112/112), 173.19 KiB | 254.00 KiB/s, done. Resolving deltas: 100% (51/51), done.# 生成證書 [root@nexus3 conf]# cd ssl/ [root@nexus3 ssl]# ls ca.cnf docs flush.sh gen.cert.sh gen.root.sh LICENSE README.md [root@nexus3 ssl]# ./gen.cert.sh docker.mynexus.com Removing dir out Creating output structure Done Generating a 2048 bit RSA private key .......+++ ......+++ writing new private key to 'out/root.key.pem' ----- Generating RSA private key, 2048 bit long modulus ........+++ .....................+++ e is 65537 (0x10001) Using configuration from ./ca.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'CN' stateOrProvinceName :ASN.1 12:'Guangdong' localityName :ASN.1 12:'Guangzhou' organizationName :ASN.1 12:'Fishdrowned' organizationalUnitName:ASN.1 12:'docker.mynexus.com' commonName :ASN.1 12:'*.docker.mynexus.com' Certificate is to be certified until Dec 25 10:52:19 2021 GMT (730 days)Write out database with 1 new entries Data Base UpdatedCertificates are located in: lrwxrwxrwx 1 root root 45 Dec 26 18:52 /usr/local/nginx/conf/ssl/out/docker.mynexus.com/docker.mynexus.com.bundle.crt -> ./20191226-1852/docker.mynexus.com.bundle.crt lrwxrwxrwx 1 root root 38 Dec 26 18:52 /usr/local/nginx/conf/ssl/out/docker.mynexus.com/docker.mynexus.com.crt -> ./20191226-1852/docker.mynexus.com.crt lrwxrwxrwx 1 root root 15 Dec 26 18:52 /usr/local/nginx/conf/ssl/out/docker.mynexus.com/docker.mynexus.com.key.pem -> ../cert.key.pem lrwxrwxrwx 1 root root 11 Dec 26 18:52 /usr/local/nginx/conf/ssl/out/docker.mynexus.com/root.crt -> ../root.crt在nginx中增加如下配置:
upstream nexus_docker_get {server 192.168.0.125:9082; }upstream nexus_docker_put {server 192.168.0.125:9083; }server {listen 80;listen 443 ssl;server_name docker.mynexus.com;access_log logs/docker.mynexus.com access_json;# 證書ssl_certificate /usr/local/nginx/conf/ssl/out/docker.mynexus.com/docker.mynexus.com.crt;ssl_certificate_key /usr/local/nginx/conf/ssl/out/docker.mynexus.com/docker.mynexus.com.key.pem;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 uploadsclient_max_body_size 0;# required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486)chunked_transfer_encoding on;# 設置默認使用推送代理set $upstream "nexus_docker_put";# 當請求是GET,也就是拉取鏡像的時候,這里改為拉取代理,如此便解決了拉取和推送的端口統一if ( $request_method ~* 'GET') {set $upstream "nexus_docker_get";}# 只有本地倉庫才支持搜索,所以將搜索請求轉發到本地倉庫,否則出現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;} }加完配置之后,reload一下
[root@localhost conf]# /usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root@localhost conf]# /usr/local/nginx/sbin/nginx -s reload四、配置docker客戶端
nginx部署完成之后,找一臺客戶機進行測試,先在客戶機的hosts文件中加入剛才定義的內部使用的域名解析。然后還需要在客戶端將自簽名的根證書(ca.crt)導入到客戶端才能正常使用,否則會報不信任錯誤。
在上文介紹的一鍵生成自簽名證書工具中,會生成一個根證書,名稱為/usr/local/nginx/conf/ssl/out/docker.mynexus.com/root.crt,將這個文件上傳到客戶端服務器的/etc/docker/certs.d/docker.mynexus.com目錄即可(注意目錄需要創建,最后的文件夾和倉庫域名保持一致:docker.mynexus.com)。
找一臺測試機:
[root@localhost ~]# echo '192.168.0.125 docker.mynexus.com' >> /etc/hosts [root@localhost ~]# mkdir -p /etc/docker/certs.d/docker.mynexus.com再把nexus服務器上的根證書拷貝到客戶機上
[root@nexus3 ~]# scp /usr/local/nginx/conf/ssl/out/docker.mynexus.com/root.crt 192.168.0.151:/etc/docker/certs.d/docker.mynexus.com/然后就可以開始使用了。
五、測試驗證
1、pull一個鏡像
[root@localhost ~]# docker pull docker.io/redis Using default tag: latest latest: Pulling from library/redis 000eee12ec04: Pull complete 5cc53381c195: Pull complete 48bb7bcb5fbf: Pull complete ef8a890bb1c2: Pull complete 32ada9c6fb0d: Pull complete 76e034b0f296: Pull complete Digest: sha256:1eedfc017b0cd3e232878ce38bd9328518219802a8ef37fe34f58dcf591688ef Status: Downloaded newer image for redis:latest docker.io/library/redis:latest [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE redis latest dcf9ec9265e0 4 weeks ago 98.2MB2、登錄docker私服
[root@localhost ~]# docker login -u admin -p Abc@123456 docker.mynexus.com WARNING! Using --password via the CLI is insecure. Use --password-stdin. WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded3、打標簽
這里的版本號是我隨便取的!!!
[root@localhost ~]# docker tag redis docker.mynexus.com/redis:v111 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE redis latest dcf9ec9265e0 4 weeks ago 98.2MB docker.mynexus.com/redis v111 dcf9ec9265e0 4 weeks ago 98.2MB4、push鏡像到私服
[root@localhost ~]# docker push docker.mynexus.com/redis:v111 The push refers to repository [docker.mynexus.com/redis] 24597674dcad: Pushed 85835f84dadf: Pushed 14d62da63315: Pushed 1771f54cbd23: Pushed 600b5cf9c806: Pushed 831c5620387f: Pushed v111: digest: sha256:e73ef998c22f9a98793d9951bb2915cd945d8fa6f9ec1b324e85d19617efc2fd size: 1572然后看一眼私服
redis鏡像被成功的push到私服上了。
5、從私服拉鏡像
1)pull一個私服存在的鏡像
就是剛才我push上去的redis鏡像。
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE [root@localhost ~]# docker pull docker.mynexus.com/redis:v111 v111: Pulling from redis 000eee12ec04: Pull complete 5cc53381c195: Pull complete 48bb7bcb5fbf: Pull complete ef8a890bb1c2: Pull complete 32ada9c6fb0d: Pull complete 76e034b0f296: Pull complete Digest: sha256:e73ef998c22f9a98793d9951bb2915cd945d8fa6f9ec1b324e85d19617efc2fd Status: Downloaded newer image for docker.mynexus.com/redis:v111 docker.mynexus.com/redis:v111 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.mynexus.com/redis v111 dcf9ec9265e0 4 weeks ago 98.2MB2)pull一個私服上不存在的鏡像
比如拉取一個centos鏡像,這個在現在的私服上是不存在的
[root@localhost ~]# docker pull docker.mynexus.com/centos Using default tag: latest latest: Pulling from centos 729ec3a6ada3: Pull complete Digest: sha256:6ab380c5a5acf71c1b6660d645d2cd79cc8ce91b38e0352cbf9561e050427baf Status: Downloaded newer image for docker.mynexus.com/centos:latest docker.mynexus.com/centos:latest可以看到已經成功將centos鏡像pull下來了,再看一眼私服。
私服中之前雖然沒有centos這個鏡像,但是它從代理的遠程倉庫中下載了這個鏡像并存在了私服中。等下次再拉取這個鏡像的時候,就可以直接從私服中拉取。這個和之前作為maven、npm、yum私服的原理是一樣的。
參考文章:
http://www.eryajf.net/1816.html
https://zhang.ge/5139.html
總結
以上是生活随笔為你收集整理的nexus3作为docker私服的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蚂蚁金服的生死时速!
- 下一篇: es java 模糊查询_java使用e