通常情况下Docker只在 UNIX socket下生效. 一般只有本地调用生效. 如果要远程调用可以有以下三种方式:
使用nginx转发通讯到Docker
用SSH和socat处理链路
创建Docker daemon监听开放的端口
第一种实现起来比较繁琐. 第二种需要在客户端服务端安装 socat. 由于其连接未加密,任何人都可以拦截Docker的通讯信息.
直到有了 Docker implemented TLS auth in 0.10才完美的解决了这个问题.
有三种简单的方式来实现:
I. 生成证书
需要生成三种证书类型:
- CA 证书用来生成客户端和服务端证书
- 远端Docker使用的客户端生疏
- 服务端使用的Docker daemon证书
我用Ruby写了生成这三种证书的代码.你只需要拷贝相关的代码 clone this repository 并运行下面的命令:
$ gem install certificate_authority
$ ruby certgen.rb example.com
CA certificates are in ~/.docker/ca
Client certificates are in ~/.docker
Server certificates are in ~/.docker/example.com
证书都生成在~/.dockerpath下.
II. 拷贝服务端证书到远端
脚本生成 Docker daemon需要的键值和证书~/.docker/example.com(example.com 是你的域名).
在服务端拷贝到~/.dockerdirectory下:
rsync -ave ssh ~/.docker/example.com/ root@example.com:~/.docker/
III. 在远端配置Docker
Docker daemon在0.10后支持--tlsverify 来提供加密的远端连接
假设你是用的是 Ubuntu 12.04 LTS并已经安装了Docker .其它环境下可能有些不同.
只需要在/etc/default/docker加入下面配置:
DOCKER_OPTS="--tlsverify -H=unix:///var/run/docker.sock -H=0.0.0.0:4243 --tlscacert=/root/.docker/ca.pem --tlscert=/root/.docker/cert.pem --tlskey=/root/.docker/key.pem"
之后重启 Docker daemon:
service docker restart
如果有错Docker daemon就会启动不了. 可以通过 under/var/log/upstart/docker.log来调试.
就是这么简单!
现在通过--tlsverify就能连接到远端Docker实例了:
docker --tlsverify -H tcp://example.com:4243 images
它会使用 ~/.docker下的证书来验证连接. 如果使用的是其他的类型, 可以通过--tls* 来查询docker --help的帮助文档 documentation.
官方的TLS创建网址在这里 can be found on Docker site.