简单明了搭建DockerOverTLS
因为 centos 即将停止官方支持, 从此的工作和学习将转移到 Debian 上进行
前置介绍
docker 默认运行在无网络环境的 unix socket 下, 所以是不能对外提供服务的, 只能本地自己玩
如果想写个程序调用 docker, 或者用 portainer 等工具管理 docker, 那就需要 docker 暴露 API 才行了
docker 支持通过 TCP 来暴露服务, 可以选择 SSH/HTTP/HTTPS 的方式进行, 此处我选择泛用且安全性较高的 HTTPS 来暴露 docker 服务
禁止在公网暴露任何未做安全措施的端口!
所以禁止使用 HTTP 的方式来暴露 docker 服务, 所以看到现在大量博客在灌水写HTTP, 暴露 2375 端口这种过时又坑小白的方法, 我很生气
HTTPS 其实就是在传输层(TCP)与应用层(HTTP)间加了一层(SSL/TLS 层), 安全原理不在此赘述, 只需要知道使用它比直接用 HTTP 麻烦一点, 但安全系数大大提升, 做好心理准备即可(然而本篇是简单明了系列, 自然不会麻烦到哪去)
因为是直接公网环境, 所以必须要有的几个东西:
- 任意有公网 IP 的服务器(不解释)
- 域名(绑定了上述公网 IP, 因为证书要基于域名使用, 所以必须要有域名), 没有的直接找云服务商买, 很简单
- SSL 证书(为上述域名申请的证书一套, 分别为根证书, 域名证书, 服务器私钥), 可以自己创建, 也可以在云服务商那申请证书, 或者找证书签发机构申请, 有免费也有付费的. 我选择申请一个, 几分钟搞定, 很简单
安装 docker
懒人五合一长命令一条搞定
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release -y
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update -y
apt-get install docker-ce docker-ce-cli containerd.io -y
其它系统参考:
认清证书
以腾讯云处申请的证书为例, 其它同理
下载上图两个文件, 全部解压后一共会得到几个文件:
- xxx.key: 服务器私钥文件
- xxx_bundle.pem: 一个捆绑包文件, 里面打包了服务器证书与公钥
- xxx_bundle.crt: 同上, 只是后缀不同
- xxx.csr: 给服务器认证签名的申请文件(Certificate Signing Request), 暂时没用
- xxx_root.crt: CA 机构的根证书, 信任链的起点, 你的证书之所以可信是因为它
如果是阿里云下载的, 则简单点:
- xxx.key: 服务器私钥文件
- xxx.pem: 一个捆绑包文件, 里面打包了服务器证书与公钥
- xxx-root.crt: CA 机构的根证书, 根据签发机构和证书类型, 文件名会有不同, 但只要认准 root 和 crt 关键字就行
在其它云服务商申请的或者在签发机构直接申请的也大同小异, 这里只要认准三个文件: 私钥, 服务器证书捆绑包与根证书
分清这三个后就简单了, 将私钥重命名为 key.pem
, 服务器证书捆绑包重命名为 cert.pem
, 根证书重命名为 ca.pem
, 然后:
mkdir /root/.docker
将三个文件丢进去, 准备工作就 ok 了
修改配置
此处以 Debian
下 Docker version 20.10.14, build a224086
版本的配置进行操作
编辑配置
vim /usr/lib/systemd/system/docker.service
找到 ExecStart...
那行并注释, 一坨命令贴下去:
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/root/.docker/ca.pem --tlscert=/root/.docker/cert.pem --tlskey=/root/.docker/key.pem -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376
保存并退出, 重启容器:
systemctl daemon-reload && systemctl restart docker
然后开放防火墙 2376 端口就完成了!
注意:
- ExecStart命令指定证书时要用绝对路径, 不能用带~的路径
Docker version 20.10.5+dfsg1, build 55c4c88
版本下usr/bin/dockerd
要换成usr/sbin/dockerd
- 如果启动失败了, 多观察与原命令的区别, 试错几次总能成功
测试
使用 portainer 来添加这个服务器看看
添加成功或失败都会有提示, 成功后切到 Home:
轻松愉快~