Skip to content

第三部分 容器技术基础

Kubernetes 是容器编排平台,理解容器技术是学习 K8s 的前提。本部分介绍 Docker 容器的基本概念、镜像管理、容器网络与存储。


第 8 章 容器技术概述与 Docker 基础

8.1 什么是容器

容器是一种轻量级的虚拟化技术,它将应用程序及其依赖打包在一起,形成一个独立的运行环境。

容器 vs 虚拟机:

特性容器虚拟机
启动速度秒级分钟级
资源占用轻量较重
隔离级别进程级操作系统级
镜像大小MB 级GB 级
性能接近原生有虚拟化开销

8.2 Docker 核心概念

概念说明
镜像(Image)只读模板,包含运行应用所需的文件系统
容器(Container)镜像的运行实例
仓库(Registry)存储和分发镜像的服务,如 Docker Hub
Dockerfile定义如何构建镜像的文本文件
层(Layer)镜像由多个只读层组成,容器在最上层添加可写层

8.3 安装 Docker

bash
# Ubuntu/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/ubuntu/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/ubuntu $(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-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER
newgrp docker
bash
# 验证安装
docker version
docker run hello-world

8.4 Docker 基本命令

bash
# 拉取镜像
docker pull nginx:latest

# 查看本地镜像
docker images

# 运行容器
docker run -d -p 80:80 --name my-nginx nginx:latest

# 查看运行中的容器
docker ps

# 查看所有容器(含停止的)
docker ps -a

# 停止容器
docker stop my-nginx

# 启动容器
docker start my-nginx

# 重启容器
docker restart my-nginx

# 删除容器
docker rm my-nginx

# 强制删除运行中的容器
docker rm -f my-nginx

# 进入容器
docker exec -it my-nginx /bin/bash

# 查看容器日志
docker logs my-nginx
docker logs -f my-nginx

# 查看容器资源使用
docker stats

8.5 Docker 运行参数详解

bash
docker run -d \               # 后台运行
  --name web \                # 容器名称
  -p 8080:80 \                # 端口映射 主机端口:容器端口
  -v /host/data:/app/data \   # 数据卷挂载
  -e MYSQL_ROOT_PASSWORD=xxx \ # 环境变量
  --restart unless-stopped \  # 重启策略
  --memory=512m \             # 内存限制
  --cpus=1 \                  # CPU 限制
  nginx

8.6 本章实验

实验 8-1:运行第一个容器

bash
# 1. 拉取 nginx 镜像
docker pull nginx

# 2. 运行容器
docker run -d -p 8080:80 --name nginx-demo nginx

# 3. 查看容器状态
docker ps

# 4. 访问服务
curl http://localhost:8080

# 5. 查看日志
docker logs nginx-demo

# 6. 进入容器
docker exec -it nginx-demo /bin/bash
# 在容器内执行:
cat /etc/nginx/nginx.conf
exit

# 7. 停止并删除容器
docker stop nginx-demo
docker rm nginx-demo

8.7 本章练习

  1. 解释镜像和容器的区别。
  2. 使用 docker run 启动一个 Redis 容器,映射端口 6379。
  3. 进入 Redis 容器,执行 redis-cli ping
  4. 查看 Docker 容器的资源使用情况。

第 9 章 Docker 镜像、容器与仓库

9.1 镜像分层原理

Docker 镜像由多个只读层(Layer)组成,每一层代表 Dockerfile 中的一条指令。

镜像层(只读):
  Layer 3: COPY app.py /app
  Layer 2: RUN pip install flask
  Layer 1: FROM python:3.11

容器层(可写):
  Container Layer

优点:

  • 共享基础镜像层,节省存储
  • 构建时缓存未变更的层,加速构建

9.2 编写 Dockerfile

dockerfile
# Dockerfile
FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 5000

CMD ["python", "app.py"]

常用指令:

指令说明
FROM基础镜像
RUN执行命令
COPY复制文件到镜像
ADD复制文件(支持 URL 和解压)
WORKDIR设置工作目录
ENV设置环境变量
EXPOSE声明端口
CMD容器启动默认命令
ENTRYPOINT容器启动入口

9.3 构建和推送镜像

bash
# 构建镜像
docker build -t myapp:1.0 .

# 查看镜像
docker images

# 运行镜像
docker run -d -p 5000:5000 myapp:1.0

# 打标签
docker tag myapp:1.0 registry.example.com/myapp:1.0

# 推送到镜像仓库
docker push registry.example.com/myapp:1.0

# 从仓库拉取
docker pull registry.example.com/myapp:1.0

9.4 镜像仓库

Docker Hub

公共镜像仓库:https://hub.docker.com/

bash
# 登录
docker login

# 推送镜像
docker tag myapp:1.0 username/myapp:1.0
docker push username/myapp:1.0

私有镜像仓库

常见私有仓库:

  • Harbor(企业级)
  • Docker Registry
  • 阿里云容器镜像服务 ACR
  • AWS ECR
  • 腾讯云 TCR

9.5 容器数据持久化

容器是临时的,数据需要持久化保存。

数据卷(Volume)

bash
# 创建卷
docker volume create my-data

# 使用卷
docker run -d -v my-data:/data nginx

# 查看卷
docker volume ls

# 查看卷详情
docker volume inspect my-data

绑定挂载(Bind Mount)

bash
# 将主机目录挂载到容器
docker run -d -v /host/path:/container/path nginx

tmpfs 挂载

bash
# 数据存储在内存中,适合敏感数据
docker run -d --tmpfs /app/cache:rw,noexec,nosuid,size=100m nginx

9.6 容器网络

Docker 默认网络模式:

模式说明
bridge默认模式,容器通过 docker0 网桥通信
host容器共享主机网络栈
none无网络
container共享另一个容器的网络栈
bash
# 查看网络
docker network ls

# 创建自定义网络
docker network create my-net

# 在自定义网络中运行容器
docker run -d --name web --network my-net nginx
docker run -d --name db --network my-net mysql

# 同一网络中的容器可以通过容器名互相访问
docker exec -it web ping db

9.7 Docker Compose

Docker Compose 用于定义和运行多容器应用。

yaml
# docker-compose.yml
version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - api

  api:
    build: ./api
    ports:
      - "5000:5000"
    environment:
      - DB_HOST=db
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: xxx
    volumes:
      - db-data:/var/lib/mysql

volumes:
  db-data:
bash
# 启动所有服务
docker compose up -d

# 查看日志
docker compose logs -f

# 停止服务
docker compose down

# 重新构建
docker compose up -d --build

9.8 本章实验

实验 9-1:构建并运行 Python Web 应用

bash
# 1. 创建项目目录
mkdir ~/docker-flask && cd ~/docker-flask

# 2. 创建 app.py
cat > app.py << 'EOF'
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello from Docker!"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
EOF

# 3. 创建 requirements.txt
echo "flask==2.3.0" > requirements.txt

# 4. 创建 Dockerfile
cat > Dockerfile << 'EOF'
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
EOF

# 5. 构建并运行
docker build -t flask-demo:1.0 .
docker run -d -p 5000:5000 --name flask-app flask-demo:1.0

# 6. 测试
curl http://localhost:5000

实验 9-2:使用 Docker Compose 部署多服务

bash
# 1. 创建目录
mkdir ~/docker-compose-demo && cd ~/docker-compose-demo

# 2. 创建 docker-compose.yml(见上方示例)

# 3. 启动
docker compose up -d

# 4. 查看状态
docker compose ps

# 5. 停止并清理
docker compose down -v

9.9 本章练习

  1. 编写一个 Dockerfile,构建一个 Nginx 静态网站镜像。
  2. 将镜像推送到 Docker Hub 或私有仓库。
  3. 使用 Docker Volume 持久化 MySQL 数据。
  4. 使用 Docker Compose 部署一个 Web + API + DB 的应用。

第 10 章 Docker 网络与存储

10.1 深入理解 Docker 网络

Bridge 网络

默认桥接网络,容器通过 docker0 网桥与外部通信。

bash
# 查看 docker0 网桥
ip addr show docker0

# 查看容器 IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name

自定义 Bridge 网络

bash
# 创建网络
docker network create --driver bridge --subnet 172.20.0.0/16 my-network

# 运行容器并指定 IP
docker run -d --name web --network my-network --ip 172.20.0.10 nginx

Host 网络

bash
# 容器共享主机网络,不需要端口映射
docker run -d --network host nginx

10.2 Docker 存储驱动

存储驱动特点
overlay2现代 Linux 默认,性能优秀
aufs旧版本使用
devicemapperCentOS 旧版本
btrfs/zfs高级文件系统
bash
# 查看当前存储驱动
docker info | grep "Storage Driver"

10.3 容器日志管理

bash
# 查看容器日志
docker logs container_name

# 配置日志驱动
# /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

# 重启 Docker
sudo systemctl restart docker

10.4 容器安全基础

bash
# 以非 root 用户运行
docker run -u 1000:1000 nginx

# 限制容器能力
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx

# 只读文件系统
docker run --read-only -v /tmp:/tmp nginx

# 不启用特权模式
docker run --privileged=false nginx

10.5 本章练习

  1. 创建一个自定义 Docker 网络,并让两个容器通过容器名互相访问。
  2. 查看 Docker 使用的存储驱动。
  3. 配置 Docker 日志轮转策略。
  4. 使用非 root 用户运行一个容器。

第三阶段总结

完成本阶段学习后,你应该能够:

  • 理解容器技术原理
  • 熟练使用 Docker 命令
  • 编写 Dockerfile 构建镜像
  • 使用 Docker Volume 持久化数据
  • 使用 Docker 网络连接容器
  • 使用 Docker Compose 编排多容器应用

进入下一阶段:Kubernetes 核心基础