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_PASSWORDroot 用户密码(必填)
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 应用打包成自己的镜像。到时候你会发现,前面学的所有命令,都在这份文件里串成一条流水线。

系列文章持续更新中,欢迎关注收藏不迷路!

更多推荐