以下是常用的 Docker 命令及示例解释,按功能分类整理:
1. 镜像管理
1.1 拉取镜像
docker pull nginx:latest
nginx:latest
: 从 Docker Hub 拉取最新版本的 Nginx 镜像。
1.2 查看本地镜像
docker images
- 列出本地所有镜像,显示名称、标签、大小等信息。
1.3 删除镜像
docker rmi nginx:latest
- 删除指定的本地镜像(需确保没有容器依赖)。
2. 容器生命周期
2.1 运行容器
docker run -d -p 80:80 --name my-nginx nginx:latest
-d
: 后台运行容器(detached 模式)。-p 80:80
: 将宿主机的 80 端口映射到容器的 80 端口。--name my-nginx
: 指定容器名称(避免随机生成)。
2.2 查看运行中的容器
docker ps
- 仅显示正在运行的容器。
2.3 查看所有容器(包括已停止的)
docker ps -a
2.4 停止容器
docker stop my-nginx
- 优雅停止容器(发送 SIGTERM 信号)。
2.5 启动已停止的容器
docker start my-nginx
2.6 重启容器
docker restart my-nginx
2.7 强制删除容器
docker rm -f my-nginx
-f
: 强制删除运行中的容器(慎用)。
查看容器IP
从容器外面看:
docker inspect <containerNameOrId> | grep '"IPAddress"' | head -n 1
或者
docker inspect -f "{{.NetworkSettings.IPAddress}}" <containerNameOrId>
从容器里面看:
dock儿 exec / attach 进入容器,通过ip 或 ifconfig查看
docker inspect
和 docker exec
/docker attach
是 Docker 中用于查看和操作容器的两个不同命令。
docker inspect
:该命令用于查看容器的详细信息,例如容器的 ID、名称、状态、端口映射等。要使用docker inspect
,请运行以下命令:
docker inspect [container_id_or_name]
其中,[container_id_or_name]
是您要查看的容器的 ID 或名称。例如,要查看名为 my_container
的容器的详细信息,请运行:
docker inspect my_container
docker exec
和docker attach
:这两个命令用于在容器中执行命令或附加到容器。docker exec
用于在容器中执行命令,而docker attach
用于附加到容器并查看其输出。要使用docker exec
,请运行以下命令:
docker exec [container_id_or_name] [command]
其中,[container_id_or_name]
是您要执行命令的容器的 ID 或名称,[command]
是您要在容器中执行的命令。例如,要在名为 my_container
的容器中执行 ls
命令,请运行:
docker exec my_container ls
要使用 docker attach
,请运行以下命令:
docker attach [container_id_or_name]
其中,[container_id_or_name]
是您要附加的容器的 ID 或名称。例如,要附加到名为 my_container
的容器,请运行:
docker attach my_container
总之,docker inspect
用于查看容器的详细信息,而 docker exec
和 docker attach
用于在容器中执行命令或附加到容器。
docker attach
命令用于附加到正在运行的 Docker 容器。一旦附加到容器,您将能够查看容器的输出、与容器进行交互,并在容器中执行命令。
要使用 docker attach
,请运行以下命令:
docker attach [container_id_or_name]
其中,[container_id_or_name]
是您要附加的容器的 ID 或名称。例如,要附加到名为 my_container
的容器,请运行:
docker attach my_container
一旦附加到容器,您将看到容器的输出,并能够在容器中执行命令。例如,您可以在容器中运行 shell 命令、查看日志等。
需要注意的是,docker attach
命令会将您的终端附加到容器,这意味着您将无法在终端中执行其他命令,直到您从容器中分离。要从容器中分离,请按 Ctrl+P
,然后按 Ctrl+Q
。
总之,docker attach
命令用于附加到正在运行的 Docker 容器,以便查看容器的输出、与容器进行交互,并在容器中执行命令。
3. 容器交互与调试
3.1 进入容器终端
docker exec -it my-nginx /bin/bash
-it
: 以交互模式进入容器(需容器内包含/bin/bash
)。
3.2 查看容器日志
docker logs -f my-nginx
-f
: 实时跟踪日志输出(类似tail -f
)。
3.3 查看容器资源使用
docker stats my-nginx
- 实时监控 CPU、内存、网络等资源。
4. 构建镜像
4.1 通过 Dockerfile 构建镜像
docker build -t my-app:1.0 .
-t my-app:1.0
: 指定镜像名称和标签。.
: 使用当前目录下的Dockerfile
。
5. 数据管理
5.1 挂载数据卷
docker run -v /host/path:/container/path nginx
- 将宿主机的
/host/path
目录挂载到容器的/container/path
。
5.2 创建命名卷
docker volume create my-volume
docker run -v my-volume:/container/path nginx
6. 网络管理
6.1 查看网络列表
docker network ls
6.2 创建自定义网络
docker network create my-network
docker run --network=my-network nginx
7. 清理与维护
7.1 删除所有已停止的容器
docker container prune
7.2 清理未使用的镜像、卷、网络
docker system prune -a
-a
: 删除所有未使用的镜像(不仅仅是临时镜像)。
8. Docker Compose 常用命令
8.1 启动服务
docker-compose up -d
-d
: 后台运行。
8.2 停止并删除服务
docker-compose down
8.3 查看服务状态
docker-compose ps
典型使用场景示例
运行一个 MySQL 容器
docker run -d \
--name mysql-db \
-e MYSQL_ROOT_PASSWORD=123456 \
-v mysql_data:/var/lib/mysql \
-p 3306:3306 \
mysql:8.0
-e
: 设置环境变量(此处为 MySQL root 密码)。-v mysql_data:/var/lib/mysql
: 持久化 MySQL 数据。
掌握这些命令后,可覆盖日常开发、测试和运维中的大部分需求。根据实际场景组合使用参数(如 -p
, -v
, --network
)能灵活控制容器行为。
Docker 和 Docker Compose 是互补工具,但解决的问题不同。以下是它们的核心区别和关系:
1. 定位与作用
Docker
- 定位:容器运行时和管理工具。
- 作用:用于创建、运行和管理单个容器。
- 操作对象:直接操作镜像、容器、网络、卷等资源。
- 典型场景:
- 快速启动一个独立容器(如 Nginx、MySQL)。
- 调试或测试单个服务。
Docker Compose
- 定位:多容器应用的编排工具(基于 Docker)。
- 作用:通过 YAML 文件定义和运行多容器应用,简化复杂应用的部署流程。
- 操作对象:管理一组关联的容器(服务)及其依赖(网络、卷等)。
- 典型场景:
- 同时启动 Web 服务 + 数据库 + 缓存(如 Django + PostgreSQL + Redis)。
- 开发环境中快速重建完整的多服务应用环境。
2. 核心区别
维度 | Docker | Docker Compose |
---|---|---|
管理目标 | 单容器 | 多容器组成的应用 |
配置方式 | 命令行参数(docker run -p -v ) | YAML 文件(docker-compose.yml ) |
网络管理 | 需手动创建网络并连接容器 | 自动创建共享网络,服务间通过服务名通信 |
依赖关系 | 需手动控制启动顺序 | 通过 depends_on 定义启动顺序 |
适用场景 | 简单容器操作 | 复杂多服务应用(开发、测试环境) |
3. 操作对比示例
场景:部署一个 Web 应用(Python Flask) + 数据库(PostgreSQL)
使用纯 Docker 命令
需手动执行多个步骤:
# 1. 创建共享网络
docker network create my-app-network
# 2. 启动数据库容器
docker run -d \
--name postgres-db \
--network my-app-network \
-e POSTGRES_PASSWORD=secret \
-v pgdata:/var/lib/postgresql/data \
postgres:13
# 3. 启动 Web 应用容器(依赖数据库)
docker run -d \
--name flask-app \
--network my-app-network \
-e DB_HOST=postgres-db \
-p 5000:5000 \
my-flask-app:latest
痛点:
- 手动管理网络和卷。
- 需记住容器间的依赖关系和启动顺序。
- 命令冗长,难以复用。
使用 Docker Compose
通过 docker-compose.yml
一键启动:
version: '3.8'
services:
web:
image: my-flask-app:latest
ports:
- "5000:5000"
environment:
DB_HOST: postgres-db
depends_on:
- db
networks:
- my-network
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: secret
volumes:
- pgdata:/var/lib/postgresql/data
networks:
- my-network
volumes:
pgdata:
networks:
my-network:
执行命令:
docker-compose up -d
优势:
- 依赖关系和配置集中管理。
- 自动创建网络、卷,并连接服务。
- 支持一键启动/停止整个应用栈。
4. 关键特性对比
功能 | Docker | Docker Compose |
---|---|---|
服务编排 | ❌ 不支持 | ✅ 定义多服务及其关系 |
环境变量管理 | 命令行传递(-e ) | YAML 文件集中定义 |
配置文件复用 | ❌ 需重复输入命令 | ✅ 通过 YAML 文件复用配置 |
跨主机部署 | ❌ 不支持 | ❌ 仅限单机(生产环境需 Swarm/K8s) |
5. 总结
- Docker:基础工具,适合管理单个容器。
- Docker Compose:上层工具,适合在单机环境中编排多容器应用,尤其适合开发和测试。
- 关系:Compose 依赖 Docker,通过抽象简化复杂应用的部署,但不适用于生产集群(生产环境需 Kubernetes 或 Docker Swarm)。