通常情况下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.
相关资源:使用TLS加密通讯远程连接Docker的示例详解