红帽已经在 CentOS 8 中用 Podman 替代了 Docker, 它是与 Docker 类似的容器技术,使用命令都十分相似, 但对于熟悉 Docker 及配置的管理人员,他们可能会倾向于使用 Docker。 本文会简单介绍如何在 CentOS 8 下安装、配置 Docker。


目录

  1. 安装 Docker
    1. 准备工作
  2. 配置系统防火墙
    1. 0. 开启 IP 转发
    2. 1. 关闭防火墙
    3. 2. 配置防火墙

安装 Docker

准备工作

  1. 卸载旧版本的 Docker.
$ sudo dnf remove docker-common docker  container-selinux docker-selinux docker-engine
  1. 添加 Docker 安装源
$ sudo curl  https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
  1. 安装最新版的 Containerd. 你可能需要主动查看最新版本,目前 (06/03/2020) 是 1.2.6-3.3.
$ sudo dnf install -y https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
  1. 安装 Docker CE
$ sudo dnf install -y docker-ce
  1. 启用 Docker 服务
$ sudo systemctl enable --now docker
  1. 为非 Root 用户添加运行 Docker 的权限
$ sudo groupadd docker
$ sudo useradd -m -d /home/test -U -r test
$ sudo usermoad -aG docker test
  1. 验证 Docker 是否正确安装
$ docker run busybox ping -c 5 google.com

不出意外, docker ping 是不通的。 我们安装的 Docker 是有问题的, 防火墙并没有正确配置。

配置系统防火墙

0. 开启 IP 转发

$ echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.conf
$ sudo sysctl -p

1. 关闭防火墙

One easily way that makes docker access the network is stop the firewall. CentOS 8 using firewalld with nftables to protect the system.

$ sudo systemctl disable --now firewalld
$ sudo systemctl mask --now firewalld

But this will expose our server to security attacks. So, we need configure the firewalld to granting docker the network access.

2. 配置防火墙

  1. 检查活动的 zonedocker0 所在的 zone
$ sudo firewall-cmd --get-active-zones
$ sudo firewall-cmd --get-zone-of-interface=docker0

我们发现 Docker 的 docker0 没有在任何 zone 中, 我们需要将其加到某一个 zonepublic

  1. 添加 docker0public zone.
$ firewall-cmd --permanent --zone=public --change-interface=docker0
#or
$ firewall-cmd --permanent --zone=public --add-interface=docker0
#or
$ nmcli connection modify docker0 connection.zone public
  1. docker0 配置 iptables 规则.
$ firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 4 -i docker0 -j ACCEPT
$ firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 6 -i docker0 -j ACCEPT
$ firewall-cmd --zone=public --add-masquerade --permanent
  1. 打开所需要的端口.
## dns
$ firewall-cmd --zone=public --add-port=53/tcp
## http
$ firewall-cmd --zone=public --add-port=80/tcp
## https
$ firewall-cmd --zone=public --add-port=443/tcp
  1. 重新载入防火墙规则,重启 Docker 服务.
$ sudo firewall-cmd --reload
$ sudo systemctl restart docker
  1. 验证 Docker 是否能连接网络
$ docker run busybox ping -c 5 google.com
PING google.com (172.217.11.46): 56 data bytes
64 bytes from 172.217.11.46: seq=0 ttl=55 time=10.850 ms
64 bytes from 172.217.11.46: seq=1 ttl=55 time=1.786 ms
64 bytes from 172.217.11.46: seq=2 ttl=55 time=1.759 ms
64 bytes from 172.217.11.46: seq=3 ttl=55 time=1.978 ms
64 bytes from 172.217.11.46: seq=4 ttl=55 time=1.797 ms

--- google.com ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 1.759/3.634/10.850 ms

可以看到,现在 Docker 已经能够访问网络了。