在Ubuntu 16.04 LTS上设置DOCKER_OPTS

之前一直使用Ubuntu 14.04来跑Docker。今天在16.04 LTS上跑Docker的时候发现设置DOCKER_OPTS的时候有些区别,特此记录一下。

1. 症状

之前在Ubuntu 14.04 LTS上都是通过修改/etc/default/docker文件来设置DOCKER_OPTS参数的,譬如像下面这个配置:

1
2
# Docker Upstart and SysVinit configuration file
DOCKER_OPTS="-H unix:///var/run/docker.sock -H tcp://0.0.0.0:2345"

是通过使用-H tcp://0.0.0.0:2345参数,开启Docker的Remote API端口。这样就可以通过远程访问Docker服务。

今天在16.04 LTS版本上发现这样修改不起作用。具体表现是始终没有绑定到端口2345上,这个参数根本就没有起作用。

2. 原因

这个问题出现的原因是/etc/default/docker这个文件是用于SysVinit启动机制的一个配置文件。而Ubuntu 16.04 LTS使用systemd替代了init作为服务启动进程。新的启动机制不使用这个配置文件。

3. 解决办法

解决办法就是修改systemd的启动脚本,引入这个配置文件。打开/lib/systemd/system/docker.service这个文件,修改如下:

1
2
EnvironmentFile=-/etc/default/docker
ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H fd://

上述修改通过EnvironmentFile指定了环境变量文件(内容参考上面)。然后在ExecStart中使用了在环境变量文件中定义的DOCKER_OPTS环境变量。这样修改以后,就可以通过修改/etc/default/docker文件来修改DOCKER_OPTS变量了。

修改上述文件之后,使用下面的命令使配置生效:

1
2
sudo systemctl daemon-reload
sudo service docker restart

附录

热评文章