暗色模式

Docker 容器管理:从镜像拉取到容器生命周期与数据卷

技术教程
2026-08-31
5
0
本文要点
  • Docker 的核心概念:镜像(image)是只读模板,容器(container)是镜像的运行实例;容器可以反复创建、销毁,互不影响。
  • 拉镜像用 docker pull 镜像名:标签,看本地镜像用 docker images,看运行中的容器用 docker ps
  • 运行容器一条命令搞定:docker run -d --name web-demo -p 8081:80 nginx:alpine,其中 -d 后台运行、-p 做端口映射、--name 起名字。
  • 数据卷用 -v 宿主机目录:容器内目录 挂载,宿主机改文件、容器里立即生效,是"改配置/换文件不用进容器"的常用做法。
  • 进容器执行命令用 docker exec 容器名 命令;排查问题先看 docker logs 容器名,删除容器用 docker rm -f 容器名

为什么需要 Docker

部署软件最头疼的是环境差异:本机能跑,服务器上装不上依赖;换台机器又缺系统库。Docker 把应用连同它的运行环境一起打包成镜像,在任何装有 Docker 的 Linux 上都能以容器的形式一键跑起来。

两个核心概念要分清:

  • 镜像(image):只读的"安装包",包含应用代码、依赖、系统库和启动命令。可以共享、版本管理、从仓库拉取;
  • 容器(container):镜像的运行实例。容器在镜像之上加一层可写层,随用随建、删除即消失,互不干扰。

日常工作就是围绕这两个概念:拉镜像 → 跑容器 → 管理生命周期。下面在装有 Docker 29.1.3 的 Ubuntu 24.04 上实测,用 nginx 容器完整演示一遍。

镜像管理:查看与拉取

先看本地已经有哪些镜像:

docker images

查看本地镜像

每行一个镜像,字段分别是镜像名与标签、镜像 ID、磁盘占用。截图里这台机器已经缓存了 nginx:alpinepython:3.12-slim 等常用镜像,还有 hello-world 这种只有 25.9kB 的最小测试镜像。

本地没有的镜像用 pull 拉取,标签缺省默认 latest

docker pull nginx:alpine

Docker Hub 拉取 nginx:alpine(alpine 是极简 Linux 发行版,镜像只有 27MB 左右)。国内网络环境下拉取慢或失败时,可以配置镜像加速器(registry mirror),原理是让 Docker 从国内镜像站拉取。

运行容器:run、端口映射与数据卷

拉好镜像,用 docker run 创建并启动容器。这条命令一次完成"创建 + 启动 + 端口映射 + 挂载数据卷":

docker run -d --name web-demo -p 8081:80 -v /srv/web-data:/usr/share/nginx/html nginx:alpine && docker ps

运行容器

逐段拆解参数:

  • -d(detach):后台运行,不占住当前终端(去掉则前台运行,Ctrl+C 会停掉容器);
  • --name web-demo:给容器命名,之后 docker execdocker stopdocker rm 都可以用名字指代,比用容器 ID 好记;
  • -p 8081:80:端口映射,宿主机端口:容器内端口。nginx 在容器内监听 80,映射后访问宿主机的 8081 就是访问容器里的 80;
  • -v /srv/web-data:/usr/share/nginx/html数据卷,把宿主机目录挂载进容器。/usr/share/nginx/html 是 nginx 的网站根目录,挂载后这个目录的内容完全由宿主机侧文件决定;
  • nginx:alpine:用哪个镜像创建。

输出第一行是容器的完整 ID(docker ps 里显示前 12 位)。下面 docker ps 列出所有运行中的容器:刚创建的 web-demo 状态是 Up,端口列显示 0.0.0.0:8081->80/tcp,正是我们映射的规则。截图里还看到一个更早创建的 web-bench 容器占着 8080 端口,互不影响。

进入容器与验证数据卷

容器在跑,怎么确认里面真的生效了?两种方式:进入容器执行命令,或者直接从宿主机请求服务:

docker exec web-demo ls -l /usr/share/nginx/html && curl -s http://127.0.0.1:8081/

进入容器并验证数据卷

  • docker exec 容器名 命令:在运行中的容器里执行命令,相当于"进入容器操作"。这里执行 ls -l 看网站根目录,输出里只有一个 index.html(85 字节)——这个文件是先在宿主机 /srv/web-data/ 里创建好的,挂载后容器里直接看得到;
  • curl http://127.0.0.1:8081/:从宿主机请求映射出来的端口,返回的就是宿主机写的那份自定义 HTML。宿主机改文件、容器立即生效,这正是数据卷的价值——改配置、换页面都不用进容器重来一遍。

如果只想交互式进容器,用 docker exec -it web-demo sh(nginx 镜像是精简系统,通常没有 bash,用 sh)。容器进程的输出用 docker logs web-demo 查看,和 journalctl 看服务日志是同一个思路。

停止、重启与删除

容器管理的其他常用操作:

docker stop web-demo    # 停止(发送 SIGTERM,可优雅退出)
docker start web-demo   # 重新启动已存在的容器
docker restart web-demo # 重启
docker rm web-demo      # 删除容器(需先停止)
docker rm -f web-demo   # 强制删除运行中的容器
docker ps -a            # 列出所有容器(含已停止的)

几个细节:

  • stop 先发 SIGTERM 给主进程,超时(默认 10 秒)才 SIGKILL 强杀;个别服务需要 docker stop -t 60 延长宽限期;
  • 删除容器不等于删除镜像。容器删除后镜像还在,docker images 依然能查到;想清掉不再使用的镜像用 docker rmi 镜像名
  • docker ps -a 里能看到 Exited 状态的旧容器,占着名字和少量磁盘,长期不用的清理掉即可。

常用 docker 命令速查

命令作用
docker images列出本地镜像
docker pull 镜像:标签从仓库拉取镜像
docker run -d --name 名字 -p 端口:端口 镜像后台运行容器并映射端口
docker ps / docker ps -a列出运行中 / 所有容器
docker exec 容器 命令在容器内执行命令
docker logs 容器查看容器输出日志
docker stop/start/restart 容器停止 / 启动 / 重启
docker rm -f 容器强制删除容器
docker rmi 镜像删除镜像

小结

Docker 日常使用就记一条主线:docker pull 拿镜像 → docker run 起容器 → docker ps 看状态 → docker exec/logs 排障 → docker stop/rm 收尾。配合 -p 做端口映射、-v 挂数据卷,nginx、数据库、后端服务这类常规部署基本都能覆盖。等镜像多了、部署复杂了,再引入 docker-compose 用声明式文件管理多容器,就属于下一步的进阶内容了。

参考:Docker 官方 CLI 文档(https://docs.docker.com/reference/cli/docker/)docker run 参考(https://docs.docker.com/reference/cli/docker/container/run/)

发表评论

暂无评论,快来抢沙发吧!