【问题标题】:DOCKER_OPTS do not work in config file /etc/default/dockerDOCKER_OPTS 在配置文件 /etc/default/docker 中不起作用
【发布时间】:2015-03-02 00:50:42
【问题描述】:

我已将 /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 有效。

真的让我很困惑!

【问题讨论】:

  • 只是为了更清楚,编辑/etc/default/docker后是否重启docker服务?
  • 是的,我已经一次又一次地重新启动它

标签: ubuntu docker upstart systemd


【解决方案1】:

查看docker源码(config.goflags.go)后,我想说$DOCKER_OPTS可以传入的选项是docker本身的选项,-H--host是docker的选项守护进程。 作为解决问题的一种解决方法,您可以编辑您正在使用的初始化脚本文件以在其中包含 -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 daemon 启动配置文件吗?许多文章(包括official docs)告诉我在/etc/default/docker 中设置DOCKER_OPTS 而不是在bash 环境中。
  • 是的,应该。并且 docker init 脚本加载 /etc/default/docker。如果我设置DOCKER_OPTS="-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock",我已经测试并且在我的环境(Linux Mint 17 -Ubuntu 14.04- 和 docker 1.4.1)中工作。我使用的是默认的初始化系统(upstart),你应该使用相同的。检查文件/etc/init/docker.conf 以查看它是否正在加载配置文件。它应该出现:if [ -f /etc/default/$UPSTART_JOB ]; then . /etc/default/$UPSTART_JOB; fi
  • /etc/default/docker 在重新启动我的 ubuntu 服务器后现在为我工作。
  • @Sean 我发现在你对 /etc/default/docker 进行更改后,不需要重新启动 Ubuntu 机器,只需重新启动 docker 服务...
【解决方案2】:

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

我注意到 /etc/default/docker 中的所有选项实际上都被默认注释掉了。

我删除了 DOCKER_OPTS 前面的 #,然后重新启动,它按预期工作。

我认为以前的 docker 版本 (1.3) 默认情况下没有注释掉这些选项,至少我不记得必须删除#-sign。

【讨论】:

  • 当我在 ubuntu 16.04 上运行 docker 17.xx+ 和 docker-compose 1.18 时,这对我有帮助
【解决方案3】:

我遇到了同样的问题。

Ubuntu 14.10 使用 systemd 而不是 sysv-init/upstart。也许您应该查看/lib/systemd/system/docker.service 以更改选项。

【讨论】:

  • 为了完整起见,您需要发出以下命令(必要时使用sudosystemctl daemon-reloadservice docker restart
  • 另外,journalctl 是一个有用的命令,用于在服务启动失败时查看任何消息。
【解决方案4】:

请参阅此处了解使用 systemd 的更高版本的 Debian/Ubuntu。

此链接说明如何正确修改 systemd 单元文件以使用 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 install 进程似乎忽略了 systemd 单元文件。

【讨论】:

  • 我成功地使用了一个更小的 docker.conf,它只是覆盖了我想要更改的 /lib/systemd/system/docker.service 的部分。
【解决方案5】:

根据docker documentation,为 Docker 守护程序配置守护程序标志和环境变量的推荐方法是使用 systemd drop-in 文件

因此,对于这种特定情况,请执行以下操作:

  1. 使用命令sudo systemctl edit docker.service 在文本编辑器中打开docker.service 的覆盖文件。

  2. 添加或修改以下行,替换为您自己的值。

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock
    
  3. 保存文件。

  4. 重新加载systemctl 配置。

     $ sudo systemctl daemon-reload
    
  5. 重启 Docker:

     $ sudo systemctl restart docker.service
    
  6. 通过查看netstat 的输出以确认dockerd 正在侦听配置的端口,以查看更改是否已生效。

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

【讨论】:

【解决方案6】:

回复systemd cmets结合Ubuntu:Ubuntu 14.04仍然使用Upstart,所以对/etc/default/docker的修改应该已经达到了预期的效果。直到 15.04 Ubuntu 才开始默认使用 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

【讨论】:

    【解决方案7】:

    我也遇到过类似的挑战。当我开始考虑将一些系统从 Ubuntu 14.04 迁移到 Ubuntu 16.04 时。我的目标是为 Ubuntu 16.04 (systemd) 和 Ubuntu 14.04 (Upstart) 使用一个带有 dockerd 标志 (DOCKER_OPTS) 的 dockerd 配置文件,而不是 /etc/docker/daemon.json。我选择不使用 /etc/docker/daemon.json 进行 docker daemon 配置,因为 json 不支持 cmets。

    我希望 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
    

    【讨论】:

      【解决方案8】:

      使用平台无关 daemon-configuration-file 似乎更干净。

      "hosts" 添加到您的/etc/docker/daemon.json(或/custom/path/to/daemon/config.json,如果您在启动dockerd 时使用--config-file 选项):

      {
      ...
      "hosts": ["tcp://127.0.0.1:2375", "unix:///var/run/docker.sock"],
      ...
      }
      

      重启守护进程:

      sudo systemctl restart docker
      

      【讨论】:

        【解决方案9】:

        由于 docker 守护程序端口限制,我在 jenkins 按需旋转从属服务器方面遇到了很多问题。

        原来如此

        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 守护进程做任何事情**

        【讨论】:

          猜你喜欢
          • 2023-02-03
          • 1970-01-01
          • 2017-12-31
          • 2021-08-09
          • 2018-01-02
          • 2016-01-12
          • 1970-01-01
          • 2017-07-30
          • 1970-01-01
          相关资源
          最近更新 更多