下面是Docker开启远程访问的实现攻略:
一、修改 Docker daemon 配置
默认情况下,Docker daemon 只监听本地 socket 连接。为了实现 docker 远程访问,我们需要修改 Docker daemon 的配置,监听网络请求。在 /etc/docker/daemon.json
中添加以下内容:
{
"hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"],
"tlsverify": true,
"tlscacert": "/etc/docker/ca.pem",
"tlscert": "/etc/docker/server-cert.pem",
"tlskey": "/etc/docker/server-key.pem"
}
说明:
-
hosts
:指定 Docker daemon 监听额外的网络地址,这里配置为监听本地所有的 IP 地址上的 2376 端口。 -
tlsverify
:是否启用 TLS 认证。 -
tlscacert
、tlscert
、tlskey
:配置 TLS 认证的证书和秘钥。
二、配置 TLS 证书
为了保证访问的安全性,我们需要启用 TLS 认证。下面是涉及到的文件:
-
a. CA 证书:ca.pem
b. CA 私钥:ca-key.pem -
a. 自签名服务器证书:server-cert.pem
b. 服务器私钥:server-key.pem
首先创建用于生成证书的目录,执行以下命令:
$ mkdir /etc/docker
$ cd /etc/docker
1. a. CA 证书:
生成 CA 私钥:
$ openssl genrsa -aes256 -out ca-key.pem 4096
说明:
- -aes256:指定使用 AES 算法加密,加密位数为 256 位。
- -out:指定输出文件路径和文件名。
- 4096:指定私钥位数为 4096 位。
生成 CA 证书:
$ openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
说明:
- -new:新生成一个证书请求。
- -key:为之前生成的私钥。
- -out:指定输出路径和文件名。
- -days:证书的有效期,这里设置为 365 天。
- -sha256:指定摘要算法为 SHA-256。
2. a. 服务器证书:
生成私钥:
$ openssl genrsa -out server-key.pem 4096
生成证书请求:
$ openssl req -subj "/CN=<your-server-hostname>" -sha256 -new -key server-key.pem -out server.csr
说明:
- -subj:设置证书的主题信息,这里填写你的服务器主机名或 IP 地址。
- -key:为之前生成的私钥。
- -out:指定输出路径和文件名。
- -sha256:指定摘要算法为 SHA-256。
生成证书:使用自签名的方式签发证书,执行以下命令:
$ echo "subjectAltName = IP:<your-server-ip>" > extfile.cnf
$ openssl x509 -req -days 365 -sha256 -in server.csr -signkey server-key.pem -out server-cert.pem -extfile extfile.cnf
说明:
- -days:证书的有效期,这里设置为 365 天。
- -in:指定证书请求。
- -signkey:为之前生成的私钥。
- -out:指定输出路径和文件名。
- -extfile:使用 extfile.cnf 文件中的代替名作为证书中的主题替代名。
三、启动 Docker daemon
修改完成 Docker daemon 的配置和配置证书后,重启 Docker daemon 服务即可。
$ sudo service docker restart
四、使用客户端连接 Docker daemon
启用 TLS 认证后,我们需要使用客户端证书和私钥来连接 Docker daemon。如果客户端未处在相同主机,需要将之前生成的 CA 证书 ca.pem
发送给客户端。
1. 验证 Docker daemon 的 TLS 连接
$ docker --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/client-cert.pem --tlskey=/etc/docker/client-key.pem -H=<your-server-ip>:<docker-port> version
其中:
- --tlsverify:启用 TLS 认证。
- --tlscacert、--tlscert、--tlskey:分别指定 CA 证书、客户端证书和私钥的路径。
- -H:指定 Docker daemon 的地址和端口号。
2. 解除 Docker daemon 的 TLS 连接验证
$ export DOCKER_TLS_VERIFY=0
$ export DOCKER_HOST=<your-server-hostname>:<docker port>
示例说明
示例一:使用官方提供的 docker-machine
工具
使用 docker-machine
工具创建 Docker daemon 服务并开启 TLS 认证,具体步骤如下:
- 安装
docker-machine
- 在本地生成客户端证书和私钥,并将
ca.pem
文件发送到本地 - 使用
docker-machine
创建远程 Docker daemon,并将生成的服务器证书和私钥复制到服务器上(注意备份) - 修改 Docker daemon 的配置,完成 TLS 配置
- 重启 Docker daemon 服务,并验证 TLS 连接
# 注意替换成自己的值
YOUR_REMOTE_HOST=<your-server-ip>
DOCKER_PORT=2376
# 创建 docker-machine
$ docker-machine create \
--driver generic \
--generic-ip-address $YOUR_REMOTE_HOST \
--generic-engine-port $DOCKER_PORT \
--generic-ssh-port 22 \
--engine-install-url "https://releases.rancher.com/install-docker/19.03.11.sh" \
remote_docker
# 复制证书和私钥到服务器
$ scp -r ~/.docker/machine/certs remote_docker:/home/ubuntu
# 在服务器上完成配置
$ ssh remote_docker
# 修改 Docker daemon 配置
$ sudo vi /etc/docker/daemon.json
# 重启 Docker daemon 服务
$ sudo service docker restart
# 验证 TLS 连接
$ docker --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/cert.pem --tlskey=/etc/docker/key.pem -H=$YOUR_REMOTE_HOST:$DOCKER_PORT version
示例二:使用 docker-compose 部署应用
使用 docker-compose
部署应用,具体步骤如下:
- 在本地生成客户端证书和私钥,并将
ca.pem
文件发送到远程主机 - 编写
docker-compose.yml
文件,指定 Docker daemon 的连接信息和使用的证书 - 在远程主机上通过
docker-compose
启动应用
# docker-compose.yml 文件内容
version: "3"
services:
nginx:
image: nginx
container_name: test-nginx
ports:
- 80:80
tls:
ca_cert: /etc/docker/ca.pem
cert: /etc/docker/cert.pem
key: /etc/docker/key.pem
verify: True
host: "tcp://<your-server-ip>:2376"
command: nginx -g "daemon off;"
# 将证书文件发送远程主机
$ scp -r /path/to/certs ubuntu@<your-server-ip>:/home/ubuntu
# 在远程主机上使用 docker-compose 启动应用
$ sudo docker-compose up
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Docker之开启远程访问的实现 - Python技术站