03 镜像与容器操作
本章学习日常使用频率最高的一批命令。建议边看边敲,所有例子都可以直接在你的机器上运行。
1. 镜像操作
1.1 搜索与拉取镜像
# 从 Docker Hub 拉取镜像,不写标签默认是 latest
docker pull nginx
# 推荐:明确指定版本标签
docker pull nginx:1.25
# 拉取官方 Python 镜像的精简版
docker pull python:3.12-slim
镜像名的完整格式是 仓库地址/命名空间/镜像名:标签,比如 nginx:1.25 其实是 docker.io/library/nginx:1.25 的简写。
经验:生产环境永远指定明确的版本标签,不要用
latest——今天和明天拉到的latest可能不是同一个东西。
1.2 查看与删除镜像
# 列出本地所有镜像
docker images
# 删除镜像
docker rmi nginx:1.25
# 删除所有没被任何容器使用的悬空镜像(清理磁盘常用)
docker image prune
docker images 输出说明:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.25 a8758716bb6a 3 weeks ago 187MB
python 3.12-slim af0b7f6bd087 4 weeks ago 130MB
2. 容器操作
2.1 启动容器:docker run
这是 Docker 最重要的命令,参数也最多。先看一个典型例子:
docker run -d --name my-nginx -p 8080:80 --restart unless-stopped nginx:1.25
逐个拆解:
| 参数 | 作用 |
|---|---|
-d | 后台运行(detached),不加会占住当前终端 |
--name my-nginx | 给容器起名字,不起会随机生成一个 |
-p 8080:80 | 端口映射,格式是 宿主机端口:容器端口 |
--restart unless-stopped | 容器挂了自动重启(除非是手动停止的) |
nginx:1.25 | 使用的镜像 |
其他常用参数:
# -e 设置环境变量(很多镜像靠环境变量来配置)
docker run -d --name my-mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql:8.0
# -v 挂载目录(下下章详细讲)
docker run -d --name web -p 8080:80 -v /data/html:/usr/share/nginx/html nginx:1.25
# -it 交互式运行,进入一个临时容器玩玩,--rm 表示退出后自动删除
docker run -it --rm python:3.12-slim python
2.2 查看容器
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
输出关键列:CONTAINER ID(容器 ID)、STATUS(Up 表示运行中,Exited 表示已退出)、PORTS(端口映射)、NAMES(容器名)。
2.3 启动、停止、删除
docker stop my-nginx # 停止
docker start my-nginx # 再次启动
docker restart my-nginx # 重启
docker rm my-nginx # 删除(需先停止)
docker rm -f my-nginx # 强制删除运行中的容器
# 清理所有已停止的容器
docker container prune
容器被删除后,写在容器内部的数据也一起没了。需要保留的数据必须用数据卷(第 05 章)。
3. 排查问题三板斧
容器起不来、行为不对时,按顺序用这三个命令:
3.1 看日志:docker logs
docker logs my-nginx # 输出全部日志
docker logs -f my-nginx # 实时跟踪(类似 tail -f),Ctrl+C 退出
docker logs --tail 100 my-nginx # 只看最后 100 行
3.2 进入容器:docker exec
# 在容器里开一个 shell(镜像里没有 bash 就用 sh)
docker exec -it my-nginx bash
# 不进入交互,直接执行单条命令
docker exec my-nginx cat /etc/nginx/nginx.conf
3.3 看详情:docker inspect
# 输出容器的完整配置(JSON),如 IP、挂载、环境变量
docker inspect my-nginx
# 配合 --format 提取指定字段,比如容器 IP
docker inspect --format '{{.NetworkSettings.IPAddress}}' my-nginx
4. 容器与宿主机之间拷贝文件
# 宿主机 → 容器
docker cp ./index.html my-nginx:/usr/share/nginx/html/
# 容器 → 宿主机
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf
5. 查看资源占用
# 类似 top,实时查看各容器 CPU / 内存 / 网络
docker stats
# 查看 Docker 整体磁盘占用(镜像、容器、卷各占多少)
docker system df
6. 动手练习
把下面这套流程完整走一遍:
# 1. 启动一个 Nginx,映射到 8080 端口
docker run -d --name practice -p 8080:80 nginx:1.25
# 2. 浏览器访问 http://localhost:8080 看到欢迎页
# 3. 进入容器,修改首页内容
docker exec -it practice bash
echo '<h1>Hello Docker</h1>' > /usr/share/nginx/html/index.html
exit
# 4. 刷新浏览器,看到 Hello Docker
# 5. 看一眼访问日志
docker logs practice
# 6. 收工,删除容器
docker rm -f practice
小结
- 镜像:
pull拉取、images查看、rmi删除,版本标签要写明确 - 容器:
run启动(记住-d、--name、-p、-e、-v)、ps查看、stop/rm停止删除 - 排查三板斧:
logs看日志 →exec进容器 →inspect看配置 - 容器是一次性的,重要数据不能只放在容器里
下一章学习怎么把自己的应用打包成镜像:04-Dockerfile编写