Docker 守护程序标志被忽略
Docker daemon flags ignored
环境:
- OS: debian 8.0.0-amd64, ubuntu-15.04, 16.04
- Docker: 1.x.x
程序:
我更改 /etc/default/docker
以添加私有 docker 注册表,然后我重新启动 docker 服务并最终尝试拉取一些图像。
$ cat /etc/default/docker
DOCKER_OPTS="--insecure-registry mydocker-registry.net:5000"
$ service docker restart
$ docker pull mydocker-registry.net:5000/testdb
FATA[0000] Error: v1 ping attempt failed with error: Get https://mydocker-
registry.net:5000/v1/_ping: dial tcp: lookup mydocker-registry.net: no
such host. If this private registry supports only HTTP or HTTPS with an
unknown CA certificate, please add `--insecure-registry mydocker-
registry.net:5000` to the daemon's arguments. In the case of HTTPS, if
you have access to the registry's CA certificate, no need for the flag;
simply place the CA certificate at /etc/docker/certs.d/mydocker-
registry.net:5000/ca.crt
ps
输出没有显示任何关于 DOCKER_OPTS 环境变量的信息。
$ ps auxwww|grep docker
root 6919 0.0 0.1 331076 19984 ? Ssl 10:14 0:00 /usr/bin/docker -d -H fd://
问题:
根据 docker 文档,使用私有注册表的方法是通过 /etc/default/docker
中的 DOCKER_OPTS。为什么做了之后,在这个环境下不生效?
备注:
- 私有注册表主机名已由 DNS 正确解析。
推荐方式Docker17.xx+
有多种方法可以为您的 Docker 守护程序配置守护程序标志和环境变量。 recommended way是使用平台无关的daemon.json
文件,默认位于Linux上的/etc/docker/
。
因此,要配置不安全的注册表,请执行以下操作:
在 /etc/docker/daemon.json
文件中设置以下标志:
{
"insecure-registries": ["mydocker-registry.net:5000"]
}
重启Docker
$ sudo systemctl restart docker
每次都更轻松!
以前推荐的方法 Docker 1.12
根据 docker documentation,为您的 Docker 守护进程配置守护进程标志和环境变量的推荐方法是使用 systemd 插入文件。
因此,对于这种特定情况,请执行以下操作:
创建一个名为 /etc/systemd/system/docker.service.d/private-registry.conf
的文件,内容如下:
If not exists, create directory /etc/systemd/system/docker.service.d
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --insecure-registry mydocker-registry.net:5000
刷新更改:
$ sudo systemctl daemon-reload
重启Docker:
$ sudo systemctl restart docker
瞧!
不推荐的方式
编辑文件/lib/systemd/system/docker.service
...
[Service]
ExecStart=/usr/bin/docker -d -H fd:// $DOCKER_OPTS
...
EnvironmentFile=-/etc/default/docker
...
然后执行
systemctl daemon-reload
systemctl restart docker
验证 /etc/default/docker
是否已加载
ps auxwww | grep docker
root 4989 0.8 0.1 265540 16608 ? Ssl 10:37 0:00 /usr/bin/docker -d -H fd:// --insecure-registry
就是这样。
基于 Systemd 的系统不读取 /etc/default 配置,您现在必须将它们放在 /etc/systemd 中,另请参阅 docker 错误 docker bug #12926
现在Docker网站上有官方文档,参考Control and configure Docker with systemd。
切勿直接破解服务文件进行配置。
经过测试并在基于 Arch 和 Debian 的系统上工作 - 我不得不包括忽略任何过时的 EnvironmentFile 指令的选项,不过(另请参阅链接的 Docker 参考,但我一开始并没有发现它以为不需要):
-EnvironmentFile=/etc/default/docker
ExecStart=
ExecStart=/usr/bin/docker daemon ...
使用 docker 1.12.x
,Ubuntu 16.04
中的情况似乎发生了变化。基于更新 documentation
将DOCKER_OPTS="-g /mnt/somewhere/else/docker/ --storage-driver=overlay2"
添加到/etc/default/docker
编辑文件/lib/systemd/system/docker.service
...
[Service]
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS
...
EnvironmentFile=-/etc/default/docker
...
然后执行:
sudo systemctl daemon-reload
sudo systemctl restart docker
Systemd 确实不是为附加 选项到 ExecStart 或环境而设计的。最好也是最独立于平台的方法是使用 /etc/docker/daemon.json
configuration file.
看:
cat > /etc/docker/daemon.json <<DOCKERCONFIG
{
"labels": ["foo=bar"],
"insecure-registries": ["mydocker-registry.net:5000"]
}
DOCKERCONFIG
Ubuntu 通过 DOCKER_OPTS
针对不安全注册表的特定解决方案
因为...
$ dpkg --list | grep -i docker
ii docker.io 1.12.3-0ubuntu4~16.04.2 amd64 Linux container runtime
...附带...
$ cat /etc/systemd/system/multi-user.target.wants/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target docker.socket
Requires=docker.socket
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
EnvironmentFile=-/etc/default/docker
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
[Install]
WantedBy=multi-user.target
...(特别是:ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS
)您可以采用混合方法,结合 "Recommended Way" 和使用 DOCKER_OPTS
来避免吹过 -H fd://
选项,如果你要重新定义 ExecStart
# The docker.io package doesn't create a systemd drop-ins directory, so we will
$ mkdir -p /etc/systemd/system/docker.service.d
$ cat > /etc/systemd/system/docker.service.d/10-insecure-registry.conf <<EOF
[Service]
Environment="DOCKER_OPTS=--insecure-registry docker.internal:5000"
EOF
我遇到了类似的挑战。当我开始寻找开始将某些系统从 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-security-infrastructure/tree/master/dockerd-configuration-options
git clone https://github.com/BradleyA/docker-scripts
cd docker-scripts/dockerd-configuration-options
环境:
- OS: debian 8.0.0-amd64, ubuntu-15.04, 16.04
- Docker: 1.x.x
程序:
我更改 /etc/default/docker
以添加私有 docker 注册表,然后我重新启动 docker 服务并最终尝试拉取一些图像。
$ cat /etc/default/docker
DOCKER_OPTS="--insecure-registry mydocker-registry.net:5000"
$ service docker restart
$ docker pull mydocker-registry.net:5000/testdb
FATA[0000] Error: v1 ping attempt failed with error: Get https://mydocker-
registry.net:5000/v1/_ping: dial tcp: lookup mydocker-registry.net: no
such host. If this private registry supports only HTTP or HTTPS with an
unknown CA certificate, please add `--insecure-registry mydocker-
registry.net:5000` to the daemon's arguments. In the case of HTTPS, if
you have access to the registry's CA certificate, no need for the flag;
simply place the CA certificate at /etc/docker/certs.d/mydocker-
registry.net:5000/ca.crt
ps
输出没有显示任何关于 DOCKER_OPTS 环境变量的信息。
$ ps auxwww|grep docker
root 6919 0.0 0.1 331076 19984 ? Ssl 10:14 0:00 /usr/bin/docker -d -H fd://
问题:
根据 docker 文档,使用私有注册表的方法是通过 /etc/default/docker
中的 DOCKER_OPTS。为什么做了之后,在这个环境下不生效?
备注:
- 私有注册表主机名已由 DNS 正确解析。
推荐方式Docker17.xx+
有多种方法可以为您的 Docker 守护程序配置守护程序标志和环境变量。 recommended way是使用平台无关的daemon.json
文件,默认位于Linux上的/etc/docker/
。
因此,要配置不安全的注册表,请执行以下操作:
在
/etc/docker/daemon.json
文件中设置以下标志:{ "insecure-registries": ["mydocker-registry.net:5000"] }
重启Docker
$ sudo systemctl restart docker
每次都更轻松!
以前推荐的方法 Docker 1.12
根据 docker documentation,为您的 Docker 守护进程配置守护进程标志和环境变量的推荐方法是使用 systemd 插入文件。
因此,对于这种特定情况,请执行以下操作:
创建一个名为
/etc/systemd/system/docker.service.d/private-registry.conf
的文件,内容如下:If not exists, create directory
/etc/systemd/system/docker.service.d
[Service] ExecStart= ExecStart=/usr/bin/dockerd --insecure-registry mydocker-registry.net:5000
刷新更改:
$ sudo systemctl daemon-reload
重启Docker:
$ sudo systemctl restart docker
瞧!
不推荐的方式
编辑文件/lib/systemd/system/docker.service
...
[Service]
ExecStart=/usr/bin/docker -d -H fd:// $DOCKER_OPTS
...
EnvironmentFile=-/etc/default/docker
...
然后执行
systemctl daemon-reload
systemctl restart docker
验证 /etc/default/docker
是否已加载
ps auxwww | grep docker
root 4989 0.8 0.1 265540 16608 ? Ssl 10:37 0:00 /usr/bin/docker -d -H fd:// --insecure-registry
就是这样。
基于 Systemd 的系统不读取 /etc/default 配置,您现在必须将它们放在 /etc/systemd 中,另请参阅 docker 错误 docker bug #12926
现在Docker网站上有官方文档,参考Control and configure Docker with systemd。
切勿直接破解服务文件进行配置。
经过测试并在基于 Arch 和 Debian 的系统上工作 - 我不得不包括忽略任何过时的 EnvironmentFile 指令的选项,不过(另请参阅链接的 Docker 参考,但我一开始并没有发现它以为不需要):
-EnvironmentFile=/etc/default/docker
ExecStart=
ExecStart=/usr/bin/docker daemon ...
使用 docker 1.12.x
,Ubuntu 16.04
中的情况似乎发生了变化。基于更新 documentation
将DOCKER_OPTS="-g /mnt/somewhere/else/docker/ --storage-driver=overlay2"
添加到/etc/default/docker
编辑文件/lib/systemd/system/docker.service
...
[Service]
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS
...
EnvironmentFile=-/etc/default/docker
...
然后执行:
sudo systemctl daemon-reload
sudo systemctl restart docker
Systemd 确实不是为附加 选项到 ExecStart 或环境而设计的。最好也是最独立于平台的方法是使用 /etc/docker/daemon.json
configuration file.
看:
cat > /etc/docker/daemon.json <<DOCKERCONFIG
{
"labels": ["foo=bar"],
"insecure-registries": ["mydocker-registry.net:5000"]
}
DOCKERCONFIG
Ubuntu 通过 DOCKER_OPTS
针对不安全注册表的特定解决方案因为...
$ dpkg --list | grep -i docker
ii docker.io 1.12.3-0ubuntu4~16.04.2 amd64 Linux container runtime
...附带...
$ cat /etc/systemd/system/multi-user.target.wants/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target docker.socket
Requires=docker.socket
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
EnvironmentFile=-/etc/default/docker
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
[Install]
WantedBy=multi-user.target
...(特别是:ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS
)您可以采用混合方法,结合 DOCKER_OPTS
来避免吹过 -H fd://
选项,如果你要重新定义 ExecStart
# The docker.io package doesn't create a systemd drop-ins directory, so we will
$ mkdir -p /etc/systemd/system/docker.service.d
$ cat > /etc/systemd/system/docker.service.d/10-insecure-registry.conf <<EOF
[Service]
Environment="DOCKER_OPTS=--insecure-registry docker.internal:5000"
EOF
我遇到了类似的挑战。当我开始寻找开始将某些系统从 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-security-infrastructure/tree/master/dockerd-configuration-options
git clone https://github.com/BradleyA/docker-scripts
cd docker-scripts/dockerd-configuration-options