外观
Docker 笔记
约 2550 字大约 9 分钟
2025-08-16
一、Docker 简介
1.1 什么是 Docker?
Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache 2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
1.2 Docker 核心特点
- 轻量级:容器共享宿主机内核,无需额外的虚拟机层
- 快速部署:秒级启动和停止容器
- 一致性:开发、测试、生产环境一致性
- 隔离性:进程、网络、文件系统完全隔离
- 可移植性:一次构建,随处运行
- 资源高效:比传统虚拟机更节省系统资源
1.3 Docker 与虚拟机对比
| 特性 | Docker 容器 | 虚拟机 |
|---|---|---|
| 架构 | 应用层抽象 | 硬件层抽象 |
| 启动速度 | 秒级 | 分钟级 |
| 性能 | 接近原生 | 有损耗 |
| 资源占用 | 低 | 高 |
| 隔离级别 | 进程级 | 系统级 |
| 镜像大小 | MB 级别 | GB 级别 |
| 应用场景 | 微服务、持续集成 | 完整系统模拟 |
二、Docker 核心概念
2.1 镜像(Image)
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的配置参数。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
镜像特点:
- 采用分层存储架构(Union FS)
- 只读层,每一层都是上一层的增量
- 通过镜像ID唯一标识
- 可以通过标签(Tag)管理不同版本
2.2 容器(Container)
容器是镜像的运行时实例。镜像和容器的关系,就像面向对象程序设计中的"类"和"实例"一样,镜像是静态的定义,容器是镜像运行时的实体。
容器特点:
- 在隔离环境中运行
- 拥有独立的文件系统、网络空间
- 可以被创建、启动、停止、删除、暂停
- 容器内进程是运行在隔离环境里的
2.3 仓库(Repository)
仓库是集中存储、分发镜像的服务。一个 Docker Registry 中可以包含多个仓库;每个仓库可以包含多个标签;每个标签对应一个镜像。
仓库命名规范:
<用户名>/<软件名>:<标签>- 例如:
nginx:latest、library/ubuntu:20.04 - 不指定标签时,默认使用
latest标签
2.4 Dockerfile
Dockerfile 是 Docker 镜像的定制文件,包含了创建镜像所需的所有命令。通过 Dockerfile 可以定制自己所需项目工程的镜像。
三、Docker 基础命令
3.1 镜像操作
# 拉取镜像
docker pull nginx:latest
# 查看本地镜像
docker images
# 或
docker image ls
# 删除镜像
docker rmi nginx
# 强制删除
docker rmi -f nginx
# 构建镜像
docker build -t myapp:1.0 .
# 保存镜像为 tar 文件
docker save -o myapp.tar myapp:1.0
# 从 tar 文件加载镜像
docker load -i myapp.tar3.2 容器操作
# 运行容器
docker run -d -p 80:80 --name webserver nginx
# 选项说明:
# -d: 以分离模式运行容器(后台运行)
# -p: 端口映射(宿主机端口:容器端口)
# --name: 指定容器名称
# -it: 交互式 bash 模式
# --rm: 容器终止后自动删除
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 启动/停止容器
docker start webserver
docker stop webserver
# 重启容器
docker restart webserver
# 进入正在运行的容器
docker exec -it webserver bash
# 查看容器日志
docker logs webserver
# 实时查看日志
docker logs -f webserver
# 查看容器资源使用情况
docker stats webserver
# 删除容器
docker rm webserver
# 强制删除运行中的容器
docker rm -f webserver3.3 常用命令速查表
| 命令 | 说明 |
|---|---|
docker images | 列出本地镜像 |
docker ps | 列出正在运行的容器 |
docker ps -a | 列出所有容器(包括已停止的) |
docker run [选项] 镜像名 [命令] | 创建并启动容器 |
docker start/stop/restart <容器> | 启动/停止/重启容器 |
docker exec -it <容器> bash | 进入容器执行命令 |
docker logs <容器> | 查看容器日志 |
docker rm <容器> | 删除容器 |
docker rmi <镜像> | 删除镜像 |
docker build -t <标签> . | 构建镜像 |
docker pull <镜像> | 拉取镜像 |
docker push <镜像> | 推送镜像到仓库 |
docker stats | 实时监控容器资源使用 |
四、Dockerfile 详解
4.1 Dockerfile 基本结构
# 指定基础镜像
FROM ubuntu:20.04
# 维护者信息
LABEL maintainer="example@example.com"
# 设置环境变量
ENV DEBIAN_FRONTEND=noninteractive \
TZ=Asia/Shanghai
# 在容器中创建目录
WORKDIR /app
# 复制文件到容器
COPY . /app
# 安装依赖
RUN apt-get update && \
apt-get install -y python3 python3-pip && \
pip3 install -r requirements.txt
# 暴露端口
EXPOSE 5000
# 容器启动命令
CMD ["python3", "app.py"]4.2 常用 Dockerfile 指令
| 指令 | 说明 |
|---|---|
FROM | 指定基础镜像(必须是第一条指令) |
LABEL | 添加元数据(如作者信息) |
ENV | 设置环境变量 |
WORKDIR | 设置工作目录 |
COPY | 从宿主机复制文件到容器 |
ADD | 类似 COPY,但支持自动解压和 URL |
RUN | 在容器内执行命令 |
USER | 设置默认用户名 |
EXPOSE | 声明容器运行时监听的端口 |
CMD | 容器启动时执行的命令(可被覆盖) |
ENTRYPOINT | 容器启动时执行的命令(不可被覆盖) |
4.3 编写最佳实践
合理选择基础镜像
- 优先使用官方镜像
- 选择最小化的基础镜像(如 alpine)
- 例如:
FROM node:14-alpine比FROM node:14更小
合并 RUN 指令
# 不推荐 RUN apt-get update RUN apt-get install -y package1 package2 # 推荐 RUN apt-get update && \ apt-get install -y package1 package2 && \ rm -rf /var/lib/apt/lists/*使用 .dockerignore 文件
- 忽略不需要的文件(如 node_modules、.git)
- 类似 .gitignore 的作用
多阶段构建
# 构建阶段 FROM maven:3.6.0-jdk-8 AS build COPY src /usr/src/app/src COPY pom.xml /usr/src/app RUN mvn -f /usr/src/app/pom.xml clean package # 运行阶段 FROM openjdk:8-jre-alpine COPY --from=build /usr/src/app/target/my-app.jar /app/my-app.jar CMD ["java", "-jar", "/app/my-app.jar"]
五、Docker Compose
5.1 什么是 Docker Compose?
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 YAML 文件配置应用程序的服务,然后使用一个命令创建和启动所有服务。
5.2 基本使用
docker-compose.yml 示例:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
depends_on:
- redis
redis:
image: "redis:alpine"常用命令:
# 启动所有服务(后台运行)
docker-compose up -d
# 停止所有服务
docker-compose down
# 查看服务日志
docker-compose logs -f
# 重建服务
docker-compose build
# 重启服务
docker-compose restart5.3 常用配置项
| 配置项 | 说明 |
|---|---|
build | 指定 Dockerfile 路径 |
image | 指定镜像名称 |
ports | 端口映射 |
volumes | 卷挂载 |
environment | 设置环境变量 |
depends_on | 指定服务依赖关系 |
networks | 配置网络 |
restart | 重启策略(no, on-failure, always, unless-stopped) |
六、数据管理
6.1 数据卷(Volumes)
数据卷是在 Docker 管理的文件系统中存储数据的首选机制。
# 创建数据卷
docker volume create my-vol
# 查看数据卷
docker volume ls
# 查看数据卷详情
docker volume inspect my-vol
# 使用数据卷运行容器
docker run -d -v my-vol:/app/data nginx6.2 绑定挂载(Bind Mounts)
绑定挂载将宿主机上的文件或目录挂载到容器中。
# 挂载宿主机目录到容器
docker run -d -v /宿主机路径:/容器路径 nginx
# 只读挂载
docker run -d -v /宿主机路径:/容器路径:ro nginx6.3 临时文件系统(tmpfs)
tmpfs 将数据存储在宿主机的内存中,不会写入磁盘。
# 创建 tmpfs 挂载
docker run -d --tmpfs /app/cache nginx七、网络管理
7.1 网络模式
| 模式 | 说明 |
|---|---|
bridge | 默认模式,容器通过 Docker 网桥连接 |
host | 容器共享宿主机网络命名空间 |
none | 容器没有网络连接 |
container | 容器共享另一个容器的网络 |
7.2 网络操作
# 创建网络
docker network create my-network
# 查看网络
docker network ls
# 查看网络详情
docker network inspect my-network
# 连接容器到网络
docker network connect my-network container1
# 断开容器与网络的连接
docker network disconnect my-network container1
# 删除网络
docker network rm my-network7.3 自定义网络
# 创建自定义桥接网络
docker network create -d bridge --subnet=192.168.100.0/24 my-net
# 运行容器并连接到自定义网络
docker run -d --name web --network my-net nginx
docker run -d --name db --network my-net mysql八、最佳实践
8.1 安全最佳实践
避免使用 root 用户运行容器
# 创建非特权用户 RUN groupadd -r appuser && useradd -r -g appuser appuser USER appuser定期更新基础镜像
- 修复已知漏洞
- 使用最新安全补丁
限制容器资源
docker run -d \ --memory=512m \ --cpus=1.0 \ --pids-limit=50 \ nginx扫描镜像漏洞
docker scan nginx:latest
8.2 性能优化
- 使用多阶段构建减少镜像大小
- 合理选择基础镜像(优先使用 alpine)
- 合并 RUN 指令减少镜像层数
- 清理不必要的文件和缓存
- 限制容器资源使用
8.3 常见问题解决
问题1:容器启动后立即退出
解决方案:
- 检查容器日志:
docker logs <容器名> - 确保 CMD 或 ENTRYPOINT 指定了前台进程
- 例如:
CMD ["nginx", "-g", "daemon off;"]
问题2:端口冲突
解决方案:
- 更改宿主机端口映射:
-p 8080:80 - 停止占用端口的进程:
docker stop $(docker ps -q -f port=80)
问题3:数据持久化问题
解决方案:
- 使用数据卷:
-v my-volume:/data - 避免将数据存储在容器文件系统中
九、实用技巧
9.1 清理命令
# 删除所有停止的容器
docker container prune
# 删除所有未使用的镜像
docker image prune
# 删除所有未使用的网络
docker network prune
# 删除所有未使用的卷
docker volume prune
# 一键清理(谨慎使用)
docker system prune -a9.2 调试技巧
# 临时进入容器
docker exec -it <容器> sh
# 查看容器进程
docker top <容器>
# 查看容器详细信息
docker inspect <容器>
# 实时监控容器资源
docker stats <容器>9.3 构建优化
# 跳过缓存构建
docker build --no-cache -t myapp:1.0 .
# 使用构建参数
docker build --build-arg HTTP_PROXY=http://10.20.30.2:1234 -t myapp:1.0 .
# 并行构建多个镜像
docker buildx build --parallel .