Docker守护程序标志被忽略

时间:2015-05-08 15:31:33

标签: ubuntu docker debian

环境:

  • 操作系统: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环境var。

$ 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正确解析了私有注册表主机名。

6 个答案:

答案 0 :(得分:56)

推荐方式Docker 17.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
    
  3. 每次都更容易!

    以前推荐的Docker 1.12方式

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

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

    1. 使用以下内容创建名为/etc/systemd/system/docker.service.d/private-registry.conf的文件:

        

      如果不存在,请创建目录/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
      
    4. 瞧!

      不推荐的方式

      修改档案/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 
      

      那就是它。

答案 1 :(得分:8)

Ubuntu 16.04使用docker 1.12.x似乎发生了变化。基于更新的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

答案 2 :(得分:6)

基于系统的系统不读取/ etc / default配置,您必须立即将它们放在/ etc / systemd中,另请参阅docker bug docker bug #12926

现在有关于Docker站点的官方文档,请参阅Control and configure Docker with systemd

您永远不应该直接破解服务文件以进行配置。

测试并使用基于Arch和Debian的系统 - 我必须包含忽略任何过时的EnvironmentFile指令的选项(参见链接的Docker引用,但我最初没有发现它并认为它不是需要的话):

-EnvironmentFile=/etc/default/docker
ExecStart=
ExecStart=/usr/bin/docker daemon ...

答案 3 :(得分:4)

Systemd实际上并非设计用于将附加选项附加到ExecStart或Environment。最佳且与平台无关的最佳方式是使用/etc/docker/daemon.json configuration file

看哪:

cat > /etc/docker/daemon.json <<DOCKERCONFIG
{
  "labels": ["foo=bar"],
  "insecure-registries": ["mydocker-registry.net:5000"]
}
DOCKERCONFIG

答案 4 :(得分:1)

Ubuntu通过DOCKER_OPTS

对insecure-registry进行特定解决方案

由于...

$ 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)您可以采用混合方法,将[chosen answer's]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

答案 5 :(得分: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-security-infrastructure/tree/master/dockerd-configuration-options

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