设置Docker
远程访问
WARNING
记得加验证,切记不要裸奔!!!
生成TLS
证书
采用 openssl 生成证书
TIP
.csr
这是证书签名请求(Certificate Signing Request)文件。它包含向证书颁发机构(CA)请求签名的证书的信息。CSR 包含了你的组织或个人信息以及你想要在证书中包含的域名或其他标识信息
sh
# 生成根私钥
openssl genrsa -out ca-key.pem 4096
# 生成根证书 使用私钥签发 一般根证书时间可以长一点
openssl req -new -x509 -sha256 -days 3650 -key ca-key.pem -out ca.pem -subj "/C=<国家>/ST=<州或省>/L=<城市>/O=<组织名>/CN=<ip或者域名>"
# 生成服务端 私钥
openssl genrsa -out server-key.pem 4096
# 证书请求文件
openssl req -subj "/CN=server" -sha256 -new -key server-key.pem -out server.csr
# 生成 cnf 文件 or ip
echo subjectAltName = IP:192.168.0.1,IP:192.168.0.2 > extfile.cnf
# ca 签发服务端证书
openssl x509 -req -sha256 -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
# 验证签发证书是否正确
openssl verify -CAfile ca.pem server-cert.pem
# 生成客户端 私钥
openssl genrsa -out client-key.pem 4096
# 证书请求文件
openssl req -subj "/CN=client" -new -key client-key.pem -out client.csr
# ca 签发客户端证书
openssl x509 -req -sha256 -days 365 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem
# 制作p12证书(导入浏览器)
openssl pkcs12 -export -clcerts -in client-cert.pem -inkey client-key.pem -out client.p12
# 清理证书请求文件
rm -f client.csr server.csr ca.srl extfile.cnf
配置文件示例
ini
# extfile.cnf
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
CN = Your_Common_Name
[v3_req]
subjectAltName = @alt_names
[alt_names]
DNS.1 = example.com
DNS.2 = www.example.com
IP.1 = 172.18.169.91
IP.2 = 192.168.1.100
IP.3 = 10.0.0.1
绑定docker.sock
配置
推荐使用nginx
绑定docker.sock
配置
- 不用修改 docker 配置,直接在 nginx 配置中绑定
docker.sock
即可
nginx
server {
listen 2376 ssl;
server_name _;
ssl_certificate server-cert.pem; # server证书公钥
ssl_certificate_key server-key.pem; # server私钥
ssl_client_certificate ca.pem; # 根级证书公钥,用于验证各个二级client
ssl_verify_client on; # 开启客户端证书验证
location / {
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass unix:/var/run/docker.sock;
}
}
添加tls
绑定docker.sock
配置
TIP
可以使用 sudo find / -type s -iname "docker.sock"
命令查询 docker.sock 路径
提醒
可能会和 sudo systemctl restart docker
冲突 需要单独启动 docker 服务
json
// /etc/docker/daemon.json
{
"tls": true,
"tlsverify": true,
"tlscacert": "/path/to/ca.pem",
"tlscert": "/path/to/server-cert.pem",
"tlskey": "/path/to/server-key.pem",
"hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"]
}
直接修改启动文件
sh
# /usr/lib/systemd/system/docker.service
[Service]
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2376
重启Docker
服务
sh
sudo systemctl daemon-reload
sudo systemctl restart docker
查看错误日志
sh
sudo journalctl -u docker
设置防火墙
sh
# iptable
sudo iptables -A INPUT -p tcp --dport 2375 -j ACCEPT
远程测试访问
sh
docker -H tcp://<远程主机 IP>:2375 <docker 命令>