Docker, Docker Compose & Dockerfile 速查表

本文档旨在提供一个清晰、易于查阅的 Docker、Docker Compose 和 Dockerfile 常用命令与语法参考。


一、Docker 核心命令

镜像管理 (Image Management)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 从 Docker Hub 检索镜像
docker search [image_name]

# 从仓库拉取镜像
docker pull [image_name]:[tag]

# 列出本地所有镜像
docker images

# 查看镜像的详细信息
docker image inspect [image_name]

# 删除一个或多个镜像
docker rmi [image_id_or_name]

# 删除所有镜像
docker rmi $(docker images -q)

# 将容器保存为新的镜像
docker commit [container_id] [new_image_name]:[tag]

# 将镜像保存为 .tar 归档文件
docker save -o [archive_name].tar [image_name]

# 从 .tar 归档文件加载镜像
docker load -i [archive_name].tar

# 登录到 Docker Hub
docker login

# 为镜像添加标签 (常用于推送前重命名)
docker tag [source_image] [hub_user]/[repo_name]:[tag]

# 将镜像推送到远程仓库
docker push [hub_user]/[repo_name]:[tag]

容器生命周期 (Container Lifecycle)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 创建并启动一个容器
docker run [options] [image_name] [command]

# 列出正在运行的容器
docker ps

# 列出所有容器 (包括已停止的)
docker ps -a

# 启动一个或多个已停止的容器
docker start [container_id_or_name]

# 停止一个或多个正在运行的容器
docker stop [container_id_or_name]

# 重启容器
docker restart [container_id_or_name]

# 删除一个或多个容器
docker rm [container_id_or_name]

# 删除所有已停止的容器
docker rm $(docker ps -aq)

docker run 常用选项:

  • -d: 后台运行容器 (detached mode)。
  • -p [host_port]:[container_port]: 将主机的端口映射到容器的端口。
  • --name [container_name]: 为容器指定一个名称。
  • -v [host_path]:[container_path]: 将主机的目录挂载到容器中(绑定挂载)。
  • -v [volume_name]:[container_path]: 将一个命名的卷挂载到容器中。
  • -e [KEY]=[VALUE]: 设置环境变量。
  • --network [network_name]: 将容器连接到一个指定的网络。
  • --restart always: 配置容器在退出时总是自动重启。

容器交互与监控

1
2
3
4
5
6
7
8
9
10
11
# 在运行的容器中执行命令 (进入交互式 shell)
docker exec -it [container_id_or_name] bash

# 查看容器的日志
docker logs [container_id_or_name]

# 实时显示容器的资源使用情况 (CPU, Memory)
docker stats

# 查看容器的详细信息
docker container inspect [container_id_or_name]

网络与数据卷管理

1
2
3
4
5
6
7
8
9
10
# --- Docker 网络 ---
docker network create [network_name]
docker network ls
docker network rm [network_name]

# --- Docker 数据卷 ---
docker volume create [volume_name]
docker volume ls
docker volume inspect [volume_name]
docker volume rm [volume_name]

二、Docker Compose

用于定义和运行多容器 Docker 应用程序的工具。

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 在后台创建并启动所有服务
docker-compose up -d

# 停止并移除所有服务、网络
docker-compose down

# 停止并移除服务、网络、卷和镜像
docker-compose down -v --rmi all

# 启动指定服务
docker-compose start [service_name]

# 停止指定服务
docker-compose stop [service_name]

# 伸缩服务实例数量
docker-compose scale [service_name]=3

# 使用指定的 compose 文件
docker-compose -f [file_name].yml up -d

docker-compose.yml 示例

一个典型的 WordPress + MySQL 应用配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
version: '3.8'

services:
mysql:
image: mysql:5.7
container_name: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: wordpress
volumes:
- mysql-data:/var/lib/mysql
networks:
- blog-net

wordpress:
image: wordpress:latest
container_name: wordpress
restart: always
ports:
- "8888:80"
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: 123456
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress-data:/var/www/html
networks:
- blog-net
depends_on:
- mysql

networks:
blog-net:

volumes:
mysql-data:
wordpress-data:

三、Dockerfile

用于自动构建 Docker 镜像的文本文件。

常用指令

  • FROM: 指定基础镜像。
  • LABEL: 为镜像添加元数据(如作者)。
  • WORKDIR: 设置工作目录。
  • COPY: 将文件或目录从构建上下文复制到镜像中。
  • ADD: 功能类似 COPY,但支持 URL 和自动解压。
  • RUN: 在镜像构建过程中执行命令。
  • ENV: 设置环境变量。
  • EXPOSE: 声明容器运行时监听的端口(仅为文档目的)。
  • CMD: 提供容器启动时的默认命令(可被 docker run 的命令覆盖)。
  • ENTRYPOINT: 配置容器启动时的主命令(不易被覆盖)。
  • USER: 指定运行容器时的用户名或 UID。
  • VOLUME: 创建一个可以从本地主机或其他容器挂载的挂载点。
  • ARG: 定义构建时变量。

构建镜像

1
2
3
# -t: 为镜像指定名称和标签
# .: 指定 Dockerfile 所在的路径 (构建上下文)
docker build -t my-java-app:v1.0 .

Dockerfile 示例

一个简单的 Java 应用 Dockerfile:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 使用官方的 OpenJDK 17 作为基础镜像
FROM openjdk:17-jdk-slim

# 为镜像添加作者标签
LABEL author="Your Name"

# 设置工作目录
WORKDIR /app

# 将构建好的 .jar 文件复制到工作目录
COPY target/app.jar app.jar

# 声明容器将监听 8080 端口
EXPOSE 8080

# 设置容器启动时执行的命令
ENTRYPOINT ["java", "-jar", "app.jar"]