Vultr CentOS 7 安装 Docker

前言

最近在整理零零散散的 VPS,准备折腾自己的「架构」,在搬瓦工和 CloudCone 的 VPS 上都成功安装了 Docker,然后也打算也在 Vultr 上操作一番。人算不如天算,在 Vultr 上安装 Docker 可真是把人搞得头都大了。

安装过程很顺利

参考官网,安装过程其实很顺利,一顿操作猛如虎,不信你看下面的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 移除旧版本的 Docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
# 安装 Docker 依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装 Docker-CE
yum install -y docker-ce
# 开启 Docker
systemctl start docker
# 安装 Docker Compose
curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

# Docker 和 Swarm 相关防火墙配置
systemctl status firewalld
systemctl start firewalld
systemctl enable firewalld
firewall-cmd --add-port=2376/tcp --permanent
firewall-cmd --add-port=2377/tcp --permanent
firewall-cmd --add-port=7946/tcp --permanent
firewall-cmd --add-port=7946/udp --permanent
firewall-cmd --add-port=4789/udp --permanent
firewall-cmd --reload
systemctl restart docker
# 开机自启动
systemctl enable docker

重启有毛病

但是一旦重启 VPS,就会发现丫的,通过 SSH 连不到 VPS 了,要么是 connection refused,要么是 no route to host。一开始以为是我的防火墙配置有问题,就试了安装完 Docker 把防火墙关闭等等方法,一个一个地试,都是不行。

只要不重启,Docker 用着好好的,一旦重启,就是连不了 SSH。给 Vultr 官方发 Ticket,问了几通之后,人也找不到什么问题,索性甩锅说,这不是他们负责的领域。

不过,他们倒是给我指了条路,问我他们的「一键安装 Docker 应用」是否也会出现这种问题。经过尝试,嗯,确实官方的没有问题。

然后去看了 Vultr 关于「一键安装 Docker 应用」的文档,里面有提到他们禁用了 SELinux 的相关说明。于是,灵机一动,难道是和这个有关?

在之前成功安装好 Docker 的机器上查看了 SELinux 的状态,发现是 Disabled。再在 Vultr 上新建了一个 VPS,把上面的命令操作了一遍之后,SELinux 神奇地从 Disabled 变成了 Enforcing。手动更改回原来的状态之后,重启 VPS,再尝试 SSH 连接,一切正常。

操作方法

涉及到的命令不多,详见下面代码。修改保存之后,使用getenforce 查看仍为 Enforcing,重启之后生效。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# getenforce 获取 SELinux 状态
getenforce
# 用于关闭 SELinux 防火墙,但重启后失效
setenforce 0
# 修改配置文件
# 将 SELINUX=enforcing 改为 SELINUX=disabled,保存后退出
vi /etc/selinux/config
# 以下为示例内容
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted

后记

为什么会出现这样的问题?大概浏览了 Docker 官方文档中和 SELinux 有关的章节,可能是因为 Vultr 提供的 CentOS 的版本问题,所以 Docker 在安装的时候,会默认启动了 SELinux?