基于操作系统:CentOS 8.4
搭建此私有镜像仓库是为了制作并推送商城后端服务。
更换国内镜像加速器。
<这里提供的加速器很快就会失效,每个云服务器提供商都有提供国内镜像加速器,请使用自己云服务器提供商的国内镜像加速器,具体咨询对应服务商的客服>"registry-mirrors": [ "https://docker.m.daocloud.io", "https://dockerproxy.com", "https://docker.mirrors.ustc.edu.cn", "https://docker.nju.edu.cn" ]
修改/etc/docker/daemon.json文件:
vim /etc/docker/daemon.json
以下内容:
{ "log-driver":"json-file", "log-opts": {"max-size":"50m", "max-file":"3"}, "registry-mirrors": [ "https://docker.m.daocloud.io", "https://dockerproxy.com", "https://docker.mirrors.ustc.edu.cn", "https://docker.nju.edu.cn" ] }
Docker开启远程API:
用vim编辑器修改docker.service文件:
vim /usr/lib/systemd/system/docker.service
需要修改的部分:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
修改后的部分:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
注意:如果docker服务使用宝塔安装的,以上修改配置文件的路径不生效的,可以查看修改配置文件路径为:/etc/systemd/system/docker.service.d/docker.conf
修改后的部分:
ExecStart=/usr/bin/dockerd --default-ulimit nofile=65535:65535 -H fd:// -H tcp://0.0.0.0:2375 --tlsverify --tlscacert=/data/docker-ca/ca.pem --tlscert=/data/docker-ca/server-cert.pem --tlskey=/data/docker-ca/server-key.pem
重启docker:
sudo systemctl daemon-reload sudo systemctl restart docker
下载registry:2.5镜像
docker pull registry:2.5
创建用于持久化保存仓库中的镜像目录及相关配置。
mkdir -p /data/registry mkdir -p /data/registry/auth mkdir -p /data/registry/config
生成账号密码:
docker run --entrypoint htpasswd registry:2.5 -Bbn name password >> /data/registry/auth/htpasswd
设置配置文件:
vim /data/registry/config/config.yml
以下内容:
version: 0.1 log: fields: service: registry storage: delete: enabled: true cache: blobdescriptor: inmemory filesystem: rootdirectory: /var/lib/registry http: addr: :5000 headers: X-Content-Type-Options: [nosniff] health: storagedriver: enabled: true interval: 10s threshold: 3
启动镜像:
docker run -d -p 5000:5000 --restart=always --name=registry \ -v /data/registry/config/:/etc/docker/registry/ \ -v /data/registry/auth/:/auth/ \ -e "REGISTRY_AUTH=htpasswd" \ -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ -v /data/registry/:/var/lib/registry/ \ registry:2.5
开启 http 形式访问私有仓库模式:
vim /etc/docker/daemon.json
加入以下内容:127.0.0.1换成你自己的IP。
{"insecure-registries":["127.0.0.1:5000"]}
重启docker:
sudo systemctl daemon-reload sudo systemctl restart docker
由于端口暴露在外网,考虑安全性增加ca证书验证。
创建存放证书的目录:
mkdir /data/docker-ca && cd /data/docker-ca
创建CA证书私钥,期间需要输入两次用户名和密码,生成文件为ca-key.pem;
openssl genrsa -aes256 -out ca-key.pem 4096
根据私钥创建CA证书,期间需要输入上一步设置的私钥密码,生成文件为ca.pem;
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem
创建服务端私钥,生成文件为server-key.pem;
openssl genrsa -out server-key.pem 4096
创建服务端证书签名请求文件,用于CA证书给服务端证书签名,生成文件server.csr;
openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr
创建CA证书签名好的服务端证书,期间需要输入CA证书私钥密码,生成文件为server-cert.pem;
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
创建客户端私钥,生成文件为key.pem;
openssl genrsa -out key.pem 4096
创建客户端证书签名请求文件,用于CA证书给客户证书签名,生成文件client.csr;
openssl req -subj "/CN=client" -new -key key.pem -out client.csr
为了让秘钥适合客户端认证,创建一个扩展配置文件extfile-client.cnf;
echo extendedKeyUsage = clientAuth > extfile-client.cnf
创建CA证书签名好的客户端证书,期间需要输入CA证书私钥密码,生成文件为cert.pem;
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf
删除创建过程中多余的文件;
rm -rf ca.srl server.csr client.csr extfile-client.cnf
最终生成文件如下,有了它们我们就可以进行基于TLS的安全访问了。
ca.pem CA证书 ca-key.pem CA证书私钥 server-cert.pem 服务端证书 server-key.pem 服务端证书私钥 cert.pem 客户端证书 key.pem 客户端证书私钥
配置Docker支持TLS,用vim编辑器修改docker.service文件;
vim /usr/lib/systemd/system/docker.service
修改以ExecStart开头的配置,开启TLS认证,并配置好CA证书、服务端证书和服务端私钥,修改内容如下;
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 --tlsverify --tlscacert=/data/docker-ca/ca.pem --tlscert=/data/docker-ca/server-cert.pem --tlskey=/data/docker-ca/server-key.pem -H unix://var/run/docker.sock --data-root /data/docker
注意:如果docker服务使用宝塔安装的,以上修改配置文件的路径不生效的,可以查看修改配置文件路径为:
/etc/systemd/system/docker.service.d/docker.conf
修改后的部分:
ExecStart=/usr/bin/dockerd --default-ulimit nofile=65535:65535 -H fd:// -H tcp://0.0.0.0:2375 --tlsverify --tlscacert=/data/docker-ca/ca.pem --tlscert=/data/docker-ca/server-cert.pem --tlskey=/data/docker-ca/server-key.pem
重启Docker服务,这样我们的Docker服务就支持使用TLS进行远程访问了!
systemctl daemon-reload systemctl restart docker
下载证书:
ca.pem CA证书 cert.pem 客户端证书 key.pem 客户端证书私钥
代码中已集成
使用docker-maven-plugin来打包Docker镜像:
注意:一定要加https。开启TLS不再支持http了,需要改用https,修改配置为https。否则报:HTTP 400 Bad Request
<dockerHost>https://192.168.3.101:2375</dockerHost> <dockerCertPath>D:\docker-ca</dockerCertPath> #本机存放证书密码的目录