LXX的网络日志
人因梦想而伟大
Docker-04-使用Docke Compose搭建有用权限验证的私有仓库

访问仓库

私有仓库

使用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的功能。