玩轉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:
- index
負責並維護有關用戶帳戶、鏡像的校驗以及公共命名空間的信息。
Web UI
元數據存儲
認證服務
符號化 - registry
是鏡像和圖表的倉庫,它不具有本地數據庫以及不提供用戶認證,通過Index Auth service 的Token的方式進行認證。 - Registry Client
Docker充當registry客戶端來維護推送和拉取,以及客戶端的授權。
4.三個典型情景
5.搭建私有倉庫
在集羣服務時,需要docker,如果此時還從外部鏡像倉庫中下載鏡像,會十分緩慢
docker hub雖然方便,但是還是有限制:
需要internet連接, 速度慢
所有人都可以訪問
由於安全原因企業不允許將鏡像放到外網
好消息是docker公司已經將registry開源,我們可以快速構建企業私有倉庫
私有倉庫的優點:
- 節省網絡帶寬,針對於每個鏡像不用每個人都去中央倉庫上面去下載,只需要從私有倉庫中下載即可;
- 提供鏡像資源利用,針對於公司內部使用的鏡像,推送到本地的私有倉庫中,以供公司內部相關人員使用。目前Docker Registry已經升級到了v2,最新版的Docker已不再支持v1。Registry v2使用Go語言編寫,在性能和安全性上做了很多優化,重新設計了鏡像的存儲格式。如果需要安裝registry v2,只需下載registry:2.2即可。
- 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>