主题
第三部分 容器技术基础
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 dockerbash
# 验证安装
docker version
docker run hello-world8.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 stats8.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 限制
nginx8.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-demo8.7 本章练习
- 解释镜像和容器的区别。
- 使用
docker run启动一个 Redis 容器,映射端口 6379。 - 进入 Redis 容器,执行
redis-cli ping。 - 查看 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.09.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 nginxtmpfs 挂载
bash
# 数据存储在内存中,适合敏感数据
docker run -d --tmpfs /app/cache:rw,noexec,nosuid,size=100m nginx9.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 db9.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 --build9.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 -v9.9 本章练习
- 编写一个 Dockerfile,构建一个 Nginx 静态网站镜像。
- 将镜像推送到 Docker Hub 或私有仓库。
- 使用 Docker Volume 持久化 MySQL 数据。
- 使用 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 nginxHost 网络
bash
# 容器共享主机网络,不需要端口映射
docker run -d --network host nginx10.2 Docker 存储驱动
| 存储驱动 | 特点 |
|---|---|
| overlay2 | 现代 Linux 默认,性能优秀 |
| aufs | 旧版本使用 |
| devicemapper | CentOS 旧版本 |
| 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 docker10.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 nginx10.5 本章练习
- 创建一个自定义 Docker 网络,并让两个容器通过容器名互相访问。
- 查看 Docker 使用的存储驱动。
- 配置 Docker 日志轮转策略。
- 使用非 root 用户运行一个容器。
第三阶段总结
完成本阶段学习后,你应该能够:
- 理解容器技术原理
- 熟练使用 Docker 命令
- 编写 Dockerfile 构建镜像
- 使用 Docker Volume 持久化数据
- 使用 Docker 网络连接容器
- 使用 Docker Compose 编排多容器应用
进入下一阶段:Kubernetes 核心基础。