Docker 使用手册
1. 什么是 Docker?
Docker 解决了一个核心问题:环境一致性。
- 场景 :小甲有一个程序
a.py,在本地环境 Env 1 中运行结果是 A; - 问题:发给小乙后,他的电脑环境是 Env 2,很可能因为依赖缺失或其他原因导致运行报错;
- Docker 解决方案 :将【
a.py+ Env 1 】打包成一个 Docker 镜像(images); - 使用方式:甲将 Docker 镜像上传到仓库(公共或私有均可),乙从仓库 pull 下来,在命令行中启动 Docker 并使用该镜像,即可执行相同的运行并得到相同的结果。
2. 核心术语
- Docker images(镜像):相对容器来说,是模板,包含了完整的运行环境和应用代码。
- Docker container(容器):是镜像的实例化,一个镜像可以创建多个容器。
- Docker service(服务):在 Docker Compose 或 Swarm 环境中,服务是对容器的抽象和管理单位,定义了容器的运行方式、数量、网络等配置。
- Dockerfile : 一个文本文件,包含了构建 Docker 镜像所需的所有命令。通过
docker build命令读取 Dockerfile 并执行其中的命令,最终生成一个镜像。
3. 服务与容器的关系
3.1 服务的定义
服务(Service)是 Docker Compose / Docker Swarm 中的概念,定义了如何运行容器。
服务可以理解为容器的配置模板,包含了容器的镜像、命令、环境变量、网络、卷等配置信息。
- 服务是容器的抽象:服务定义了容器的运行规范,一个服务可以管理多个容器实例。
3.2 服务与容器的区别
| 特性 | 服务(Service) | 容器(Container) |
|---|---|---|
| 定义方式 | 通过 docker-compose.yml 或 Swarm 配置文件定义 | 通过镜像创建 |
| 管理范围 | 可以管理多个容器实例 | 单个运行实例 |
| 配置方式 | 集中配置,统一管理 | 独立配置 |
| 扩展能力 | 支持水平扩展,调整实例数量 | 单个实例,需要手动管理多个容器 |
| 网络管理 | 提供服务发现和负载均衡 | 需要手动配置网络 |
4. 实用命令(命令清单,暂可不看)
4.1 镜像相关命令
***imagename>:举例: *** my-image:latest (my-image 是镜像名,latest 是默认标签,意思是最新版本)
docker images:查看本地所有镜像docker pull <image_name>:<tag>:从仓库拉取镜像
eg: docker pull ccr.ccs.tencentyun.com/library/ubuntu:22.04 从腾讯云拉取 ubuntu22.04镜像
docker push <image_name>:<tag>:将镜像推送到仓库docker rmi <image_id>:删除指定镜像(可以只用ID的前四位)docker build -t <image_name>:<tag> .:构建镜像
4.2 容器相关命令
docker ps:查看正在运行的容器docker ps -a:查看所有容器(包括已停止的)docker start <container_id>:启动容器docker stop <container_id>:停止容器docker rm <container_id>:删除容器docker exec -it <container_id> bash:进入容器内部
4.3 服务相关命令
docker compose up:启动服务docker compose down:停止服务docker compose ps:查看服务状态docker compose logs:查看服务日志docker compose scale <service_name>=<number>:扩展服务实例数量
4.4 系统相关命令
docker system df:查看 Docker 系统资源使用情况docker system prune:清理未使用的 Docker 资源
5. 使用步骤(必须逐步)
我采用的是构建方式,将 Dockerfile、docker-compose.yml、.dockerignore 等文件放在 Git 仓库内。
乙方 git clone 仓库后,输入对应命令即可复刻出镜像。
5.1 通过 requirements.txt 添加依赖
创建 requirements.txt 文件,列出项目所需的依赖包:
# 核心依赖
# ============================================================
pyyaml>=6.0
# 数据处理和分析
pandas>=1.3.0,<3.0.0
# 系统监控(用于内存监控)
psutil>=5.8.0,<6.0.0
5.2 编写 Dockerfile 构建命令
dockerfile
# 基础镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 复制依赖文件
COPY requirements.txt .
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制项目代码
COPY . .
# 暴露端口
EXPOSE 5000
# 启动命令
CMD ["python", "app.py"]
5.3 编写 docker-compose.yml(多容器场景)(可选)
如果需要同时构建多个容器,使用 docker-compose.yml:
下面是两个容器的示例配置
yaml
services:
exp-dfs-bestgoal-commonpre:
image: my-image:latest
user: "1000:1000"
working_dir: /app/scripts
command: python3 ablation_car5-24.py
mem_limit: 8g
cpus: 4
restart: "no"
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
labels:
- "project=static-scenario-synthesis"
- "experiment.type=ablation"
- "experiment.algorithm=dfs"
- "experiment.strategy=bestgoal-commonpre"
volumes:
- ../:/app
- ./results/dfs-bestgoal-commonpre:/app/results
environment:
- PYTHONUNBUFFERED=1
- PYTHONPATH=/app:/app/scripts:/app/core
- CURRENT_SERVICE=exp-dfs-bestgoal-commonpre
- CONFIG_ALGORITHMS=DFS_BestGoal_CommonPre
- CAR_COUNTS_TO_RUN=5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24
- TIMEOUT_SECONDS=7200
- MEMORY_LIMIT_MB=8192
exp-dfs-bestgoal:
image: my-image:latest
user: "1000:1000"
working_dir: /app/scripts
command: python3 ablation_car5-24.py
mem_limit: 8g
cpus: 4
restart: "no"
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
labels:
- "project=static-scenario-synthesis"
- "experiment.type=ablation"
- "experiment.algorithm=dfs"
- "experiment.strategy=bestgoal"
volumes:
- ../:/app
- ./results/dfs-bestgoal:/app/results
environment:
- PYTHONUNBUFFERED=1
- PYTHONPATH=/app:/app/scripts:/app/core
- CURRENT_SERVICE=exp-dfs-bestgoal
- CONFIG_ALGORITHMS=DFS_BestGoal
- CAR_COUNTS_TO_RUN=5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24
- TIMEOUT_SECONDS=7200
- MEMORY_LIMIT_MB=8192
5.4 运行
在 Dockerfile 同目录下执行:
bash
docker build -t my-image:latest .
docker run -p 5000:5000 my-image:latest
6. 运行相关脚本
6.1 启动所有容器 (加上-d 是后台运行)
bash
docker-compose up -d
6.2 查看状态(所有运行中的容器)
bash
docker-compose ps
#查看 包括没运行的容器
docker-compose ps -a
6.3 查看日志
bash
docker-compose logs -f
7. 需要重新构建镜像的情况:
在修改以下配置后,需要重新构建新镜像:
- Dockerfile
- requirements.txt
- 项目代码
- 构建上下文文件(配置文件、静态资源等):
-
构建上下文文件指在构建 Docker 镜像时,Docker 引擎会将指定目录(通常是当前目录,即 . )下的所有文件和子目录作为构建上下文发送给 Docker 守护进程
-
COPY 指令 示例:在 Dockerfile 中使用 COPY 指令将构建上下文中的文件复制到镜像中
dockerfileCOPY ./app.py /app/ COPY ./static/ /app/static/
-
bash
#常规构建
docker build -t my-image:latest .
#带网络配置的构建
docker build --network=host --no-cache -t my-image:latest .
8. 需要重新生成新容器的情况:
修改docker-compose.yml配置后,必须删除旧容器才能生效(无需重新构建新镜像):
旧容器仍用旧配置,必须停止重建;而Compose 每次运行都会重新读取配置文件。
bash
docker compose down
# 删除旧容器
docker rm -f $(docker ps -a -q) 2>/dev/null || true
docker compose up -d 【可指定容器,如exp-dfs-bestgoal-commonpre】
9. 服务管理 docker compose 常见命令
bash
#1 查看特定服务日志
docker compose logs -f exp-dfs-bestgoal-commonpre
# 运行多个服务
##同时启动 2 个服务
docker compose up -d exp-dfs-bestgoal-commonpre exp-bfs-commonpre
##查看 2 个服务的日志
docker compose logs -f exp-dfs-bestgoal-commonpre exp-bfs-commonpre
#2 容器操作
##进入容器 bash(用命令行在容器内操作,执行文件)
docker compose run --rm exp-dfs-bestgoal-commonpre bash
- 使用 .dockerignore 文件:排除不需要打包到镜像中的文件,减少镜像大小
- 使用官方基础镜像:确保安全性和稳定性
- 使用多阶段构建:减小最终镜像大小
- 设置合理的标签:便于版本管理和回滚
版本历史
- 2026-03-09:初始版本
- 2026-03-10:完善文档结构和内容