在實際使用docker的過程中,因為產品主要使用了微服務的架構,會有很多不同的服務鏡像,將生成的鏡像放到docker-hub上是不合適的。而且為了便于后續的自動化運維和部署方便,都需要在產品運行的內網部署一個私有化的docker倉庫。將部署的過程簡單記錄如下:
安裝docker-ce
docker官網有比較詳細的文檔進行指導,參考如下鏈接:
https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/
使用registry
docker local倉庫也是通過docker鏡像提供的,官方提供了一個registry的鏡像,關于registry的相關介紹在docker官網上有比較詳細的說明,本文只是說明了搭建本地鏡像的一個簡化過程。如果想了解更多的詳細,可以參考如下鏈接:
https://docs.docker.com/registry/deploying/
使用的時候,直接啟動registry鏡像就可以了。啟動命令如下:
docker run -d \
-p 5000:5000 \
--restart=always \
--name registry \
-v /mnt/docker_imgs:/var/lib/registry \
registry:2
目前一般都是使用v2版本的, -v指定了宿主機上的目錄用來作為docker倉庫的存儲位置,如果不指定的話,registry鏡像重啟之后會丟失已經存儲在本地倉庫的鏡像文件。其他命令都是docker常見命令,可以參考官網的docker命令文檔。
啟動registry鏡像之后,可以通過docker ps看到如下信息:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cd88743185ff registry:2 "/entrypoint.sh /e..." 4 seconds ago Up 4 seconds 0.0.0.0:5000->5000/tcp registry
按照上面的命令啟動之后,就可以直接在本地使用local倉庫了。用ubuntu鏡像實驗之后,是下面的效果:
root@worker:/home/zhbo# docker tag ubuntu:16.04 localhost:5000/fcss/base
root@worker:/home/zhbo# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry 2 177391bcf802 2 days ago 33.3MB
ubuntu 16.04 20c44cd7596f 2 weeks ago 123MB
localhost:5000/fcss/base latest 20c44cd7596f 2 weeks ago 123MB
root@worker:/home/zhbo# docker push localhost:5000/fcss/base
The push refers to a repository [localhost:5000/fcss/base]
2f5b0990636a: Pushed
c9748fbf541d: Pushed
b3968bc26fbd: Pushed
aa4e47c45116: Pushed
788ce2310e2f: Pushed
latest: digest: sha256:d4558f7616365813792918b6d73dc474bcacf99b13d1ed947731a653fb6e260c size: 1357
root@worker:/home/zhbo# ls
docker_imgs sources.list
root@worker:/home/zhbo# ls docker_imgs
docker
root@worker:/home/zhbo# ls docker_imgs/docker
registry
root@worker:/home/zhbo# ls docker_imgs/docker/registry/
v2
root@worker:/home/zhbo# ls docker_imgs/docker/registry/v2
blobs repositories
root@worker:/home/zhbo# ls docker_imgs/docker/registry/v2/repositories/
fcss
root@worker:/home/zhbo# ls docker_imgs/docker/registry/v2/repositories/fcss
base
root@worker:/home/zhbo# ls docker_imgs/docker/registry/v2/repositories/fcss/base
_layers _manifests _uploads
但是這個時候,如果在其他pc上通過docker pull獲取新加的這個鏡像,是會出錯的,如下:
root@zhbo-OptiPlex-9020:/home/zhbo# docker pull 172.22.15.165:5000/fcss/base
Using default tag: latest
Error response from daemon: Get https://172.22.15.165:5000/v1/_ping: http: server gave HTTP response to HTTPS client
這是因為:registry官方鏡像為了保證安全,缺省使用https進行通信,畢竟在生產環境中如果使用了http,是很容易被中間人攻擊的。 測試環境中我們可以將通信方式修改為http,生產環境強烈不建議這樣做。
修改通信方式為http
-
修改docker client pc里面的/etc/docker/daemon.json文件,如果沒有該文件,可以手工創建。在這個文件中添加如下內容:
{ "insecure-registries" : ["myregistrydomain.com:5000"] }
重啟client端的docker服務
使用自簽名證書
更安全的方式是使用自簽名證書,在docker官網上有介紹:
https://docs.docker.com/registry/insecure/#use-self-signed-certificates
這種方式可以在測試環境中使用,因為可信的證書頒發機構都需要有一個可用的域名,我們在內網部署的時候不一定是有域名的。可能就是一個內網IP地址。
這個時候可以用下面的方法使用自簽名證書:
生成自簽名證書
在docker registry的server上,執行:
$ mkdir -p certs
$ openssl req \
-newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
-x509 -days 365 -out certs/domain.crt
注意:common name要填寫實際的域名,不能使用ip地址,否則在使用的時候可能會提示如下錯誤:
Using default tag: latest
Error response from daemon: Get https://172.22.15.165:443/v1/_ping: x509: cannot validate certificate for 172.22.15.165 because it doesn't contain any IP SANs
重啟registry鏡像
docker run -d \
--restart=always \
--name registry \
-v `pwd`/certs:/certs \
-v /mnt/docker_imgs:/var/lib/registry \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
-p 443:443 \
registry:2
添加信任關系
在所有需要用到docker daemon的pc上執行如下命令。這里以ubuntu作為示例:
$ cp certs/domain.crt /usr/local/share/ca-certificates/myregistrydomain.com.crt
update-ca-certificates
在實驗環境中,可能并沒有域名。這個時候可以通過修改/etc/hosts加上靜態域名解析。添加CA證書之后需要重新啟動docker daemon.
實際使用的效果如下:
root@zhbo-OptiPlex-9020:/home/zhbo# docker pull dockers.fcss:443/fcss/base
Using default tag: latest
latest: Pulling from fcss/base
660c48dd555d: Pull complete
4c7380416e78: Pull complete
421e436b5f80: Pull complete
e4ce6c3651b3: Pull complete
be588e74bd34: Pull complete
Digest: sha256:d4558f7616365813792918b6d73dc474bcacf99b13d1ed947731a653fb6e260c
Status: Downloaded newer image for dockers.fcss.fortinet:443/fcss/base:latest
使用受信任的證書
在生產環境中可以使用上面的自簽名證書,這樣在部署的時候就需要將domain.crt復制到所有的docker daemon的宿主機上。如果有自己的域名,可以通過let's encrypt申請免費的ssl證書,這樣就不用像現在這樣麻煩了。
私有倉庫的一些操作:
私有倉庫可以通過registry提供的api來操作,可以參考官網的api文檔,鏈接如下:
https://docs.docker.com/registry/spec/api/#detail
查看所有鏡像
docker search命令不能搜索本地倉庫的鏡像文件,實際測試會報錯??梢杂孟旅娴姆绞将@取本地倉庫中的所有鏡像:
# curl https://<registry domain>/v2/_catalog
{"repositories":["fcss/base"]}