玩轉Docker----- 第三部-----------docker公有、私有倉庫的搭建

玩轉Docker----- 第三部-----------docker公有、私有倉庫的搭建

1.Docker 倉庫

Docker倉庫是用來包含鏡像的位置,Docker提供一個註冊服務器

(Register)來保存多個倉庫,每個倉庫又可以包含多個具備不同tag的鏡像。

Docker運行中使用的默認倉庫是Docker Hub公共倉庫。

倉庫的出現是爲了避免鏡像太多難以管理的局面。
在這裏插入圖片描述
有時候會把倉庫和倉庫註冊服務器(Registry)混爲一談,並不嚴格區分。
實際上,倉庫註冊服務器上往往存放着多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標籤(tag)。

倉庫分爲公開倉庫(Public)和私有倉庫(Private)兩種形式。
最大的公開倉庫是 Docker Hub,存放了數量龐大的鏡像供用戶下載
國內的公開倉庫包括 Docker Pool等,可以提供大陸用戶更穩定快速的訪問

當然,用戶也可以在本地網絡內創建一個私有倉庫
當用戶創建了自己的鏡像之後可以使用 push 命令將它上傳到公有或者私有倉庫,
這樣下次在另外一臺機器上使用這個鏡像時候,只需要從倉庫上 pull 下來就可以了。

有時使用 Docker Hub 這樣的公共倉庫可能不方便,會侵犯到企業的隱私,所以我們可以搭建私人倉庫去使用

2.Docker Hub

Docker Hub是Docker公司維護的公共倉庫,用戶可以免費使用,也可以購買私有倉庫。

在這裏插入圖片描述
第一步:首先需要註冊一個docker hub帳號:

訪問https://hub.docker.com/

登錄成功後註冊一個賬號,然後登錄賬號
在這裏插入圖片描述
創建倉庫:

填寫倉庫名—選擇public—create

在這裏插入圖片描述
此時我們已經在官方的倉庫中創建了一個倉庫,下面我們可以上傳鏡像到倉庫中

第二步:登陸docker hub帳號

docker login

在這裏插入圖片描述
登陸成功後會自動生成以下文件,在這裏存儲了docker hub中的用戶名和信息:

在這裏插入圖片描述
第三步:上傳鏡像到docker hub

先把鏡像名改爲用戶名/鏡像名的形式:
			docker tag busybox:latest 021129/busybox:latest

上傳:
			docker push 021129/busybox

search搜索自己的用戶名:
			docker search 021129

在這裏插入圖片描述
然後就可以看到用戶021129上傳的鏡像了

配置鏡像加速器

爲什麼要配置鏡像加速器呢?

因爲我們現在拉取的鏡像都是從國外的網站拉取的鏡像,因爲docker的官網在國外。我們使用docker pull 拉取鏡像是比較慢的,所以我們可以使用阿里雲提供的鏡像加速器,這樣就加速了我們拉取鏡像的速度。

步驟:

第一步:登陸阿里雲,註冊帳號,也可以使用支付寶或者淘寶等登陸方式。

找到鏡像加速器
在這裏插入圖片描述

[root@server1 ~]# cd /etc/docker/
[root@server1 docker]# ls
key.json
[root@server1 docker]# vim daemon.json
[root@server1 docker]# cat daemon.json 
{
  "registry-mirrors": ["https://eqyqr0h1.mirror.aliyuncs.com"]
}
[root@server1 docker]# systemctl daemon-reload
[root@server1 docker]# systemctl restart docker

操作完成之後,我們拉取鏡像的速度就快了。因爲我們使用的是阿里雲這個路徑

[root@server1 docker]# docker pull nginx   拉取
可以看到速度明顯提升了。。。。。。。

3.Registry的工作原理

在這裏插入圖片描述
index服務主要提供鏡像索引以及用戶認證的功能。當下載一個鏡像的時候,首先會去index服務上做認證,然後查找鏡像所在的registry的地址並放回給docker客戶端,docker客戶端再從registry下載鏡像,在下載過程中registry會去index校驗客戶端token的合法性,不同鏡像可以保存在不同的registry服務上,其索引信息都放在index服務上。

Docker Registry有三個角色,分別是index、registry和registryclient:

  1. index
    負責並維護有關用戶帳戶、鏡像的校驗以及公共命名空間的信息。
    Web UI
    元數據存儲
    認證服務
    符號化
  2. registry
    是鏡像和圖表的倉庫,它不具有本地數據庫以及不提供用戶認證,通過Index Auth service 的Token的方式進行認證。
  3. Registry Client
    Docker充當registry客戶端來維護推送和拉取,以及客戶端的授權。

4.三個典型情景

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

5.搭建私有倉庫

在集羣服務時,需要docker,如果此時還從外部鏡像倉庫中下載鏡像,會十分緩慢

docker hub雖然方便,但是還是有限制:

需要internet連接, 速度慢
所有人都可以訪問
由於安全原因企業不允許將鏡像放到外網
好消息是docker公司已經將registry開源,我們可以快速構建企業私有倉庫

私有倉庫的優點:

  1. 節省網絡帶寬,針對於每個鏡像不用每個人都去中央倉庫上面去下載,只需要從私有倉庫中下載即可;
  2. 提供鏡像資源利用,針對於公司內部使用的鏡像,推送到本地的私有倉庫中,以供公司內部相關人員使用。目前Docker Registry已經升級到了v2,最新版的Docker已不再支持v1。Registry v2使用Go語言編寫,在性能和安全性上做了很多優化,重新設計了鏡像的存儲格式。如果需要安裝registry v2,只需下載registry:2.2即可。
  3. Docker官方提供的工具docker-registry可以用於構建私有的鏡像倉庫

導入registry鏡像:

[root@server1 docker]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
486039affc0a: Pull complete 
ba51a3b098e6: Pull complete 
8bb4c43d6c8e: Pull complete 
6f5f453e5f2d: Pull complete 
42bc10b72f42: Pull complete 
Digest: sha256:7d081088e4bfd632a88e3f3bcd9e007ef44a796fddfe3261407a3f9f04abe1e7
Status: Downloaded newer image for registry:latest
[root@server1 docker]# docker images
registry                 latest              708bc6af7e5e        4 months ago        25.8MB

[root@server1 docker]# docker history registry:latest   # 查看構建歷史
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
708bc6af7e5e        4 months ago        /bin/sh -c #(nop)  CMD ["/etc/docker/registr…   0B                  
<missing>           4 months ago        /bin/sh -c #(nop)  ENTRYPOINT ["/entrypoint.0B                  
<missing>           4 months ago        /bin/sh -c #(nop) COPY file:507caa54f88c1f38…   155B                
<missing>           4 months ago        /bin/sh -c #(nop)  EXPOSE 5000                  0B                  
<missing>           4 months ago        /bin/sh -c #(nop)  VOLUME [/var/lib/registry]   0B                  
<missing>           4 months ago        /bin/sh -c #(nop) COPY file:4544cc1555469403…   295B                
<missing>           4 months ago        /bin/sh -c #(nop) COPY file:21256ff7df5369f7…   20.1MB              
<missing>           4 months ago        /bin/sh -c set -ex     && apk add --no-cache…   1.28MB              
<missing>           4 months ago        /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B                  
<missing>           4 months ago        /bin/sh -c #(nop) ADD file:e38375b009a2e2c9b…   4.41MB 

[root@server1 docker]# docker run -d -p 5000:5000 --name registry registry   
a6e8fcb11aa6c6c242af163ba435862bc57fbc94230ae59387529dffdce89895

[root@server1 docker]# docker volume ls          #本地docker數據目錄  
DRIVER              VOLUME NAME
local               929dd77d2ec1a4879d641d14276ea602ef6525da94ca475527747364cc1c63c1
local               bcb9fcb4b542296667bf580da84bbbffba65fa56869bcbdbd51343fd67e0bea9

[root@server1 docker]# docker volume prune    #釋放現在不用的邏輯卷
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
929dd77d2ec1a4879d641d14276ea602ef6525da94ca475527747364cc1c63c1

[root@server1 docker]# docker volume ls
DRIVER              VOLUME NAME
local               bcb9fcb4b542296667bf580da84bbbffba65fa56869bcbdbd51343fd67e0bea9

[root@server1 docker]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      7447/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      7738/master         
tcp6       0      0 :::5000                 :::*                    LISTEN      18166/docker-proxy       
 ##5000端口打開
tcp6       0      0 :::8080                 :::*                    LISTEN      17666/httpd         
tcp6       0      0 :::22                   :::*                    LISTEN      7447/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      7738/master         
       

至此,倉庫在本地已經架設完成了。。。。。。。。。

現在我們上傳鏡像到registry中:

將本地鏡像上傳至私有倉庫,本地鏡像在命名時需要加上倉庫的ip和端口:
[root@server1 docker]# docker tag nginx:latest localhost:5000/nginx:lastest

上傳:
[root@server1 docker]# docker push localhost:5000/nginx
The push refers to repository [localhost:5000/nginx]
e89b70d28795: Pushed 
832a3ae4ac84: Pushed 
014cf8bfcb2d: Pushed 
lastest: digest: sha256:600bff7fb36d7992512f8c07abd50aac08db8f17c94e3c83e47d53435a1a6f7c size: 948

上傳完成之後我們來測試一下。。。。。。。。。。。。。。。

測試從本地倉庫能否拉取鏡像:

[root@server1 docker]# docker rmi localhost:5000/nginx:lastest   #刪除現有的本地鏡像:
Untagged: localhost:5000/nginx:lastest
Untagged: localhost:5000/nginx@sha256:600bff7fb36d7992512f8c07abd50aac08db8f17c94e3c83e47d53435a1a6f7c
[root@server1 docker]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
nginx                    v5                  8b37025d2302        30 hours ago        26.8MB
<none>                   <none>              5070b9e8245a        30 hours ago        119MB
<none>                   <none>              202037ece7d7        31 hours ago        255MB
nginx                    v4                  5266ea500a02        31 hours ago        141MB
nginx                    v3                  d09706588144        31 hours ago        258MB
nginx                    v2                  2511596b68fd        31 hours ago        277MB
nginx                    v1                  91098f1d380a        34 hours ago        303MB
registry                 latest              708bc6af7e5e        4 months ago        25.8MB
busybox                  latest              59788edf1f3e        20 months ago       1.15MB
nginx                    latest              e548f1a579cf        2 years ago         109MB
game2048                 latest              19299002fdbe        3 years ago         55.5MB
ubuntu                   latest              07c86167cdc4        4 years ago         188MB
rhel7                    latest              0a3eb3fde7fd        5 years ago         140MB
gcr.io/distroless/base   latest              9a255d5fe262        50 years ago        16.8MB

[root@server1 docker]# docker pull localhost:5000/nginx:lastest     #拉取
lastest: Pulling from nginx
Digest: sha256:600bff7fb36d7992512f8c07abd50aac08db8f17c94e3c83e47d53435a1a6f7c 
Status: Downloaded newer image for localhost:5000/nginx:lastest
[root@server1 docker]# docker images 
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
nginx                    v5                  8b37025d2302        30 hours ago        26.8MB
<none>                   <none>              5070b9e8245a        30 hours ago        119MB
nginx                    v4                  5266ea500a02        31 hours ago        141MB
<none>                   <none>              202037ece7d7        31 hours ago        255MB
nginx                    v3                  d09706588144        31 hours ago        258MB
nginx                    v2                  2511596b68fd        31 hours ago        277MB
nginx                    v1                  91098f1d380a        34 hours ago        303MB
registry                 latest              708bc6af7e5e        4 months ago        25.8MB
busybox                  latest              59788edf1f3e        20 months ago       1.15MB
nginx                    latest              e548f1a579cf        2 years ago         109MB
localhost:5000/nginx     lastest             e548f1a579cf        2 years ago         109MB
game2048                 latest              19299002fdbe        3 years ago         55.5MB
ubuntu                   latest              07c86167cdc4        4 years ago         188MB
rhel7                    latest              0a3eb3fde7fd        5 years ago         140MB
gcr.io/distroless/base   latest              9a255d5fe262        50 years ago        16.8MB

拉取成功!!!!!!!!!!!!!!!!!!

docker inspect registry #查看到容器掛載點
在這裏插入圖片描述
切換到存放位置:

[root@server1 docker]# cd /var/lib/docker/volumes/
[root@server1 volumes]# ls
bcb9fcb4b542296667bf580da84bbbffba65fa56869bcbdbd51343fd67e0bea9  metadata.db
[root@server1 volumes]# cd bcb9fcb4b542296667bf580da84bbbffba65fa56869bcbdbd51343fd67e0bea9/
[root@server1 bcb9fcb4b542296667bf580da84bbbffba65fa56869bcbdbd51343fd67e0bea9]# ls
_data
#######從本地倉庫拉取的鏡像保存在本地的這個目錄中

至此,私有倉庫創建完成!!!!!!!!!!!!!!!

現在我們使用命令行操作不方便,而且遠程連接的話必須使用 tls 加密,所以我們現在做 tls 加密。

6.TLS 加密

[root@server1 ~]# mkdir -p certs		 	#建立目錄用來存放證書
[root@server1 ~]# openssl req \				#生成證書和key
> -newkey rsa:4096 -nodes -sha256 -keyout certs/westos.org.key \
> -x509 -days 365 -out certs/westos.org.crt
......
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Shaanxi           
Locality Name (eg, city) [Default City]:Xi'an
Organization Name (eg, company) [Default Company Ltd]:Westos
Organizational Unit Name (eg, section) []:Linux
Common Name (eg, your name or your server's hostname) []:westos.org
Email Address []:root@westos.org       		# 輸入證書的信息

[root@server1 ~]# ls certs/
westos.org.crt  westos.org.key
## 就生成了證書和key文件

[root@server1 ~]# docker rm -f registry 			#刪除這個容器,重新使用tls加密開啓
registry
[root@server1 ~]# docker run -d \
>   --restart=always \								#容器開機自啓
>   --name registry \								#容器名
>  -v "$(pwd)"/certs:/certs \						#證書目錄的掛載
> -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \				#-e是編輯容器運行的參數
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/westos.org.crt \		#指定證書
> -e REGISTRY_HTTP_TLS_KEY=/certs/westos.org.key \				# 指定key
> -p 443:443 \													# 端口映射
> registry														# 鏡像
883709cfe136ae1fdc7717f16c2536fa33dd30fa62a621f32ce8b6f9ba7a1a6c
[root@server1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                            NAMES
883709cfe136        registry            "/entrypoint.sh /etc…"   28 seconds ago      Up 27 seconds       0.0.0.0:443->443/tcp, 5000/tcp   registry

[root@server1 ~]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      7447/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      7738/master         
tcp6       0      0 :::8080                 :::*                    LISTEN      17666/httpd         
tcp6       0      0 :::22                   :::*                    LISTEN      7447/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      7738/master         
tcp6       0      0 :::443                  :::*                    LISTEN      18726/docker-proxy  

加密的端口已經打開了。。。。。。。。。。。。。。

[root@server1 ~]# vim /etc/hosts			# 寫一下解析,因爲我們剛纔使用的是westos這個名字
192.168.43.71    server1 westos.org

# 然後我們讓每個docker的守護進程都信任這個證書
[root@server1 ~]# mkdir -p /etc/docker/certs.d/westos.org
[root@server1 ~]# cp certs/westos.org.crt /etc/docker/certs.d/westos.org/
[root@server1 ~]# cd /etc/docker/certs.d/westos.org/
[root@server1 westos.org]# mv westos.org.crt ca.crt
[root@server1 westos.org]# ls
ca.crt					# 改名爲 ca.crt

上傳鏡像:
[root@server1 westos.org]# docker tag nginx:latest westos.org/nginx:latest
											      #我們剛纔做了解析,否則這裏不識別
[root@server1 westos.org]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
localhost:5000/nginx     lastest             9beeba249f3e        8 days ago          127MB
westos.org/nginx         latest              9beeba249f3e        8 days ago          127MB
		# 創建成功

[root@server1 westos.org]# docker push westos.org/nginx
The push refers to repository [westos.org/nginx]
e89b70d28795: Pushed 
832a3ae4ac84: Pushed 
014cf8bfcb2d: Pushed 
latest: digest: sha256:600bff7fb36d7992512f8c07abd50aac08db8f17c94e3c83e47d53435a1a6f7c size: 948
[root@server1 westos.org]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      7447/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      7738/master         
tcp6       0      0 :::8080                 :::*                    LISTEN      17666/httpd         
tcp6       0      0 :::22                   :::*                    LISTEN      7447/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      7738/master         
tcp6       0      0 :::443                  :::*                    LISTEN      18726/docker-proxy  
######我們只有443端口打開,這次就走的是443端口,使用了TLS加密

7.用戶認證>>>>>>限制訪問

添加本地基礎認證:
[root@server1 ~]# mkdir auth				# 建立用戶認證目錄
[root@server1 ~]# docker run \
>   --entrypoint htpasswd \
> registry -Bbn admin westos > auth/htpasswd
[root@server1 ~]# docker ps  -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                            NAMES
adabb9608b33        registry            "htpasswd -Bbn admin…"   5 minutes ago       Exited (0) 5 minutes ago                                    practical_ride
883709cfe136        registry            "/entrypoint.sh /etc…"   26 minutes ago      Up 26 minutes              0.0.0.0:443->443/tcp, 5000/tcp   registry
[root@server1 ~]# docker rm -f practical_ride	# 運行完刪除它


[root@server1 ~]# cat auth/htpasswd
admin:$2y$05$eRiyMoicCpWQs6RhSW6dW.IuDC866BRuTOcWrOBg2kz1xewUqj8na
## 生成我們需要的用戶和加密字符就好了。
我們還可以在追加一個用戶:
[root@server1 ~]# docker run  --rm --entrypoint htpasswd registry -Bbn xrt xiaoxu >> auth/htpasswd
[root@server1 ~]# cat auth/htpasswd
admin:$2y$05$eRiyMoicCpWQs6RhSW6dW.IuDC866BRuTOcWrOBg2kz1xewUqj8na

xrt:$2y$05$bWHDFBO1KQp6rAyozNQPY.L2UV/SbJGgax2Y5Y94EbpJkDry3qQUa


重新運行registry:
[root@server1 ~]# docker rm -f registry 
registry

[root@server1 ~]# docker run -d \
> --restart=always \
> --name registry \
> -v "$(pwd)"/certs:/certs \
> -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/westos.org.crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/westos.org.key \
> -p 443:443 \
> -v "$(pwd)"/auth:/auth \
> -e "REGISTRY_AUTH=htpasswd" \
> -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
> -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
> registry
dc2e8825d3c8e0296340170d03cdeca30fea07aea16d6ab0b5448e1e1ae8e671

測試:

[root@server1 ~]# docker push westos.org/nginx
The push refers to repository [westos.org/nginx]
e89b70d28795: Preparing 
832a3ae4ac84: Preparing 
014cf8bfcb2d: Preparing 
no basic auth credentials           #沒有基礎的用戶認證,所以不能上傳
[root@server1 ~]# docker login westos.org
Username: admin
Password: 
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-store

Login Succeeded
[root@server1 ~]# docker push westos.org/nginx
The push refers to repository [westos.org/nginx]
e89b70d28795: Pushed 
832a3ae4ac84: Pushed 
014cf8bfcb2d: Pushed 
latest: digest: sha256:600bff7fb36d7992512f8c07abd50aac08db8f17c94e3c83e47d53435a1a6f7c size: 948


我們發現,我們創建的兩個用戶都登陸成功,並且可以上傳。。。。。。。。

8.遠程主機連接docker倉庫

首先我們再打開一臺虛擬機server2,安裝好docker(server2也要能上網)

先寫本地解析:
[root@server2 ~]# vim /etc/hosts
192.168.43.71    server1 westos.org

#再把證書從server1上拷貝到server2上,遠程連接需要認證
[root@server1 ~]# scp -r /etc/docker/certs.d server2:/etc/docker/

[root@server2 westos.org]# ls
ca.crt
[root@server2 westos.org]# pwd
/etc/docker/certs.d/westos.org

[root@server2 westos.org]# docker login westos.org    #登錄
Username: admin
Password: 
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-store

Login Succeeded											#登錄成功




[root@server2 westos.org]# docker pull westos.org/nginx     #可以下載鏡像
Using default tag: latest
latest: Pulling from nginx
8176e34d5d92: Pull complete 
5b19c1bdd74b: Pull complete 
4e9f6296fa34: Pull complete 
Digest: sha256:600bff7fb36d7992512f8c07abd50aac08db8f17c94e3c83e47d53435a1a6f7c
Status: Downloaded newer image for westos.org/nginx:latest
[root@server2 westos.org]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
westos.org/nginx    latest              e548f1a579cf        2 years ago         109MB
[root@server2 westos.org]# docker run -d --name nginx -p 80:80 westos.org/nginx
72396f24e3b8fb31bc3828b741b6e49147bf2a4f2ae97f9538f7d488b60df526
[root@server2 westos.org]# docker ps           # 正常運行
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
72396f24e3b8        westos.org/nginx    "nginx -g 'daemon of…"   14 seconds ago      Up 12 seconds       0.0.0.0:80->80/tcp   nginx
[root@server2 westos.org]# curl  localhost       #可以訪問
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章