在 centos 上安装 docker 引擎
预计阅读时间:11分钟
要在 centos 上开始使用 docker engine,请确保 满足先决条件,然后 安装 docker。
要安装 docker 引擎,您需要 centos 7 或 8 的维护版本。不支持或测试存档版本。
该<code>centos-extras</code>库必须启用。默认情况下启用此存储库,但如果您已禁用它,则需要 重新启用它。
<code>overlay2</code>推荐使用存储驱动。
旧版本的 docker 被称为<code>docker</code>或<code>docker-engine</code>。如果安装了这些,请卸载它们以及相关的依赖项。
如果<code>yum</code>报告没有安装这些软件包,那也没关系。
的内容<code>/var/lib/docker/</code>,包括图像、容器、卷和网络,将被保留。docker 引擎包现在被称为<code>docker-ce</code>.
您可以根据需要以不同方式安装 docker engine:
大多数用户 设置 docker 的存储库并从中安装,以便于安装和升级任务。这是推荐的方法。
一些用户下载 rpm 包并 手动安装并完全手动管理升级。这在诸如在无法访问互联网的气隙系统上安装 docker 等情况下非常有用。
在测试和开发环境中,一些用户选择使用自动化的 便捷脚本来安装 docker。
在新主机上首次安装 docker engine 之前,您需要设置 docker 存储库。之后,您可以从存储库安装和更新 docker。
安装<code>yum-utils</code>包(提供<code>yum-config-manager</code> 实用程序)并设置稳定存储库。
可选:启用夜间或测试存储库。 这些存储库包含在<code>docker.repo</code>上面的文件中,但默认情况下是禁用的。您可以在稳定存储库旁边启用它们。以下命令启用夜间存储库。
要启用测试通道,请运行以下命令:
您可以通过运行带有标志的命令来禁用夜间或测试存储库 。要重新启用它,请使用该标志。以下命令禁用夜间存储库。<code>yum-config-manager</code><code>--disable</code><code>--enable</code>
了解nightly和test频道。
安装最新版本的 docker engine 和 containerd,或者进入下一步安装特定版本:
<code>$ sudo yum install docker-ce docker-ce-cli containerd.io</code>
如果提示接受 gpg 密钥,请验证指纹是否匹配<code>060a 61c5 1b55 8a7f 742b 77aa c52f eb6b 621e 9f35</code>,如果匹配 ,请接受。
有多个 docker 存储库?
如果您启用了多个 docker 存储库,则在<code>yum install</code>或 <code>yum update</code>命令中未指定版本的情况下安装或更新始终会安装可能的最高版本,这可能不适合您的稳定性需求。
此命令会安装 docker,但不会启动 docker。它还会创建一个 <code>docker</code>组,但是,默认情况下它不会向该组添加任何用户。
要安装特定版本的 docker engine,请在 repo 中列出可用版本,然后选择并安装:
一种。列出并排序您的存储库中可用的版本。此示例按版本号对结果进行排序,从高到低,并被截断:
<code>$ yum list docker-ce --showduplicates | sort -r docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable</code>
返回的列表取决于启用了哪些存储库,并且特定于您的 centos 版本(<code>.el7</code>在本示例中由后缀表示)。
湾 通过完全限定的包名称安装特定版本,即包名称 ( <code>docker-ce</code>) 加上从第一个冒号 ( <code>:</code>)开始的版本字符串(第 2 列),直到第一个连字符,由连字符 ( <code>-</code>)分隔。例如,<code>docker-ce-18.09.1</code>。
<code>$ sudo yum install docker-ce-<version_string> docker-ce-cli-<version_string> containerd.io</code>
启动 docker。
<code>$ sudo systemctl start docker</code>
通过运行<code>hello-world</code> 映像验证 docker engine 是否已正确安装。
<code>$ sudo docker run hello-world</code>
此命令下载测试映像并在容器中运行它。当容器运行时,它会打印一条消息并退出。
这将安装并运行 docker 引擎。使用<code>sudo</code>运行泊坞窗命令。继续linux postinstall以允许非特权用户运行 docker 命令和其他可选配置步骤。
要升级 docker engine,请按照安装说明进行操作,选择要安装的新版本。
如果您无法使用 docker 的存储库来安装 docker,您可以下载该<code>.rpm</code>版本的 文件并手动安装。每次要升级 docker engine 时都需要下载一个新文件。
前往https://download.docker.com/linux/centos/ 并选择您的 centos 版本。然后浏览<code>x86_64/stable/packages/</code> 并下载<code>.rpm</code>要安装的 docker 版本的文件。
笔记
要安装每晚或测试(预发布)包,<code>stable</code>请将上述 url 中的单词更改为<code>nightly</code>或<code>test</code>。 了解nightly和test频道。
安装 docker engine,将下面的路径更改为您下载 docker 包的路径。
<code>$ sudo yum install /path/to/package.rpm</code>
docker 已安装但未启动。该<code>docker</code>组被创建,但没有用户添加到组。
这将安装并运行 docker 引擎。使用<code>sudo</code>运行泊坞窗命令。继续linux 的安装后步骤以允许非特权用户运行 docker 命令和其他可选配置步骤。
要升级 docker engine,请下载更新的包文件并重复 安装过程,使用<code>yum -y upgrade</code> 代替<code>yum -y install</code>,并指向新文件。
docker 在get.docker.com 上提供了一个方便的脚本,可以快速且非交互式地将 docker 安装到开发环境中。不建议将便捷脚本用于生产环境,但可以用作示例来创建适合您需求的配置脚本。另请参阅使用存储库安装 步骤以了解使用软件包存储库进行安装的安装步骤。该脚本的源代码是开源的,可以docker-install在 github 上的 存储库中找到。
在本地运行之前,请务必检查从 internet 下载的脚本。在安装之前,让自己熟悉便利脚本的潜在风险和限制:
脚本需要root
或sudo
特权才能运行。
该脚本会尝试检测您的 linux 发行版和版本并为您配置包管理系统,并且不允许您自定义大多数安装参数。
该脚本无需确认即可安装依赖项和建议。这可能会安装大量软件包,具体取决于主机的当前配置。
默认情况下,该脚本会安装 docker、containerd 和 runc 的最新稳定版本。使用此脚本配置机器时,可能会导致 docker 的主要版本意外升级。在部署到生产系统之前,始终在测试环境中测试(主要)升级。
该脚本并非旨在升级现有的 docker 安装。使用脚本更新现有安装时,依赖项可能不会更新到预期版本,从而导致使用过时的版本。
提示:运行前预览脚本步骤 您可以运行带有<code>dry_run=1</code>选项的脚本以了解脚本在安装过程中将执行的步骤:
此示例从get.docker.com下载脚本 并运行它以在 linux 上安装 docker 的最新稳定版本:
安装了 docker。该<code>docker</code>服务在基于 debian 的发行版上自动启动。在<code>rpm</code>基于发行版的发行版上,例如 centos、fedora、rhel 或 sles,您需要使用适当的<code>systemctl</code>or<code>service</code>命令手动启动它。如消息所示,默认情况下,非 root 用户无法运行 docker 命令。
以非特权用户身份使用 docker,还是以无根模式安装? 安装脚本需要<code>root</code>或<code>sudo</code>具有安装和使用 docker 的权限。如果要授予非 root 用户访问 docker 的权限,请参阅 linux 的安装后步骤。docker 也可以在没有<code>root</code>特权的情况下安装,或配置为在无根模式下运行。有关在无根模式下运行 docker 的说明,请参阅以 非 root 用户身份运行 docker 守护进程(无根模式)。
docker 还在test.docker.com 上提供了一个方便的脚本,用于在 linux 上安装 docker 的预发布版本。此脚本等效于 中的脚本<code>get.docker.com</code>,但会配置您的包管理器以启用我们包存储库中的“测试”通道,其中包括 docker 的稳定版和预发布版(测试版、候选发布版)。使用此脚本可以提前访问新版本,并在它们稳定发布之前在测试环境中对其进行评估。
要从“测试”频道在 linux 上安装最新版本的 docker,请运行:
如果您使用便利脚本安装 docker,则应直接使用您的包管理器升级 docker。重新运行便利脚本没有任何好处,如果它尝试重新添加已经添加到主机的存储库,它可能会导致问题。
卸载 docker engine、cli 和 containerd 包:
<code>$ sudo yum remove docker-ce docker-ce-cli containerd.io</code>
主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有镜像、容器和卷:
<code>$ sudo rm -rf /var/lib/docker $ sudo rm -rf /var/lib/containerd</code>
您必须手动删除任何已编辑的配置文件。
linux 的安装后步骤
预计阅读时间:15分钟
本节包含用于配置 linux 主机以更好地与 docker 配合使用的可选过程。
docker 守护进程绑定到 unix 套接字而不是 tcp 端口。默认情况下,unix 套接字归用户所有<code>root</code>,其他用户只能使用<code>sudo</code>. docker 守护进程始终以<code>root</code>用户身份运行。
如果您不想在<code>docker</code>命令前加上<code>sudo</code>,请创建一个名为的 unix 组<code>docker</code>并向其中添加用户。当 docker 守护进程启动时,它会创建一个可由<code>docker</code>组成员访问的 unix 套接字。
警告 该<code>docker</code>组授予与<code>root</code> 用户等效的权限。有关这如何影响系统安全性的详细信息,请参阅 docker 守护进程攻击面。 注意: 要在没有 root 权限的情况下运行 docker,请参阅 以非 root 用户身份运行 docker 守护程序(无根模式)。
要创建<code>docker</code>组并添加您的用户:
创建<code>docker</code>组。
<code>$ sudo groupadd docker</code>
将您的用户添加到<code>docker</code>组中。
<code>$ sudo usermod -ag docker $user</code>
注销并重新登录,以便重新评估您的组成员身份。
如果在虚拟机上进行测试,可能需要重新启动虚拟机以使更改生效。
在桌面 linux 环境(如 x windows)上,完全注销会话,然后重新登录。
在 linux 上,您还可以运行以下命令来激活对组的更改:
<code>$ newgrp docker</code>
验证您是否可以在<code>docker</code>没有<code>sudo</code>.
<code>$ docker run hello-world</code>
如果您<code>sudo</code>在将用户添加到<code>docker</code>组之前最初运行 docker cli 命令,您可能会看到以下错误,这表明您的<code>~/.docker/</code>目录由于<code>sudo</code>命令而使用不正确的权限创建。
<code>warning: error loading config file: /home/user/.docker/config.json - stat /home/user/.docker/config.json: permission denied</code>
要解决此问题,请删除<code>~/.docker/</code>目录(它会自动重新创建,但所有自定义设置都将丢失),或使用以下命令更改其所有权和权限:
<code>$ sudo chown "$user":"$user" /home/"$user"/.docker -r $ sudo chmod g+rwx "$home/.docker" -r</code>
大多数当前的 linux 发行版(rhel、centos、fedora、debian、ubuntu 16.04 及更高版本)用于systemd管理系统启动时启动的服务。在 debian 和 ubuntu 上,docker 服务默认配置为在启动时启动。要在引导时为其他发行版自动启动 docker 和 containerd,请使用以下命令:
要禁用此行为,请<code>disable</code>改用。
如果您需要添加 http 代理,为 docker 运行时文件设置不同的目录或分区,或进行其他自定义,请参阅 自定义 systemd docker 守护程序选项。
有关不同存储引擎的信息,请参阅 存储驱动程序。默认存储引擎和支持的存储引擎列表取决于主机的 linux 发行版和可用的内核驱动程序。
docker 提供了通过一系列日志驱动程序从主机上运行的所有容器收集和查看日志数据的功能。默认日志驱动程序<code>json-file</code>将日志数据写入主机文件系统上的 json 格式文件。随着时间的推移,这些日志文件的大小会扩大,从而可能导致磁盘资源耗尽。
要缓解此类问题,请配置<code>json-file</code>日志驱动程序以启用日志轮换,使用 替代日志驱动程序( 例如 默认执行日志轮换的“本地”日志驱动程序),或使用将日志发送到远程日志记录聚合器的日志记录驱动程序。
默认情况下,docker 守护进程侦听 unix 套接字上的连接以接受来自本地客户端的请求。通过将 docker 配置为侦听 ip 地址和端口以及 unix 套接字,可以允许 docker 接受来自远程主机的请求。有关此配置选项的更多详细信息,请查看docker cli 参考文章的“将docker绑定到另一个主机/端口或 unix 套接字”部分。
保护您的连接 在配置 docker 以接受来自远程主机的连接之前,了解将 docker 开放到网络的安全含义至关重要。如果不采取措施保护连接,远程非 root 用户就有可能在主机上获得 root 访问权限。有关如何使用 tls 证书来保护此连接的更多信息,请查看有关 如何保护 docker 守护进程套接字的文章。
<code>docker.service</code> 对于使用 systemd 的 linux 发行版,例如 redhat、centos、ubuntu 和 sles 的最新版本,可以使用systemd 单元文件来配置 docker 以接受远程连接,或者使用<code>daemon.json</code>推荐用于不使用 systemd 的 linux 发行版的文件。
systemd 与 daemon.json 将 docker 配置为同时使用<code>systemd</code>单元文件和<code>daemon.json</code> 文件来侦听连接会导致冲突,从而阻止 docker 启动。
使用该命令在文本编辑器中<code>sudo systemctl edit docker.service</code>打开覆盖文件<code>docker.service</code>。
添加或修改以下几行,替换您自己的值。
<code>[service] execstart= execstart=/usr/bin/dockerd -h fd:// -h tcp://127.0.0.1:2375</code>
保存文件。
重新加载<code>systemctl</code>配置。
<code>$ sudo systemctl daemon-reload</code>
重启 docker。
<code>$ sudo systemctl restart docker.service</code>
通过查看<code>netstat</code>以确认<code>dockerd</code>正在侦听配置的端口的输出来检查更改是否得到遵守。
<code>$ sudo netstat -lntp | grep dockerd tcp 0 0 127.0.0.1:2375 0.0.0.0:* listen 3758/dockerd</code>
设置连接到unix套接字的<code>hosts</code>数组<code>/etc/docker/daemon.json</code>和ip地址,如下:
<code>{ "hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"] }</code>
要在 docker 守护程序上启用 ipv6,请参阅 启用 ipv6 支持。
如果您的内核版本低于 3.10 或缺少某些模块,docker 将无法正常运行。要检查内核兼容性,您可以下载并运行check-config.sh 脚本。
该脚本仅适用于 linux,不适用于 macos。
如果您看到如下错误,则您的 docker 客户端可能被配置为连接到不同主机上的 docker 守护程序,而该主机可能无法访问。
要查看您的客户端配置为连接到哪个主机,请检查<code>docker_host</code>您环境中变量的值。
如果此命令返回一个值,则 docker 客户端将设置为连接到在该主机上运行的 docker 守护程序。如果未设置,则 docker 客户端将设置为连接到在本地主机上运行的 docker 守护程序。如果设置错误,请使用以下命令取消设置:
您可能需要在文件中编辑环境,例如<code>~/.bashrc</code>或 <code>~/.profile</code>以防止<code>docker_host</code>错误设置变量。
如果<code>docker_host</code>按预期设置,请验证 docker 守护程序是否正在远程主机上运行,并且防火墙或网络中断未阻止您进行连接。
如果使用手动配置你的网络<code>systemd-network</code>有<code>systemd</code> 219或更高版本,docker容器可能无法访问您的网络。从<code>systemd</code>版本 220开始,给定网络 ( <code>net.ipv4.conf.<interface>.forwarding</code>)的转发设置默认为off。此设置可防止 ip 转发。它还与 docker<code>net.ipv4.conf.all.forwarding</code>在容器内启用设置的行为相冲突。
要在 rhel、centos 或 fedora 上解决此问题,请<code><interface>.network</code> 在<code>/usr/lib/systemd/network/</code>docker 主机(例如:)上编辑文件<code>/usr/lib/systemd/network/80-container-host0.network</code>并在该<code>[network]</code>部分中添加以下块。
此配置允许按预期从容器转发 ip。
使用 gui 的 linux 系统通常运行一个网络管理器,它使用<code>dnsmasq</code>在环回地址(例如<code>127.0.0.1</code>或 ) 上运行的 实例<code>127.0.1.1</code>来缓存 dns 请求,并将此条目添加到 <code>/etc/resolv.conf</code>. 该<code>dnsmasq</code>服务可加快 dns 查找速度并提供 dhcp 服务。此配置不拥有自己的网络命名空间的码头工人容器内工作,因为多克尔容器做出决议回环如地址<code>127.0.0.1</code>到 自身,这是很不可能的运行在自己的回送地址的dns服务器。
如果泊坞窗检测中引用没有dns服务器<code>/etc/resolv.conf</code>是一个全功能的dns服务器,下面的警告出现和码头工人使用由谷歌在提供的公共dns服务器<code>8.8.8.8</code>和<code>8.8.4.4</code>dns解析。
如果您看到此警告,请首先检查您是否使用<code>dnsmasq</code>:
如果您的容器需要解析网络内部的主机,则公共名称服务器是不够的。你有两个选择:
您可以指定一个 dns 服务器供 docker 使用,或者
您可以dnsmasq
在 networkmanager 中禁用。如果您这样做,networkmanager 会将您真正的 dns 名称服务器添加到/etc/resolv.conf
,但您将失去dnsmasq
.
您只需要使用这些方法之一。
配置文件的默认位置是<code>/etc/docker/daemon.json</code>. 您可以使用<code>--config-file</code> 守护程序标志更改配置文件的位置。下面的文档假设配置文件位于<code>/etc/docker/daemon.json</code>.
创建或编辑docker守护进程配置文件,默认为 <code>/etc/docker/daemon.json</code>file,控制docker守护进程配置。
<code>$ sudo nano /etc/docker/daemon.json</code>
添加<code>dns</code>具有一个或多个 ip 地址作为值的键。如果文件已有内容,您只需添加或编辑该<code>dns</code>行。
<code>{ "dns": ["8.8.8.8", "8.8.4.4"] }</code>
如果您的内部 dns 服务器无法解析公共 ip 地址,请至少包含一个可以解析的 dns 服务器,以便您可以连接到 docker hub 并且您的容器可以解析 internet 域名。
保存并关闭文件。
重新启动 docker 守护进程。
<code>$ sudo service docker restart</code>
通过尝试拉取镜像来验证 docker 是否可以解析外部 ip 地址:
<code>$ docker pull hello-world</code>
如有必要,请验证 docker 容器是否可以通过 ping 来解析内部主机名。
<code>$ 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</code>
如果您不想更改 docker 守护程序的配置以使用特定 ip 地址,请按照这些说明<code>dnsmasq</code>在 networkmanager 中禁用。
编辑<code>/etc/networkmanager/networkmanager.conf</code>文件。
通过<code>dns=dnsmasq</code>在行<code>#</code>的开头添加一个字符来注释掉该行。
<code># dns=dnsmasq</code>
重新启动 networkmanager 和 docker。作为替代方案,您可以重新启动系统。
<code>$ sudo systemctl restart network-manager $ sudo systemctl restart docker</code>
要<code>dnsmasq</code>在 rhel、centos 或 fedora 上禁用:
禁用<code>dnsmasq</code>服务:
<code>$ sudo systemctl stop dnsmasq $ sudo systemctl disable dnsmasq</code>
使用red hat 文档手动配置 dns 服务器 。
如果您在运行 docker 的同一主机上运行防火墙,并且希望从另一台主机访问 docker remote api 并且启用了远程访问,则需要配置防火墙以允许 docker 端口上的传入连接,默认为<code>2376</code>if tls 加密传输已启用或<code>2375</code> 以其他方式启用。
两种常见的防火墙守护进程是 ufw(uncomplicated firewall)(常用于 ubuntu 系统)和firewalld(常用于基于 rpm 的系统)。请参阅您的操作系统和防火墙的文档,但以下信息可能会帮助您入门。这些选项相当宽松,您可能希望使用不同的配置来更多地锁定您的系统。
ufw:<code>default_forward_policy="accept"</code>在您的配置中设置。
firewalld:将类似于以下内容的规则添加到您的策略中(一种用于传入请求,一种用于传出请求)。确保接口名称和链名称正确。
<code><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></code>
在 ubuntu 或 debian 主机上,使用映像时,您可能会看到类似于以下内容的消息。
在基于 rpm 的系统上不会发生此警告,默认情况下启用这些功能。
如果您不需要这些功能,则可以忽略警告。您可以按照这些说明在 ubuntu 或 debian 上启用这些功能。即使 docker 没有运行,内存和交换计算也会产生大约 1% 的总可用内存开销和 10% 的整体性能下降。
以具有<code>sudo</code>特权的用户身份登录 ubuntu 或 debian 主机。
编辑<code>/etc/default/grub</code>文件。添加或编辑该<code>grub_cmdline_linux</code>行以添加以下两个键值对:
<code>grub_cmdline_linux="cgroup_enable=memory swapaccount=1"</code>
更新 grub。<code>$ sudo update-grub</code>如果您的 grub 配置文件的语法不正确,则会发生错误。在这种情况下,重复步骤 2 和 3。更改在系统重新启动时生效。开始教程如果您已经运行命令开始学习本教程,那么恭喜您!如果没有,请打开命令提示符或 bash 窗口,然后运行以下命令:<code>$ docker run -d -p 80:80 docker/getting-started</code>您会注意到使用了一些标志。以下是有关它们的更多信息:
-d
- 以分离模式运行容器(在后台)
-p 80:80
- 将主机的 80 端口映射到容器中的 80 端口
docker/getting-started
- 要使用的图像
提示
您可以组合单个字符标志来缩短完整命令。例如,上面的命令可以写成:
现在你已经运行了一个容器,什么是容器?简单地说,容器只是你机器上的另一个进程,它与主机上的所有其他进程隔离开来。这种隔离利用了内核命名空间和 cgroups,这些特性已经在 linux 中存在了很长时间。docker 一直致力于使这些功能易于使用且易于使用。
从头开始创建容器 如果您想了解容器是如何从头开始构建的,aqua security 的 liz rice 有一个精彩的演讲,其中她在 go 中从头开始创建了一个容器。虽然她制作了一个简单的容器,但本次演讲并未涉及网络、为文件系统使用图像等。但是,它可以深入了解事物的运作方式。
运行容器时,它使用隔离的文件系统。此自定义文件系统由容器映像提供。由于镜像包含容器的文件系统,它必须包含运行应用程序所需的一切——所有依赖项、配置、脚本、二进制文件等。镜像还包含容器的其他配置,例如环境变量、要运行的默认命令、和其他元数据。
稍后我们将深入研究图像,涵盖分层、最佳实践等主题。