DOCKER_OPTS 在配置文件中不起作用 /etc/default/docker
DOCKER_OPTS do not work in config file /etc/default/docker
我已经将/etc/default/docker
更改为DOCKER_OPTS="-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock"
(docker版本1.4.1 in ubuntu 14.04),但它对我没有任何影响(不听在端口 2375
)。 docker 似乎没有读取这个初始配置文件,因为我发现 export http_proxy
环境也不起作用。
只有 sudo docker -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock -d
有效。
真是把我搞糊涂了!
查看docker源代码(config.go and flags.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 $?
;;
我刚刚 运行 遇到 "same" 问题。
我注意到 /etc/default/docker 中的所有选项实际上默认都被注释掉了。
我删除了 DOCKER_OPTS 前面的 #,重新启动并按预期工作。
我认为以前的 docker 版本 (1.3) 没有默认注释掉这些选项,至少我不记得必须删除 #-sign。
我遇到了同样的问题。
Ubuntu 14.10 使用 systemd
而不是 sysv-init/upstart
。也许您应该查看 /lib/systemd/system/docker.service
以更改选项。
请参阅此处了解使用 systemd 的 Debian/Ubuntu 更高版本。
此 link 解释了如何正确修改 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 安装过程似乎忽略了 systemd 单元文件。
根据 docker documentation,为您的 Docker 守护进程配置守护进程标志和环境变量的推荐方法是使用 systemd 插入文件。
因此,对于这种特定情况,请执行以下操作:
使用命令 sudo systemctl edit docker.service
在文本编辑器中打开 docker.service
的覆盖文件。
添加或修改以下行,替换为您自己的值。
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock
保存文件。
重新加载 systemctl
配置。
$ sudo systemctl daemon-reload
重启Docker:
$ sudo systemctl restart docker.service
通过查看 netstat
的输出以确认 dockerd
正在侦听配置的端口来检查更改是否得到遵守。
$ sudo netstat -lntp | grep dockerd
tcp 0 0 127.0.0.1:2375 0.0.0.0:* LISTEN 3758/dockerd
结合Ubuntu回复systemd评论:Ubuntu14.04仍然使用Upstart,所以对/etc/default/docker
的修改应该达到了预期的效果。直到 15.04 Ubuntu 才开始默认使用 systemd。
如果您有 Ubuntu 15.04 或更高版本因此需要使用 systemd,或者如果您明确选择在 15.04 之前使用 systemd,这是获得所需 OP 效果的正确且最简单的方法,a TCP 套接字,将是:
- 创建文件
/etc/systemd/system/docker.service.d/docker-tcp.conf
- 添加以下内容
- 执行
sudo systemctl daemon-reload
- 执行
sudo systemctl restart docker
文件内容:
[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon --host=tcp://127.0.0.1:2375
我遇到了类似的挑战。当我开始寻找开始将某些系统从 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 守护进程配置,因为 json 不支持注释。
我希望 systemd 设计使用覆盖文件,它只修改 dockerd 标志。它使用默认的 Docker systemd 配置文件 (/lib/systemd/system/docker.service) 进行其他 Docker 设置。另一个 objective 是在每次更改或启动后在每个系统上自定义 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
使用 平台独立 daemon-configuration-file 似乎更干净。
将 "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"],
...
}
重启守护进程:
sudo systemctl restart docker
好吧,由于 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 守护进程做任何事情 **
我已经将/etc/default/docker
更改为DOCKER_OPTS="-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock"
(docker版本1.4.1 in ubuntu 14.04),但它对我没有任何影响(不听在端口 2375
)。 docker 似乎没有读取这个初始配置文件,因为我发现 export http_proxy
环境也不起作用。
只有 sudo docker -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock -d
有效。
真是把我搞糊涂了!
查看docker源代码(config.go and flags.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 $?
;;
我刚刚 运行 遇到 "same" 问题。
我注意到 /etc/default/docker 中的所有选项实际上默认都被注释掉了。
我删除了 DOCKER_OPTS 前面的 #,重新启动并按预期工作。
我认为以前的 docker 版本 (1.3) 没有默认注释掉这些选项,至少我不记得必须删除 #-sign。
我遇到了同样的问题。
Ubuntu 14.10 使用 systemd
而不是 sysv-init/upstart
。也许您应该查看 /lib/systemd/system/docker.service
以更改选项。
请参阅此处了解使用 systemd 的 Debian/Ubuntu 更高版本。
此 link 解释了如何正确修改 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 安装过程似乎忽略了 systemd 单元文件。
根据 docker documentation,为您的 Docker 守护进程配置守护进程标志和环境变量的推荐方法是使用 systemd 插入文件。
因此,对于这种特定情况,请执行以下操作:
使用命令
sudo systemctl edit docker.service
在文本编辑器中打开docker.service
的覆盖文件。添加或修改以下行,替换为您自己的值。
[Service] ExecStart= ExecStart=/usr/bin/dockerd -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock
保存文件。
重新加载
systemctl
配置。$ sudo systemctl daemon-reload
重启Docker:
$ sudo systemctl restart docker.service
通过查看
netstat
的输出以确认dockerd
正在侦听配置的端口来检查更改是否得到遵守。$ sudo netstat -lntp | grep dockerd tcp 0 0 127.0.0.1:2375 0.0.0.0:* LISTEN 3758/dockerd
结合Ubuntu回复systemd评论:Ubuntu14.04仍然使用Upstart,所以对/etc/default/docker
的修改应该达到了预期的效果。直到 15.04 Ubuntu 才开始默认使用 systemd。
如果您有 Ubuntu 15.04 或更高版本因此需要使用 systemd,或者如果您明确选择在 15.04 之前使用 systemd,这是获得所需 OP 效果的正确且最简单的方法,a TCP 套接字,将是:
- 创建文件
/etc/systemd/system/docker.service.d/docker-tcp.conf
- 添加以下内容
- 执行
sudo systemctl daemon-reload
- 执行
sudo systemctl restart docker
文件内容:
[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon --host=tcp://127.0.0.1:2375
我遇到了类似的挑战。当我开始寻找开始将某些系统从 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 守护进程配置,因为 json 不支持注释。
我希望 systemd 设计使用覆盖文件,它只修改 dockerd 标志。它使用默认的 Docker systemd 配置文件 (/lib/systemd/system/docker.service) 进行其他 Docker 设置。另一个 objective 是在每次更改或启动后在每个系统上自定义 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
使用 平台独立 daemon-configuration-file 似乎更干净。
将 "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"],
...
}
重启守护进程:
sudo systemctl restart docker
好吧,由于 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 守护进程做任何事情 **