咱們平時鏡像都是習慣於放在公共倉庫的,好比Dockerhub, Daocloud。但在企業裏,咱們常常會須要搭建公司本身的鏡像倉庫。
這篇文章講解如何用docker提供的registry鏡像來搭建本身的鏡像倉庫。node
下面用registry:2.6.2鏡像建立docker倉庫。
將宿主機的5000端口映射到容器的5000端口。
將宿主機/mnt/registry掛在到容器的/var/lib/registry目錄,容器裏的這個目錄就是存放鏡像的地方。這樣能夠將數據持久化,當容器掛掉時鏡像不會丟失。linux
mkdir /mnt/registry docker run -d \ -p 5000:5000 \ --restart=always \ --name registry \ -v /mnt/registry:/var/lib/registry \ registry:2.6.2
docker倉庫是須要ssl認證的,因爲如今沒有添加ssl認證,須要在docker客戶端添加參數:git
vim /etc/sysconfig/docker # 在OPTIONS下添加--insecure-registry=<host-ip>:5000 OPTIONS='--selinux-enabled --log-driver=json-file --signature-verification=false --insecure-registry=10.34.31.13:5000' # 重啓docker systemctl restart docker
咱們能夠測試一下新建的倉庫是否可用。docker
docker push 10.34.31.13:5000/hello-world:v1
但這樣形式的倉庫可用性不高,好比咱們有多個鏡像倉庫要使用,咱們須要常常去修改--insecure-registry參數。
下面會講解如何建立一個https協議的高可用倉庫。json
安裝opensslvim
yum install -y openssl
修改openssl.cnf文件api
vim /etc/pki/tls/openssl.cnf # 找到v3_ca,在下面添加宿主機的IP地址 [ v3_ca ] subjectAltName = IP:10.34.31.13
若是沒有修改這個文件,最後生成的ssl證書使用時會報錯以下:app
x509: cannot validate certificate 10.34.31.13 because it doesn't contain any IP SANs
生成ssl證書dom
mkdir /certs openssl req -newkey rsa:4096 -nodes -sha256 \ -keyout /certs/domain.key -x509 -days 1000 \ -out /certs/domain.cert # 生成證書的過程當中須要填寫如下參數,在Conmmon那一欄填寫你爲dokcer倉庫準備的域名 Country Name (2 letter code) [AU]:CN State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:10.34.31.13:5000 Email Address []:
建立docker倉庫測試
# 這裏啓動方式跟上面差異不大,多了掛載/certs文件夾和添加了兩個certificate參數 docker run -d \ --restart=always \ --name registry \ -v /certs:/certs \ -v /var/lib/registry:/var/lib/registry \ -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.cert \ -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \ -p 5000:5000 \ registry:2.6.2
配置docker客戶端
# 之後須要使用這個倉庫的機器,在客戶端像這樣配置一下就能夠了 mkdir /etc/docker/certs.d/10.34.31.13:5000 cp /certs/domain.cert /etc/docker/certs.d/10.34.31.13:5000/ca.crt # 如今就能夠測試一下了 docker push 10.34.31.13:5000/hello-world:v1
上面的容器是由doker直接啓動的,因爲我使用的是kubernetes集羣,因此我但願一切容器都能由kubernetes來管理。
因而我爲kubernetes集羣添加了一個node節點,來作k8s集羣的鏡像倉庫。
給node添加標籤
由於我只想在這臺節點上運行registry容器,因此須要給這臺節點添加標籤,便於k8s部署能只選到這臺節點。
# n3是這個節點的hostname.若是沒有添加k8s客戶端權限,能夠在master節點上執行。 kubectl label node n3 bind-registry=ture
建立registry目錄,用於持久化images數據
mkdir /var/lib/registry
部署registry。dockerhub-dp.yaml我會在最後面貼出來。
kubectl create -f dockerhub-dp.yaml
配置docker客戶端
這個跟上面一個思路,端口稍有不一樣。
# 之後須要使用這個倉庫的機器,在客戶端像這樣配置一下就能夠了 mkdir /etc/docker/certs.d/10.34.31.13:30003 cp /certs/domain.cert /etc/docker/certs.d/10.34.31.13:5000/ca.crt
爲了訪問方便,我將registry service的端口設置爲了NodePort,但k8s限制這個端口只能設置爲30000以上,全部我這裏設置爲了30003。
apiVersion: apps/v1beta2 kind: Deployment metadata: name: docker-local-hub namespace: kube-system labels: app: registry spec: replicas: 1 selector: matchLabels: app: registry template: metadata: labels: app: registry spec: containers: - name: registry image: registry:2.6.2 ports: - containerPort: 5000 env: - name: REGISTRY_HTTP_TLS_CERTIFICATE value: "/certs/domain.cert" - name: REGISTRY_HTTP_TLS_KEY value: "/certs/domain.key" volumeMounts: - mountPath: /var/lib/registry name: docker-hub - mountPath: /certs name: certs nodeSelector: bind-registry: "ture" volumes: - name: docker-hub hostPath: path: /var/lib/registry type: Directory - name: certs hostPath: path: /certs type: Directory --- apiVersion: v1 kind: Service metadata: name: docker-local-hub namespace: kube-system labels: app: registry spec: selector: app: registry ports: - port: 5000 targetPort: 5000 nodePort: 30003 type: NodePort