之前一直使用Ubuntu 14.04来跑Docker。今天在16.04 LTS上跑Docker的时候发现设置DOCKER_OPTS的时候有些区别,特此记录一下。
1. 症状
之前在Ubuntu 14.04 LTS上都是通过修改/etc/default/docker文件来设置DOCKER_OPTS参数的,譬如像下面这个配置:
1# Docker Upstart and SysVinit configuration file
2DOCKER_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这个文件,修改如下:
1EnvironmentFile=-/etc/default/docker
2ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H fd://
上述修改通过EnvironmentFile指定了环境变量文件(内容参考上面)。然后在ExecStart中使用了在环境变量文件中定义的DOCKER_OPTS环境变量。这样修改以后,就可以通过修改/etc/default/docker文件来修改DOCKER_OPTS变量了。
修改上述文件之后,使用下面的命令使配置生效:
1sudo systemctl daemon-reload
2sudo service docker restart