centos7搭建docker私人倉庫(kubernetes)

咱們平時鏡像都是習慣於放在公共倉庫的,好比Dockerhub, Daocloud。但在企業裏,咱們常常會須要搭建公司本身的鏡像倉庫。
這篇文章講解如何用docker提供的registry鏡像來搭建本身的鏡像倉庫。node

不添加ssl認證的倉庫

下面用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

建立一個帶ssl認證的高可用倉庫

  1. 安裝opensslvim

    yum install -y openssl
  2. 修改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
  3. 生成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 []:
  4. 建立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
  5. 配置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

使用kubernetes部署docker倉庫

上面的容器是由doker直接啓動的,因爲我使用的是kubernetes集羣,因此我但願一切容器都能由kubernetes來管理。
因而我爲kubernetes集羣添加了一個node節點,來作k8s集羣的鏡像倉庫。

  1. 生成ssl證書
    參考上面,在準備的node節點上生成ssl證書。
  2. 給node添加標籤
    由於我只想在這臺節點上運行registry容器,因此須要給這臺節點添加標籤,便於k8s部署能只選到這臺節點。

    # n3是這個節點的hostname.若是沒有添加k8s客戶端權限,能夠在master節點上執行。
    kubectl label node n3 bind-registry=ture
  3. 建立registry目錄,用於持久化images數據

    mkdir /var/lib/registry
  4. 部署registry。dockerhub-dp.yaml我會在最後面貼出來。

    kubectl create -f dockerhub-dp.yaml
  5. 配置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。

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
相關文章
相關標籤/搜索