Linux的安装后步骤
预计阅读时间:15分钟
本节包含用于配置Linux主机以使其更好地与Docker配合使用的可选过程。
以非root用户身份管理Docker
Docker守护程序绑定到Unix套接字而不是TCP端口。默认情况下,Unix套接字由用户拥有root
,其他用户只能使用来访问它sudo
。Docker守护程序始终以root
用户身份运行。
如果您不想在docker
命令前添加sudo
,请创建一个Unix组docker
,并将其添加用户。Docker守护程序启动时,它会创建一个可由该docker
组成员访问的Unix套接字。
警告
该
docker
组授予与root
用户等效的特权。有关如何影响系统安全性的详细信息,请参阅 Docker Daemon Attack Surface。
注意事项:
要在没有root特权的情况下运行Docker,请参阅 以非root用户身份运行Docker守护程序(无根模式)。
要创建docker
组并添加您的用户,请执行以下操作:
-
创建
docker
组。$ sudo groupadd docker
-
将您的用户添加到该
docker
组。$ sudo usermod -aG docker $USER
-
注销并重新登录,以便重新评估您的组成员身份。
如果在虚拟机上进行测试,则可能需要重新启动虚拟机以使更改生效。
在台式机Linux环境(例如X Windows)上,完全注销会话,然后重新登录。
在Linux上,您还可以运行以下命令来激活对组的更改:
$ newgrp docker
-
验证您是否可以运行
docker
不带命令的命令sudo
。$ docker run hello-world
此命令下载测试图像并在容器中运行它。容器运行时,它会打印参考消息并退出。
如果最初
sudo
在将用户添加到docker
组中之前使用来运行Docker CLI命令,则可能会看到以下错误,这表明~/.docker/
由于该sudo
命令,您的目录创建时使用了不正确的权限。WARNING: Error loading config file: /home/user/.docker/config.json - stat /home/user/.docker/config.json: permission denied
要解决此问题,请删除
~/.docker/
目录(会自动重新创建目录,但是所有自定义设置都会丢失),或者使用以下命令更改其所有权和权限:$ sudo chown "$USER":"$USER" /home/"$USER"/.docker -R $ sudo chmod g+rwx "$HOME/.docker" -R
配置Docker以在启动时启动
当前大多数Linux发行版(RHEL,CentOS,Fedora,Debian,Ubuntu 16.04及更高版本)都systemd
用于管理系统启动时启动的服务。在Debian和Ubuntu上,默认情况下,将Docker服务配置为在引导时启动。要在启动时自动启动其他发行版的Docker和Containerd,请使用以下命令:
$ sudo systemctl enable docker.service
$ sudo systemctl enable containerd.service
若要禁用此行为,请disable
改用。
$ sudo systemctl disable docker.service
$ sudo systemctl disable containerd.service
如果需要添加HTTP代理,为Docker运行时文件设置其他目录或分区,或进行其他自定义,请参阅 自定义系统的Docker守护程序选项。
使用其他存储引擎
有关不同存储引擎的信息,请参阅 存储驱动程序。默认存储引擎和支持的存储引擎列表取决于主机的Linux发行版和可用的内核驱动程序。
配置默认日志记录驱动程序
Docker提供了通过一系列日志记录驱动程序从主机上运行的所有容器收集和查看日志数据的功能。默认的日志记录驱动程序json-file
将日志数据写入主机文件系统上的JSON格式的文件中。随着时间的流逝,这些日志文件的大小会扩大,从而可能会耗尽磁盘资源。
要缓解此类问题,请配置json-file
日志记录驱动程序以启用日志循环,使用
备用日志记录驱动程序,
例如
默认情况下执行日志循环的“本地”日志记录驱动程序,或使用将日志记录发送到远程日志记录聚合器的日志记录驱动程序。
配置Docker守护程序侦听连接的位置
默认情况下,Docker守护程序在UNIX套接字上侦听连接以接受来自本地客户端的请求。通过将Docker配置为侦听IP地址和端口以及UNIX套接字,可以允许Docker接受来自远程主机的请求。有关此配置选项的更多详细信息,请参阅《Docker CLI参考》文章的“将Docker绑定到另一个主机/端口或unix套接字”部分。
保护您的连接
在将Docker配置为接受来自远程主机的连接之前,至关重要的是要了解将Docker打开到网络的安全隐患。如果未采取措施保护连接安全,则远程非root用户可能会获得主机上的root访问权限。有关如何使用TLS证书保护此连接的更多信息,请查看有关 如何保护Docker守护程序套接字的本文。
可以docker.service
使用systemd使用Linuxd发行版的systemd单元文件(例如RedHat,CentOS,Ubuntu和SLES的最新版本)配置Docker接受远程连接,或者使用daemon.json
不使用systemd的Linux发行版推荐的文件来配置Docker 。
systemd vs daemon.json
将Docker配置为同时使用
systemd
unit文件和daemon.json
file侦听连接会导致冲突,从而阻止Docker启动。
使用systemd
单位文件配置远程访问
-
使用命令在文本编辑器中
sudo systemctl edit docker.service
打开替代文件docker.service
。 -
添加或修改以下行,以替换您自己的值。
[Service] ExecStart= ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
-
保存文件。
-
重新加载
systemctl
配置。$ sudo systemctl daemon-reload
-
重新启动Docker。
$ sudo systemctl restart docker.service
-
通过查看的输出
netstat
以确认dockerd
是否在配置的端口上进行侦听,以查看是否接受了更改。$ sudo netstat -lntp | grep dockerd tcp 0 0 127.0.0.1:2375 0.0.0.0:* LISTEN 3758/dockerd
使用以下命令配置远程访问 daemon.json
-
在中设置
hosts
阵列/etc/docker/daemon.json
以连接到UNIX套接字和IP地址,如下所示:{ "hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"] }
-
重新启动Docker。
-
通过查看的输出
netstat
以确认dockerd
是否在配置的端口上进行侦听,以查看是否接受了更改。$ sudo netstat -lntp | grep dockerd tcp 0 0 127.0.0.1:2375 0.0.0.0:* LISTEN 3758/dockerd
在Docker守护程序上启用IPv6
要在Docker守护程序上启用IPv6,请参阅 启用IPv6支持。
故障排除
内核兼容性
如果您的内核早于3.10版本或缺少某些模块,则Docker无法正确运行。要检查内核兼容性,可以下载并运行check-config.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守护程序正在远程主机上运行,并且防火墙或网络中断没有阻止您进行连接。
IP转发问题
如果使用手动配置你的网络systemd-network
有systemd
219或更高版本,Docker容器可能无法访问您的网络。从systemd
版本220开始,给定网络(net.ipv4.conf.<interface>.forwarding
)的转发设置默认为off。此设置可防止IP转发。这也与Dockernet.ipv4.conf.all.forwarding
在容器中启用设置的行为相冲突。
要在RHEL,CentOS或Fedora上解决此问题,请<interface>.network
在/usr/lib/systemd/network/
Docker主机上编辑文件(例如:),/usr/lib/systemd/network/80-container-host0.network
然后在该[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服务。此配置不拥有自己的网络命名空间的码头工人容器内工作,因为多克尔容器做出决议回环如地址127.0.0.1
到
自身,这是很不可能的运行在自己的回送地址的DNS服务器。
如果泊坞窗检测中引用没有DNS服务器/etc/resolv.conf
是一个全功能的DNS服务器,下面的警告出现和码头工人使用由谷歌在提供的公共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中禁用。如果这样做,NetworkManager会将您的真实DNS名称服务器添加到/etc/resolv.conf
,但您可能会失去的可能的好处dnsmasq
。
您只需要使用这些方法之一。
为Docker指定DNS服务器
配置文件的默认位置是/etc/docker/daemon.json
。您可以使用--config-file
守护程序标志来更改配置文件的位置。以下文档假定配置文件位于/etc/docker/daemon.json
。
-
创建或编辑Docker守护程序配置文件,该
/etc/docker/daemon.json
文件默认为 用来控制Docker守护程序配置的文件。$ sudo nano /etc/docker/daemon.json
-
添加
dns
一个或多个IP地址作为值的密钥。如果文件具有现有内容,则只需添加或编辑该dns
行。{ "dns": ["8.8.8.8", "8.8.4.4"] }
如果您的内部DNS服务器无法解析公共IP地址,请至少包括一台可以解析的IP服务器,以便您可以连接到Docker Hub,以便您的容器可以解析Internet域名。
保存并关闭文件。
-
重新启动Docker守护程序。
$ sudo service docker restart
-
通过尝试拉镜像来验证Docker是否可以解析外部IP地址:
$ docker pull hello-world
-
如有必要,请通过ping验证Docker容器可以解析内部主机名。
$ docker run --rm -it alpine ping -c4 <my_internal_host> PING google.com (192.168.1.2): 56 data bytes 64 bytes from 192.168.1.2: seq=0 ttl=41 time=7.597 ms 64 bytes from 192.168.1.2: seq=1 ttl=41 time=7.635 ms 64 bytes from 192.168.1.2: seq=2 ttl=41 time=7.660 ms 64 bytes from 192.168.1.2: seq=3 ttl=41 time=7.677 ms
禁用 dnsmasq
的Ubuntu
如果您不想将Docker守护程序的配置更改为使用特定的IP地址,请按照以下说明dnsmasq
在NetworkManager中禁用。
-
编辑
/etc/NetworkManager/NetworkManager.conf
文件。 -
通过
dns=dnsmasq
在行首添加一个#
字符来注释掉该行。# dns=dnsmasq
保存并关闭文件。
-
重新启动NetworkManager和Docker。或者,您可以重新引导系统。
$ sudo systemctl restart network-manager $ sudo systemctl restart docker
RHEL,CentOS或Fedora
要dnsmasq
在RHEL,CentOS或Fedora上禁用:
-
禁用
dnsmasq
服务:$ sudo systemctl stop dnsmasq $ sudo systemctl disable dnsmasq
-
使用Red Hat文档手动配置DNS服务器 。
允许通过防火墙访问远程API
如果您运行在同一台主机上安装了防火墙,你跑码头工人,你要访问从另一台主机和远程访问泊坞远程API已启用,则需要配置防火墙以允许码头工人端口默认为传入连接,2376
如果启用或禁用TLS加密传输2375
。
两种常见的防火墙守护程序是 UFW(不复杂的防火墙)(通常用于Ubuntu系统)和Firewalld(通常用于基于RPM的系统)。请查阅有关您的操作系统和防火墙的文档,但是以下信息可能有助于您入门。这些选项相当宽松,您可能希望使用其他配置来进一步锁定系统。
-
UFW:
DEFAULT_FORWARD_POLICY="ACCEPT"
在您的配置中设置。 -
firewalld:将与以下内容类似的规则添加到您的策略中(一个用于传入请求,另一个用于传出请求)。确保接口名称和链名称正确。
<direct> [ <rule ipv="ipv6" table="filter" chain="FORWARD_direct" priority="0"> -i zt0 -j ACCEPT </rule> ] [ <rule ipv="ipv6" table="filter" chain="FORWARD_direct" priority="0"> -o zt0 -j ACCEPT </rule> ] </direct>
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%。
-
以具有
sudo
特权的用户身份登录Ubuntu或Debian主机。 -
编辑
/etc/default/grub
文件。添加或编辑该GRUB_CMDLINE_LINUX
行以添加以下两个键值对:GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
保存并关闭文件。
-
更新GRUB。
$ sudo update-grub
如果您的GRUB配置文件的语法不正确,则会发生错误。在这种情况下,请重复步骤2和3。
更改将在系统重新引导后生效。
下一步
- 查看入门培训模块,以学习如何构建映像并将其作为容器化应用程序运行。
- 复习“使用Docker开发”中的主题,以了解如何使用Docker构建新应用程序。