centos7搭建docker私人倉(cāng)庫(kù)的方法(kubernetes)
我們平時(shí)鏡像都是習(xí)慣于放在公共倉(cāng)庫(kù)的,比如Dockerhub, Daocloud。但在企業(yè)里,我們經(jīng)常會(huì)需要搭建公司自己的鏡像倉(cāng)庫(kù)。
這篇文章講解如何用docker提供的registry鏡像來(lái)搭建自己的鏡像倉(cāng)庫(kù)。
不添加ssl認(rèn)證的倉(cāng)庫(kù)
下面用registry:2.6.2鏡像創(chuàng)建docker倉(cāng)庫(kù)。
將宿主機(jī)的5000端口映射到容器的5000端口。
將宿主機(jī)/mnt/registry掛在到容器的/var/lib/registry目錄,容器里的這個(gè)目錄就是存放鏡像的地方。這樣可以將數(shù)據(jù)持久化,當(dāng)容器掛掉時(shí)鏡像不會(huì)丟失。
mkdir /mnt/registry docker run -d \ -p 5000:5000 \ --restart=always \ --name registry \ -v /mnt/registry:/var/lib/registry \ registry:2.6.2
docker倉(cāng)庫(kù)是需要ssl認(rèn)證的,由于現(xiàn)在沒(méi)有添加ssl認(rèn)證,需要在docker客戶端添加參數(shù):
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
我們可以測(cè)試一下新建的倉(cāng)庫(kù)是否可用。
docker push 10.34.31.13:5000/hello-world:v1
但這樣形式的倉(cāng)庫(kù)可用性不高,比如我們有多個(gè)鏡像倉(cāng)庫(kù)要使用,我們需要經(jīng)常去修改--insecure-registry參數(shù)。
下面會(huì)講解如何創(chuàng)建一個(gè)https協(xié)議的高可用倉(cāng)庫(kù)。
創(chuàng)建一個(gè)帶ssl認(rèn)證的高可用倉(cāng)庫(kù)
1、安裝openssl
yum install -y openssl
2、修改openssl.cnf文件
vim /etc/pki/tls/openssl.cnf # 找到v3_ca,在下面添加宿主機(jī)的IP地址 [ v3_ca ] subjectAltName = IP:10.34.31.13
如果沒(méi)有修改這個(gè)文件,最后生成的ssl證書使用時(shí)會(huì)報(bào)錯(cuò)如下:
x509: cannot validate certificate 10.34.31.13 because it doesn't contain any IP SANs
3、生成ssl證書
mkdir /certs openssl req -newkey rsa:4096 -nodes -sha256 \ -keyout /certs/domain.key -x509 -days 1000 \ -out /certs/domain.cert # 生成證書的過(guò)程中需要填寫以下參數(shù),在Conmmon那一欄填寫你為dokcer倉(cāng)庫(kù)準(zhǔn)備的域名 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 []:
4、創(chuàng)建docker倉(cāng)庫(kù)
# 這里啟動(dòng)方式跟上面差別不大,多了掛載/certs文件夾和添加了兩個(gè)certificate參數(shù) 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
5、配置docker客戶端
# 以后需要使用這個(gè)倉(cāng)庫(kù)的機(jī)器,在客戶端像這樣配置一下就可以了 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 # 現(xiàn)在就可以測(cè)試一下了 docker push 10.34.31.13:5000/hello-world:v1
使用kubernetes部署docker倉(cāng)庫(kù)
上面的容器是由doker直接啟動(dòng)的,由于我使用的是kubernetes集群,所以我希望一切容器都能由kubernetes來(lái)管理。
于是我為kubernetes集群添加了一個(gè)node節(jié)點(diǎn),來(lái)做k8s集群的鏡像倉(cāng)庫(kù)。
1、生成ssl證書
參考上面,在準(zhǔn)備的node節(jié)點(diǎn)上生成ssl證書。
2、給node添加標(biāo)簽
因?yàn)槲抑幌朐谶@臺(tái)節(jié)點(diǎn)上運(yùn)行registry容器,所以需要給這臺(tái)節(jié)點(diǎn)添加標(biāo)簽,便于k8s部署能只選到這臺(tái)節(jié)點(diǎn)。
# n3是這個(gè)節(jié)點(diǎn)的hostname.如果沒(méi)有添加k8s客戶端權(quán)限,可以在master節(jié)點(diǎn)上執(zhí)行。 kubectl label node n3 bind-registry=ture
3、創(chuàng)建registry目錄,用于持久化images數(shù)據(jù)
mkdir /var/lib/registry
4、部署registry。dockerhub-dp.yaml我會(huì)在最后面貼出來(lái)。
kubectl create -f dockerhub-dp.yaml
5、配置docker客戶端
這個(gè)跟上面一個(gè)思路,端口稍有不同。
# 以后需要使用這個(gè)倉(cāng)庫(kù)的機(jī)器,在客戶端像這樣配置一下就可以了 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
為了訪問(wèn)方便,我將registry service的端口設(shè)置為了NodePort,但k8s限制這個(gè)端口只能設(shè)置為30000以上,所有我這里設(shè)置為了30003。
dockerhub-dp.yaml
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
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Docker網(wǎng)段和內(nèi)網(wǎng)網(wǎng)段ip沖突導(dǎo)致無(wú)法訪問(wèn)網(wǎng)絡(luò)的兩種解決方法
本文主要介紹了Docker網(wǎng)段和內(nèi)網(wǎng)網(wǎng)段沖突導(dǎo)致無(wú)法訪問(wèn)網(wǎng)絡(luò)的兩種解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06Docker在Windows系統(tǒng)中的安裝和使用方法詳解
這篇文章主要給大家介紹了關(guān)于Docker在Windows系統(tǒng)中的安裝和使用方法,Docker允許開(kāi)發(fā)中將應(yīng)用、依賴、函數(shù)庫(kù)、配置一起打包,形成可移植鏡像Docker應(yīng)用運(yùn)行在容器中,需要的朋友可以參考下2023-09-09如何通過(guò)vs2017的Dockerfile來(lái)生成鏡像
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)vs2017的Dockerfile來(lái)生成鏡像,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07

Docker中優(yōu)化Mysql運(yùn)行內(nèi)存的操作

Docker安裝mysql主從復(fù)制的實(shí)現(xiàn)步驟