Docker 是一個開源的容器引擎,可讓開發者把應用以及依賴打包到一個可移植的容器中。Docker 採用Go語言編寫,當時學習Go語言的時候已經知道這個神器,可是一直沒有合適的場景正式使用,如今機會來啦。linux
Registry 是Docker 鏡像的倉庫,使用Registry 能搭建私有的Docker倉庫,方便分發自定義鏡像。docker
本文的內容在如下版本中測試經過,不一樣的版本可能存在不一樣的地方,如下內容僅供參考。
vim
1 |
[root@CentOS72-40 /] |
安裝Docker 須要內核是3.10 以上64位的Linux 系統。查看Linux 內核版本,CentOS7.2是沒問題的。(如今Mac 和 Windows 均可以安裝Docker)
centos
1 |
[root@CentOS72-40 ~]# uname -r |
CentOS 7 以後的默認防火牆是firewall,習慣使用iptables 作防火牆,因此仍是修改成iptables 作防火牆。
中止firewall ,而後禁止firewall 開機啓動。
tomcat
1 |
[root@CentOS72-40 ~] |
檢查iptables 的狀態,若沒有安裝iptables 服務則須要安裝iptables-services。
tcp
1 |
[root@CentOS72-40 ~] |
編輯iptables 防火牆文檔,開放22和5000端口(5000端口供Registry對外提供服務)。
學習
1 |
[root@CentOS72-40 ~]# vim /etc/sysconfig/iptables |
設置iptables 防火牆開機啓動,啓動防火牆使更改的配置生效。
測試
1 |
[root@CentOS72-40 ~]# systemctl enable iptables |
建立Docker 的yum 的倉庫。
ui
1 |
[root@CentOS72-40 ~]# tee /etc/yum.repos.d/docker.repo <<-'EOF' |
安裝docker-engine 會自動安裝依賴 docker-engine-selinux。
this
大專欄 Docker 安裝與Registry V2私有倉庫搭建">1 |
[root@CentOS72-40 ~]# yum install docker-engine |
設置開機啓動docker,而後啓動docker。
1 |
[root@CentOS72-40 ~]# systemctl enable docker |
安裝完docker以後將會發現建立docker0網卡。
1 |
[root@CentOS72-40 /]# ifconfig |
拉取2.5.1版本的Registry 鏡像。
1 |
[root@CentOS72-40 /]# docker pull registry:2.5.1 |
啓動Registry鏡像。根據Registry的文檔把/tmp/registry-dev 目錄映射出來是有問題的,真正的數據不是存儲再這個目錄。不知道是不新版的存在這個目錄,反正2.5.1版的Registry 數據不是保存在這裏,進入容器發現真正存儲鏡像的時在/var/lib/registry 目錄,因此把這個目錄映射出來。(跟着官方文檔竟然也走不通,鬱悶,會不會是官方故意挖個坑讓你們踩的呢)
1 |
[root@CentOS72-40 /]# docker run -d -p 5000:5000 -v /data/registry:/var/lib/registry --name registry registry:2.5.1 |
打開http://172.18.2.40:5000/v2/_catalog 驗證是否安裝成功。
如果啓用iptables的時候沒有放開5000端口,在registry 運行的時候再放開。以後停了registry 從新打開registry 就會有下面的錯誤。不單單是Registry這個容器存在這個問題,全部容器的在運行中,主機的iptables 被修改過,停了容器再啓動都會有這個問題。目前沒有找到好的解決版本,可是從新啓動docker 服務 systemclt restart docker
能夠臨時解決這個問題。
1 |
Error response from daemon: driver failed programming external connectivity on endpoint registry (4b748e54bb59d8bfe1f1bd961c6f0fcfbd8ec94c75c5d4880134bd2a453b0d51): iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 5000 -j DNAT --to-destination 172.17.0.2:5000 ! -i docker0: iptables: No chain/target/match by that name. |
對已經存在的鏡像wendyeq/tomcat8
打上帶Registry地址的tag,版本號位1.0。而後推送到Registry,發現推送不了,緣由是Registry V2採用https協議。
1 |
[root@M-CentOS72-36 ~]# docker tag wendyeq/tomcat8 172.18.2.40:5000/wendyeq/tomcat8:1.0 |
解決這個問題的最簡單方式是修改docker的啓動腳本,添加-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock --insecure-registry 172.18.2.40:5000
內容。
1 |
[root@M-CentOS72-36 ~]# vim /usr/lib/systemd/system/docker.service |
修改完以後就能夠推送到Registry 的私有倉庫啦。
1 |
[root@M-CentOS72-36 ~]# systemctl start docker |
Docker 和 Registry 的安裝都比較簡單,可是Registry查找鏡像好麻煩,特別是查看版本號,要好好研究一下Registry 的文檔才行。