CentOS 7 安装 Docker 完整教程

https://ai.feishu.cn/wiki/BQvOwl67iiKBT5kMATqc3N5anQb?from=from_copylink

原文链接!!

CentOS 7 安装 Docker 完整教程

准备环境

创建虚拟机

建议配置

2 vCPU、2--4GB 内存、40GB 磁盘(动态/固定均可),网卡选 NAT 或桥接(后面要能联网下载软件包)。

虚拟机创建完成后,把 CentOS 7 的 ISO 挂载到光驱,设置从光驱启动。

安装 CentOS 7

打开网卡

为什么要打开网卡开关?

CentOS 7 默认网卡是关闭的(ONBOOT=no)。如果不打开,开机后就没有 IP,连不上网,也无法用 SSH 远程连接工具(如 Xshell/Putty)操作。

开关网络和主机名 (Network & Hostname):点进去,把右上角的开关 ON 打开(看到有 IP 地址出现),然后点"Done"完成。

设置主机名

为什么要改名字?

区分节点:默认名字通常是 localhost。当你以后管理很多台机器(比如 Docker 集群或 K8s)时,全叫 localhost 会让你分不清现在在操作哪台机器,极易误操作。

日志标识:系统日志和 Docker 日志里会记录主机名,改个好认的名字(如 docker-node1)方便排查问题。

设置sudo hostnamectl set-hostname docker-node1(名字自由规划,这里叫docker-node)

hostnamectl:这是 CentOS 7 里专门用来"控制主机名"的工具(ctl = control)。

set-hostname:动作指令,告诉它"我要设定一个新的主机名"。

docker-node:这是你给它起的新名字。

验证hostnamectlhostname 查看是否生效。(输出的应该是刚才设置的名字)

修改网络连接设置

为什么要设静态 IP(推荐)?

地址固定:如果用自动获取(DHCP),每次重启虚拟机 IP 可能会变。一旦 IP 变了,你的 SSH 连接工具就要重新配,Docker 容器映射的端口地址也会变,非常麻烦。

服务器标准:作为服务器(Server),拥有固定的"门牌号"是标准做法。

为什么要重启网络?

Linux 的网络配置文件(/etc/sysconfig/network-scripts/ifcfg-xxx)修改后不会立即生效,必须重启网络服务(network 或 NetworkManager)来重新加载这些配置。

如果安装时没开网卡,想改静态IP,输入:nmtui

nmtui:全称是 Network Manager Text User Interface。

意思:呼叫"网络管理器"的"文本图形界面"。它让你不用去死记硬背复杂的配置文件写法,能在纯文本的黑框里画出一个类似 Windows 的设置窗口,让你用键盘选。

用键盘上下键选中Edit a connection,按回车

选中网卡(ens33 或eth0),按回车

如果用自动获取IP ,确保IPv4 CONFIGURATION<Automatic>,并且 Automatically connect 前面有 [X]

如果要设静态IP

IPv4 CONFIGURATION 改为 <Manual>

Show ,在 Addresses 填 IP(如 192.168.1.100/24),Gateway 填网关(如 192.168.1.1),DNS Server8.8.8.8

确保最底下的 Automatically connect 选中了 [X]

一路按 OK -> Back -> Quit 退出。

最后输入

systemctl restart network

systemctl:这是 CentOS 7 的"大管家",负责管理系统里的各种服务(Service)。

restart:动作是"重启"。

network:对象是"网络服务"。

如果不报错,说明重启网络成功

禁用防火墙

为什么要关掉它?

避免冲突:Docker 在启动容器时,会自己去修改底层的网络规则(iptables)来实现端口映射。CentOS 自带的 firewalld 也是管理这些规则的。如果两者同时修改,容易打架,导致容器端口通不了。

降低难度:在学习阶段,防火墙配置相当复杂。直接关掉它是最快排除"网络不通"干扰的方法。

复制下面两行命令执行

systemctl stop firewalld

stop:动作是"停止"。

firewalld:对象是"防火墙守护进程"(d = daemon,守护进程的意思)。

解释:这叫"现在别干活"。这只是临时的,系统重启后它还会自动起来。

systemctl disable firewalld

disable:动作是"禁用"。

解释:这叫"以后也别干活"。它会把防火墙从"开机启动列表"里踢出去,下次开机它就不会自己启动了。

验证状态

systemctl status firewalld

status:动作是"查看状态"。

解释:这叫"汇报一下你现在的状态"。你需要确认它显示 inactive (dead),才表示真的关掉了。

(应该看到Active: inactive (dead)

(按 q 退出查看)

禁用SELinux(实验环境)

SELinux 是什么?

它是一个非常严格的"安全保镖",专门管哪个程序能动哪个文件。

为什么要关掉?

权限噩梦:Docker 经常需要把宿主机的文件挂载到容器里(Volume)。如果开着 SELinux,容器往往会被拦截,报 Permission denied(权限拒绝),即使你是 root 用户也不行。

配置复杂:要让 Docker 和 SELinux 和平共处,需要给文件打专门的标签(Label),这对初学者来说太难了。关掉它是为了先跑通流程。

setenforce 0

setenforce:设置 SELinux 的执行(enforce)模式。

0:代表 Permissive(宽容模式)。

解释:意思是"把警报关了,别真的拦截"。这行命令是即时生效的,但重启后会失效。

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

sed:Linux 下极其强大的"流编辑器",用来自动处理文本。

-i:in-place,意思是"直接修改文件",而不是只把修改结果打印到屏幕上。

's/旧内容/新内容/g':这是替换公式。s=substitute(替换),g=global(全局)。

它把文件里的 SELINUX=enforcing(开启) 替换成了 SELINUX=disabled(禁用)。

/etc/selinux/config:这是 SELinux 的配置文件路径。

解释:这相当于用记事本打开了配置文件,改了设置,然后保存关闭。这是为了让禁用操作永久生效(重启后依然是关闭的)。

验证是否改好了:

grep SELINUX=disabled /etc/selinux/config

(如果有输出内容,说明修改成功)

更改时区设置

为什么要改时区?

日志对齐:CentOS 默认可能是 UTC 时间(比北京时间晚8小时)。如果出了 Bug 去看日志,你会发现时间对不上,让你误以为是以前的报错。

业务逻辑:如果你的 Docker 容器里跑的是定时任务(比如每天早上 8 点发邮件),宿主机时间不对,任务执行时间就会全乱套。

设置上海时间:

timedatectl set-timezone Asia/Shanghai

timedatectl:时间和日期控制工具。

set-timezone:动作是"设定时区"。

Asia/Shanghai:标准的时区写法(亚洲/上海),代表中国标准时间(CST)。

验证:

date

(看输出的时间和现在是否对得上)

最后做完以上步骤后

重启一次虚拟机,确保所有"永久生效的配置"(SELinux、防火墙、网络)都正常工作:

reboot

重启连上后,你的环境就准备好安装 Docker 了。

正式安装 Docker

环境准备好后,我们开始安装 Docker。CentOS 默认的软件源里虽然也有 Docker,但版本非常老旧(通常叫 docker 而不是 docker-ce),所以我们需要配置官方推荐的源。

设置Docker 仓库

安装所需的工具包

我们需要yum-utils提供的yum-config-manager命令来管理仓库

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

💡 为什么要安装这些?解决什么问题?

yum-utils:这是一个"工具箱"。我们需要用到其中的 yum-config-manager 命令来自动添加软件仓库。如果不装它,后面你输入 yum-config-manager 时系统会报错:"command not found"。

device-mapper & lvm2:这是 Docker 存储驱动(Storage Driver)的底层依赖。简单说,Docker 需要它们来管理容器的文件系统(Overlay2)。如果不装,Docker 启动时可能会报错,或者读写性能极差。

设置Docker Engine 稳定版仓库地址

比如阿里云镜像

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

💡 为什么要用阿里云源?

速度问题:Docker 的官方源服务器在国外 (download.docker.com)。在国内连接非常不稳定,经常出现"连接超时"或下载速度只有几 KB/s 的情况。

稳定性:阿里云镜像源是官方源的完整克隆,内容一样,但服务器在国内,下载飞快,能让你几秒钟下完几百兆的安装包。

安装Docker Engine软件包

卸载Podman(如存在)

(注:仅在 CentOS 8 / Stream 8 或预装了 Podman 的系统上必须执行,CentOS 7 一般提示"未找到包"也没关系,跑一下更保险)

sudo yum remove -y docker

docker-client

docker-client-latest

docker-common

docker-latest

docker-latest-logrotate

docker-logrotate

docker-engine

podman

💡为什么要执行删除?

清理旧版本:旧版的 Docker 名字叫 docker 或 docker-engine,而新版叫 docker-ce。如果不删除,安装时会报"文件冲突"错误。

一山不容二虎(Podman):CentOS 8 或部分定制版 CentOS 7 预装了 Podman(Red Hat 推出的 Docker 替代品)。它俩都想争夺底层的容器运行权限(如 runc),如果不卸载 Podman,安装 Docker 时会直接报错失败。

安装指定版本的Docker Engine

这里我们不建议直接盲目安装最新版,而是安装一个工业界广泛使用的稳定版本(如 20.10.x 系列)

第一步:查看"仓库"里都有哪些版本?

yum list docker-ce --showduplicates | sort -r

(你会看到一长串版本号列表,从最新到最旧排列)

第二步:安装指定版本(推荐 20.10.21)

sudo yum install -y docker-ce-20.10.21 docker-ce-cli-20.10.21 containerd.io

💡 为什么要指定版本?为什么装了三个包?

版本一致性:在企业生产环境中,服务器的软件版本必须统一。如果这里不指定版本直接 yum install docker-ce,它会默认装最新版(比如 v24+)。万一最新版改了配置文件写法,你按照旧教程操作就会报错。

三大组件解释:

  • docker-ce:这是 Docker 的服务端(守护进程),干活的主力。
  • docker-ce-cli:这是命令行工具(Client),你在黑框里敲的 docker run 命令就是它提供的。注意:Cli 的版本号必须和服务端一致,否则可能出现"语言不通"的兼容性 BUG。
  • containerd.io:这是容器运行时。简单理解,Docker 是 CEO,containerd 是真正去管理容器生死的部门经理。它是必须的底层组件。

开机自动启动与验证

软件装好了只是躺在硬盘里,我们需要把它"叫醒"并设置为"随时待命"。

启动Docker并设置开机自启
  1. 启动 Docker

    systemctl start docker

  2. 设置开机自动启动

    systemctl enable docker

  3. 检查一下它的状态

    systemctl status docker

💡 为什么要设置开机自启?

很多初学者装完能用,但虚拟机一重启,发现 Docker 命令报错 Cannot connect to the Docker daemon。这是因为忘记了 enable。

服务器通常是无人值守的,断电重启后,我们需要 Docker 能够自己爬起来工作,恢复业务,而不是等人去敲命令启动。

预期结果 :执行 status 后,你应该看到绿色的 Active: active (running)

运行 Hello World 验证

最后,我们通过运行一个最小的测试容器来通过"期末考试"。

docker run hello-world

💡 这个命令背后发生了什么? 当你看到屏幕输出 "Hello from Docker!" 时,说明你的环境已经完美就绪。这短短的一行命令其实验证了以下全流程:

  • 客户端正常:CLI 能够接收你的命令。
  • 服务端正常:Daemon 能够响应请求。
  • 网络正常:Docker 能够连接到远程仓库(Registry)。
  • 存储正常:Docker 能够下载镜像并解压到本地硬盘。
  • 运行时正常:Docker 能够把镜像变成一个正在运行的容器。
相关推荐
记得记得就1512 小时前
Docker核心功能全解析:网络、资源控制、数据卷
网络·docker·容器
wheeldown2 小时前
【Linux网络编程】网络基础之MAC地址与IP地址的区别
linux·运维·网络·macos
chenyuhao20242 小时前
Linux系统编程:多线程同步与单例模式
linux·服务器·c++·后端·单例模式
代码游侠2 小时前
应用——UDP 网络编程
linux·运维·开发语言·学习·算法
Lueeee.2 小时前
RTSP协议
linux
忍冬行者2 小时前
通过ansible分发免密公钥、清理不再使用的公钥及验证公钥状态
linux·服务器·ansible
木童6622 小时前
Docker 容器操作(资源限制、数据卷容器、端口映射、容器互联)
运维·docker·容器
Full Stack Developme2 小时前
Linux iso文件 与 压缩文件 的区别
linux
prettyxian2 小时前
【linux】进程概念(2)Linux进程的生命密码:从fork到完全独立
linux·运维·服务器