问题描述
环境:
-
操作系统: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正确解析了私有注册表主机名。
最佳解决思路
推荐方式Docker 17.xx +
有许多方法可以为Docker守护程序配置守护程序标志和环境变量。 recommended way将使用platform-independent 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 drop-in文件。
因此,对于这种特定情况,请执行以下操作:
-
使用以下内容创建名为
/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
-
同花顺变化:
$ 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
而已。
次佳解决思路
使用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
第三种解决思路
基于系统的系统不读取/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 ...
第四种思路
Systemd实际上并不是为ExecStart或Environment附加选项而设计的。最好也是大多数platform-independent方式是使用/etc/docker/daemon.json
configuration file。
看吧:
cat > /etc/docker/daemon.json <<DOCKERCONFIG
{
"labels": ["foo=bar"],
"insecure-registries": ["mydocker-registry.net:5000"]
}
DOCKERCONFIG