DOCKER_OPTS在配置文件/etc/default/docker中无效。

28

我已经修改了/etc/default/docker文件中的以下内容:DOCKER_OPTS="-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock"(在Ubuntu 14.04上安装的Docker版本为1.4.1),但是对我来说它没有任何效果(不监听2375端口)。似乎docker没有读取这个初始配置文件,因为我发现export http_proxy环境也无法正常工作。

只有使用sudo docker -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock -d才能起作用。

这真的让我感到困惑!


1
为确保更加清晰,你在编辑/etc/default/docker文件后是否需要重启docker服务? - Javier Cortejoso
是的,我已经一遍又一遍地重新启动它了。 - seanlook
9个回答

39
根据 docker 文档,配置 Docker daemon 的守护进程标志和环境变量的推荐方法是使用 systemddrop-in 文件
因此,在这种情况下,请执行以下操作:
  1. Use the command sudo systemctl edit docker.service to open an override file for docker.service in a text editor.

  2. Add or modify the following lines, substituting your own values.

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock
    
  3. Save the file.

  4. Reload the systemctl configuration.

     $ sudo systemctl daemon-reload
    
  5. Restart Docker:

     $ sudo systemctl restart docker.service
    
  6. Check to see whether the change was honored by reviewing the output of netstat to confirm dockerd is listening on the configured port.

    $ sudo netstat -lntp | grep dockerd
    tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd
    

推荐的方式对我来说并没有完全起作用,因为-H已经设置好了。我不得不使用之前方法的一部分https://dev59.com/TlcP5IYBdhLWcg3wqLow#44055659 - blackbox
请注意,重复的 ExecStart= 行不是打字错误。这是必需的,以强制 systemd 替换执行命令而不是添加新命令。 - David Dombrowsky

15

请查看使用systemd的Debian/Ubuntu的较新版本。

此链接说明如何正确修改systemd unit文件以使其与DOCKER_OPTS配合使用:https://github.com/docker/docker/issues/9889

基本上,您需要创建一个/etc/systemd/system/docker.service.d/docker.conf文件,并在其中指定您的覆盖内容。

我必须在上述文件中执行类似以下命令才能在systemd环境中启动带有DOCKER_OPTS环境变量的docker:

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target docker.socket
Requires=docker.socket

[Service]
EnvironmentFile=-/etc/default/docker
ExecStart=
ExecStart=/usr/bin/docker -d $DOCKER_OPTS -H fd://
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity

[Install]
WantedBy=multi-user.target

目前Docker的安装过程似乎忽略了systemd单元文件。


我成功地使用了一个更简化的docker.conf文件,它只覆盖了我想要更改的/lib/systemd/system/docker.service的部分。 - Aneel

8

我有同样的问题。

Ubuntu 14.10使用systemd代替sysv-init/upstart。也许您应该查看/lib/systemd/system/docker.service来更改选项。


为了完整性,您需要发出以下命令(如果需要,请使用sudo):systemctl daemon-reloadservice docker restart - David Carboni
此外,journalctl 是一个有用的命令,可以查看服务启动失败时的任何消息。 - David Carboni

3

我刚刚遇到了同样的问题。

我注意到,/etc/default/docker中所有选项默认都是被注释掉的。

我删除了DOCKER_OPTS前面的#号,重新启动后问题得到了解决。

我认为以前的docker版本(1.3)默认情况下没有对这些选项进行注释,至少我不记得需要删除#号。


这对我很有用,当时我在 Ubuntu 16.04 上运行 Docker 17.xx+ 和 Docker Compose 1.18。 - Trevor McCasland

1

在查看了docker源代码(config.goflags.go)之后,我认为你可以在$DOCKER_OPTS中传递的选项是docker本身的选项,而-H--host是docker守护进程的选项。 作为解决问题的一种方法,您可以编辑正在使用的init脚本文件以包含-H选项。例如:

  • 如果您正在使用upstart init系统,请编辑文件/etc/init/docker.conf,将exec行更改为exec "$DOCKER" -H "tcp://127.0.0.1:2375" -H "unix:///var/run/docker.sock" -d $DOCKER_OPTS
  • 如果您正在使用sysvinit init系统,请编辑文件/etc/init.d/docker,将启动行更改为类似以下内容:

使用此命令:

start-stop-daemon --start --background \
    --no-close \
    --exec "$DOCKER" \
    --pidfile "$DOCKER_SSD_PIDFILE" \
    --make-pidfile \
    -- \
        -H "tcp://127.0.0.1:2375" \
        -H "unix:///var/run/docker.sock" \
        -d -p "$DOCKER_PIDFILE" \
        $DOCKER_OPTS >> \
        "$DOCKER_LOGFILE" 2>&1 
    log_end_msg $?
    ;;

应该将/etc/default/docker作为Docker守护进程的启动配置文件吗?许多文章(包括官方文档)告诉我要在/etc/default/docker中设置DOCKER_OPTS而不是在bash环境中设置。 - seanlook
是的,应该可以。而且docker init脚本会加载/etc/default/docker。我已经测试过,在我的环境(Linux Mint 17 -Ubuntu 14.04-和docker 1.4.1),如果我设置DOCKER_OPTS="-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock",它就可以工作了。我正在使用默认的init系统(upstart),你也应该使用相同的系统。检查文件/etc/init/docker.conf,看看它是否正在加载配置文件。它应该出现:if [ -f /etc/default/$UPSTART_JOB ]; then . /etc/default/$UPSTART_JOB; fi - Javier Cortejoso
在重启我的Ubuntu服务器后,/etc/default/docker现在可以正常工作了。 - seanlook
@Sean 我发现在你对 /etc/default/docker 进行更改后,无需重启 Ubuntu 机器,只需要简单地重启 docker 服务即可... - user3614014

1
作为对 Ubuntu 系统与 systemd 的评论的回应:Ubuntu 14.04 仍然使用 Upstart,因此更改 /etc/default/docker 应该会产生所需的效果。直到 Ubuntu 15.04 开始默认使用 systemd。

如果您使用的是 Ubuntu 15.04 或更高版本并且需要使用 systemd,或者在 15.04 之前明确选择使用 systemd,则实现 OP(一个 TCP 套接字)所需的正确和最简单的方法是:

  1. 创建文件 /etc/systemd/system/docker.service.d/docker-tcp.conf
  2. 添加以下内容
  3. 执行 sudo systemctl daemon-reload
  4. 执行 sudo systemctl restart docker

文件内容如下:

[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon --host=tcp://127.0.0.1:2375

1
使用平台无关的守护进程配置文件似乎更加简洁。
"hosts"添加到您的/etc/docker/daemon.json(或者如果您在启动dockerd时使用了--config-file选项,则添加到/custom/path/to/daemon/config.json):
{
...
"hosts": ["tcp://127.0.0.1:2375", "unix:///var/run/docker.sock"],
...
}

restart the daemon:

sudo systemctl restart docker

0

我曾面临类似的挑战。当我开始考虑将一些系统从Ubuntu 14.04迁移到Ubuntu 16.04时,我的目标是使用一个dockerd配置文件和dockerd标志(DOCKER_OPTS)用于Ubuntu 16.04 (systemd)和Ubuntu 14.04(Upstart),而不是/ etc /docker/daemon.json。我选择不使用/ etc/docker/daemon.json来进行docker守护程序配置,因为json不支持注释。

我想要一个systemd设计来使用覆盖文件,仅修改dockerd标志。它使用默认的Docker systemd配置文件(/ lib /systemd/system/docker.service)进行其他Docker设置。另一个目标是在每次更改或引导后自定义每个系统上的systemd。

这解决了我的问题,希望对你有所帮助。

https://github.com/BradleyA/docker-scripts/tree/master/dockerd-configuration-options

git clone https://github.com/BradleyA/docker-scripts
cd docker-scripts/dockerd-configuration-options

0

我在使用Jenkins的时候,因为Docker守护进程端口限制的问题,遇到了很多关于按需从Jenkins生成slave的问题。

所以我做了以下操作:

sudo systemctl edit docker.service

添加以下内容:

[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon --host=tcp://0.0.0.0:2375

保存文件

运行以下命令

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker.service

注意:这将公开您的守护程序,任何拥有您的IP和端口的人都可以对您的Docker守护程序进行任何操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接