我更改了/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。为什么在这样做之后,它不会在这种环境中生效?
答案 0 :(得分:56)
有许多方法可以为Docker守护程序配置守护程序标志和环境变量。 recommended way将使用与平台无关的daemon.json
文件,默认情况下位于Linux上的/etc/docker/
。
因此,要配置不安全的注册表,请执行以下操作:
在/etc/docker/daemon.json
文件中设置以下标志:
{
"insecure-registries": ["mydocker-registry.net:5000"]
}
重启Docker
$ sudo systemctl restart docker
每次都更容易!
根据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
那就是它。
答案 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)
由于...
$ 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