--- title: "04-镜像与容器命令实操" created: 2026-09-01 tags: - 项目筑基 --- # 镜像与容器命令实操 上一篇把 Docker 装好了、看懂了三角色架构,本篇把日常 90% 场景会用到的命令一次过完。核心只有两个对象:**镜像**和**容器**。 ## 一、镜像 vs 容器:模板与实例 延续 [[01-docker|docker]] 篇的盒子比喻: | 对象 | 类比 | 一句话 | | --- | --- | --- | | 镜像(Image) | 安装光盘 / 模具 | 只读的打包模板,里面有程序+依赖+启动方式 | | 容器(Container) | 用这张光盘装好开机的那台机器 | 镜像跑起来的实例,读写层在镜像之上 | 一张光盘可以装无数台机器——**一个镜像可以同时跑 N 个容器**,这是后面扩容的基础。 ## 二、一条命令起服务:docker run ```bash 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` | > [!tip] 端口映射直觉 > `-p 8080:80` 读作"把我的 8080 接到它的 80"。01 篇里本地跑 `http-server -p 8080` 是直接占宿主机端口;容器里跑的服务默认躲在盒子内,必须用 `-p` 开个洞——这正是再次出发组里每个服务都要配 `-p` 或 Tunnel 的原因。 ## 三、日常巡视:ps / logs / exec ```bash 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` 退出,容器照常运行。 ## 四、容器生命周期 ```mermaid 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 ``` 对应命令全家桶: ```bash 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) # 删掉所有容器(清场用,慎跑) ``` > [!warning] 删容器 ≠ 删镜像 > `rm` 删的是容器实例,`rmi` 删的是镜像模板。删掉容器再 `docker run` 一遍就回来了——但容器里自己写过的数据也会一起没(怎么办?见数据卷篇)。 ## 五、镜像管理 ```bash 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 分钟走完) ```bash # 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`,改动消失了**。容器是可以随时扔掉的,真正想留下的数据得另想办法——这个坑留到 [[06-数据卷与网络|数据卷与网络]] 再填。 --- 镜像和容器的操作盘熟了,但你可能已经发现:到目前为止跑的都是**别人造好的盒子**。自己写的项目怎么打包成镜像?答案在下一篇:[[05-Dockerfile-构建镜像|Dockerfile 构建镜像]]。 --- ⬅️ [[03-安装与核心架构|安装与核心架构]] 🏠 [[00-网络与项目|00-网络与项目]] ➡️ [[05-Dockerfile-构建镜像|Dockerfile 构建镜像]]