25- 容器与虚拟化基础(Docker / Podman / KVM / LXC) 🐳
前提条件 ✅
- 已完成 Web、数据库、邮件、VPN、高可用配置(有可容器化的服务,如 Nginx、MariaDB)
- 以 ops 用户登录(具有 sudo 权限)
- 系统运行在 Debian 12 Bookworm
- 防火墙已放行容器相关端口(视应用而定,如 80/443)
- 虚拟机环境:VMware Workstation Pro(建议至少 4核8GB内存,便于运行多个容器/KVM)
本章并行介绍容器(Docker/Podman)和轻量虚拟化(LXC)+ 完整虚拟化(KVM),生产环境推荐优先容器化。
详细步骤 🛠️
- Docker(最流行容器引擎)
安装官方版本(推荐,避免 Debian 仓库旧版):
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
启动并加入 ops 用户组(免 sudo 运行):
sudo systemctl enable --now docker
sudo usermod -aG docker ops
newgrp docker # 或重新登录
测试:
docker run hello-world
docker version
- Podman(无守护进程、rootless、与 Docker 兼容)
安装:
sudo apt install -y podman podman-compose
rootless 模式测试:
podman run --rm hello-world
podman ps -a
Docker 兼容别名(可选):
alias docker=podman
alias docker-compose=podman-compose
- 简单容器化示例(Nginx)
Docker 方式:
docker run -d --name my-nginx -p 8080:80 nginx:latest
curl http://localhost:8080
docker logs my-nginx
docker stop my-nginx
Podman 方式(rootless):
podman run -d --name my-nginx -p 8080:80 nginx:latest
使用 docker-compose / podman-compose(推荐生产): 创建 docker-compose.yml:
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html:ro
启动:
docker compose up -d
# 或 podman-compose up -d
- LXC(轻量容器,系统级虚拟化)
安装:
sudo apt install -y lxc lxc-templates
创建容器:
sudo lxc-create -t download -n web01 -- --dist debian --release bookworm --arch amd64
sudo lxc-start -n web01
sudo lxc-attach -n web01 -- apt update && apt install -y nginx
sudo lxc-attach -n web01 -- systemctl enable --now nginx
网络桥接(默认使用 lxcbr0):
sudo lxc-info -n web01 -iH # 查看 IP
- KVM(完整虚拟化,QEMU/KVM)
安装:
sudo apt install -y qemu-kvm libvirt-clients libvirt-daemon-system virtinst bridge-utils virt-manager
sudo systemctl enable --now libvirtd
sudo usermod -aG libvirt ops
sudo usermod -aG kvm ops
创建虚拟机(命令行示例):
sudo virt-install \
--name test-vm \
--ram 2048 \
--vcpus 2 \
--disk size=20 \
--os-variant debian12 \
--network bridge=virbr0 \
--graphics none \
--location 'https://deb.debian.org/debian/dists/bookworm/main/installer-amd64/'
或使用 virt-manager 图形界面(宿主机需有桌面环境)。
- 生产建议对比
| 技术 | 隔离级别 | 资源开销 | 启动速度 | 推荐场景 |
|---|---|---|---|---|
| Docker | 进程级 | 低 | 秒级 | 微服务、CI/CD、Web 应用 |
| Podman | 进程级 | 低 | 秒级 | rootless、安全敏感环境 |
| LXC | 系统级 | 中 | 秒级 | 完整系统容器、轻量虚拟机 |
| KVM | 硬件虚拟化 | 高 | 分钟级 | 完整 OS、Windows、测试环境 |
实践任务 🎯
- 安装 Docker,运行 hello-world 和一个 Nginx 容器,浏览器访问 8080 端口确认
- 安装 Podman,用 podman run 启动相同 Nginx 容器,比较与 Docker 的使用差异
- 创建一个 LXC 容器 web01,安装 Nginx 并从宿主机访问容器 IP 的 80 端口
- (可选)用 virt-install 创建一个小型 Debian KVM 虚拟机,观察资源占用
自测问题 ❓
- Docker 和 Podman 的最大区别是什么?为什么 Podman 更适合安全敏感环境?
- LXC 容器与 Docker 容器的隔离级别有何不同?
- KVM 虚拟机启动比容器慢的主要原因是什么?
- 如何让 Docker 容器使用宿主机的网络(--network host 的作用)?
总结 📌
容器(Docker/Podman)是现代应用部署的核心,轻量、快速、可移植;LXC 适合需要完整系统级的场景;KVM 适用于传统虚拟机需求。
本章建立了容器与虚拟化基础,后续可扩展 Docker Compose、Podman Pod、Kubernetes 等,形成云原生运维能力。