镜像与容器命令实操

上一篇把 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(lscatenv 随便看),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 构建镜像