©
本文档使用 PHP中文网手册 发布
本节包含配置Linux主机以更好地使用Docker的可选过程。
docker
daemon绑定到Unix套接字,而不是TCP端口。默认情况下,unix套接字由用户拥有。root
而其他用户只能使用sudo
...docker
守护进程总是以root
用户。
如果你不想用sudo
当您使用docker
命令,创建一个名为docker
并将用户添加到其中。当docker
守护进程启动,它使unix套接字的所有权可以由docker
小组。
警告*
docker
组授予与root
用户。有关此操作如何影响系统安全性的详细信息,请参阅码头守护进程攻击面...
若要创建docker
分组并添加用户:
创建docker
小组。
$sudo群加码头
2. 将您的用户添加到docker
组中。
$sudo usermod-AG docker$user
注销并重新登录,以便重新评估您的组成员资格。如果在虚拟机上进行测试,可能需要重新启动虚拟机以使更改生效。在桌面Linux环境(如X Windows)上,完全退出会话并重新登录。
2. 验证您可以不使用运行docker
命令sudo
。
$docker运行Hello-world
该命令下载测试图像并将其运行到容器中。当容器运行时,它会打印一条信息消息并退出。
大多数当前的Linux发行版(RHEL,CentOS,Fedora,Ubuntu 16.04和更高版本)用于systemd
管理在系统引导时启动哪些服务。Ubuntu 14.10及以下版本使用upstart
。
systemd
$ sudo systemctl enable docker
要禁用此行为,请改为使用disable
。
$ sudo systemctl disable docker
如果您需要添加HTTP代理,为Docker运行时文件设置不同的目录或分区,或进行其他自定义,请参阅自定义您的systemd Docker守护进程选项。
upstart
Docker会自动配置为在启动时使用upstart
。要禁用此行为,请使用以下命令:
$ echo manual | sudo tee /etc/init/docker.override
chkconfig
$ sudo chkconfig docker on
有关不同存储引擎的信息,请参阅存储驱动程序。默认的存储引擎和受支持的存储引擎列表取决于您的主机的Linux发行版和可用的内核驱动程序。
如果您的内核早于版本3.10,或者缺少某些模块,Docker将无法正确运行。要检查内核兼容性,可以下载并运行check-compatibility.sh
剧本。
$ curl https://raw.githubusercontent.com/docker/docker/master/contrib/check-config.sh > check-config.sh $ bash ./check-config.sh
这个脚本只能在Linux上运行,而不是MacOS。
Cannot connect to the Docker daemon
如果您看到以下错误,您的Docker客户端可能被配置为连接到另一个主机上的Docker守护进程,并且可能无法访问该主机。
Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?
若要查看您的客户端配置为连接到哪个主机,请检查DOCKER_HOST
环境中的变量。
$ env | grep DOCKER_HOST
如果此命令返回值,则将Docker客户端设置为连接到在该主机上运行的Docker守护程序。如果未设置,则将Docker客户端设置为连接到在本地主机上运行的Docker守护程序。如果设置错误,请使用以下命令取消设置:
$ unset DOCKER_HOST
您可能需要在文件中编辑您的环境,如~/.bashrc
或~/.profile
以防止DOCKER_HOST
变量被错误地设置。
如果DOCKER_HOST
按预期设置,请验证Docker守护进程是否运行在远程主机上,并且防火墙或网络中断并不妨碍您连接。
如果您使用systemd-network
带着systemd
版本219或更高版本,码头容器可能无法访问您的网络。一开始systemd
版本220,给定网络%28的转发设置net.ipv4.conf.<interface>.forwarding
%29默认值为脱此设置阻止IP转发。它还与Docker的启用net.ipv4.conf.all.forwarding
在容器内设置。
若要在RHEL、CentOS或Fedora上处理此问题,请编辑<interface>.network
文件在/usr/lib/systemd/network/
在您的码头主机%28ex:/usr/lib/systemd/network/80-container-host0.network
%29并在[Network]
部分。
[Network]...IPForward=kernel # OR IPForward=true...
此配置允许按照预期从容器转发IP。
DNS resolver found in resolv.conf and containers can't use it
使用GUI的Linux系统通常有一个网络管理器正在运行,它使用dnsmasq
实例在环回地址上运行,如127.0.0.1
或127.0.1.1
缓存dns请求,并将此项添加到/etc/resolv.conf
...dnsmasq
服务加速DNS查询,并提供DHCP服务.。此配置在具有自己的网络命名空间的Docker容器中无法工作,因为Docker容器解析回送地址,如127.0.0.1
到本身,而且它不太可能在自己的回送地址上运行DNS服务器。
如果Docker检测到没有在/etc/resolv.conf
是一个功能齐全的DNS服务器,会发生以下警告,Docker将使用Google提供的公共DNS服务器8.8.8.8
和8.8.4.4
用于DNS解析。
WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it. Using default external servers : [8.8.8.8 8.8.4.4]
如果您看到此警告,请首先检查是否使用dnsmasq
*
$ ps aux |grep dnsmasq
如果您的容器需要解析网络内部的主机,那么公共名称服务器将是不够的。你有两个选择:
可以为Docker指定要使用的DNS服务器,或
你可以禁用dnsmasq
在网络管理员中。如果这样做,NetworkManager将添加真正的DNS名称服务器到/etc/resolv.conf
,但你将失去dnsmasq
...
您只需要使用这些方法中的一种。
配置文件的默认位置是/etc/docker/daemon.json
.可以使用--config-file
守护星旗。下面的文档假设配置文件位于/etc/docker/daemon.json
...
创建或编辑Docker守护进程配置文件,默认为/etc/docker/daemon.json
文件,它控制Docker守护进程配置。
$sudo Nano/etc/docker/daemon.json
2. 加一个dns
以一个或多个IP地址作为值的密钥。如果文件有现有内容,则只需添加或编辑dns
排队。
{“DNS”:“8.8.8.8”、“8.8.4.4”}
如果您的内部DNS服务器无法解析公共IP地址,请至少包含一个DNS服务器,以便您可以连接到Docker Hub并使您的容器可以解析互联网域名。
保存并关闭文件。
重新启动Docker守护进程。 $sudo服务码头重新启动
2. 验证Docker可以通过尝试提取图像来解析外部IP地址:
$docker推出hello-world
如有必要,请验证Docker容器可以通过对其进行ping来解析内部主机名。$ docker run --rm -it alpine ping -c4 <my_internal_host> PING google.com(192.168.1.2):56个数据字节来自192.168.1.2的64个字节:seq = 0 ttl = 41时间= 7.597 ms来自192.168的64个字节。 1.2:seq = 1 ttl = 41 time = 7.635 ms从192.168.1.2开始64字节:seq = 2 ttl = 41 time = 7.660 ms从192.168.1.2开始64字节:seq = 3 ttl = 41 time = 7.677 ms禁用dnsmasq
Ubuntu不要将Docker守护程序的配置更改为使用特定IP地址,请按照这些说明在NetworkManager中禁用dnsmasq
。
2. 编辑/etc/NetworkManager/NetworkManager.conf
文件。
3. 注释掉dns=dnsmasq
行,通过添加#
字符到行的开头。dns=dnsmasq保存并关闭文件。
4. 重新启动NetworkManager和Docker。作为一种选择,您可以重新启动系统。
$sudo重新启动网络管理器$sudo重新启动端口
禁用dnsmasq
在RHEL、CentOS或Fedora上:
禁用dnsmasq
服务:
$sudo服务dnsmasq停止$sudo system ctl禁用dnsmasq
使用Red Hat文档手动配置DNS服务器。
如果在运行Docker的同一台主机上运行防火墙,并且希望从另一台主机访问Docker远程API,并且启用远程访问,则需要配置防火墙以允许在Docker端口上进行传入连接,该端口默认为2376
如果启用了TLS加密传输,或者2375
否则。
UFW(简单防火墙)默认丢弃所有转发流量和所有传入流量。如果要从其他主机访问Docker Remote API并且已启用远程访问,则需要配置UFW以允许Docker端口上的传入连接,2376
如果启用TLS加密传输,则默认为启用连接2375
。默认情况下,Docker在未启用TLS的情况下运行。如果您不使用TLS,强烈建议您不要使用远程主机访问Docker Remote API,以防止远程特权升级攻击。
若要配置UFW并允许在Docker端口上进行传入连接,请执行以下操作:
确认UFW已启用。
$sudo UFW状态
如果ufw
未启用,则其余步骤将没有帮助。
2. 编辑UFW配置文件,它通常是/etc/default/ufw
或/etc/sysconfig/ufw
.设置DEFAULT_FORWARD_POLICY
政策ACCEPT
...
DEFAULT_FORWARD_POLICY="ACCEPT"
保存并关闭文件。
如果您需要启用从外部主机访问Docker Remote API并了解安全影响(请参阅此过程之前的部分),然后配置UFW以允许Docker端口上的传入连接(即,2375
如果您不使用TLS),如果您使用则2376
。$ sudo ufw allow 2376/tcp
2. 重新加载UFW。
$ sudo ufw reload
Your kernel does not support cgroup swap limit capabilities
在Ubuntu或Debian主机上,使用图像时可能会看到与以下内容类似的消息。
WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.
在基于RPM的系统上不会发生此警告,默认情况下启用这些功能。
如果您不需要这些功能,则可以忽略该警告。按照这些说明,您可以在Ubuntu或Debian上启用这些功能。即使Docker没有运行,内存和交换会计也会产生大约1%的总可用内存开销和10%的整体性能下降。
以用户身份登录Ubuntu或Debian主机sudo
特权。
2. 编辑/etc/default/grub
文件。添加或编辑该GRUB_CMDLINE_LINUX
行以添加以下两个键值对:
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
保存并关闭文件。
更新GRUB。 $sudo更新-GRUB 如果GRUB配置文件的语法不正确,则会发生错误。在本例中,重复步骤3和4。 这些更改将在重新启动系统时生效。下一步
2. 继续用户指南...
Docker,Docker文档,需求,apt,安装,ubuntu,安装,卸载,升级,更新