Docker基礎內容之倉庫

前言

Docker提供了開放的中央倉庫dockerhub,同時也容許咱們使用registry搭建本地私有倉庫。搭建私有倉庫有以下的優勢:html

  • 節省網絡帶寬,提高Docker部署速度,不用每一個鏡像從DockerHub上去下載,只需從私有倉庫下載就可;
  • 私有鏡像,包含公司敏感信息,不方便公開對外,只在公司內部使用。

 

私有倉庫基本部署

部署步驟

下載鏡像倉庫nginx

  要想部署docker私有倉庫必須使用官方給定的鏡像來進行構造。git

docker pull registry

 

建立容器github

docker run -d -p 5000:5000 --restart=always --name=registry-srv -v /mydata/dockerRegistry:/var/lib/registry registry

-d:後臺運行
-p:將容器的5000端口映射到宿主機的5000端口--name:容器的名稱
-v:將容器內的/var/lib/registry映射到宿主機的/mydata/dockerRegistry目錄,默認狀況下,會將倉庫存放於容器的/tmp/registry目錄下;

 

搭建容器相關的web服務web

docker pull hyper/docker-registry-web
docker run -it -p 8080:8080 --restart=always --name registry-web --link registry-srv -e REGISTRY_URL=http://registry-srv:5000/v2 -e REGISTRY_NAME=localhost:5000 hyper/docker-registry-web

-it: 以交互模式運行
--link:連接其它容器(registry-srv),在此容器中,使用registry-srv等同於registry-srv容器的局域網地址
-e:設置環境變量

 

上傳測試docker

docker push 192.168.1.87:5000/cbbing/hcharts

 

下載測試json

docker pull 192.168.1.87:5000/hcharts

 

注意centos

若是你不想使用 127.0.0.1:5000 做爲倉庫地址,好比想讓本網段的其餘主機也能把鏡像推送到私有倉庫。你就得把例如 192.168.199.100:5000 這樣的內網地址做爲私有倉庫地址,這時你會發現沒法成功推送鏡像。網絡

這是由於 Docker 默認不容許非 HTTPS 方式推送鏡像。咱們能夠經過 Docker 的配置選項來取消這個限制,或者查看下一節配置可以經過 HTTPS 訪問的私有倉庫。dom

對於使用 systemd 的系統,請在 /etc/docker/daemon.json 中寫入以下內容(若是文件不存在請新建該文件);修改完配置以後記得重啓docker。

{
  "registry-mirror": [
    "https://registry.docker-cn.com"
  ],
  "insecure-registries": [
    "192.168.199.100:5000"
  ]
}

 

web端查看私有倉庫鏡像

  訪問:http://192.168.1.87:8080/,網頁上呈現:

 

私有倉庫高級部署

環境準備

  新建一個文件夾,如下步驟均在該文件夾中進行

[root@host-3 ~]# mkdir /opt/ssl
[root@host-3 ssl]# cd /opt/ssl/

 

準備站點證書

  這裏假設咱們將要搭建的私有倉庫地址爲 docker.domain.com,下面咱們介紹使用 openssl 自行簽發 docker.domain.com 的站點 SSL 證書。

 

建立 CA 私鑰

[root@host-3 ssl]# openssl genrsa -out "root-ca.key" 4096
Generating RSA private key, 4096 bit long modulus
...........................++
................++
e is 65537 (0x10001)

 

建立 CA 根證書請求文件 

[root@host-3 ssl]# openssl req -new -key "root-ca.key" -out "root-ca.csr" -sha256 -subj '/C=CN/ST=beijing/L=chaoyang/O=emaxdata/CN=docker.domain.com'
# 以上命令中 -subj 參數裏的 /C 表示國家,如 CN;/ST 表示省;/L 表示城市或者地區;/O 表示組織名;/CN 通用名稱。

 

配置 CA 根證書

[root@host-3 ssl]# touch root-ca.cnf
[root@host-3 ssl]# vi root-ca.cnf
[root_ca]
basicConstraints = critical,CA:TRUE,pathlen:1
keyUsage = critical, nonRepudiation, cRLSign, keyCertSign
subjectKeyIdentifier=hash

 

簽發根證書

[root@host-3 ssl]# openssl x509 -req  -days 3650  -in "root-ca.csr" -signkey "root-ca.key" -sha256 -out "root-ca.crt" -extfile "root-ca.cnf" -extensions root_ca
Signature ok
subject=/C=CN/ST=beijing/L=chaoyang/O=emaxdata/CN=docker.domain.com
Getting Private key

 

生成站點 SSL 私鑰

[root@host-3 ssl]# openssl genrsa -out "docker.domain.com.key" 4096
Generating RSA private key, 4096 bit long modulus
................................................................................................++
.......................................................................................................................................++
e is 65537 (0x10001)

 

生成證書請求文件

[root@host-3 ssl]# openssl req -new -key "docker.domain.com.key" -out "site.csr" -sha256 -subj '/C=CN/ST=beijing/L=chaoyang/O=emaxdata/CN=docker.domain.com'

 

配置證書

[root@host-3 ssl]# touch site.cnf
[root@host-3 ssl]# vi site.cnf

[server]
authorityKeyIdentifier=keyid,issuer
basicConstraints = critical,CA:FALSE
extendedKeyUsage=serverAuth
keyUsage = critical, digitalSignature, keyEncipherment
subjectAltName = DNS:docker.domain.com, IP:127.0.0.1
subjectKeyIdentifier=hash

 

簽署站點 SSL 證書

root@host-3 ssl]# openssl x509 -req -days 750 -in "site.csr" -sha256 -CA "root-ca.crt" -CAkey "root-ca.key"  -CAcreateserial -out "docker.domain.com.crt" -extfile "site.cnf" -extensions server
Signature ok
subject=/C=CN/ST=beijing/L=chaoyang/O=emaxdata/CN=docker.domain.com
Getting CA Private Key

# 這樣已經擁有了 docker.domain.com 的網站 SSL 私鑰 docker.domain.com.key 和 SSL 證書 docker.domain.com.crt 及 CA 根證書 root-ca.crt。保留docker.domain.com.key docker.domain.com.crt root-ca.crt這三個文件,刪除其餘文件

 

將證書相關內容遷移到docker配置中

[root@host-3 ssl]# mkdir -p /etc/docker/registry
[root@host-3 ssl]# cd /etc/docker/registry/
[root@host-3 registry]# mv /opt/ssl /etc/docker/registry/

 

配置私有倉庫信息

[root@host-3 registry]# vi /etc/docker/registry/config.yml
version: 0.1
log:
  accesslog:
    disabled: true
  level: debug
  formatter: text
  fields:
    service: registry
    environment: staging
storage:
  delete:
    enabled: true
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
auth:
  htpasswd:
    realm: basic-realm
    path: /etc/docker/registry/auth/nginx.htpasswd
http:
  addr: :443
  host: https://docker.domain.com
  headers:
    X-Content-Type-Options: [nosniff]
  http2:
    disabled: false
  tls:
    certificate: /etc/docker/registry/ssl/docker.domain.com.crt
    key: /etc/docker/registry/ssl/docker.domain.com.key
health:
  storagedriver:
    enabled: true
    interval: 10s
threshold: 3

 

生成http認證文件

[root@host-3 registry]# mkdir -p /etc/docker/registry/auth/
[root@host-3 registry]# docker run --rm --entrypoint htpasswd registry -Bbn admin admin > /etc/docker/registry/auth/nginx.htpasswd

 

生成compose文件

[root@host-3 registry]# vi  /etc/docker/registry/docker-compose.yml
version: '3'

services:
  registry:
    image: registry
    ports:
      - "443:443"
    volumes:
      - ./:/etc/docker/registry
      - registry-data:/var/lib/registry     # 這裏的存儲路勁就是容器存儲中映射到宿主機的掛載點,掛載點在/var/lib/docker下;詳情請參考volume的使用

volumes:
  registry-data:

 

修改hosts

vi /etc/hosts
127.0.0.1 docker.domain.com

 

啓動容器

[root@host-3 registry]# cd /etc/docker/registry/
[root@host-3 registry]# curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
[root@host-3 registry]# chmod a+x /usr/local/bin/docker-compose
[root@host-3 registry]# docker-compose up -d

這樣咱們就搭建好了一個具備權限認證、TLS 的私有倉庫,接下來咱們測試其功能是否正常。

 

測試功能

  因爲自行簽發的 CA 根證書不被系統信任,因此咱們須要將 CA 根證書 ssl/root-ca.crt 移入 /etc/docker/certs.d/docker.domain.com 文件夾中。

[root@host-3 registry]# mkdir -p /etc/docker/certs.d/docker.domain.com
[root@host-3 registry]# cp /etc/docker/registry/ssl/root-ca.crt /etc/docker/certs.d/docker.domain.com/ca.crt

 

登陸私有倉庫

docker login docker.domain.com          # 輸入上面建立的用戶與密碼

 

嘗試推送、拉取鏡像

[root@host-3 centos]# docker tag centos:latest docker.domain.com/admin/centos:latest
[root@host-3 docker]# docker push docker.domain.com/admin/centos
[root@host-3 centos]# docker rmi -f 9f38484d220f
[root@host-3 centos]# docker pull docker.domain.com/admin/centos

 

文章來自轉載:https://yeasy.gitbooks.io/docker_practice/content/repository/registry_auth.html

相關文章
相關標籤/搜索