Docker开启远程连接并实现安全通信详解

 更新时间:2022年08月17日 10:03:32   作者:龚国玮  
这篇文章主要为大家介绍了Docker开启远程连接并实现安全通信过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

Docker 使用了客户端 -- 服务端模型。服务端对外提供 REST API。

默认安装方式,客户端和服务端在同一台主机上,通过本地安全 PIC Socket 进行通信,例如 Linux 中 /var/run/docker.sock。我们还可以配置它们通过网络进行通信。它们默认网络配置使用不安全的 HTTP Socket,端口为 2375。

在生产环境这是不能接受的。通过 TLS 的方式连接解决这个问题。生产环境中推荐这种配置,即使在可信内网中,也建议使用该方式!

Docker 为 TLS 提供两种模式

  • daemon 模式:Docker daemon 只接收认证客户端的请求。
  • 客户端模式:Docker 客户端只接收认证的 daemon 发起的请求。

同时使用它们,能提供最高的安全等级。

下面开始介绍如何完成 TLS 的配置,总体步骤如下。

  • 创建 CA 。
  • 为 daemon 创建密钥对。
  • 为客户端创建密钥对。
  • 分发密钥
  • Docker 配置 TLS 模式

创建 CA

在 node2 运行下面的命令。

  • 为 CA 创建私钥(过程中需要设置密码)
$ openssl genrsa -aes256 -out ca-key.pem 4096

当前目录新增一个 ca-key.pem 文件,这是 CA 私钥。

  • 用 CA 私钥生成公钥(过程需要输入之前的密码)
$ openssl req -new -x509 -days 730 -key ca-key.pem -sha256 -out ca.pem

当前目录新增一个 ca.pem 文件,这是 CA 公钥,也叫”证书“。

为 daemon 创建密钥对

在 node3 运行下面的命令。

  • 为 daemon 创建私钥。
$ openssl genrsa -out daemon-key.pem 4096

当前目录新增一个 daemon-key.pem 文件,这是 daemon 节点的私钥。

  • 创建证书签名请求并发送到 CA。
$ openssl req -subj "/CN=daemon" \ -sha256 -new -key daemon-key.pem -out daemon.csr

当前目录新增一个 daemon.csr 文件,这是 CSR。

为证书添加属性。 创建文件,名为 extfile.cnf。示例中使用了 daemon 节点的 DNS 名称和 IP。每个人的环境中可能值不同。

$ subjectAltName = DNS:daemon,IP:192.168.57.3
extendedKeyUsage = serverAuth
  • 生成证书 使用 CSR 文件、CA 密钥、extfile.cnf 文件完成签名和 daemon 证书配置。
$ openssl x509 -req -days 730 -sha256 \ -in daemon.csr -CA ca.pem -CAkey ca-key.pem \ -CAcreateserial -out daemon-cert.pem -extfile extfile.cnf 

此时,已经拥有一个可用 CA ,同时 daemon 的 Node3 节点也有了自己的密钥。

继续下面内容前,删除 CSR 和 extfile.cnf。

$ rm daemon.csr extfile.cnf

为客户端创建密钥对

在 node3 运行下面的命令。

为客户端创建密钥

$ openssl genrsa -out client-key.pem 4096

当前目录新增一个 client-key.pem 文件。

创建 CSR。

$ openssl req -subj '/CN=client' -new -key client-key.pem -out client.csr

当前目录新增一个 client.csr 文件。

创建 extfile.cnf 文件 将证书设置为客户端认证可用。文件内容如下。

extendedKeyUsage = clientAuth

生成证书 使用 CSR 文件、CA 密钥、extfile.cnf 文件完成签名和客户端证书配置。

$ openssl x509 -req -days 730 -sha256 \ -in client.csr -CA ca.pem -CAkey ca-key.pem \ -CAcreateserial -out client-cert.pem -extfile extfile.cnf

删除 CSR 和 extfile.cnf ,因为不会用到它们了。 $ rm client.csr extfile.cnf

此时,在工作目录下应该有如下 7 个文件。

ca-key.pem
ca.pem
ca.srl
client-cert.pem
client-key.pem
daemon-cert.pem
daemon-key.pem

分发密钥

  • 从 CA (刚才证书生成的 node) 复制 ca.pem、daemon-cert.pem、daemon-key.pem 到 node3(daemon 节点)。
  • 从 CA (刚才证书生成的 node) 复制 ca.pem、client-cert.pem、client-key.pem 到 node1(客户端节点)。

这里用 scp 完成复制操作。在 scp 的过程中对部分文件进行了重命名。重命名非常重要,因为 Docker 对文件命名有规范。

// Daemon files
$ scp ./ca.pem ubuntu@daemon:/home/ubuntu/.docker/ca.pem
$ scp ./daemon-cert.pem ubuntu@daemon:/home/ubuntu/.docker/cert.pem
$ scp ./daemon-key.pem ubuntu@daemon:/home/ubuntu/.docker/key.pem
// Client files
$ scp ./ca.pem ubuntu@client:/home/ubuntu/.docker/ca.pem
$ scp ./client-cert.pem ubuntu@client:/home/ubuntu/.docker/cert.pem
$ scp ./client-key.pem ubuntu@client:/home/ubuntu/.docker/key.pem

Docker 配置 TLS 模式

进入 Node3(daemon 节点)完成下面的配置。

找到 daemon.json 配置文件。在 Linux 上位于 /etc/docker,编辑 daemon.json 文件,添加如下行。

   "tls": true, 
   "tlsverify": true,
   "tlscacert": "/home/ubuntu/.docker/ca.pem",
   "tlscert": "/home/ubuntu/.docker/cert.pem",
   "tlskey": "/home/ubuntu/.docker/key.pem",
   "hosts": ["tcp://你的 daemon 的IP:2376"]

这些 daemon.json 中的参数意义如下。

  • tlsverify :开启 TLS 认证。
  • tlscacert :指定daemon可信任的 CA。
  • tlscert :向 Docker 指定 daemon 证书的位置。
  • tlskey :向 Docker 指定daemon私钥的位置。
  • hosts :向 Docker 指定需要绑定 daemon 的具体 Socket。

警告:部分版本的 Linux 系统运行 systemd 的,不允许在 daemon.json 中使用“hosts”选项。替换方案是在 systemd 配置文件中进行重写。创建名为 /etc/systemd/system/docker.service.d/override.conf 的新文件。在其中加入下列 3 行内容,然后保存。

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://你的 daemon 的IP:2376”

重启 daemon 。

$ systemctl daemon-reload
$ systemctl restart docker.service

如果重启失败且错误为

docker.service: Main process exited, code=exited, status=1/FAILURE

为了让它工作,编辑 /lib/systemd/system/docker.service,修改如下内容之后再次尝试重启。

# 修改前:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# 修改后:
ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock

理论上,/etc/systemd/system/docker.service.d/override.conf/etc/docker/daemon.json 可以同时修改,但是并不建议这么做,如果仅修改 /etc/docker/daemon.json 没有出现任何问题,那就太棒了。

进入 Docker 客户端节点,配置临时环境变量。

$ export DOCKER_HOST=tcp://你的 daemon IP 地址:2376

尝试运行 $ docker version,会出现错误,类似无法连接 daemon。接着设置另一个环境变量。

$ export DOCKER_TLS_VERIFY=1

它是告知 Docker 客户端使用证书对全部命令进行签名,此时再试试 $ docker version

🎉 恭喜。你成功完成了客户端与 daemon 完成安全的通信。

以上就是Docker开启远程连接并实现安全通信详解的详细内容,更多关于Docker远程连接安全通信的资料请关注脚本之家其它相关文章!

相关文章

  • 详细记一次Docker部署服务的爬坑历程

    详细记一次Docker部署服务的爬坑历程

    这篇文章主要介绍了详细记一次Docker部署服务的爬坑历程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • mac下docker 安装 ES的详细过程

    mac下docker 安装 ES的详细过程

    这篇文章主要介绍了mac下docker 安装 ES的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • Docker两个容器互相请求接口的实现

    Docker两个容器互相请求接口的实现

    在Docker中,容器通过Docker网络进行相互通信,本文就来介绍一下Docker两个容器互相请求接口的实现,感兴趣的可以了解一下,感兴趣的可以了解一下
    2023-11-11
  • 优化 Docker 镜像大小常见的方式

    优化 Docker 镜像大小常见的方式

    这篇文章主要介绍了如何优化 Docker 镜像大小,帮助大家更好的理解和使用docker容器,感兴趣的朋友可以了解下。
    2020-09-09
  • Docker无法stop或者rm指定容器问题解决方案

    Docker无法stop或者rm指定容器问题解决方案

    这篇文章主要介绍了Docker无法stop或者rm指定容器问题解决方案,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • Docker Dockerfile 定制镜像的方法

    Docker Dockerfile 定制镜像的方法

    这篇文章主要介绍了Docker Dockerfile 定制镜像的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 使用Docker部署MySQL数据库的两种方法

    使用Docker部署MySQL数据库的两种方法

    在现代软件开发中,MySQL 是一种流行的关系数据库管理系统,因其可靠性和易用性受到广泛欢迎,通过 Docker,可以快速、便捷地部署和管理 MySQL 数据库实例,本文将介绍两种通过 Docker 部署 MySQL 的方法,需要的朋友可以参考下
    2024-10-10
  • Docker容器的加载分层原理及commit镜像

    Docker容器的加载分层原理及commit镜像

    这篇文章主要为大家介绍了Docker容器的加载分层原理及commit镜像,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Docker 简单部署 ElasticSearch的实现方法

    Docker 简单部署 ElasticSearch的实现方法

    这篇文章主要介绍了Docker 简单部署 ElasticSearch的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • Docker Base Image自己创建具体实现

    Docker Base Image自己创建具体实现

    这篇文章主要介绍了Docker Base Image创建具体实现的相关资料,这里提供了详细的具体步骤,需要的朋友可以参考下
    2016-11-11

最新评论