首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

可选的Linux安装后步骤(引擎) | Optional Linux post-installation steps (Engine)

本节包含配置Linux主机以更好地使用Docker的可选过程。

将Docker管理为非root用户

dockerdaemon绑定到Unix套接字,而不是TCP端口。默认情况下,unix套接字由用户拥有。root而其他用户只能使用sudo...docker守护进程总是以root用户。

如果你不想用sudo当您使用docker命令,创建一个名为docker并将用户添加到其中。当docker守护进程启动,它使unix套接字的所有权可以由docker小组。

警告*docker组授予与root用户。有关此操作如何影响系统安全性的详细信息,请参阅码头守护进程攻击面...

若要创建docker分组并添加用户:

  1. 创建docker小组。 $sudo群加码头

2. 将您的用户添加到docker组中。

$sudo usermod-AG docker$user

  1. 注销并重新登录,以便重新评估您的组成员资格。如果在虚拟机上进行测试,可能需要重新启动虚拟机以使更改生效。在桌面Linux环境(如X Windows)上,完全退出会话并重新登录。

2. 验证您可以不使用运行docker命令sudo

$docker运行Hello-world

该命令下载测试图像并将其运行到容器中。当容器运行时,它会打印一条信息消息并退出。

配置Docker在启动时启动

大多数当前的Linux发行版(RHEL,CentOS,Fedora,Ubuntu 16.04和更高版本)用于systemd管理在系统引导时启动哪些服务。Ubuntu 14.10及以下版本使用upstart

systemd

代码语言:javascript
复制
$ sudo systemctl enable docker

要禁用此行为,请改为使用disable

代码语言:javascript
复制
$ sudo systemctl disable docker

如果您需要添加HTTP代理,为Docker运行时文件设置不同的目录或分区,或进行其他自定义,请参阅自定义您的systemd Docker守护进程选项。

upstart

Docker会自动配置为在启动时使用upstart。要禁用此行为,请使用以下命令:

代码语言:javascript
复制
$ echo manual | sudo tee /etc/init/docker.override

chkconfig

代码语言:javascript
复制
$ sudo chkconfig docker on

使用不同的存储引擎

有关不同存储引擎的信息,请参阅存储驱动程序。默认的存储引擎和受支持的存储引擎列表取决于您的主机的Linux发行版和可用的内核驱动程序。

故障排除

内核兼容性

如果您的内核早于版本3.10,或者缺少某些模块,Docker将无法正确运行。要检查内核兼容性,可以下载并运行check-compatibility.sh剧本。

代码语言:javascript
复制
$ 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守护进程,并且可能无法访问该主机。

代码语言:javascript
复制
Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?

若要查看您的客户端配置为连接到哪个主机,请检查DOCKER_HOST环境中的变量。

代码语言:javascript
复制
$ env | grep DOCKER_HOST

如果此命令返回值,则将Docker客户端设置为连接到在该主机上运行的Docker守护程序。如果未设置,则将Docker客户端设置为连接到在本地主机上运行的Docker守护程序。如果设置错误,请使用以下命令取消设置:

代码语言:javascript
复制
$ unset DOCKER_HOST

您可能需要在文件中编辑您的环境,如~/.bashrc~/.profile以防止DOCKER_HOST变量被错误地设置。

如果DOCKER_HOST按预期设置,请验证Docker守护进程是否运行在远程主机上,并且防火墙或网络中断并不妨碍您连接。

IP转发问题

如果您使用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]部分。

代码语言:javascript
复制
[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.1127.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.88.8.4.4用于DNS解析。

代码语言:javascript
复制
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*

代码语言:javascript
复制
$ ps aux |grep dnsmasq

如果您的容器需要解析网络内部的主机,那么公共名称服务器将是不够的。你有两个选择:

  • 可以为Docker指定要使用的DNS服务器,
  • 你可以禁用dnsmasq在网络管理员中。如果这样做,NetworkManager将添加真正的DNS名称服务器到/etc/resolv.conf,但你将失去dnsmasq...

您只需要使用这些方法中的一种。

为Docker指定DNS服务器

配置文件的默认位置是/etc/docker/daemon.json.可以使用--config-file守护星旗。下面的文档假设配置文件位于/etc/docker/daemon.json...

  1. 创建或编辑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并使您的容器可以解析互联网域名。

保存并关闭文件。

  1. 重新启动Docker守护进程。 $sudo服务码头重新启动

2. 验证Docker可以通过尝试提取图像来解析外部IP地址:

$docker推出hello-world

  1. 如有必要,请验证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禁用dnsmasqUbuntu不要将Docker守护程序的配置更改为使用特定IP地址,请按照这些说明在NetworkManager中禁用dnsmasq

2. 编辑/etc/NetworkManager/NetworkManager.conf文件。

3. 注释掉dns=dnsmasq行,通过添加#字符到行的开头。dns=dnsmasq保存并关闭文件。

4. 重新启动NetworkManager和Docker。作为一种选择,您可以重新启动系统。

$sudo重新启动网络管理器$sudo重新启动端口

Rhel、CentOS或Fedora

禁用dnsmasq在RHEL、CentOS或Fedora上:

  1. 禁用dnsmasq服务: $sudo服务dnsmasq停止$sudo system ctl禁用dnsmasq
  1. 使用Red Hat文档手动配置DNS服务器。

允许通过防火墙访问远程api

如果在运行Docker的同一台主机上运行防火墙,并且希望从另一台主机访问Docker远程API,并且启用远程访问,则需要配置防火墙以允许在Docker端口上进行传入连接,该端口默认为2376如果启用了TLS加密传输,或者2375否则。

UFW的具体说明

UFW(简单防火墙)默认丢弃所有转发流量和所有传入流量。如果要从其他主机访问Docker Remote API并且已启用远程访问,则需要配置UFW以允许Docker端口上的传入连接,2376如果启用TLS加密传输,则默认为启用连接2375。默认情况下,Docker在启用TLS的情况下运行。如果您不使用TLS,强烈建议您不要使用远程主机访问Docker Remote API,以防止远程特权升级攻击。

若要配置UFW并允许在Docker端口上进行传入连接,请执行以下操作:

  1. 确认UFW已启用。 $sudo UFW状态 如果ufw未启用,则其余步骤将没有帮助。

2. 编辑UFW配置文件,它通常是/etc/default/ufw/etc/sysconfig/ufw.设置DEFAULT_FORWARD_POLICY政策ACCEPT...

DEFAULT_FORWARD_POLICY="ACCEPT"

保存并关闭文件。

  1. 如果您需要启用从外部主机访问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主机上,使用图像时可能会看到与以下内容类似的消息。

代码语言:javascript
复制
WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.

在基于RPM的系统上不会发生此警告,默认情况下启用这些功能。

如果您不需要这些功能,则可以忽略该警告。按照这些说明,您可以在Ubuntu或Debian上启用这些功能。即使Docker没有运行,内存和交换会计也会产生大约1%的总可用内存开销和10%的整体性能下降。

  1. 以用户身份登录Ubuntu或Debian主机sudo特权。

2. 编辑/etc/default/grub文件。添加或编辑该GRUB_CMDLINE_LINUX行以添加以下两个键值对:

GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"

保存并关闭文件。

  1. 更新GRUB。 $sudo更新-GRUB 如果GRUB配置文件的语法不正确,则会发生错误。在本例中,重复步骤3和4。 这些更改将在重新启动系统时生效。下一步

2. 继续用户指南...

扫码关注腾讯云开发者

领取腾讯云代金券