第 3 章:镜像与容器 —— Docker 的核心"积木"¶
场景: 你已经运行了
hello-world和 Nginx 容器。但你可能会问:这些镜像是从哪来的?容器停止后数据还在吗?怎么进入容器内部看看?本章将深入镜像与容器的核心操作——这是 Docker 日常使用中最频繁的技能。
3.1 镜像(Image)—— 容器的"蓝图"¶
核心比喻:镜像就像饼干模具,容器就像饼干
你有一个星星形状的饼干模具(镜像)。用这个模具在面团上按一下,就做出一块星星饼干(容器)。同一个模具可以做出无数块一模一样的饼干。模具本身不会被消耗——它只是模板。
镜像 = 只读模板,容器 = 镜像的运行实例。
搜索和拉取镜像¶
# 在 Docker Hub 上搜索镜像
docker search mysql
# 拉取镜像(默认拉取 latest 标签)
docker pull nginx
# 拉取指定版本的镜像
docker pull nginx:1.25
docker pull python:3.11-slim
docker pull node:18-alpine
镜像标签(Tag)
镜像标签用于区分不同版本。格式为 镜像名:标签。
nginx:latest— 最新稳定版nginx:1.25— 指定大版本nginx:1.25.3— 精确版本python:3.11-slim— 精简版(体积更小)python:3.11-alpine— 基于 Alpine Linux 的超精简版
查看和管理镜像¶
# 列出本地所有镜像
docker images
# 或者使用更详细的命令
docker image ls
# 查看镜像详细信息
docker image inspect nginx
# 查看镜像历史(每一层的构建信息)
docker image history nginx
# 删除镜像
docker rmi nginx:latest
# 强制删除(即使有容器在使用)
docker rmi -f nginx:latest
# 清理无用的镜像(悬空镜像)
docker image prune
docker images 输出示例:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 weeks ago 141MB
python 3.11-slim 1e6f2e3b3b3b 3 weeks ago 122MB
hello-world latest d2c94e258dcb 8 months ago 13.3kB
| 列 | 含义 |
|---|---|
| REPOSITORY | 镜像仓库名 |
| TAG | 标签(版本) |
| IMAGE ID | 镜像唯一标识 |
| CREATED | 创建时间 |
| SIZE | 镜像大小 |
3.2 容器(Container)—— 镜像的"实例"¶
创建和启动容器¶
# 基本运行(前台模式)
docker run nginx
# 后台运行
docker run -d nginx
# 后台运行 + 端口映射 + 命名
docker run -d -p 8080:80 --name web nginx
# 交互式运行(进入容器内部)
docker run -it ubuntu bash
# 运行后自动删除(用于临时任务)
docker run --rm ubuntu echo "Hello"
docker run 常用参数速查:
| 参数 | 全称 | 作用 |
|---|---|---|
-d |
--detach |
后台运行 |
-p |
--publish |
端口映射 本机:容器 |
--name |
给容器命名 | |
-it |
--interactive --tty |
交互式终端 |
--rm |
容器退出后自动删除 | |
-e |
--env |
设置环境变量 |
-v |
--volume |
挂载数据卷 |
--restart |
重启策略 |
查看容器¶
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 只显示容器 ID
docker ps -q
# 查看最新创建的容器
docker ps -l
# 查看容器资源使用情况
docker stats
docker ps 输出示例:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 nginx "/docker-entrypoint.…" 5 minutes ago Up 5 minutes 0.0.0.0:8080->80/tcp web
容器生命周期管理¶
# 停止容器
docker stop web
# 启动已停止的容器
docker start web
# 重启容器
docker restart web
# 暂停容器(冻结进程)
docker pause web
docker unpause web
# 强制停止(相当于 kill -9)
docker kill web
# 删除已停止的容器
docker rm web
# 强制删除运行中的容器
docker rm -f web
# 删除所有已停止的容器
docker container prune
3.3 进入容器内部¶
# 方法 1:在运行中的容器里执行命令
docker exec -it web bash
# 方法 2:以 root 用户进入
docker exec -it -u root web bash
# 方法 3:执行单条命令(不进入交互模式)
docker exec web ls /usr/share/nginx/html
docker exec web cat /etc/nginx/nginx.conf
核心比喻:docker exec 就像走进集装箱里检查货物
集装箱在码头上运行着(容器在运行),你想看看里面的货物是否完好。docker exec 就是打开集装箱的门,走进去看看——你可以查看文件、修改配置、安装工具,但注意:容器重启后这些修改会丢失(除非你把它写进镜像)。
3.4 查看日志和调试¶
# 查看容器日志
docker logs web
# 实时跟踪日志(类似 tail -f)
docker logs -f web
# 查看最近 50 行日志
docker logs --tail 50 web
# 查看带时间戳的日志
docker logs -t web
# 查看容器详细信息(IP 地址、挂载点、环境变量等)
docker inspect web
# 查看容器内进程
docker top web
# 查看容器资源使用统计
docker stats web
3.5 文件复制¶
# 从宿主机复制文件到容器
docker cp index.html web:/usr/share/nginx/html/
# 从容器复制文件到宿主机
docker cp web:/etc/nginx/nginx.conf ./nginx.conf
# 验证文件已复制
docker exec web ls /usr/share/nginx/html/
3.6 综合练习:操作一个 Nginx 容器¶
# 1. 拉取 Nginx 镜像
docker pull nginx:alpine
# 2. 创建并启动容器
docker run -d -p 8080:80 --name my-web nginx:alpine
# 3. 查看容器状态
docker ps
# 4. 查看日志
docker logs my-web
# 5. 进入容器查看默认页面
docker exec my-web cat /usr/share/nginx/html/index.html
# 6. 创建一个自定义页面
echo "<h1>Hello from Docker!</h1>" > index.html
# 7. 复制到容器中
docker cp index.html my-web:/usr/share/nginx/html/
# 8. 验证:浏览器访问 http://localhost:8080
# 9. 查看容器详细信息
docker inspect my-web | grep IPAddress
# 10. 停止并删除容器
docker stop my-web
docker rm my-web
要点总结¶
- 镜像 = 只读模板,容器 = 镜像的运行实例
-
docker pull拉取镜像,docker images查看本地镜像 -
docker run -d -p 8080:80 --name xxx nginx启动容器 -
docker ps查看运行中的容器,docker ps -a查看所有 -
docker stop/start/restart/rm管理容器生命周期 -
docker exec -it xxx bash进入容器内部 -
docker logs查看日志,docker cp复制文件 - 标签(Tag)区分镜像版本,
latest是默认标签
课后练习¶
-
镜像探索 :拉取
python:3.11-slim和python:3.11-alpine,对比它们的大小差异。 -
容器操作 :运行一个 Ubuntu 容器,进入内部安装
curl,然后退出并删除容器。 -
日志调试 :运行一个 Nginx 容器,访问几次页面,然后用
docker logs查看访问日志。
下一章预告: 从 Docker Hub 拉取现成的镜像很方便,但真正的威力在于构建自己的镜像。第 4 章将学习 Dockerfile——镜像的"配方说明书"。