04. Docker 常用命令实战:从 Hello World 到容器全生命周期管理
04. Docker 常用命令实战:从 Hello World 到容器全生命周期管理
Docker 命令太多了记不住?别慌,这篇文章帮你把最常用的命令一网打尽。从拉镜像、跑容器、看日志,到 MySQL、Redis、Nginx 三大实战案例,一篇文章搞定 Docker 命令的"二八法则"——掌握 20% 的核心命令,解决 80% 的日常问题。

▲ 别背命令,先理解套路:镜像命令一套、容器命令一套、网络卷一套,配合实战案例,用几次就记住了。
一、先来感受一下:Hello World
Docker 最经典的入门仪式,就是跑一个 hello-world 容器:
docker run hello-world
第一次运行会看到这样的输出:
Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 7050e35b49f5: Pull complete Digest: sha256:aa0cc8055b82dc2509be2ab90a1a9745c70c35a91c277c3e897541ee51e8b46a Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. ...
发生了什么?
| 步骤 | Docker 做的事 |
|---|---|
| 1 | 发现本地没有 hello-world 镜像 |
| 2 | 自动从 Docker Hub 拉取 |
| 3 | 用这个镜像创建并启动容器 |
| 4 | 容器打印欢迎信息后退出 |
就这一条命令,你已经完成了:拉镜像 → 创建容器 → 运行容器 全流程。
新手上路的第一课:别小看这行命令,它背后的链路(拉取→创建→运行)就是整个 Docker 世界的地基。
二、镜像操作命令
镜像是容器的"模板",相当于安装包。先把镜像相关的命令搞定。
2.1 docker pull:拉取镜像
# 拉取 nginx 的 alpine 版本(体积小,只有 40MB 左右) docker pull nginx:alpine
输出:
alpine: Pulling from library/nginx df2a149f1c37: Pull complete ... Digest: sha256:3f4c5a3... Status: Downloaded newer image for nginx:alpine docker.io/library/nginx:alpine
小贴士:镜像名后面不写标签(tag),默认拉
latest。生产环境建议指定具体版本,避免"版本漂移"。
2.2 docker images:查看本地镜像列表
docker images
输出:
REPOSITORY TAG IMAGE ID CREATED SIZE nginx alpine a8758716bb6a 2 weeks ago 43.2MB hello-world latest d2c94e258dcb 3 months ago 13.3kB
| 字段 | 含义 |
|---|---|
| REPOSITORY | 镜像名(仓库名) |
| TAG | 标签(版本号) |
| IMAGE ID | 镜像唯一 ID |
| SIZE | 镜像大小 |
2.3 docker rmi:删除镜像
# 按镜像 ID 删除 docker rmi a8758716bb6a # 按镜像名+标签删除 docker rmi nginx:alpine # 强制删除(不管有没有容器引用) docker rmi -f nginx:alpine
注意:如果有容器还在使用这个镜像,不加
-f会删不掉。建议先停容器再删镜像。
2.4 docker tag:给镜像打标签
# 给本地镜像打个新标签(常用于推送到私有仓库前重命名) docker tag nginx:alpine myregistry.com/nginx:v1.0
这个操作不会复制镜像,只是加了一个"别名"。
2.5 docker build:构建自定义镜像
这个命令配合 Dockerfile 使用,后面有专门文章细讲,这里先看个例子:
# 在当前目录找 Dockerfile,构建镜像并打标签 docker build -t myapp:v1.0 .
三、容器操作命令
容器是镜像运行起来的"实例",相当于安装好的软件。这部分是日常用得最多的。
3.1 docker run:创建并运行容器(核心中的核心)
这是 Docker 最重要的命令,参数非常多。来看一个"全家桶"示例:
docker run -d \ --name my-web \ -p 8080:80 \ -v /data/html:/usr/share/nginx/html \ -e ENV_VAR=production \ --restart always \ nginx:alpine
| 参数 | 含义 | 示例 |
|---|---|---|
-d | 后台运行(detached) | -d |
--name | 给容器起个名字 | --name my-web |
-p | 端口映射(宿主机:容器) | -p 8080:80 |
-v | 挂载目录(宿主机:容器) | -v /data:/data |
-e | 设置环境变量 | -e KEY=value |
--restart | 重启策略 | always / on-failure / no |
运行后浏览器访问 http://localhost:8080 就能看到 Nginx 欢迎页了。
3.2 docker ps:查看容器状态
# 查看正在运行的容器 docker ps # 查看所有容器(包括已停止的) docker ps -a # 只显示容器 ID(方便批量操作) docker ps -q
输出示例:
CONTAINER ID IMAGE STATUS PORTS NAMES a1b2c3d4e5f6 nginx:alpine Up 2 minutes 0.0.0.0:8080->80/tcp my-web
3.3 docker stop / start / restart:容器生命周期
容器的"一生"就这几步,记住这张图就够了:

▲ 容器的一生:创建 → 启动 → 运行 → 停止 → 删除,配合对应的命令即可随时"操控"它。
# 停止容器(发送 SIGTERM,优雅退出) docker stop my-web # 启动已停止的容器 docker start my-web # 重启容器 docker restart my-web # 批量停止所有运行中的容器 docker stop $(docker ps -q)
3.4 docker rm:删除容器
# 删除已停止的容器 docker rm my-web # 强制删除运行中的容器 docker rm -f my-web # 清理所有已停止的容器(常用!) docker container prune
3.5 docker exec -it:进入容器内部
# 进入容器的 bash(像 SSH 登录一样) docker exec -it my-web /bin/bash # 在容器里执行单条命令 docker exec my-web ls /usr/share/nginx/html
小贴士:有些精简镜像没有 bash,可以用
sh代替:docker exec -it my-web sh
3.6 docker logs:查看容器日志
# 查看全部日志 docker logs my-web # 只看最后 50 行 docker logs --tail 50 my-web # 实时追踪日志(像 tail -f) docker logs -f my-web # 显示时间戳 docker logs -f --timestamps my-web
3.7 docker inspect:查看容器详细信息
docker inspect my-web
输出是一大段 JSON,包含容器的所有配置信息。配合 --format 可以只提取特定字段:
# 只获取容器 IP 地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' my-web
# 只获取挂载的卷信息
docker inspect --format='{{.Mounts}}' my-web
四、实战案例 1:MySQL 容器
这是最常见的场景——用 Docker 跑一个 MySQL 数据库。

▲ 数据库、缓存、Web 服务器,这三个是 Docker 用得最多的场景,下面一个个跑起来。
4.1 完整命令
docker run -d \ --name mysql-dev \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=123456 \ -e MYSQL_DATABASE=testdb \ -v /data/mysql:/var/lib/mysql \ --restart always \ mysql:8.0
| 参数解释 | 说明 |
|---|---|
MYSQL_ROOT_PASSWORD | root 用户密码(必填) |
MYSQL_DATABASE | 自动创建的数据库 |
-v /data/mysql:/var/lib/mysql | 数据持久化到宿主机 |
--restart always | 服务器重启后自动拉起 |
4.2 验证运行
# 查看日志,等待初始化完成(第一次约 30 秒) docker logs -f mysql-dev
看到 ready for connections 就表示启动成功了。用数据库工具连接:
Host: localhost Port: 3306 User: root Password: 123456 Database: testdb
4.3 数据持久化验证
# 删除容器(数据不会丢,因为挂载了卷) docker rm -f mysql-dev # 重新创建,数据还在! docker run -d --name mysql-dev -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=123456 \ -v /data/mysql:/var/lib/mysql \ mysql:8.0
重点:MySQL 数据默认存在容器内的
/var/lib/mysql,不挂载卷的话,删容器数据就没了。生产环境必须挂载!
五、实战案例 2:Redis 容器
Redis 更简单,一条命令搞定:
docker run -d \ --name redis-dev \ -p 6379:6379 \ -v /data/redis:/data \ --restart always \ redis:7-alpine
验证连接:
# 进入 Redis CLI docker exec -it redis-dev redis-cli # 测试一下 127.0.0.1:6379> SET name "Docker" OK 127.0.0.1:6379> GET name "Docker"
如果需要设置密码:
docker run -d --name redis-dev -p 6379:6379 \ redis:7-alpine redis-server --requirepass "mypassword"
六、实战案例 3:Nginx 容器
Nginx 常用于静态文件服务和反向代理。
6.1 基础运行
docker run -d \ --name nginx-web \ -p 80:80 \ -v /data/www:/usr/share/nginx/html \ --restart always \ nginx:alpine
6.2 挂载自定义网页
在宿主机创建文件:
mkdir -p /data/www echo '<h1>Hello from Docker Nginx!</h1>' > /data/www/index.html
浏览器访问 http://localhost,就能看到自定义页面了。
6.3 挂载自定义配置
docker run -d \ --name nginx-web \ -p 80:80 \ -v /data/www:/usr/share/nginx/html \ -v /data/nginx.conf:/etc/nginx/nginx.conf:ro \ --restart always \ nginx:alpine
:ro表示只读挂载,容器内无法修改这个配置文件,更安全。
七、命令速查表
把最常用的命令整理成表格,方便随时查阅。
7.1 镜像命令
| 命令 | 作用 | 示例 |
|---|---|---|
docker pull | 拉取镜像 | docker pull nginx:alpine |
docker images | 查看本地镜像 | docker images |
docker rmi | 删除镜像 | docker rmi nginx:alpine |
docker tag | 打标签 | docker tag nginx myreg/nginx:v1 |
docker build | 构建镜像 | docker build -t app:v1 . |
docker image prune | 清理无用镜像 | docker image prune -a |
7.2 容器命令
| 命令 | 作用 | 示例 |
|---|---|---|
docker run | 创建并运行容器 | docker run -d -p 80:80 nginx |
docker ps | 查看运行中容器 | docker ps -a |
docker stop | 停止容器 | docker stop my-web |
docker start | 启动容器 | docker start my-web |
docker restart | 重启容器 | docker restart my-web |
docker rm | 删除容器 | docker rm -f my-web |
docker exec | 进入容器 | docker exec -it my-web sh |
docker logs | 查看日志 | docker logs -f my-web |
docker inspect | 查看详情 | docker inspect my-web |
7.3 网络命令
| 命令 | 作用 | 示例 |
|---|---|---|
docker network ls | 查看网络列表 | docker network ls |
docker network create | 创建网络 | docker network create mynet |
docker network connect | 容器加入网络 | docker network connect mynet app |
docker network rm | 删除网络 | docker network rm mynet |
7.4 卷命令
| 命令 | 作用 | 示例 |
|---|---|---|
docker volume ls | 查看卷列表 | docker volume ls |
docker volume create | 创建卷 | docker volume create mydata |
docker volume inspect | 查看卷详情 | docker volume inspect mydata |
docker volume prune | 清理无用卷 | docker volume prune |
八、--help 是你的好朋友
忘了某个命令的用法?不用百度,直接问 Docker 自己:
# 查看 docker 有哪些子命令 docker --help # 查看某个子命令的用法 docker run --help # 查看特定参数的说明 docker volume create --help
输出会列出所有参数和说明,比任何文档都准确(毕竟是人家的亲儿子)。
九、本文要点回顾
| 要点 | 核心内容 |
|---|---|
| 镜像三件套 | pull 拉取、images 查看、rmi 删除 |
| 容器生命周期 | run 创建 → ps 查看 → stop 停止 → start 启动 → rm 删除 |
| 进入容器 | docker exec -it 容器名 /bin/sh |
| 看日志 | docker logs -f 容器名 |
| 数据持久化 | 用 -v 挂载宿主机目录 |
| 端口映射 | 用 -p 宿主机端口:容器端口 |
金句:Docker 命令不用死记硬背,用多了自然就记住了。实在忘了,
--help随时待命。
十、下集预告
本文把 Docker 最常用的命令过了一遍,配合三个实战案例,日常使用基本够用。
下一篇我们进入 Docker 的核心实战:手写 Dockerfile,把自己写的 Python / Node.js 应用打包成自己的镜像。到时候你会发现,前面学的所有命令,都在这份文件里串成一条流水线。
系列文章持续更新中,欢迎关注收藏不迷路!
更多推荐

所有评论(0)