访问仓库
私有仓库
使用Docke Compose搭建有用权限验证的私有仓库
使用 Docker Compose
搭建一个拥有权限认证、TLS的私有仓库。
安装Docker Compose
在使用docker-compose之前,我们需要安装它。这里,我们使用1.23.2的docker-compose版本。
第一步下载Docker Compose:
运行此命令下载Docker Compose,替换$dockeComposeVersion
为想要使用的ompose的特定版本:
curl -L https://github.com/docker/compose/releases/download/$dockerComposeVersion/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
例如,要下载Compose的1.23.2版本,命令:
curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
第二步对二进制文件应用可执行权限:
xin@xin:$ sudo chmod +x /usr/local/bin/docker-compose
第三步测试安装:
xin@xin:$ docker-compose -vesion
docker-compose version 1.23.2, build 1110ad01
安装Docker-Compose的步骤就完成了。
接下来我们需要准备站点证书。
首先我们需要新建一个文件夹,接下来的步骤都会在该文件夹中进行。
准备站点证书
如果你拥有一个域名,国内各大云服务商均提供免费的站点证书。你也可以使用openssl
自行签发证书。
这里假设我们要搭建的私有仓库地址为 docker.codedream.xin
,下面我们介绍使用哦 openssl
自行签发 docker.codedream.xin
的站点SSL证书。
第一步创建 CA 私钥:
xin@xin:$ openssl genrsa -out "root-ca.key" 4096
第二步利用私钥创建CA根证书请求文件:
xin@xin:$ openssl req -new -key "root-ca.key" -sha256 -out "root-ca.csr" -sha256 -subj '/C=CN/ST=Guangdong/L=Guangzhou/O=Your Company Name/CN=Your Compnay Name Docker Registry CA'
以上命令中 -subj
参数里面的 /C
表示国家,如 CN;/ST
表示省份;/L
表示城市或者地区;/O
表示组织名称;/CN
通用名称。
第三步配置CA根证书,新建 root-ca.cnf:
[root_ca]
basicConstraints = critical,CA:TRUE,pathlen:1
keyUsage = critical, nonRepudiation, cRLSign, keyCertSign
subjectKeyIdentifier=hash
第四步签发根证书:
xin@xin:$ 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
第五步生成站点SSL 私钥:
xin@xin:$ openssl genrsa -out "docker.codedream.xin.key" 4096
第六步使用私钥生成证书请求文件:
xin@xin:$ openssl req -new -key "docker.codedream.xin.key" -out "site.csr" -sha256 -subj '/C=CN/ST=Guangdong/L=Guangzhou/O=Your Company Name/CN=docker.codedream.xin'
第七步配置证书,新建site.cnf文件:
[server]
authorityKeyIdentifier=keyid,issuer
basicConstraints = critical,CA:FALSE
extendedKeyUsage=serverAuth
keyUsage = critical, digitalSignature, keyEncipherment
subjectAltName = DNS:docker.codedream.xin, IP:127.0.0.1
subjectKeyIdentifier=hash
第八步签署站点 SSL 证书:
xin@xin:$ openssl x509 -req -days 750 -in "site.csr" -sha256 -CA "root-ca.crt" -CAkey "root-ca.key" -CAcreateserial -out "docker.codedream.xin.crt" -extfile "site.cnf" -extensions server
这样我们已经拥有了docker.codeream.xin
网站的SSL私钥docker.codedream.xin.key
和 SSL 证书 docker.codeream.xin.crt
以及 CA 根证书 root-ca.crt
。
新建 ssl 文件并且将docker.codedream.xin.key
docker.codedream.xin.crt
root-ca.crt
这三个文件移入,其他文件删除。
配置私有仓库
私有仓库默认配置位于 /etc/docker/registry/config.yml
,我们先在本地编辑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.codedream.xin
headers:
X-Content-Type-Options: [nosniff]
http2:
disabled: false
tls:
certificate: /etc/docker/registry/ssl/docker.codedream.xin.crt
key: /etc/docker/registry/ssl/docker.codedream.xin.key
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
生成http认证文件
xin@xin:/etc/docker/registry# mkdir auth
xin@xin:/etc/docker/registry# docker run --rm --entrypoint htpasswd registry:2 -Bbn username password > auth/nginx.htpasswd
将上面的usename和password替换为你自己的用户名密码。
编辑 docker-compose.yml
version: '3'
services:
registry:
image: registry
ports:
- "443:443"
volumes:
- ./:/etc/docker/registry
- registry-data:/var/lib/registry
volumes:
registry-data:
修改hosts
编辑/etc/hosts
文件,在里面添加一行:
127.0.0.1 docker.codedream.xin
启动
xin@xin:$ docker-compose up -d
注意:docker-compose文件需要放在/etc/docker/registry
下。
这样我们就搭建好了一个具有权限认证、TLS的私有仓库,接下来我们将测试其功能是否正常。
测试私有仓库功能
由于自行签发的CA证书根本不被系统信任,所以我们需要将CA证书 root-ca.crt
移入 /etc/docker/certs.d/docker.codedream.xin/
文件夹中。
xin@xin:~$ sudo mkdir -p /etc/docker/certs.d/docker.codedream.xin
xin@xin:~$ sudo cp /etc/docker/registry/ssl/root-ca.crt /etc/docker/certs.d/docker.codedream.xin
登录到私有仓库,输入账号密码:
xin@xin:~$ docker login docker.codedream.xin
尝试推送、拉取镜像:
xin@xin:$ docker pull ubuntu:18.04
xin@xin:~$ docker tag ubuntu:18.04 docker.codedream.xin/username/ubuntu:18.04
xin@xin:~$ docker push docker.codedream.xin/username/ubuntu:18.04
xin@xin:~$ docker image rm docker.codedream.xin/username/ubuntu:18.04
xin@xin:~$ docker pull docker.codedream.xin/username/ubuntu:18.04
小结
这一节比较简单,主要是使用Docker Compose添加了https的功能。