Docker守护进程标志被忽略

环境:

  • OSdebian 8.0.0-amd64,ubuntu-15.04,16.04
  • Docker :1.xx

程序:

我改变了/etc/default/docker来添加一个私有的dockerregistry,然后我重新启动了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环境variables。

 $ ps auxwww|grep docker root 6919 0.0 0.1 331076 19984 ? Ssl 10:14 0:00 /usr/bin/docker -d -H fd:// 

题:

根据docker文档,使用私有registry的方法是通过/etc/default/docker docker中的DOCKER_OPTS。 为什么这样做后,在这种环境下不起作用?

笔记:

  • 私人registry主机名由DNS正确parsing。

推荐方式码头17.xx +

有很多方法可以为Docker守护进程配置守护进程标志和环境变量。 推荐的方法是使用独立于平台的daemon.json文件,该文件位于Linux上的/etc/docker/

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

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

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

      $ sudo systemctl restart docker 

每次更轻松!


先前推荐的方式与Docker 1.12

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

所以,对于这个特定的情况,请执行以下操作:

  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 

瞧!


不建议的方式

编辑文件/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 

而已。

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

现在有一个关于Docker站点的官方文档,请参阅Control和Systemd配置Docker 。

你不应该直接破解服务文件进行配置。

经过测试,在基于Arch和Debian的系统上工作 – 但是我必须包括忽略任何废弃的EnvironmentFile指令的选项(另请参阅链接的Docker参考,但是我一开始并没有发现它,并认为它不是必需的):

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

Ubuntu 16.04使用1.12.x似乎已经发生了变化。 基于更新的文档

/etc/default/docker DOCKER_OPTS="-g /mnt/somewhere/else/docker/ --storage-driver=overlay2"添加DOCKER_OPTS="-g /mnt/somewhere/else/docker/ --storage-driver=overlay2"

编辑文件/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或Environment的。 最好也是最平台无关的方法是使用/etc/docker/daemon.json 配置文件 。

看吧:

 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