【第10期】小蓝伞的 Docker 基础实战:镜像、容器、端口、卷、网络和日志一次讲透

系列:《从小白到 AI 大模型开发工程师的进阶之路》
技术点:AI-0010 Docker 基础
主人公:小蓝伞

先说结论

Docker 不是“把程序压缩成一个文件”,而是用镜像描述运行环境,用容器启动隔离进程,用端口暴露服务,用卷保存容器之外仍需保留的数据。掌握这四句话,就能读懂大多数 Docker 入门命令。

本文假设 Docker Desktop 已经可用。以下命令是学习示例,请在自己的开发环境中执行并验证;不要把示例输出当作已经在你的电脑上实测成功。

一、镜像和容器到底差在哪

概念正确理解常见误解
镜像 image只读、分层的运行模板镜像本身就是正在运行的程序
容器 container从镜像启动的运行实例删除容器也不会影响其中数据
端口映射宿主机端口转发到容器端口容器端口会自动对外公开
卷 volumeDocker 管理的持久化存储容器文件天然永久保存

镜像像菜谱,容器像按菜谱做出来的一盘菜;端口是餐厅窗口,卷是不会随盘子一起倒掉的仓库。小蓝伞提醒:盘子可以重做,仓库的数据不能靠运气保存。

Docker 客户端把命令交给 Docker daemon;daemon 负责拉取镜像、创建容器、配置网络和存储。理解这条链路后,遇到问题就能区分是命令端、镜像、容器进程还是网络出了问题。

二、最小实践:运行一个 Nginx 服务

docker version
docker pull nginx
docker image ls
docker run --name hello-nginx -d -p 8080:80 nginx
docker ps
docker port hello-nginx
Invoke-WebRequest http://localhost:8080 -UseBasicParsing | Select-Object -ExpandProperty StatusCode

-d 表示后台运行,--name 固定容器名,-p 8080:80 表示把宿主机 8080 转发到容器内监听的 80。若最后返回 200,才说明服务进程、端口映射和 HTTP 访问三者都已打通。

为什么不只看 docker ps?容器在运行只能证明主进程没有退出,并不能证明应用端口可访问。为什么不只在浏览器看页面?浏览器缓存、代理和跳转也可能干扰判断。命令行状态码是更可重复的验证方式。

三、容器生命周期:先查状态,再查日志

docker ps
docker ps -a
docker logs --tail 100 hello-nginx
docker inspect hello-nginx
docker stop hello-nginx
docker start hello-nginx
docker restart hello-nginx

docker ps 只显示运行中容器,已退出容器要用 docker ps -a 找。服务访问失败时,按“容器是否存在 → 是否运行 → 日志是否报错 → 端口是否映射 → 应用是否监听”的顺序排查,远比重装 Docker 更有效。

进入容器应主要用于检查:

docker exec -it hello-nginx sh
cat /etc/os-release
exit

不建议把手工改容器内部文件当作部署方案。容器重建后,修改通常会消失;可重复的改动应写进 Dockerfile,需保留的数据应写进卷。

四、卷:容器删了,数据还能不能在

下面用 Nginx 首页验证命名卷的持久化。请先确保 8081 未被占用。

docker volume create nginx-html
docker run --name nginx-volume -d -p 8081:80 -v nginx-html:/usr/share/nginx/html nginx
docker exec nginx-volume sh -c 'echo "hello from volume" > /usr/share/nginx/html/index.html'
Invoke-WebRequest http://localhost:8081 -UseBasicParsing | Select-Object -ExpandProperty Content
docker rm -f nginx-volume
docker run --name nginx-volume-2 -d -p 8081:80 -v nginx-html:/usr/share/nginx/html nginx
Invoke-WebRequest http://localhost:8081 -UseBasicParsing | Select-Object -ExpandProperty Content

第二个容器仍能看到页面,才证明数据放进了卷,而不是容器可写层。卷适合数据库、向量索引和模型缓存;临时数据是否持久化,要按恢复要求决定。docker volume rm nginx-html 是不可逆清理动作,删除前先确认不含重要数据。

命名卷与绑定挂载怎么选

命名卷由 Docker 管理,跨环境迁移更明确,适合服务数据;绑定挂载把宿主机目录映射进去,适合本地开发时把代码实时提供给容器。Windows 路径挂载尤其需要验证权限和共享设置,不能照搬 Linux 路径。

五、网络、日志与重启策略

默认 bridge 网络允许容器联网,但容器里的 localhost 指向容器自己,不是宿主机,也不是另一个容器。多个服务协作时,应创建自定义网络,用容器名作为服务地址:

docker network create ai-demo-net
docker run --name demo-nginx --network ai-demo-net -d nginx
docker network inspect ai-demo-net
docker logs --tail 100 demo-nginx

服务日志优先输出到标准输出和标准错误,docker logs 才能成为第一排查入口。长期服务可考虑 --restart unless-stopped,但重启策略不等于健康检查,也不能替代监控和告警。

六、五类高频故障

  1. 端口被占用:执行 Get-NetTCPConnection -LocalPort 8080 -ErrorAction SilentlyContinue,换宿主机端口或停止明确确认过的占用进程。
  2. 容器名冲突docker ps -a 找到旧容器;确认数据已持久化后删除,或使用新名称。
  3. 容器秒退:先看 docker ps -a,再看 docker logs 容器名,不要只看镜像是否下载成功。
  4. 数据丢失:检查是否使用卷或绑定挂载;只依赖容器可写层不适合保存重要数据。
  5. 镜像拉取失败:检查网络、镜像标签和仓库权限;不要把来路不明的镜像源写进团队配置。

七、面试题

1. 镜像和容器的关系? 镜像是只读模板,容器是镜像启动后的实例;同一镜像可以启动多个容器。

2. -p 8080:80 如何理解? 宿主机 8080 映射到容器 80;容器应用仍监听 80,外部访问宿主机 8080。

3. 为什么需要卷? 容器生命周期短,卷把数据放到独立存储中,支持重建和升级后继续使用。

4. docker stopdocker rm 区别? stop 停止主进程,rm 删除容器元数据和可写层;删除前必须确认数据已持久化。

5. 容器内 localhost 指向哪里? 指向当前容器自身,不等于宿主机或其他容器。

八、本期小结

Docker 的价值不在于让命令变多,而在于明确“运行环境、服务生命周期、网络边界和数据归属”。下一期学习 WSL2 与 Docker Desktop,解释 Windows、Linux 子系统和 Docker 引擎之间的边界。

点个关注不迷路,继续跟着小蓝伞把 AI 开发环境搭得既能跑、又可复现。工具让启动更快,理解让系统更稳;每一次认真验证,都是从小白走向 AI 工程师的一小步。

官方资料

 

更多推荐