本文要点
- 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:alpine、python: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 exec、docker stop、docker 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/)
评论 (0)
暂无评论,快来抢沙发吧!