Docker 的文档铺天盖地,但初学者真正需要建立的只是一张对象关系图:镜像(Image)是模板,容器(Container)是模板的运行实例,数据卷(Volume)让数据活下来,网络(Network)让容器互相找到对方。 本文围绕这四个对象展开。
镜像与容器:类与实例的关系
镜像是一个只读的、分层的文件系统快照,里面打包了应用及其全部依赖。容器是从镜像启动的进程,拥有自己的文件系统视图(在镜像之上加一层可写层)、进程空间、网络空间。
一个镜像可以启动多个互不干扰的容器,就像一个类可以 new 出多个实例:
docker run -d --name web1 -p 8081:80 nginxdocker run -d --name web2 -p 8082:80 nginx两条命令用同一个 nginx 镜像起了两个独立容器,分别映射到宿主机 8081、8082。
docker run 的关键参数:
| 参数 | 作用 |
|---|---|
-d | 后台运行(detached) |
--name | 给容器命名,否则随机生成 |
-p 宿主端口:容器端口 | 端口映射 |
-e KEY=VALUE | 注入环境变量 |
-v 卷名或路径:容器内路径 | 挂载数据 |
--restart unless-stopped | 崩溃或重启后自动拉起 |
容器生命周期操作
docker ps # 运行中的容器docker ps -a # 包括已停止的docker stop web1 # 优雅停止(先发 SIGTERM)docker start web1 # 重新启动docker restart web1 # 重启docker rm web1 # 删除已停止的容器docker rm -f web1 # 强制删除运行中的(慎用)排错三件套,记牢:
docker logs -f web1 # 看容器标准输出(应用日志都该打到这里)docker exec -it web1 sh # 进容器里看看docker inspect web1 # 查看容器全部配置(IP、挂载、环境变量)数据持久化:三种挂载
容器删了,可写层里的数据就没了。需要持久化的数据必须挂载出来:
1. 命名卷(Volume,推荐)——由 Docker 管理存储位置:
docker volume create pgdatadocker run -d --name db -v pgdata:/var/lib/postgresql/data postgres:162. 绑定挂载(Bind Mount)——直接映射宿主机路径,开发时常用:
docker run -d --name app -v /opt/myapp/config:/app/config myapp3. tmpfs——只存在于内存,容器停即消失,适合敏感临时数据。
选择原则:生产数据用命名卷(可备份、可迁移);需要宿主机直接读写的配置用绑定挂载。
容器网络:三种常用模式
bridge(默认):Docker 建一个虚拟网桥 docker0,每个容器分配独立 IP。同网桥上的容器可以互相通信,配合 --link 已废弃的旧做法不同,现在用自定义网络实现服务发现:
docker network create appnetdocker run -d --name db --network appnet postgres:16docker run -d --name app --network appnet myapp# app 容器里可以直接用主机名 "db" 访问数据库自定义网络内置 DNS,容器名即主机名——这是多容器应用的标准做法。
host:容器直接用宿主机网络栈,没有隔离也没有端口映射,性能最好。适合对网络性能敏感的组件,但端口冲突要自己管。
none:完全断网,只留回环口,用于批量计算任务。
镜像管理的日常
docker images # 本地镜像列表docker pull redis:7 # 拉取指定 tagdocker build -t myapp:1.0 . # 用当前目录 Dockerfile 构建docker tag myapp:1.0 reg.example.com/myapp:1.0 # 打私仓标签docker push reg.example.com/myapp:1.0docker system prune # 清理停止的容器、悬空镜像、未用网络磁盘空间告警时,docker system df 先看占用分布,再决定 prune 范围(加 -a 连未使用的镜像一起删,下手前确认)。
延伸阅读
分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
换条路线
从其他文章中稳定抽取
最后更新于 ,距今已过 8 天
部分内容可能已过时