linux中让 Docker 使用 HTTPS的教程

Docker 启动监听端口后,使用的是 http,可以远程来管理 Docker 主机。
这样的场景存在弊端,API 层面是没有提供用户验证、Token 之类身份验证功能,任何人都可以通过地址加端口来控制 Docker 主机,为了避免这样的情况发生,Docker 官方也支持 https 方式,不过需要我们自己来生成证书。

通过 OpenSSL 命令来生成 CA 证书、服务器私钥、客户端证书、签名,openssl 命令比较复杂,我用脚本直接生成:

# cat certgen.sh
set -ex

[ -e certs ] || mkdir certs
cd certs
echo "Creating ca keys..."
echo 01 > ca.srl
openssl genrsa -des3 -out ca-key.pem
openssl rsa -in ca-key.pem -out ca-key.pem
openssl req -subj "/CN=$(hostname -f)/" -new -x509 -days 365 -key ca-key.pem -out ca.pem

echo "Creating server keys..."
openssl genrsa -des3 -out server-key.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl req -subj "/CN=$(hostname -f)/" -new -key server-key.pem -out server.csr
openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem -out server-cert.pem

echo "Creating client keys..."
openssl genrsa -des3 -out key.pem
openssl rsa -in key.pem -out key.pem
openssl req -subj '/CN=*/' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth > extfile.cnf
openssl x509 -req -days 365 -in client.csr -CA ca.pem -CAkey ca-key.pem -out cert.pem -extfile extfile.cnf

需要注意,在执行脚本之前,确保你的主机名符合 FQDN 并能正常解析,不推荐修改脚本内容 $(hostname -f) 为 IP 地址,无需修改脚本,在脚本执行过程中会反复需要输入密码,统一输入一个密码就 ok:

sh certgen.sh
执行完后,会在当前目录下生成一个 certs 目录,里面有生成的所有的证书文件。

为了避免混淆,现在拷贝 CA 和服务器私钥到其它目录:

mkdir -p /etc/docker/certs
cd certs/
cp ca.pem server-cert.pem server-key.pem /etc/docker/certs/
服务器私钥有了,我们也知道在哪里,现在只需要让 Docker 知道:

vim /etc/default/docker
DOCKER_OPTS='-H unix:///var/run/docker.sock -H docker01.thstack.com:6732 --tlsverify --tlscacert=/etc/docker/certs/ca.pem --tlscert=/etc/docker/certs/server-cert.pem --tlskey=/etc/docker/certs/server-key.pem'
重启 docker 服务:

service docker restart
添加 DOCKER_HOST 环境变量,地址为 Docker 主机的主机名,同样如果设置 IP 地址会有问题:

# vim /etc/profile
export DOCKER_HOST=tcp://docker01.thstack.com:6732

# source /etc/profile
现在 Docker 已经开启了 https 认证,在命令行里敲 docker 命令会报错,需要在每个 docker 命令加 –tlsverify 参数,docker 命令作为一个客户端工具来操作 Docker 主机同样依赖客户端证书:

root@docker01:~/certs# docker info
2014/09/14 16:19:26 Get http://docker01.thstack.com:6732/v1.14/info: malformed HTTP response "x15x03x01x00x02x02"

root@docker01:~# docker --tlsverify images
2014/09/14 16:25:53 Couldn't read ca cert /root/.docker/ca.pem: open /root/.docker/ca.pem: no such file or directory   
从 docker –tlsverify images 结果输出中了解到,加了 –tlsverify 参数后,就会默认去 ~/.docker 文件中找客户端证书,现在为 docker 客户端命令添加证书:

mkdir ~/.docker
cd certs/
cp ca.pem cert.pem key.pem ~/.docker
再次尝试执行命令:

root@docker01:~# docker ps
2014/09/14 16:28:42 Get http://docker01.thstack.com:6732/v1.14/containers/json: malformed HTTP response "x15x03x01x00x02x02"

root@docker01:~# docker --tlsverify images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              14.04.1             826544226fdc        9 days ago          194.2 MB
ubuntu              14.04               826544226fdc        9 days ago          194.2 MB
ubuntu              trusty              826544226fdc        9 days ago          194.2 MB
ubuntu              latest              826544226fdc        9 days ago          194.2 MB
ubuntu              14.10               245ce11c1f25        9 days ago          202.5 MB
ubuntu              utopic              245ce11c1f25        9 days ago          202.5 MB
ubuntu              precise             c17f3f519388        9 days ago          106.7 MB
ubuntu              12.04.5             c17f3f519388        9 days ago          106.7 MB
ubuntu              12.04               c17f3f519388        9 days ago          106.7 MB
ubuntu              12.10               c5881f11ded9        12 weeks ago        172.2 MB
ubuntu              quantal             c5881f11ded9        12 weeks ago        172.2 MB
ubuntu              13.04               463ff6be4238        12 weeks ago        169.4 MB
ubuntu              raring              463ff6be4238        12 weeks ago        169.4 MB
ubuntu              13.10               195eb90b5349        12 weeks ago        184.7 MB
ubuntu              saucy               195eb90b5349        12 weeks ago        184.7 MB
ubuntu              lucid               3db9c44f4520        4 months ago        183 MB
ubuntu              10.04               3db9c44f4520        4 months ago        183 MB 
只要开启 https 认证后,docker 命令就必须加 –tlsverify 参数。

上面所有的操作都是在 Docker 主机上操作,找另外一台机器来验证 https 是否生效:

root@ubuntu:~# curl -v -s  https://docker01.thstack.com:6732/info
* About to connect() to docker01.thstack.com port 6732 (#0)
*   Trying 192.168.3.23... connected
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS alert, Server hello (2):
* SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
* Closing connection #0
上面提示,证书验证失败,在 Docker 主机上 scp 客户端证书到这台机器上:

root@docker01:~# cd certs/
root@docker01:~/certs# scp ca.pem cert.pem key.pem root@ubuntu:/tmp
指明证书位置来验证,可以看到验证过程和结果:

root@ubuntu:~# curl -v -s -k --key /tmp/key.pem --cert /tmp/cert.pem https://docker01.thstack.com:6732/info

* About to connect() to docker01.thstack.com port 6732 (#0)
*   Trying 192.168.3.23... connected
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Request CERT (13):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS handshake, CERT verify (15):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using ECDHE-RSA-AES256-SHA
* Server certificate:
*        subject: CN=docker01.thstack.com
*        start date: 2014-09-14 03:27:16 GMT
*        expire date: 2015-09-14 03:27:16 GMT
*        common name: docker01.thstack.com (matched)
*        issuer: CN=docker01.thstack.com
*        SSL certificate verify result: self signed certificate (18), continuing anyway.
> GET /info HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: docker01.thstack.com:6732
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: application/json
< Job-Name: info
< Date: Sun, 14 Sep 2014 08:43:26 GMT
< Content-Length: 417
<
{"Containers":1,"Debug":0,"Driver":"aufs","DriverStatus":[["Root Dir","/var/lib/docker/aufs"],["Dirs","36"]],"ExecutionDriver":"native-0.2","IPv4Forwarding":1,"Images":34,"IndexServerAddress":"https://index.docker.io/v1/","InitPath":"/usr/bin/docker","InitSha1":"","KernelVersion":"3.13.0-24-generic","MemoryLimit":1,"NEventsListener":0,"NFd":11,"NGoroutines":11,"OperatingSystem":"Ubuntu 14.04.1 LTS","SwapLimit":0}
* Connection #0 to host docker01.thstack.com left intact
* Closing connection #0
* SSLv3, TLS alert, Client hello (1):
也可以在其它机器上安装 lxc-docker,来用 docker 命令远程管理 Docker 主机,同样设置环境变量,添加证书。
如果在配置过程中出错,查看 /var/log/upstart/docker.log 日志,或重新生成证书

时间: 2024-10-01 19:53:27

linux中让 Docker 使用 HTTPS的教程的相关文章

linux中安装Zend Optimizer与eAccelerator教程

eAccelerator与Zend Optimizer是一个加速软件了,我们可以利用它与php环境同步运行使用得php性能更好了,下面来一起看看linux中安装Zend Optimizer与eAccelerator教程 下载Zend Optimizer http://downloads.zend.com/optimizer/3.3.9/ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz tar -xzvf ZendOptimizer-3.3.9-linux

在Linux中直接挂载/卸载LVM分区教程

LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现,目前最新版本为:稳定版1.0.5,开发版 1.1.0-rc2,以及LVM2开发版.Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间.普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,这个文件

linux中swap交换分区分区设置教程

什么是swap分区 交换区可是看作是内存的一部分,只是它是从硬盘中划分出来的,它像windows下的虚拟内存,它的作用是缓存数据,划分它时,大小设成你的物理内存的大小的两倍. 设置swap交换分区 交换分区的大小分配推荐法则 内存小于4GB时,推荐不少于2GB的swap空间: 内存4GB~16GB,推荐不少于4GB的swap空间: 内存16GB~64GB,推荐不少于8GB的swap空间: 内存64GB~256GB,推荐不少于16GB的swap空间. 1.以root权限登录SSH,键入如下命令创建

linux中centOS防火墙iptables的设置教程

  1.安装iptables防火墙 怎么知道系统是否安装了iptables?执行iptables -V,如果显示如: iptables v1.3.5 说明已经安装了iptables. 如果没有安装iptables需要先安装,执行: yum install iptables 在Linux中设置防火墙,以CentOS为例,打开iptables的配置文件: vi /etc/sysconfig/iptables   通过/etc/init.d/iptables status命令查询是否有打开80端口,如

linux中inotify+rsync实时同步配置教程

背景 我们公司在用inotify+rsync做实时同步,来解决分布式集群文件一致性的问题.但当web文件越来越多(百万级数量html,jpg等小 文件),同步就越来越慢,根本做不到实时,按照网上的调优方法都尝试过,问题根本没有解决.经过我一翻细致研究,终于把慢的核心问题研究明白,先总结一句 inotifywait响应不会有延迟,rsync也很快.大家同样有慢的烦恼,那是因为网上的inotify+rsync的教程都是坑.下面我们来分 析. inotifywait 单独分析 /usr/local/b

Linux中开机自动启动oracle的配置教程

1.如何在Linux启动时自动启动Oracle监听和实例 修改/etc/oratab文件,命令如下: [oracle@oracle11g ~]$ vi /etc/oratab 找到:accp:/u01/oracle:N 修改为: accp:/u01/oracle:Y 第二步:把lsnrctl start和dbstart添加到rc.local文件中,命令如下: [oracle@oracle11g ~]$ vi /etc/rc.d/rc.local 添加: su oracle -lc "/u01/o

linux中wget下载http/https代理设置

方法一,直接在命令后面带参数 使用wget命令可以设置http代理 wget http://www.baidu.com/ -e use_proxy=yes -e http_proxy=yourproxy.com:port 下载https的文件就要其他的额外参数了. wget --no-check-certificate https://www.google.com/   \  -e use_proxy=yes -e https_proxy=yourproxy.com:port   ##使用htt

linux中安装VPN服务器pptpd步骤教程

环境: [root@vpn_server network-scripts]# cat /etc/redhat-release CentOS release 6.6 (Final) [root@vpn_server network-scripts]# uname -m x86_64  准备: c64 rpm -ivh http://mirrors.aliyun.com/epel/6/x86_64/epel-release-6-8.noarch.rpm yum install yum-priorit

linux中mySQL的安装和配置教程

本文的Linux环境是 Red Hat 9.0,MySQL是4.0.16. 二.安装Mysql 1.下载MySQL的安装文件 安装MySQL需要下面两个文件: MySQL-server-4.0.16-0.i386.rpm MySQL-client-4.0.16-0.i386.rpm 下载地址为:http://www.mysql.com/downloads/mysql-4.0.html,打开此网页,下拉网页找到"Linux x86 RPM downloads"项,找到"Serv