【第10期】Docker 基础实战:镜像、容器、端口、卷和日志到底是什么
【第10期】小蓝伞的 Docker 基础实战:镜像、容器、端口、卷、网络和日志一次讲透
系列:《从小白到 AI 大模型开发工程师的进阶之路》
技术点:AI-0010 Docker 基础
主人公:小蓝伞先说结论
Docker 不是“把程序压缩成一个文件”,而是用镜像描述运行环境,用容器启动隔离进程,用端口暴露服务,用卷保存容器之外仍需保留的数据。掌握这四句话,就能读懂大多数 Docker 入门命令。
本文假设 Docker Desktop 已经可用。以下命令是学习示例,请在自己的开发环境中执行并验证;不要把示例输出当作已经在你的电脑上实测成功。
一、镜像和容器到底差在哪
概念 正确理解 常见误解 镜像 image 只读、分层的运行模板 镜像本身就是正在运行的程序 容器 container 从镜像启动的运行实例 删除容器也不会影响其中数据 端口映射 宿主机端口转发到容器端口 容器端口会自动对外公开 卷 volume Docker 管理的持久化存储 容器文件天然永久保存 镜像像菜谱,容器像按菜谱做出来的一盘菜;端口是餐厅窗口,卷是不会随盘子一起倒掉的仓库。小蓝伞提醒:盘子可以重做,仓库的数据不能靠运气保存。
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,但重启策略不等于健康检查,也不能替代监控和告警。六、五类高频故障
- 端口被占用:执行
Get-NetTCPConnection -LocalPort 8080 -ErrorAction SilentlyContinue,换宿主机端口或停止明确确认过的占用进程。- 容器名冲突:
docker ps -a找到旧容器;确认数据已持久化后删除,或使用新名称。- 容器秒退:先看
docker ps -a,再看docker logs 容器名,不要只看镜像是否下载成功。- 数据丢失:检查是否使用卷或绑定挂载;只依赖容器可写层不适合保存重要数据。
- 镜像拉取失败:检查网络、镜像标签和仓库权限;不要把来路不明的镜像源写进团队配置。
七、面试题
1. 镜像和容器的关系?镜像是只读模板,容器是镜像启动后的实例;同一镜像可以启动多个容器。
2.
-p 8080:80如何理解?宿主机 8080 映射到容器 80;容器应用仍监听 80,外部访问宿主机 8080。3. 为什么需要卷?容器生命周期短,卷把数据放到独立存储中,支持重建和升级后继续使用。
4.
docker stop与docker rm区别?stop停止主进程,rm删除容器元数据和可写层;删除前必须确认数据已持久化。5. 容器内
localhost指向哪里?指向当前容器自身,不等于宿主机或其他容器。八、本期小结
Docker 的价值不在于让命令变多,而在于明确“运行环境、服务生命周期、网络边界和数据归属”。下一期学习 WSL2 与 Docker Desktop,解释 Windows、Linux 子系统和 Docker 引擎之间的边界。
点个关注不迷路,继续跟着小蓝伞把 AI 开发环境搭得既能跑、又可复现。工具让启动更快,理解让系统更稳;每一次认真验证,都是从小白走向 AI 工程师的一小步。
官方资料
- Docker:What is a container?
- Docker:Volumes
- Docker:Networking overview
- Docker CLI reference
