【Linux高级篇】想入门云原生?先掌握Docker底层:Cgroups与Namespace极简解析


🍃 予枫个人主页
📚 个人专栏 : 《Java 从入门到起飞》《读研码农的干货日常

💻 Debug 这个世界,Return 更好的自己!


引言

作为程序员,不管是日常开发、测试部署,还是入门云原生,Docker都是绕不开的核心工具。但很多新手刚接触时,总会混淆"虚拟化"与"容器化",安装Docker踩坑不断,面对镜像、容器的操作无从下手,更不懂底层的资源限制与隔离原理。今天就从基础出发,用通俗的语言+实操命令,带你吃透虚拟化与Docker的核心知识点,避开入门雷区,为后续云原生学习筑牢基础~ 觉得有用的小伙伴,麻烦点赞收藏,后续持续更新Docker进阶内容!

文章目录

一、虚拟化VS容器化:新手必懂的核心区别

很多新手刚接触Docker时,都会有一个疑问:虚拟化和容器化到底有啥不一样?为啥现在都在用容器化,而不是传统虚拟化?其实两者核心目标都是"资源隔离与复用",但实现方式和适用场景差异极大,用一张表就能快速分清:

对比维度 传统虚拟化(如VMware、KVM) 容器化(如Docker)
隔离级别 硬件级隔离(虚拟出完整操作系统) 进程级隔离(共享宿主机内核)
启动速度 慢(分钟级,需启动完整OS) 快(秒级,仅启动单个进程)
资源占用 高(需占用大量内存、磁盘) 低(共享宿主机资源,轻量级)
部署难度 复杂(需配置完整OS、依赖) 简单(打包镜像,一键部署)
适用场景 需独立OS环境(如多系统测试) 开发部署、微服务、云原生

简单来说,传统虚拟化就像"租整套房子",不管用不用得到,都要占着整套资源;而容器化就像"租单间",共享房子的公共设施(宿主机内核),只占自己需要的空间,高效又灵活。

重点提醒:Docker属于容器化技术,但容器化≠Docker,还有Podman、LXC等其他容器化工具,只是Docker生态最完善、使用最广泛,新手优先学Docker准没错~

二、Docker安装:不同系统一键搞定(避坑版)

学会了核心区别,接下来就是实操环节------Docker安装。很多新手卡在安装步骤,要么版本不兼容,要么依赖缺失,这里整理了Windows、Mac、Linux(CentOS/Ubuntu)三大系统的最简安装命令,复制粘贴就能用,避开所有常见坑。

2.1 Linux系统(CentOS 7/8,最常用)

Linux是Docker的最优运行环境,命令如下(全程root权限操作):

bash 复制代码
# 1. 卸载旧版本(若有)
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

# 2. 安装必要依赖
yum install -y yum-utils device-mapper-persistent-data lvm2

# 3. 设置阿里云镜像源(加速下载,避免官方源卡顿)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 4. 安装Docker CE(社区版,免费且够用)
yum install -y docker-ce docker-ce-cli containerd.io

# 5. 启动Docker并设置开机自启
systemctl start docker
systemctl enable docker

# 6. 验证安装成功(出现版本信息即成功)
docker --version

2.2 Linux系统(Ubuntu)

bash 复制代码
# 1. 卸载旧版本
apt-get remove docker docker-engine docker.io containerd runc

# 2. 安装必要依赖
apt-get update
apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common

# 3. 添加阿里云GPG密钥
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -

# 4. 设置阿里云镜像源
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

# 5. 安装并启动Docker
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker

# 6. 验证安装
docker --version

2.3 Windows/Mac系统

Windows和Mac推荐安装「Docker Desktop」,步骤极简:

  1. 访问Docker官方下载地址:https://www.docker.com/products/docker-desktop(需注册Docker账号,免费)
  2. 下载对应系统的安装包,双击安装(Windows需开启Hyper-V,Mac需开启虚拟化支持)
  3. 安装完成后,启动Docker Desktop,状态栏出现Docker图标即启动成功
  4. 打开终端(Windows用PowerShell,Mac用终端),输入docker --version验证

避坑提醒:Windows 10家庭版不支持Hyper-V,需安装WSL2后再安装Docker Desktop,否则会启动失败;Mac M1/M2芯片需下载对应ARM版本的Docker Desktop。

三、Docker核心操作:镜像与容器生命周期管理

安装完成后,重点掌握「镜像」和「容器」的操作------镜像就是容器的"模板"(比如Ubuntu镜像、Nginx镜像),容器就是镜像运行后的"实例",两者的生命周期管理是Docker基础的核心。

3.1 镜像核心操作(常用命令)

bash 复制代码
# 1. 拉取镜像(从Docker Hub拉取,示例:拉取Ubuntu 20.04镜像)
docker pull ubuntu:20.04  # :20.04是版本号,不写默认latest(最新版)

# 2. 查看本地所有镜像
docker images

# 3. 删除指定镜像(根据镜像ID删除,镜像ID可通过docker images查看)
docker rmi 镜像ID/镜像名称:版本号

# 4. 搜索镜像(从Docker Hub搜索镜像,示例:搜索Nginx镜像)
docker search nginx

小技巧:Docker Hub官方镜像下载速度可能较慢,可配置阿里云镜像加速器,评论区留言"加速器",获取详细配置步骤~ 记得点赞收藏,避免后续找不到!

3.2 容器核心操作(常用命令)

bash 复制代码
# 1. 新建并启动容器(最常用,示例:启动Ubuntu容器并进入交互模式)
docker run -it --name my-ubuntu ubuntu:20.04 /bin/bash
# 说明:-it 表示交互模式,--name 给容器命名,/bin/bash 进入容器终端

# 2. 查看所有容器(运行中+已停止)
docker ps -a

# 3. 启动/停止/重启容器(根据容器ID或容器名称操作)
docker start 容器ID/容器名称
docker stop 容器ID/容器名称
docker restart 容器ID/容器名称

# 4. 进入已运行的容器(示例:进入my-ubuntu容器)
docker exec -it my-ubuntu /bin/bash

# 5. 删除指定容器(需先停止容器,或加-f强制删除)
docker rm 容器ID/容器名称  # 停止后删除
docker rm -f 容器ID/容器名称  # 强制删除(运行中也能删)

# 6. 查看容器日志(排查容器运行问题)
docker logs 容器ID/容器名称

3.3 实操演示:启动一个Nginx容器

用一个实际案例巩固操作,启动Nginx容器并访问:

bash 复制代码
# 1. 拉取Nginx镜像
docker pull nginx

# 2. 启动Nginx容器,映射端口(后续讲解端口映射)
docker run -d -p 80:80 --name my-nginx nginx
# 说明:-d 表示后台运行,-p 80:80 表示端口映射

# 3. 查看容器是否运行
docker ps

# 4. 访问Nginx(本地访问:浏览器输入http://localhost,服务器访问:http://服务器IP)

操作成功后,浏览器会显示Nginx的默认页面,至此,你已经掌握了Docker的基础实操!

四、端口映射:容器与宿主机的"桥梁"

很多新手启动容器后,发现无法访问容器内的服务(比如上面的Nginx),核心原因是「容器与宿主机是隔离的」,需要通过「端口映射」打通两者的通信,也就是把宿主机的端口和容器内的端口绑定。

端口映射核心语法

bash 复制代码
docker run -p 宿主机端口:容器内端口 镜像名称
  • 示例:docker run -d -p 80:80 nginx
    • 宿主机端口:80(外部访问时用的端口)
    • 容器内端口:80(Nginx默认运行端口)
    • 意思是:外部访问宿主机的80端口,会自动转发到容器内的80端口,从而访问到Nginx服务。

常见场景

  • 本地开发:启动MySQL容器,映射端口-p 3306:3306,本地代码就能连接容器内的MySQL
  • 服务器部署:启动Tomcat容器,映射端口-p 8080:8080,外部就能通过服务器IP:8080访问Tomcat

注意:宿主机端口不能被占用,若80端口已被其他服务占用,可换其他端口,比如-p 8081:80,访问时用http://localhost:8081

五、Docker底层核心:Cgroups与Namespace(极简解析)

学会了实操,再了解一下Docker的底层原理------Docker能实现进程级隔离和资源限制,核心依赖Linux内核的两个特性:Cgroups和Namespace,不用深入源码,理解核心作用即可(为后续云原生学习打基础)。

5.1 Namespace:实现资源隔离("隔离墙")

Namespace的作用是「隔离进程的可见范围」,让每个容器都以为自己是"独立的系统",互不干扰,常见的Namespace类型:

  • PID Namespace:隔离进程ID(容器内的PID从1开始,和宿主机PID不冲突)
  • Network Namespace:隔离网络(每个容器有自己的网卡、IP、端口,和宿主机网络隔离)
  • Mount Namespace:隔离文件系统(容器内的文件系统和宿主机隔离,互不影响)
  • User Namespace:隔离用户(容器内的root用户,在宿主机上可能只是普通用户,保证安全)

简单来说,Namespace就像给每个容器建了一道"隔离墙",容器内的进程看不到墙外的宿主机和其他容器,实现了独立的运行环境。

5.2 Cgroups:实现资源限制("资源管家")

Cgroups(Control Groups)的作用是「限制容器能使用的资源」,避免某个容器占用过多资源(比如CPU、内存),导致其他容器或宿主机卡顿,核心功能:

  • CPU限制:限制容器使用的CPU核心数、CPU使用率(比如限制只能用1个核心)
  • 内存限制:限制容器能使用的最大内存(比如限制最多用1G内存)
  • 磁盘IO限制:限制容器的磁盘读写速度
  • 网络带宽限制:限制容器的网络带宽

示例:启动容器时限制CPU和内存

bash 复制代码
# 限制容器最多使用1个CPU核心,最大内存1G
docker run -d -p 80:80 --name my-nginx -m 1g --cpus 1 nginx

通过Cgroups,我们可以合理分配资源,保证多个容器在同一台宿主机上稳定运行。

六、结尾总结

本文从基础概念出发,带你吃透了虚拟化与容器化的核心区别,掌握了Docker的安装、镜像/容器生命周期管理、端口映射等实操技巧,还简单了解了Docker底层的Cgroups和Namespace原理,全程干货无废话,适合Docker新手入门。

相关推荐
小锋学长生活大爆炸8 小时前
【教程】免Root在Termux上安装Docker
运维·docker·容器
进击切图仔8 小时前
常用 Docker 命令备份
运维·docker·容器
德育处主任13 小时前
『NAS』将魂斗罗马里奥塞进NAS里
前端·javascript·docker
Mr.小海14 小时前
Docker 底层解析与生产环境实战指南
java·docker·eureka
vortex515 小时前
虚拟机工具选择指北
linux·虚拟化
流氓也是种气质 _Cookie16 小时前
Linux上安装Docker
linux·redis·docker
小锋学长生活大爆炸16 小时前
【教程】查看docker容器的TCP连接和带宽使用情况
tcp/ip·docker·容器
ccino .17 小时前
【Drupal文件上传导致跨站脚本执行(CVE-2019-6341)】
运维·网络安全·docker·容器
江湖有缘18 小时前
自托管RSS解决方案:Docker化Fusion安装教程
java·jvm·docker
sun032219 小时前
【Docker】构建镜像时使用的 Dockerfile ,以及其中的 MicroDNF
运维·docker·容器