红帽已经在 CentOS 8 中用 Podman 替代了 Docker, 它是与 Docker 类似的容器技术,使用命令都十分相似, 但对于熟悉 Docker 及配置的管理人员,他们可能会倾向于使用 Docker。 本文会简单介绍如何在 CentOS 8 下安装、配置 Docker。
Table of Contents 配置系统防火墙 0. 开启 IP 转发 1. 关闭防火墙 2. 配置防火墙
## 安装 Docker
### 准备工作
1. 卸载旧版本的 Docker.
1 $ sudo dnf remove docker-common docker container-selinux docker-selinux docker-engine
添加 Docker 安装源
1 $ sudo curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
安装最新版的 Containerd
. 你可能需要主动查看最新版本,目前 (06/03/2020) 是 1.2.6-3.3
.
1 $ 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
安装 Docker CE
1 $ sudo dnf install -y docker-ce
启用 Docker 服务
1 $ sudo systemctl enable --now docker
为非 Root 用户添加运行 Docker 的权限
1 2 3 $ sudo groupadd docker $ sudo useradd -m -d /home/test -U -r test $ sudo usermoad -aG docker test
验证 Docker 是否正确安装
1 $ docker run busybox ping -c 5 google.com
不出意外, docker ping 是不通的。 我们安装的 Docker 是有问题的, 防火墙并没有正确配置。
配置系统防火墙
0. 开启 IP 转发
1 2 $ 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.
1 2 $ 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. 配置防火墙
检查活动的 zone
和 docker0
所在的 zone
1 2 $ sudo firewall-cmd --get-active-zones $ sudo firewall-cmd --get-zone-of-interface=docker0
我们发现 Docker 的 docker0
没有在任何 zone
中, 我们需要将其加到某一个 zone
如 public
中
添加 docker0
到 public
zone.
1 2 3 4 5 $ firewall-cmd --permanent --zone=public --change-interface=docker0 $ firewall-cmd --permanent --zone=public --add-interface=docker0 $ nmcli connection modify docker0 connection.zone public
为 docker0
配置 iptables 规则.
1 2 3 $ 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 2 3 4 5 6 $ firewall-cmd --zone=public --add-port=53/tcp $ firewall-cmd --zone=public --add-port=80/tcp $ firewall-cmd --zone=public --add-port=443/tcp
重新载入防火墙规则,重启 Docker 服务.
1 2 $ sudo firewall-cmd --reload $ sudo systemctl restart docker
验证 Docker 是否能连接网络
1 2 3 4 5 6 7 8 9 10 11 $ 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 已经能够访问网络了。