TLS加密远程连接Docker
《Docker远程连接设置》一文讲述了开启Docker远程连接的方法,但那种方法不安全,因为任何客户端都可以通过Docker服务的IP地址连接上去,今天我们就来学习Docker官方推荐的安全的远程连接方式:TLS加密连接,通过证书来保证安全性。
官方文档
这里是官方的权威文档:https://docs.docker.com/engine/security/https/
环境信息
本次实战的环境信息如下:
- Docker服务所在机器(下面以A机器表示):CentOS Linux release 7.6.1810
- Docker服务版本:1.13.1
- 另一台验证远程连接的机器(下面以B机器表示)也是CentOS 7.6,其上安装了Docker client 1.13.1
操作步骤
本次实战的操作步骤如下:
- 制作证书,包括CA、服务端、客户端的;
- 设置机器A上的Docker服务的TLS连接;
- 从机器B远程连接机器A上的Docker服务;
制作证书(A机器)
- 在Linux服务器上建一个目录,进入此目录,我这里是/root/work
- 创建根证书RSA私钥:
openssl genrsa -aes256 -out ca-key.pem 4096
- 页面提示Enter pass phrase for ca-key.pem,此时输入秘钥的密码,我这里输入了1234,回车后会要求再输入一次,两次密码一致就会在当前目录生成CA秘钥文件ca-key.pem;
- 以此秘钥创建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
- 生成签名过的客户端证书(期间会要求输入密码1234):
openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
- 将多余的文件删除:
rm -rf ca.srl client.csr extfile.cnf server.csr
- 此时还剩以下文件:
| 文件名 | 作用 |
|---|---|
| ca.pem | CA机构证书 |
| ca-key.pem | 根证书RSA私钥 |
| cert.pem | 客户端证书 |
| key.pem | 客户私钥 |
| server-cert.pem | 服务端证书 |
| server-key.pem | 服务端私钥 |
至此,所有证书文件制作完成,接下来对Docker做TLS安全配置;
Docker的TLS连接设置(A机器)
- 打开文件/lib/systemd/system/docker.service,找到下图红框中的内容:

- 将上图红框中的一整行内容替换为以下内容:
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 \
- 加载上述配置,再重启docker服务:
systemctl daemon-reload && systemctl restart docker
配置完成,接下来验证远程TLS连接。
验证远程TLS连接(B机器)
- 假设前面我们操作的电脑为A,IP地址是192.168.121.138;
- 现在再准备一台电脑B,IP地址是192.168.121.132,用来验证TLS加密远程连接A上的Docker;
- 在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
- 在制作证书时没有允许通过IP访问服务端,所以B在连接A的Docker时不能直接用A的IP,所以要用host来访问A,给B电脑增加一个host配置(如果B电脑是Linux,就在/etc/hosts文件上配置):
192.168.121.138 docker-daemon
- 在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
- 不用证书连接试试,各种尝试都失败了:
[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的更多相关文章
- ssh远程连接docker中linux(ubuntu/centos)
ssh远程连接docker中linux(ubuntu/centos) https://www.jianshu.com/p/9e4d50ddc57e centos docker pull centos: ...
- ssh远程连接docker中的 linux container
ssh远程连接docker中的container 由于工作需要,要远程连接Container,本地机器是windows,以下为解决步骤: 1. 环境 本地:Windows ↓ Docker版本1. ...
- Ubuntu18.04下安装Docker并配置SSL证书加密远程连接
Docker下载与安装 下载安装包 国内网络连接docker镜像还是比较慢的,这里推荐直接下载docker镜像,Ubuntu镜像下载路径为:https://download.docker.com/li ...
- 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 ...
- 客户端远程连接docker容器中的mysql 报1251错误
1.启动容器: [root@localhost ~]# docker run -d -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql2.进入容器: [r ...
- VSCode远程连接Docker
一.Docker开启远程访问 [root@local host ~]# vi /lib/systemd/system/docker.service #修改ExecStart这行 ExecStart=/ ...
- 远程连接docker
vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix: ...
- docker构建mysql容器及Navicat 远程连接
1. MySQL部署 1.1拉取MySQL镜像 docker pull mysql 查看镜像 docker images 1.2创建MySQL容器 首先建立所需要的 文件夹: docker run - ...
- docker部署mysql Navicat远程连接
docker部署mysql Navicat远程连接 docker search mysql 查看mysql镜像(是去dockerHub网站搜素镜像,遇到问题可以去该网站查看官方文档,纯英文文档估计 ...
随机推荐
- mule发布调用webservice
mule发布webservice 使用mule esb消息总线发布和调用webservice都非常精简,mule包装了所有操作,你只需要拖控件配置就可以,下面讲解mule发布: 1.下面是flow,h ...
- abp(net core)+easyui+efcore实现仓储管理系统——使用 WEBAPI实现CURD (十二)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
- WIZnet-io6Library下载及使用
概观 io6Library是一个IPv6集成库,可以轻松集成和管理使用WIZnet硬连线双TCP / IP堆栈控制器(WIZCHIP)产品系列的用户应用程序. io6Library用于管理依赖于用户特 ...
- java多线程中wait/notify/sleep/join/yield方法以及多线程的六种状态
刚开始学线程的时候也是被这几个方法搞的云里雾里的,尤其是一开始看的毕老师的视频,老师一直在强调执行权和执行资格,看的有点懵逼,当然不是说毕老师讲的不好,就是自己有点没听明白,后来复习看了一些其他的博客 ...
- Xlistview_聚合菜谱大全数据
public class MainActivity extends AppCompatActivity implements XListView.IXListViewListener{ private ...
- 100天搞定机器学习|day40-42 Tensorflow Keras识别猫狗
100天搞定机器学习|1-38天 100天搞定机器学习|day39 Tensorflow Keras手写数字识别 前文我们用keras的Sequential 模型实现mnist手写数字识别,准确率0. ...
- sql server 日期近一年,同比
--近一年 ), , , ) SELECT CONVERT(VARCHAR, DATEADD(day, -DAY(GETDATE()), , ) --同比 ), , , ) SELECT CONVER ...
- [ZJOI2011]看电影(组合数学,高精度)
[ZJOI2011]看电影 这题模型转化很巧妙.(神仙题) 对于这种题首先肯定知道答案就是合法方案除以总方案. 总方案显然是\(k^n\). 那么考虑怎么算合法方案. 当\(n>k\)的时候显然 ...
- 危险的Hystrix线程池
本文介绍Hystrix线程池的工作原理和参数配置,指出存在的问题并提供规避方案,阅读本文需要对Hystrix有一定的了解. 文本讨论的内容,基于hystrix 1.5.18: <dependen ...
- 二级小兵——工厂模式(Factory Method)
前言 上一篇我们介绍了单例模式,今天给大家讲一个比较简单的模式——工厂模式(Factory Method),工厂模式又是什么呢?顾名思义,工厂——生产制造东西的地方.那么应用在程序当中该如何使用.并且 ...