Linux 安装 docker 后的步骤
预计阅读时间: 16分钟
本节包含用于配置 Linux 主机以使其与 Docker 配合使用的可选过程。
以非 root 用户管理 Docker
Docker 守护程序绑定到 Unix 套接字而不是 TCP 端口。默认情况下, Unix 套接字由用户拥有 root
,其他用户只能使用来访问它 sudo
。 Docker 守护程序始终以 root
用户身份运行。
如果你不想在前言 docker
与命令 sudo
,创建一个名为 docker
的 UNIX 组,并把用户添加到它。当 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
此命令下载测试图像并在容器中运行它。容器运行时,它会打印参考消息并退出。
如果在您将用户添加到
docker
组之前,事先使用sudo
在运行 Docker CLI 命令,则可能会看到以下错误,这由于sudo
命令的原因,表明您的~/.docker/
目录在创建时使用了不正确的权限。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、Ubuntu 16.04 及更高版本)用 systemd
来管理系统引导时启动的服务。在 Ubuntu 14.10 及更低版本中使用 upstart
。
systemd
$ sudo systemctl enable docker
若要禁用此行为,请 disable
改用。
$ sudo systemctl disable docker
如果需要添加 HTTP 代理,为 Docker 运行时文件设置其他目录或分区,或进行其他自定义,请参阅 自定义系统的Docker守护程序选项 。
upstart
Docker 被自动配置为使用引导启动 upstart
。若要禁用此行为,请使用以下命令:
$ echo manual | sudo tee /etc/init/docker.override
chkconfig
$ sudo chkconfig docker on
使用其他存储引擎
有关不同存储引擎的信息,请参阅 存储驱动程序 。默认存储引擎和受支持的存储引擎列表取决于主机的 Linux 发行版和可用的内核驱动程序。
配置默认的日志记录驱动程序
Docker 提供了通过一系列日志记录驱动程序从主机上运行的所有容器收集和查看日志数据的 功能 。默认的日志记录驱动程序 json-file
将日志数据写入主机文件系统上的 JSON 格式的文件。随着时间的推移,这些日志文件的大小会扩大,从而可能导致磁盘资源耗尽。要缓解此类问题,请配置备用日志记录驱动程序(例如 Splunk 或 Syslog ),或为默认驱动程序 设置日志轮转 。如果配置替代记录的驱动程序,请参见 使用 docker logs
来读取远程日志司机容器日志 。
配置 Docker 守护程序侦听连接的位置
默认情况下,Docker 守护程序在 UNIX 套接字上侦听连接以接受来自本地客户端的请求。通过将 Docker 配置为侦听 IP 地址、端口以及UNIX套接字,可以允许Docker接受来自远程主机的请求。有关此配置选项的更多详细信息,请参阅《Docker CLI参考》文章的“将 Docker 绑定到另一个主机/端口或 unix 套接字”部分。
Docker EE 客户
Docker EE 客户可以通过 UCP 客户端软件包获得对 UCP 的远程 CLI 访问。 UCP 客户端捆绑软件由 UCP 生成,并由相互 TLS 保护。有关更多信息,请参阅有关 UCP的CLI访问 的文档 。
保护您的连接
在将 Docker 配置为接受来自远程主机的连接之前,至关重要的是要了解将 Docker 打开到网络的安全隐患。如果未采取措施保护连接的安全性,则远程非 root 用户可以在主机上获得 root 访问权限。有关如何使用 TLS 证书保护此连接的更多信息,请查看有关 如何保护Docker守护程序套接字的本文 。
可以 docker.service
使用 systemd 使用 Linuxd 发行版的 systemd 单位文件(例如 RedHat、CentOS、Ubuntu 和 SLES 的最新版本)配置 Docker 接受远程连接,或者使用 daemon.json
不使用 systemd 的 Linux 发行版推荐的文件进行配置。
systemd vs daemon.json
将 Docker 配置为同时使用
systemd
unit 文件和daemon.json
文件侦听连接会导致冲突,从而阻止 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
219 版本或更高版本的 systemd-network
来手动配置您的网络, Docker 容器可能无法访问您的网络。从 systemd
220 版本开始,给定网络的转发设置( net.ipv4.conf..forwarding
)默认为 off 。此设置可防止 IP 转发。这也与 Docker 以 net.ipv4.conf.all.forwarding
在容器中启用设置的行为相冲突。
要在 RHEL、CentOS 或 Fedora 上解决此问题,请在您的 Docker 主机上编辑 /usr/lib/systemd/network/
文件中的 <interface>.network
(例如:/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 系统通常有一个 正在运行的 运行网络管理器,该网络管理器使用一个在环回地址(例如 127.0.0.1
或 127.0.1.1
)上运行的 dnsmasq
实例来缓存 DNS 请求,并将此条目添加到 /etc/resolv.conf
中。该 dnsmasq
服务可以加速 DNS查询,还提供了 DHCP 服务。此配置在拥有自己的网络命名空间的 Docker 中不起作用,因为 Docker 容器会将诸如 127.0.0.1
这样的环回地址解析给 自身 , 而且它不可能在自己的环回地址上运行 DNS 服务器 。
如果 Docker 检测到 /etc/resolv.conf
中没有引用功能完整的 DNS 服务器, 则会发出以下警告,并且 Docker 将使用谷歌提供的公共 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 服务器,或者
- 您可以在 NetworkManager 中禁用
dnsmasq
。如果这样做,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
-
添加一个或多个IP地址作为值的
dns
密钥。如果文件已有内容,则只需添加或编辑该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 地址,请按照以下说明在NetworkManager中禁用 dnsmasq
。
-
编辑
/etc/NetworkManager/NetworkManager.conf
文件。 -
通过在
dns=dnsmasq
行首添加一个#
字符来注释掉该行。# dns=dnsmasq
保存并关闭文件。
-
重新启动 NetworkManager 和 Docker 。也许,您可以重新引导系统。
$ sudo restart network-manager $ sudo restart docker
RHEL、CentOS 或 Fedora
在 RHEL、CentOS 或 Fedora 上禁用 dnsmasq
:
-
禁用
dnsmasq
服务:$ sudo service dnsmasq stop $ sudo systemctl disable dnsmasq
-
使用 Red Hat文档 手动配置 DNS 服务器 。
允许通过防火墙访问远程 API
如果您在同一台主机上运行防火墙的同时运行 Docker , 希望从另一个主机访问 Docker 远程 API 并启用远程访问 ,则需要配置防火墙以允许 Docker 端口上的传入连接, 如果启用了TLS加密传输,则默认为 2376
,否则为 2375
。
两种常见的防火墙守护程序是 UFW( Uncomplicated Firewall ) (通常用于 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 构建新应用程序。