镜像与容器命令实操
上一篇把 Docker 装好了、看懂了三角色架构,本篇把日常 90% 场景会用到的命令一次过完。核心只有两个对象:镜像和容器。
一、镜像 vs 容器:模板与实例
延续 docker 篇的盒子比喻:
| 对象 | 类比 | 一句话 |
|---|---|---|
| 镜像(Image) | 安装光盘 / 模具 | 只读的打包模板,里面有程序+依赖+启动方式 |
| 容器(Container) | 用这张光盘装好开机的那台机器 | 镜像跑起来的实例,读写层在镜像之上 |
一张光盘可以装无数台机器——一个镜像可以同时跑 N 个容器,这是后面扩容的基础。
二、一条命令起服务:docker run
docker run -d -p 8080:80 --name my-nginx nginx
打开浏览器访问 http://localhost:8080,Nginx 欢迎页就出来了——不需要装任何依赖。拆解这条命令的每个零件:
| 零件 | 含义 |
|---|---|
-d |
detached,后台运行(不加的话日志刷满终端,Ctrl+C 容器就停) |
-p 8080:80 |
端口映射:宿主机 8080 → 容器 80。容器端口是隔离的,外面访问必须映射 |
--name my-nginx |
给容器起名(不写则随机起 angry_einstein 之类) |
nginx |
镜像名,不写 tag 默认 latest |
端口映射直觉
-p 8080:80 读作"把我的 8080 接到它的 80"。01 篇里本地跑 http-server -p 8080 是直接占宿主机端口;容器里跑的服务默认躲在盒子内,必须用 -p 开个洞——这正是再次出发组里每个服务都要配 -p 或 Tunnel 的原因。
三、日常巡视:ps / logs / exec
docker ps # 看运行中的容器
docker ps -a # 看所有容器(包括已退出的——新手最常见的"怎么起了没反应"都在这)
docker logs my-nginx # 看日志
docker logs -f my-nginx # 跟踪日志(类似 tail -f)
docker exec -it my-nginx bash # 钻进容器里开个 shell
exec -it 是排查问题的神器:进去之后就是一个独立的小 Linux(ls、cat、env 随便看),exit 退出,容器照常运行。
四、容器生命周期
flowchart LR
A[created] --> B[running]
B -- "docker stop" --> C[stopped]
C -- "docker start" --> B
B -- "docker pause" --> D[paused]
D -- "docker unpause" --> B
C -- "docker rm" --> E[deleted]
B -- "docker rm -f" --> E
对应命令全家桶:
docker stop my-nginx # 优雅停止(发 SIGTERM,等 10 秒再 SIGKILL)
docker start my-nginx # 启动已停止的容器
docker restart my-nginx # 重启
docker rm my-nginx # 删除容器(运行中要先 stop,或 rm -f)
docker rm $(docker ps -aq) # 删掉所有容器(清场用,慎跑)
删容器 ≠ 删镜像
rm 删的是容器实例,rmi 删的是镜像模板。删掉容器再 docker run 一遍就回来了——但容器里自己写过的数据也会一起没(怎么办?见数据卷篇)。
五、镜像管理
docker images # 本地镜像列表(REPOSITORY:TAG + SIZE)
docker pull nginx:1.25 # 指定版本拉取;不写 tag 默认 latest
docker rmi nginx # 删除镜像(有容器引用着会拒绝,先删容器)
docker system df # 镜像/容器/卷各占多少磁盘
docker system prune # 一键清垃圾:停止的容器、悬空镜像等(清场神技)
docker system prune 就是 01 篇结尾那句"它自我修复了 还给我莫名其妙腾出 10g"的正规解法——Docker 的临时层、悬空镜像、停用容器攒起来能吃几十 G,定期 prune 一次就清爽了。
六、一条完整实操线(5 分钟走完)
# 1. 拉镜像
docker pull nginx
# 2. 起容器(后台 + 端口映射 + 命名)
docker run -d -p 8081:80 --name lab-nginx nginx
# 3. 巡视
docker ps
# 4. 改它的首页(钻进去改)
docker exec -it lab-nginx bash
# echo "hello docker" > /usr/share/nginx/html/index.html && exit
# 5. 刷新浏览器 http://localhost:8081 —— 见证 echo 生效
# 6. 看日志
docker logs lab-nginx
# 7. 拆除现场
docker stop lab-nginx && docker rm lab-nginx
第 4→5 步有个隐藏彩蛋值得注意:改完首页刷新就生效,但 docker rm 之后再 docker run,改动消失了。容器是可以随时扔掉的,真正想留下的数据得另想办法——这个坑留到 数据卷与网络 再填。
镜像和容器的操作盘熟了,但你可能已经发现:到目前为止跑的都是别人造好的盒子。自己写的项目怎么打包成镜像?答案在下一篇:Dockerfile 构建镜像。
⬅️ 安装与核心架构 🏠 00-网络与项目 ➡️ Dockerfile 构建镜像
💬 评论