Linux + 容器技术:Docker 基础到实战,快速搭建轻量隔离环境

引言

面向具备基础 Linux 操作经验的开发者/运维人员,本文将从核心原理到动手实战,带你掌握 Docker 核心用法,快速搭建轻量、隔离的应用运行环境。


  • 引言
  • 目录
    • [一、引言:容器化技术与 Docker 的核心价值](#一、引言:容器化技术与 Docker 的核心价值)
    • [二、Docker 核心概念解析](#二、Docker 核心概念解析)
      • [2.1 核心术语](#2.1 核心术语)
      • [2.2 Docker 轻量隔离的底层原理(Linux 内核特性)](#2.2 Docker 轻量隔离的底层原理(Linux 内核特性))
    • [三、环境准备与安装(Ubuntu 22.04)](#三、环境准备与安装(Ubuntu 22.04))
      • [3.1 卸载旧版本(如有)](#3.1 卸载旧版本(如有))
      • [3.2 配置软件源](#3.2 配置软件源)
      • [3.3 安装 Docker 引擎](#3.3 安装 Docker 引擎)
      • [3.4 验证安装并配置非 root 用户(可选)](#3.4 验证安装并配置非 root 用户(可选))
    • [四、Docker 基础操作演示](#四、Docker 基础操作演示)
      • [4.1 核心命令实战](#4.1 核心命令实战)
      • [4.2 编写 Dockerfile 构建自定义 Web 服务(Flask 示例)](#4.2 编写 Dockerfile 构建自定义 Web 服务(Flask 示例))
        • [步骤 1:编写 Flask 应用(app.py)](#步骤 1:编写 Flask 应用(app.py))
        • [步骤 2:编写 Dockerfile](#步骤 2:编写 Dockerfile)
        • [步骤 3:编写 requirements.txt](#步骤 3:编写 requirements.txt)
        • [步骤 4:构建镜像](#步骤 4:构建镜像)
        • [步骤 5:运行自定义镜像](#步骤 5:运行自定义镜像)
      • [4.3 使用 docker-compose 启动多容器应用(Web + Redis)](#4.3 使用 docker-compose 启动多容器应用(Web + Redis))
        • [步骤 1:编写 docker-compose.yml](#步骤 1:编写 docker-compose.yml)
        • [步骤 2:启动/停止多容器](#步骤 2:启动/停止多容器)
        • 验证效果
      • [4.4 可视化工作流(Mermaid 流程图)](#4.4 可视化工作流(Mermaid 流程图))
    • 五、实战场景:快速部署隔离的开发测试环境
      • [5.1 前置条件](#5.1 前置条件)
      • [5.2 完整流程](#5.2 完整流程)
      • [5.3 核心优势](#5.3 核心优势)
    • 六、结语
    • 总结

目录

一、引言:容器化技术与 Docker 的核心价值

在传统开发与运维流程中,"代码在我机器上能跑"是高频痛点------环境差异导致的配置兼容问题、资源浪费的虚拟机部署方式,都严重影响研发效率。容器化技术的出现彻底改变了这一现状:它基于 Linux 内核特性实现轻量级隔离,无需模拟完整操作系统,启动速度以秒级计,资源占用仅为虚拟机的 1/10 甚至更低。

Docker 作为容器化技术的事实标准,已成为现代 DevOps 与微服务架构的核心基础设施:它将应用及其依赖打包为可移植的镜像,实现"一次构建、处处运行";在微服务场景中,每个服务可独立封装为容器,简化部署、扩缩容与版本管理;同时,Docker 也是 CI/CD 流水线的关键环节,打通了开发、测试、生产环境的一致性链路。


二、Docker 核心概念解析

2.1 核心术语

术语 核心定义
镜像(Image) 只读的模板,包含运行应用所需的代码、运行时、库、环境变量和配置文件,是容器的"静态蓝本"。
容器(Container) 镜像的运行实例,是动态的、可读写的隔离环境,一个镜像可创建多个独立容器。
仓库(Registry) 存储和分发镜像的服务,如官方的 Docker Hub、私有仓库 Harbor 等。
Dockerfile 文本格式的构建脚本,定义了如何从基础镜像构建自定义镜像,是镜像的"源代码"。

2.2 Docker 轻量隔离的底层原理(Linux 内核特性)

Docker 并非"新发明",而是对 Linux 内核已有隔离技术的封装,核心依赖两大特性:

  1. Namespace(命名空间) :实现资源隔离,为每个容器创建独立的"视图"。Docker 主要使用 6 类 Namespace:
    • PID Namespace:隔离进程 ID(容器内的 PID 1 与宿主机 PID 完全独立);
    • Network Namespace:隔离网络栈(容器有独立的网卡、IP、端口);
    • Mount Namespace:隔离文件系统挂载点;
    • UTS Namespace:隔离主机名和域名;
    • IPC Namespace:隔离进程间通信;
    • User Namespace:隔离用户和组 ID。
  2. Cgroups(控制组):实现资源限制,如限制容器可使用的 CPU 核数、内存大小、磁盘 IO 等,避免单个容器占用宿主机全部资源。

与虚拟机相比,Docker 无需虚拟化内核,直接复用宿主机 Linux 内核,因此启动更快、资源占用更低------这也是"轻量"的核心原因。


三、环境准备与安装(Ubuntu 22.04)

以下命令均需以 root 或 sudo 权限执行,确保操作可复现:

3.1 卸载旧版本(如有)

bash 复制代码
sudo apt-get remove docker docker-engine docker.io containerd runc

3.2 配置软件源

bash 复制代码
# 更新 apt 包索引并安装依赖
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release

# 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 添加 Docker 稳定版源
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

3.3 安装 Docker 引擎

bash 复制代码
sudo apt-get update
# 安装最新版 Docker Engine、Containerd 和 Docker Compose
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

3.4 验证安装并配置非 root 用户(可选)

bash 复制代码
# 验证 Docker 服务是否启动
sudo systemctl status docker

# 运行测试容器,输出 "Hello Docker!" 则安装成功
sudo docker run --rm hello-world

# 配置非 root 用户免 sudo 使用 Docker(需重新登录生效)
sudo usermod -aG docker $USER

四、Docker 基础操作演示

4.1 核心命令实战

bash 复制代码
# 1. 拉取镜像(以 Nginx 为例)
docker pull nginx:1.25  # 拉取指定版本,不指定则默认 latest

# 2. 查看本地镜像
docker images

# 3. 运行容器(后台运行 + 端口映射 + 命名容器)
docker run -d --name my-nginx -p 8080:80 nginx:1.25
# 参数说明:
# -d:后台运行
# --name:指定容器名称
# -p 宿主机端口:容器端口:端口映射,访问宿主机 8080 即访问容器 80

# 4. 查看运行中的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a

# 5. 查看容器日志
docker logs my-nginx  # 实时日志加 -f 参数:docker logs -f my-nginx

# 6. 进入容器交互终端
docker exec -it my-nginx /bin/bash

# 7. 停止/启动/删除容器
docker stop my-nginx
docker start my-nginx
docker rm my-nginx  # 删除停止的容器,运行中容器需先 stop 或加 -f 强制删除

# 8. 删除镜像(需先删除基于该镜像的容器)
docker rmi nginx:1.25

4.2 编写 Dockerfile 构建自定义 Web 服务(Flask 示例)

创建目录并编写文件:

bash 复制代码
mkdir flask-demo && cd flask-demo
步骤 1:编写 Flask 应用(app.py
python 复制代码
from flask import Flask
import os

app = Flask(__name__)

# 从环境变量获取 Redis 地址(后续多容器场景用)
REDIS_HOST = os.getenv('REDIS_HOST', 'localhost')

@app.route('/')
def hello():
    return f"Hello Docker! Redis Host: {REDIS_HOST}"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
步骤 2:编写 Dockerfile
dockerfile 复制代码
# 指定基础镜像(Python 3.9 轻量版)
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

# 复制依赖文件并安装
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY app.py .

# 暴露端口(仅声明,实际映射靠 docker run -p)
EXPOSE 5000

# 容器启动命令
CMD ["python", "app.py"]
步骤 3:编写 requirements.txt
txt 复制代码
flask==2.3.3
步骤 4:构建镜像
bash 复制代码
docker build -t my-flask-app:v1 .
# 参数说明:-t 打标签(名称:版本),. 指定 Dockerfile 所在目录
步骤 5:运行自定义镜像
bash 复制代码
docker run -d --name flask-app -p 5000:5000 my-flask-app:v1
# 访问验证:curl http://localhost:5000
# 输出:Hello Docker! Redis Host: localhost

4.3 使用 docker-compose 启动多容器应用(Web + Redis)

docker-compose 可通过 YAML 文件定义多容器依赖关系,简化多服务启动。

步骤 1:编写 docker-compose.yml
yaml 复制代码
version: '3.8'  # Compose 文件版本

services:
  # Flask 服务
  web:
    build: .  # 基于当前目录的 Dockerfile 构建
    ports:
      - "5000:5000"
    environment:
      - REDIS_HOST=redis  # 引用 Redis 服务名(Compose 自动解析为容器 IP)
    depends_on:
      - redis  # 依赖 Redis 服务,启动时先启动 redis

  # Redis 服务
  redis:
    image: redis:7.2-alpine  # 直接使用官方轻量版 Redis
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data  # 挂载数据卷,持久化 Redis 数据

# 定义数据卷(持久化 Redis 数据)
volumes:
  redis-data:
步骤 2:启动/停止多容器
bash 复制代码
# 启动(后台运行加 -d)
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志(指定服务加服务名,如 docker-compose logs web)
docker-compose logs

# 停止并删除容器(保留数据卷)
docker-compose down

# 停止并删除容器+数据卷
docker-compose down -v
验证效果
bash 复制代码
curl http://localhost:5000
# 输出:Hello Docker! Redis Host: redis

4.4 可视化工作流(Mermaid 流程图)



修改 Dockerfile/应用代码重新构建
docker build 构建镜像
镜像存储到本地/仓库
docker run/docker-compose up 运行容器
容器启动应用服务
宿主机/外部访问服务
服务是否正常?
查看容器日志/进入容器调试
容器持续运行


五、实战场景:快速部署隔离的开发测试环境

假设你需要为一个 Python Web 项目搭建隔离的开发测试环境,要求包含 Web 服务、Redis 缓存,且环境与本地系统隔离,步骤如下:

5.1 前置条件

  • 宿主机已安装 Docker + Docker Compose;
  • 项目代码已准备(复用上述 Flask 示例)。

5.2 完整流程

  1. 环境隔离准备:无需在宿主机安装 Python、Redis,避免污染本地环境;

  2. 编写配置文件 :创建 docker-compose.yml(复用 4.3 节),确保所有依赖都通过容器提供;

  3. 一键启动环境

    bash 复制代码
    # 进入项目目录
    cd flask-demo
    # 启动所有服务(首次运行会自动拉取镜像、构建 Web 镜像)
    docker-compose up -d
  4. 开发调试

    • 代码修改后,重新构建并重启 Web 服务:docker-compose build web && docker-compose restart web
    • 查看 Redis 数据:docker exec -it flask-demo-redis-1 redis-cli
  5. 环境清理 :测试完成后,一键销毁环境,不留残留:

    bash 复制代码
    docker-compose down -v

5.3 核心优势

  • 隔离性:测试环境依赖(Python 版本、Redis 版本)与宿主机完全隔离,避免版本冲突;
  • 一致性 :团队成员使用相同的 docker-compose.yml,一键启动完全相同的环境;
  • 轻量高效:相比虚拟机,启动仅需数秒,资源占用极低;
  • 可复用:配置文件可纳入代码仓库,随项目版本管理。

六、结语

Docker 通过封装 Linux 内核的 Namespace 和 Cgroups 特性,实现了轻量级的应用隔离,其"镜像-容器"模型彻底解决了环境一致性问题,大幅提升了开发、测试、部署的效率:

  • 对开发者:无需手动配置复杂依赖,一键搭建隔离环境;
  • 对运维人员:应用打包为镜像后,部署流程标准化、可自动化。

当然,Docker 仅解决了单节点容器管理问题,在生产环境的大规模微服务场景中,还需借助 Kubernetes(K8s)实现容器的编排、扩缩容、自愈等能力;同时,Docker 可无缝集成到 CI/CD 流水线(如 Jenkins、GitLab CI),实现"代码提交 → 自动构建镜像 → 自动部署测试环境"的全流程自动化。

掌握 Docker 基础后,进一步学习 K8s 核心概念(Pod、Deployment、Service)、容器网络、数据持久化等,将是打通云原生技术栈的关键一步。

总结

  1. Docker 核心是基于 Linux Namespace(隔离)和 Cgroups(资源限制)实现轻量级容器,核心实体包括镜像(静态)、容器(动态)、仓库(分发);
  2. 实战中,Dockerfile 定义镜像构建规则,docker-compose 简化多容器应用管理,可快速搭建隔离的开发测试环境;
  3. Docker 解决了环境一致性问题,是 DevOps 和微服务的基础,生产环境可延伸至 Kubernetes 实现容器编排。

✨ 坚持用 清晰易懂的图解 + 代码语言, 让每个知识点都 简单直观 !

🚀 个人主页不呆头 · CSDN

🌱 代码仓库不呆头 · Gitee

📌 专栏系列

💬 座右铭 : "不患无位,患所以立。"

相关推荐
踏雪Vernon2 小时前
[服务器][教程]EC2开启自定义端口
运维
深圳市恒讯科技2 小时前
独立站使用美国服务器,对SEO究竟有何影响?
运维·服务器
食咗未2 小时前
Linux USB HOST 外接USB转串口模块
linux·驱动开发·模块测试
乾元2 小时前
当网络变成博弈场:混合云时代,如何用 AI 重构跨域链路的成本与体验平衡
运维·网络·人工智能·网络协议·安全·华为·重构
易营宝2 小时前
经销商如何通过Facebook营销和Google推广提升B2B网站询盘转化率
运维·服务器·facebook
ppo_wu2 小时前
Kafka 3.9.0:部署、监控与消息发送教程
java·linux·spring boot·分布式·后端·spring·kafka
zly35002 小时前
Linux Centos7 网络设置UUID号的修改方法
linux·运维·服务器
iconball2 小时前
个人用云计算学习笔记 --34华为 OceanStor 仿真器部署与基础使用指南
运维·笔记·学习·云计算
艾莉丝努力练剑2 小时前
艾莉丝努力练剑的2025年度总结
java·大数据·linux·开发语言·c++·人工智能·python