Docker-私有仓库用户认证
前言: 为了提高私有仓库的安全性,设置用户密码进行登录
私有仓库高级配置
使用Docker Compose
搭建拥有认证,TLS的私有仓库
需要注意的是:下面的所有操作在一个文件夹下面进行
私有仓库地址:192.168.50.66
准备站点证书
当有一个域名,就可以使用openssl
自行签发证书。
案例:搭建私有仓库地址:www.wanglhdocker.com
过程
# 创建CA私钥
openssl genrsa -out "root-ca.key" 4096
# 利用私钥创建CA根证书请求文件
openssl req -new -key "root-ca.key" \
-out "root-ca.csr" -sha256 \
-subj '/C=CN/ST=Shanxi/L=Datong/O=Your Company Name/CN=Your Company Name Docker Registry CA'
# -subj /C 表示国家; /ST 表示省 /L 表示城市 /O 表示组织名 /CN通用名称
# 配置CA根证书,新建root-ca.cnf
vim root-ca.cnf
[root-ca]
basicConstraints = critical,CA:TRUE,pathlen:1
keyUsage = critical, nonRepudiation, cRLSign, keyCertSign
subjectKeyIdentifier=hash
# 签发根证书
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私钥
openssl genrsa -out "www.wanglhdocker.com.key" 4096
# 使用私钥生成证书请求文件
openssl req -new -key "www.wanglhdocker.com.key" -out "site.csr" -sha256 \
-subj '/C=CN/ST=Shanxi/L=Datong/O=Your Company Name/CN=www.wanglhdocker.com'
# 配置证书,新建site.cnf文件
vim site.cnf
[server]
authorityKeyIdentifier=keyid,issuer
basicConstraints = critical,CA:FALSE
extendedKeyUsage=serverAuth
keyUsage = critical, digitalSignature, keyEncipherment
subjectAltName = DNS:www.wanglhdocker.com, IP:127.0.0.1
subjectKeyIdentifier=hash
# 签署站点SSL证书
openssl x509 -req -days 750 -in "site.csr" -sha256 \
-CA "root-ca.crt" -CAkey "root-ca.key" -CAcreateserial \
-out "www.wanglhdocker.com.crt" -extfile "site.cnf" -extensions server
##如此,就有了www.wanglhdocker.com的网站SSL私钥www.wanglhdocker.com.key和SSL证书www.wanglhdocker.com.crt及CA根证书 root-ca.crt
#将上面的三个文件 移动到一个文件,删除其他文件夹
配置私有仓库
私有仓库的默认配置文件:/etc/docker/registry/config.yml
。先本地编辑,在挂载到容器
vim /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://www.wanglhdocker.com
headers:
X-Content-Type-Options: [nosniff]
http2:
disabled: false
tls:
certificate: /etc/docker/registry/ssl/www.wanglhdocker.com.crt
key: /etc/docker/registry/ssl/www.wanglhdocker.com.key
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
生成http认证文件
mkdir auth
docker run --rm \
--entrypoint htpasswd \
registry \
-Bbn username password > auth/nginx.htpasswd
# username password替换为自己的用户密码
## 这里的username password就是之后登录到私有仓库的 用户名和密码
编辑docker-compose.yml
vim /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,并启动
vim /etc/hosts
127.0.0.1 www.wanglhdocker.com
docker-compose up -d
注意: 当没有安装docker-comopse这个命令的时候,需要进行安装。
安装方法:
curl -L https://github.com/docker/compose/releases/download/1.24.0-rc1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
mv /use/local/bin/docker-compose /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose
详细请参考文档:安装Docker Compose
重新启动
docker-compose up -d
注意: 在启动docker-compose
如果由于关闭了防火墙,而没有重启docker.server
,会出现下面的错误
Creating network "ssl_default" with the default driver
ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-dc7a16c6d51f -j RETURN: iptables: No chain/target/match by that name.
(exit status 1))
解决:
systemctl restart docker(或者service restart docker)
docker-compose up -d
Creating network "ssl_default" with the default driver
Creating volume "ssl_registry-data" with default driver
Creating ssl_registry_1 ... done
这样就搭建了一个具有权限认证、TLS的私有仓库。
测试
在内部进行测试(192.168.50.66)
mkdir -p /etc/docker/certs.d/www.wanglhdocker.com
cp ssl/root-ca.crt /etc/docker/certs.d/www.wanglhdocker.com/ca.crt
docker login wanglhdocker.com
docker pull centos:7
docker tag centos:7 www.wanglhdocker.com/username/centos:7
docker push www.wanglhdocker.com/username/centos:7
docker image rm www.wanglhdocker.com/username/centos:7
docker pull www.wanglhdocker.com/username/centos:7
docker logout
docker pull www.wanglhdocker.com/username/centos:7
Error response from daemon: Get http://www.wanglhdocker.com/v2/: dial tcp 127.0.0.1:80: connect: connection refused
docker tag centos:7 www.wanglhdocker.com/username/centos:7
docker push www.wanglhdocker.com/username/centos:7
The push refers to repository [www.wanglhdocker.com/username/centos]
d69483a6face: Preparing
no basic auth credentials
说明: 从上面的测试可以看出,当使用443安全认证之后,可以用username password登录到自己的私有仓库。接下来进行下一步的认证,从内网或外网的其他机器访问这个私有仓库。
需要注意的是:由于这里是自己自行签发的CA根证书,会导致不被系统信任,所以需要下载自己自行签发的CA根证书部署到其他机器。
部署:
# 环境准备
# 1.将自行签发的CA根证书下载,并部署到192.168.50.111
# 2.私有仓库的地址为192.168.50.66(当有外网IP吗,这个IP就是外网IP)
# 3.查看私有仓库的443端口是否正常启动
# 4.在192.168.50.111上部署hosts
# 私有仓库(192.168.50.66):
scp /etc/docker/certs.d/www.wanglhdocker.com/ca.crt 192.168.50.111:/root
# 客户端(192.168.50.111):
mkdir -p /etc/docker/certs.d/www.wanglhdocker.com
mv /root/ca.crt /etc/docker/certs.d/www.wanglhdocker.com
echo "192.168.50.66 www.wanglhdocker.com" >> /etc/hosts
# 用户名 username passowrd登录到192.168.50.66
docker login www.wanglhdocker.com
# 进行测试,看能够pull到私有仓库的centos:7
docker pull www.wanglhdocker.com/username/centos:7
docker image ls #能够看到www.wanglhdocker.com/username/centos:7就表示能够从自己创建的私有仓库读取镜像服务
到这里,整个实验基本完成,在过程中遇到问题,欢迎评论。
不足之处 ,还望指正!
本文来自博客园,作者:Lin-Grocery,转载请注明原文链接:https://www.cnblogs.com/moniter/articles/12305139.html