《Docker远程连接设置》一文讲述了开启Docker远程连接的方法,但那种方法不安全,因为任何客户端都可以通过Docker服务的IP地址连接上去,今天我们就来学习Docker官方推荐的安全的远程连接方式:TLS加密连接,通过证书来保证安全性。

官方文档

这里是官方的权威文档:https://docs.docker.com/engine/security/https/

环境信息

本次实战的环境信息如下:

  1. Docker服务所在机器(下面以A机器表示):CentOS Linux release 7.6.1810
  2. Docker服务版本:1.13.1
  3. 另一台验证远程连接的机器(下面以B机器表示)也是CentOS 7.6,其上安装了Docker client 1.13.1

操作步骤

本次实战的操作步骤如下:

  1. 制作证书,包括CA、服务端、客户端的;
  2. 设置机器A上的Docker服务的TLS连接;
  3. 从机器B远程连接机器A上的Docker服务;

制作证书(A机器)

  1. 在Linux服务器上建一个目录,进入此目录,我这里是/root/work
  2. 创建根证书RSA私钥:
openssl genrsa -aes256 -out ca-key.pem 4096
  1. 页面提示Enter pass phrase for ca-key.pem,此时输入秘钥的密码,我这里输入了1234,回车后会要求再输入一次,两次密码一致就会在当前目录生成CA秘钥文件ca-key.pem;
  2. 以此秘钥创建CA证书,自己给自己签发证书,自己就是CA机构,也可以交给第三方机构去签发:
openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem

此时生成的ca.pem文件就是CA证书;

5. 创建服务端私钥:

openssl genrsa -out server-key.pem 4096

此时生成的server-key.pem文件就是服务端私钥;

6. 生成服务端证书签名请求(csr即certificate signing request,里面包含公钥与服务端信息)

openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr

此时生成的server.csr文件就是服务端证书;

7. 生成签名过的服务端证书(期间会要求输入密码1234):

openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem

此时生成的server-cert.pem文件就是已盖章生效的服务端证书;

8. 生成客户私钥:

openssl genrsa -out key.pem 4096

此时生成的key.pem文件就是客户私钥;

9. 生成客户端证书签名请求:

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

此时生成的client.csr文件就是客户端证书签名请求;

10. 生成名为extfile.cnf的配置文件:

echo extendedKeyUsage=clientAuth > extfile.cnf
  1. 生成签名过的客户端证书(期间会要求输入密码1234):
openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
  1. 将多余的文件删除:
rm -rf ca.srl client.csr extfile.cnf server.csr
  1. 此时还剩以下文件:
文件名 作用
ca.pem CA机构证书
ca-key.pem 根证书RSA私钥
cert.pem 客户端证书
key.pem 客户私钥
server-cert.pem 服务端证书
server-key.pem 服务端私钥

至此,所有证书文件制作完成,接下来对Docker做TLS安全配置;

Docker的TLS连接设置(A机器)

  1. 打开文件/lib/systemd/system/docker.service,找到下图红框中的内容:

  2. 将上图红框中的一整行内容替换为以下内容:
ExecStart=/usr/bin/dockerd-current --tlsverify --tlscacert=/root/work/ca.pem --tlscert=/root/work/server-cert.pem --tlskey=/root/work/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock \
  1. 加载上述配置,再重启docker服务:
systemctl daemon-reload && systemctl restart docker

配置完成,接下来验证远程TLS连接。

验证远程TLS连接(B机器)

  1. 假设前面我们操作的电脑为A,IP地址是192.168.121.138;
  2. 现在再准备一台电脑B,IP地址是192.168.121.132,用来验证TLS加密远程连接A上的Docker;
  3. 在A机器执行以下命令,将A上的ca.pem、cert.pem、key.pem这三个文件复制到B机器的/root/work目录(请提前建好此目录):
scp /root/work/ca.pem root@192.168.121.132:/root/work \
&& scp /root/work/cert.pem root@192.168.121.132:/root/work \
&& scp /root/work/key.pem root@192.168.121.132:/root/work
  1. 在制作证书时没有允许通过IP访问服务端,所以B在连接A的Docker时不能直接用A的IP,所以要用host来访问A,给B电脑增加一个host配置(如果B电脑是Linux,就在/etc/hosts文件上配置):
192.168.121.138 docker-daemon
  1. 在B上执行以下命令,即可连接A的Docker服务:
docker --tlsverify --tlscacert=/root/work/ca.pem --tlscert=/root/work/cert.pem --tlskey=/root/work/key.pem -H tcp://docker-daemon:2376 version

控制台显示以下信息,其中Server部分就是A机器的Docker信息:

Client:
Version: 1.13.1
API version: 1.26
Package version: docker-1.13.1-102.git7f2769b.el7.centos.x86_64
Go version: go1.10.3
Git commit: b2f74b2/1.13.1
Built: Wed May 1 14:55:20 2019
OS/Arch: linux/amd64 Server:
Version: 1.13.1
API version: 1.26 (minimum version 1.12)
Package version: docker-1.13.1-102.git7f2769b.el7.centos.x86_64
Go version: go1.10.3
Git commit: 7f2769b/1.13.1
Built: Mon Aug 5 15:09:42 2019
OS/Arch: linux/amd64
Experimental: false
  1. 不用证书连接试试,各种尝试都失败了:
[root@centos7 work]# docker -H tcp://192.168.121.138:2375 images
Cannot connect to the Docker daemon at tcp://192.168.121.138:2375. Is the docker daemon running?
[root@centos7 work]# docker -H tcp://docker-daemon:2375 images
Cannot connect to the Docker daemon at tcp://docker-daemon:2375. Is the docker daemon running?
[root@centos7 work]# docker -H tcp://192.168.121.138:2376 images
Get http://192.168.121.138:2376/v1.26/images/json: net/http: HTTP/1.x transport connection broken: malformed HTTP response "\x15\x03\x01\x00\x02\x02".
* Are you trying to connect to a TLS-enabled daemon without TLS?
[root@centos7 work]# docker -H tcp://docker-daemon:2376 images
Get http://docker-daemon:2376/v1.26/images/json: net/http: HTTP/1.x transport connection broken: malformed HTTP response "\x15\x03\x01\x00\x02\x02".
* Are you trying to connect to a TLS-enabled daemon without TLS?

至此,TLS加密远程连接Docker的实战就完成了,希望您在设置安全的Docker远程连接是,本文能给您提供参考。

TLS加密远程连接Docker的更多相关文章

  1. ssh远程连接docker中linux(ubuntu/centos)

    ssh远程连接docker中linux(ubuntu/centos) https://www.jianshu.com/p/9e4d50ddc57e centos docker pull centos: ...

  2. ssh远程连接docker中的 linux container

    ssh远程连接docker中的container   由于工作需要,要远程连接Container,本地机器是windows,以下为解决步骤: 1. 环境 本地:Windows ↓ Docker版本1. ...

  3. Ubuntu18.04下安装Docker并配置SSL证书加密远程连接

    Docker下载与安装 下载安装包 国内网络连接docker镜像还是比较慢的,这里推荐直接下载docker镜像,Ubuntu镜像下载路径为:https://download.docker.com/li ...

  4. Navicat 远程连接Docker容器中的mysql 报错:1251 - Client does not support authentication protocol 解决办法。

    出现这个问题 首先进入 1.docker exec -it mysql02 bash      //mysql02是mysql容器的别名 2.mysql -uroot -p 3.输入密码 4.进入my ...

  5. 客户端远程连接docker容器中的mysql 报1251错误

    1.启动容器: [root@localhost ~]# docker run -d -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql2.进入容器: [r ...

  6. VSCode远程连接Docker

    一.Docker开启远程访问 [root@local host ~]# vi /lib/systemd/system/docker.service #修改ExecStart这行 ExecStart=/ ...

  7. 远程连接docker

    vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix: ...

  8. docker构建mysql容器及Navicat 远程连接

    1. MySQL部署 1.1拉取MySQL镜像 docker pull mysql 查看镜像 docker images 1.2创建MySQL容器 首先建立所需要的 文件夹: docker run - ...

  9. docker部署mysql Navicat远程连接

    docker部署mysql Navicat远程连接 docker search mysql   查看mysql镜像(是去dockerHub网站搜素镜像,遇到问题可以去该网站查看官方文档,纯英文文档估计 ...

随机推荐

  1. mule发布调用webservice

    mule发布webservice 使用mule esb消息总线发布和调用webservice都非常精简,mule包装了所有操作,你只需要拖控件配置就可以,下面讲解mule发布: 1.下面是flow,h ...

  2. abp(net core)+easyui+efcore实现仓储管理系统——使用 WEBAPI实现CURD (十二)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  3. WIZnet-io6Library下载及使用

    概观 io6Library是一个IPv6集成库,可以轻松集成和管理使用WIZnet硬连线双TCP / IP堆栈控制器(WIZCHIP)产品系列的用户应用程序. io6Library用于管理依赖于用户特 ...

  4. java多线程中wait/notify/sleep/join/yield方法以及多线程的六种状态

    刚开始学线程的时候也是被这几个方法搞的云里雾里的,尤其是一开始看的毕老师的视频,老师一直在强调执行权和执行资格,看的有点懵逼,当然不是说毕老师讲的不好,就是自己有点没听明白,后来复习看了一些其他的博客 ...

  5. Xlistview_聚合菜谱大全数据

    public class MainActivity extends AppCompatActivity implements XListView.IXListViewListener{ private ...

  6. 100天搞定机器学习|day40-42 Tensorflow Keras识别猫狗

    100天搞定机器学习|1-38天 100天搞定机器学习|day39 Tensorflow Keras手写数字识别 前文我们用keras的Sequential 模型实现mnist手写数字识别,准确率0. ...

  7. sql server 日期近一年,同比

    --近一年 ), , , ) SELECT CONVERT(VARCHAR, DATEADD(day, -DAY(GETDATE()), , ) --同比 ), , , ) SELECT CONVER ...

  8. [ZJOI2011]看电影(组合数学,高精度)

    [ZJOI2011]看电影 这题模型转化很巧妙.(神仙题) 对于这种题首先肯定知道答案就是合法方案除以总方案. 总方案显然是\(k^n\). 那么考虑怎么算合法方案. 当\(n>k\)的时候显然 ...

  9. 危险的Hystrix线程池

    本文介绍Hystrix线程池的工作原理和参数配置,指出存在的问题并提供规避方案,阅读本文需要对Hystrix有一定的了解. 文本讨论的内容,基于hystrix 1.5.18: <dependen ...

  10. 二级小兵——工厂模式(Factory Method)

    前言 上一篇我们介绍了单例模式,今天给大家讲一个比较简单的模式——工厂模式(Factory Method),工厂模式又是什么呢?顾名思义,工厂——生产制造东西的地方.那么应用在程序当中该如何使用.并且 ...