nexus3作为docker私服的使用
在開始之前,需要問一個(gè)問題:docker的私有倉庫,nexus3和harbor哪個(gè)好用?
我的回答是,沒有好與不好之分,只有適合與不適合。就像張戈大佬在回答提問時(shí)說的:harbor應(yīng)該更專業(yè),但是更重,要部署N個(gè)組件(雖然也可以用docker部署)。nexus3覆蓋更全面,啥都可以做,是一個(gè)混合倉庫,一個(gè)能抵多個(gè),主要還是看場景。
因?yàn)槲抑坝胣exus3做了maven、yum、npm的私服,所以對我來說,用nexus3是最為方便和快捷的。
一、安裝nexus3
安裝之前已經(jīng)講過了,有需要可以移步至nexus3的安裝
二、配置nexus
1、創(chuàng)建Blob Stores
和之前maven、npm、yum一樣,這里新建一個(gè)blob store專門作為docker的存儲。
1)Type
選擇"File"。
2)Name
就叫docker-blob吧。
3)Enable Soft Quota
限制目錄的大小。我這邊就不限制了。如果要限制的話,就勾選上,并填上限制的條件和限制的值就OK了。
4)Path
在填入Name之后,path會自動生成。
2、創(chuàng)建 一個(gè)hosted類型的倉庫
用戶可以把一些鏡像push到宿主倉庫(Hosted Repository)中。
點(diǎn)擊"Repository"–>“Repositories”–>“Create repository”,選擇docker(hosted)。
1)Name
就叫docker-hosted-my吧。
2)Online
勾選,可以設(shè)置這個(gè)倉庫是在線還是離線。
3)Repository Connectors
包含HTTP和HTTPS兩種port。下面的說明中講的很清楚:是允許客戶端直接連接到hosted倉庫用的,并根據(jù)自己的需求選擇是用http還是https。
我這里選擇http,端口設(shè)置為9083,用于后面的nginx代理的后端。
4)Allow anonymous docker pull
不勾選,這樣即使是docker pull操作,也需要先用docker login登錄之后才能拉取鏡像。
5)Docker Registry API Support
Docker registry默認(rèn)是使用API v2,為了兼容性,可以勾選啟用API v1。
6)Storang
Blob store:選擇此倉庫使用的Blob存儲,這里選擇之前創(chuàng)建的docker-blob。
Strict Content Type Validation:驗(yàn)證上傳內(nèi)容格式,這里就用默認(rèn)的勾選。
7)Hosted
Deployment Policy:部署策略,有三個(gè)選項(xiàng),分別是:
Allow Redeploy:允許重新部署
Disable Redeploy:禁止重新部署
Read-Only:只讀
我這里使用默認(rèn)的"Allow redeploy",如果是生產(chǎn)環(huán)境,可以選擇"Allow redeploy"。
8)Cleanup
Cleanup Policies:清除策略,這個(gè)是新增的功能,這里先不進(jìn)行設(shè)置。
配置完成后如下圖
3、創(chuàng)建一個(gè)proxy類型的倉庫
| 代理倉庫(Proxy Repository)是遠(yuǎn)程倉庫的代理,當(dāng)用戶向這個(gè)代理倉庫請求一個(gè)依賴包時(shí),這個(gè)代理倉庫會先在本地查找,如果存在,會直接提供給用戶進(jìn)行下載;如果在代理倉庫本地查找不到,就會從配置的遠(yuǎn)程中央倉庫中進(jìn)行下載,下載到私服上之后再提供給用戶下載。所以一般我們把私服架設(shè)在內(nèi)網(wǎng)之中,這樣可以節(jié)省外網(wǎng)帶寬,并且大大提高了用戶下載依賴的速度。 |
點(diǎn)擊"Repository"–>“Repositories”–>“Create repository”,選擇docker(proxy)。
1)Name
因?yàn)槲乙韉aocloud的docker鏡像加速地址,所以就叫"docker-proxy-daocloud"。
2)Online
勾選,設(shè)置成在線。
3)Allow anonymous docker pull
不勾選,這樣即使是docker pull操作,也需要先用docker login登錄之后才能拉取鏡像。
4)Docker Registry API Support
Docker registry默認(rèn)是使用API v2,為了兼容性,可以勾選啟用API v1。
5)Proxy
Remote storage:設(shè)置遠(yuǎn)程倉庫的地址,我這里設(shè)置成daocloud的docker鏡像加速地址—http://f1361db2.m.daocloud.io
這里為了確保能夠拉取DockerHub最新的鏡像,我選擇了Use DockerHub這個(gè)Index。
其他使用默認(rèn)配置。
6)Storage
Blob store:選擇docker-blob
Strict Content Type Validation:驗(yàn)證上傳內(nèi)容格式,這里就用默認(rèn)的勾選。
7)Routing Rule,Negative Cache,Cleanup,HTTP
都使用默認(rèn)配置。
配置完成后如下圖
4、創(chuàng)建一個(gè)group類型的倉庫
| 倉庫組(Repository Group)的目的是將多個(gè)倉庫(代理倉庫和宿主倉庫)聚合,對用戶暴露統(tǒng)一的地址。當(dāng)用戶需要獲取某一個(gè)鏡像時(shí),請求的是倉庫組的地址,系統(tǒng)將會根據(jù)倉庫組配置的倉庫順序依次查找。 |
點(diǎn)擊"Repository"–>“Repositories”–>“Create repository”,選擇docker(gruop)。
1)Name
docker-group-my
2)Online
勾選,設(shè)置成在線
3)Repository Connectors
啟用http連接器,端口設(shè)置為9082
4)Allow anonymous docker pull
不勾選,這樣即使是docker pull操作,也需要先用docker login登錄之后才能拉取鏡像。
5)Docker Registry API Support
Docker registry默認(rèn)是使用API v2,為了兼容性,可以勾選啟用API v1。
6)Storage
Blob store:選擇docker-blob
Strict Content Type Validation:使用默認(rèn)的勾選
7)Group
將左側(cè)的Available中的倉庫列表添加到右側(cè)的Members中。
OK,到這里,nexus3上docker倉庫的配置基本完成了。但是這樣并不能很好的使用。因?yàn)間roup倉庫并不能推送鏡像,推送自己制作的鏡像到倉庫還得通過本地倉庫(hosted類型的倉庫)的端口去推送,很不方便。
下面是參考張戈博客的一個(gè)通過nginx來判斷鏡是推鏡像還是拉鏡像,然后代理到不同的端口,也是非常感謝張戈大佬。
三、配置nginx
在nexus服務(wù)器上安裝好nginx之后,我們需要生成自簽名SSL證書,因?yàn)楹竺娌幌朐赿ocker pull的時(shí)候還要帶上一個(gè)端口!這里就用docker.mynexus.com作為docker倉庫的域名。
生成自簽名證書的方法網(wǎng)上有很多,這里推薦一個(gè)一鍵生成的工具,地址為https://github.com/Fishdrowned/ssl,使用的方法作者已經(jīng)寫的很詳細(xì)了。生成方式如下:
[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;# 設(shè)置默認(rèn)使用推送代理set $upstream "nexus_docker_put";# 當(dāng)請求是GET,也就是拉取鏡像的時(shí)候,這里改為拉取代理,如此便解決了拉取和推送的端口統(tǒng)一if ( $request_method ~* 'GET') {set $upstream "nexus_docker_get";}# 只有本地倉庫才支持搜索,所以將搜索請求轉(zhuǎn)發(fā)到本地倉庫,否則出現(xiàn)500報(bào)錯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部署完成之后,找一臺客戶機(jī)進(jìn)行測試,先在客戶機(jī)的hosts文件中加入剛才定義的內(nèi)部使用的域名解析。然后還需要在客戶端將自簽名的根證書(ca.crt)導(dǎo)入到客戶端才能正常使用,否則會報(bào)不信任錯誤。
在上文介紹的一鍵生成自簽名證書工具中,會生成一個(gè)根證書,名稱為/usr/local/nginx/conf/ssl/out/docker.mynexus.com/root.crt,將這個(gè)文件上傳到客戶端服務(wù)器的/etc/docker/certs.d/docker.mynexus.com目錄即可(注意目錄需要創(chuàng)建,最后的文件夾和倉庫域名保持一致:docker.mynexus.com)。
找一臺測試機(jī):
[root@localhost ~]# echo '192.168.0.125 docker.mynexus.com' >> /etc/hosts [root@localhost ~]# mkdir -p /etc/docker/certs.d/docker.mynexus.com再把nexus服務(wù)器上的根證書拷貝到客戶機(jī)上
[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/然后就可以開始使用了。
五、測試驗(yàn)證
1、pull一個(gè)鏡像
[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、打標(biāo)簽
這里的版本號是我隨便取的!!!
[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一個(gè)私服存在的鏡像
就是剛才我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一個(gè)私服上不存在的鏡像
比如拉取一個(gè)centos鏡像,這個(gè)在現(xiàn)在的私服上是不存在的
[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可以看到已經(jīng)成功將centos鏡像pull下來了,再看一眼私服。
私服中之前雖然沒有centos這個(gè)鏡像,但是它從代理的遠(yuǎn)程倉庫中下載了這個(gè)鏡像并存在了私服中。等下次再拉取這個(gè)鏡像的時(shí)候,就可以直接從私服中拉取。這個(gè)和之前作為maven、npm、yum私服的原理是一樣的。
參考文章:
http://www.eryajf.net/1816.html
https://zhang.ge/5139.html
總結(jié)
以上是生活随笔為你收集整理的nexus3作为docker私服的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蚂蚁金服的生死时速!
- 下一篇: es java 模糊查询_java使用e