Skip to content

设置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>

Site developed by Aomd.