Docker 守护程序标志被忽略

Docker daemon flags ignored

环境:

程序:

我更改 /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。为什么做了之后,在这个环境下不生效?

备注:

推荐方式Docker17.xx+

有多种方法可以为您的 Docker 守护程序配置守护程序标志和环境变量。 recommended way是使用平台无关的daemon.json文件,默认位于Linux上的/etc/docker/

因此,要配置不安全的注册表,请执行以下操作:

  1. /etc/docker/daemon.json 文件中设置以下标志:

    {
        "insecure-registries": ["mydocker-registry.net:5000"]
    }
    
  2. 重启Docker

     $ sudo systemctl restart docker
    

每次都更轻松!


以前推荐的方法 Docker 1.12

根据 docker documentation,为您的 Docker 守护进程配置守护进程标志和环境变量的推荐方法是使用 systemd 插入文件

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

  1. 创建一个名为 /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
    
  2. 刷新更改:

    $ sudo systemctl daemon-reload
    
  3. 重启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.xUbuntu 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