1.4 容器(Container)详解
容器(Container)是 Docker 的核心运行单元。理解容器的生命周期、操作方式、数据管理、网络设置等,是迈向 Docker 高级使用的关键。
一、什么是容器?
- 定义:容器是镜像(Image)的运行实例,本质是一个进程(或一组进程)在隔离的环境中运行。
- 特征:
- 轻量级、启动快、资源占用小
- 自带文件系统、网络、进程空间、资源限制
- 与主机高度隔离,但可以通过端口、卷等方式与主机或其它容器交互
二、容器的生命周期
- 创建(create)
- 创建但不启动容器(docker create)
- 启动(start)
- 启动已创建的容器(docker start),或一条命令完成(docker run)
- 停止(stop)
- 发送 SIGTERM 信号优雅停止
- 重启(restart)
- 停止后立即重新启动
- 挂起/恢复(pause/unpause)
- 挂起/恢复容器内所有进程
- 删除(rm)
- 停止后可以删除容器
- 自动重启策略
- 容器可设置在异常退出时自动重启(如
--restart=always
)
- 容器可设置在异常退出时自动重启(如
三、容器的基本操作命令
- 创建并启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] # 例如:docker run -d -p 8080:80 nginx
- 查看容器
docker ps # 查看运行中容器 docker ps -a # 查看所有容器(包括已退出)
- 停止/启动/重启容器
docker stop [容器ID/名] docker start [容器ID/名] docker restart [容器ID/名]
- 删除容器
docker rm [容器ID/名] docker rm -f [容器ID/名] # 强制删除
- 进入容器终端
docker exec -it [容器ID/名] /bin/bash docker attach [容器ID/名]
- 查看容器日志
docker logs [容器ID/名]
- 拷贝文件
docker cp [本地路径] [容器ID/名]:[容器路径] docker cp [容器ID/名]:[容器路径] [本地路径]
四、容器运行模式
- 前台模式(默认):容器输出与终端绑定,适合调试。
- 后台模式(-d):容器在后台运行,适合服务类应用。
五、容器的数据管理
1. 数据卷(Volumes)
- 作用:实现容器数据持久化,数据不会随容器销毁而丢失。
- 挂载方式:
- 匿名卷:
docker run -v /data busybox
- 具名卷:
docker run -v mydata:/data busybox
- 主机目录挂载:
docker run -v /host/data:/data busybox
- 匿名卷:
- 数据卷生命周期:独立于容器,容器删除后数据卷仍可复用。
2. 临时文件系统(tmpfs)
- 容器可挂载 tmpfs 文件系统,数据仅存于内存。
六、容器的网络管理
1. 网络模式
- bridge(默认):标准虚拟网桥,容器间可互访,主机端口可映射到容器。
- host:容器直接使用主机网络。
- none:无网络,完全隔离。
- container:与另一个容器共享网络命名空间。
- 自定义网络:通过
docker network
创建,支持子网、DNS、别名等。
2. 端口映射
-p [主机端口]:[容器端口]
,如-p 8080:80
。- 支持多端口、多协议、端口范围映射。
3. 容器的不同网络模式详解、配置方式与应用场景
Docker 容器的网络设计灵活多样,支持多种模式以适应开发、测试与生产等不同需求。理解每种网络模式的原理、配置方法及适用场景,是进行容器化部署和服务编排的关键基础。
3.1 Docker 支持的网络模式
1. bridge(桥接模式,默认)
- 原理:Docker 启动时会自动创建一个名为
bridge
的虚拟网桥(通常叫docker0
)。新建容器默认连接到该网桥,容器之间可互通,与主机和外部通信需端口映射。 - 配置方式:
docker run --network bridge ... # 默认,可省略
- 端口映射(容器与主机通信):
docker run -d -p 8080:80 nginx
- 自定义桥接网络(推荐,支持容器名互通/DNS):
docker network create mynet docker run --network mynet --name app1 ... docker run --network mynet --name app2 ... # 容器内可用 app1/app2 互相访问
- 应用场景:
- 多容器应用(如 Web + DB)部署在同一主机
- 需要端口映射对外提供服务
- 开发/测试环境最常用
2. host(主机模式)
- 原理:容器直接使用宿主机的网络栈,没有独立的网络命名空间。容器内服务监听的端口与主机一致,省略端口映射。
- 配置方式:
docker run --network host ...
- 注意事项:
- 端口冲突:多个容器监听同一端口会冲突(因为直接用主机网络)
- 只适用于 Linux,Windows/macOS 上无效
- 应用场景:
- 性能要求极高、网络延迟敏感的服务
- 需要广播、组播(如一些监控、网络发现服务)
- 容器与主机强关联、无安全隔离需求
3. none(无网络模式)
- 原理:容器启动时不分配任何网络资源,仅有本地回环接口(lo)。完全隔离于主机和其他容器。
- 配置方式:
docker run --network none ...
- 应用场景:
- 安全性要求极高的任务
- 纯数据计算、批处理,不需网络通信
- 需要手动配置自定义网络的场景
4. container:<name|id>(与其他容器共享网络)
- 原理:新容器与指定容器共享同一个网络命名空间,包括 IP、端口等。常用于进程监控、辅助容器等。
- 配置方式:
docker run --network container:<目标容器名或ID> ...
- 应用场景:
- 需要在主服务容器中运行辅助进程/工具(如 sidecar 模式)
- 多个进程需完全共享网络栈
5. 自定义网络(高级 bridge,overlay,macvlan 等)
a. 自定义 bridge 网络(推荐)
- 支持 DNS 互通、隔离,适合单主机多服务
- 配置方式同上
b. overlay(多主机跨节点网络,Swarm/Kubernetes)
- 原理:通过 VXLAN 隧道实现不同主机上的容器互联,需集群支持(如 Docker Swarm、K8s)。
- 配置方式:
docker network create --driver overlay myoverlay
- 应用场景:分布式服务、微服务集群、跨主机部署
c. macvlan(容器直接获得宿主机局域网 IP)
- 原理:为容器分配与主机同网段的独立 IP,像局域网内独立主机一样出现。
- 配置方式:
docker network create -d macvlan --subnet=192.168.1.0/24 \ --gateway=192.168.1.1 -o parent=eth0 mymacvlan docker run --network mymacvlan ...
- 应用场景:
- 容器需与内网其他设备平等通信(如数据库、打印机)
- 传统网络需求对容器透明(如有线办公环境)
3.2应用场景与选型建议
网络模式 | 隔离性 | 配置简单 | 性能 | 跨主机 | 场景举例 |
---|---|---|---|---|---|
bridge | 高 | 简单 | 中 | 否 | 单机多服务、开发测试 |
host | 低 | 简单 | 高 | 否 | 性能敏感、需广播/组播服务 |
none | 最高 | 简单 | - | 否 | 纯计算、安全隔离 |
container | 低 | 简单 | 与被共享容器相同 | 否 | sidecar 容器、进程监控 |
overlay | 高 | 需集群 | 中 | 是 | 多主机集群、云原生微服务 |
macvlan | 低 | 需配置 | 高 | 否 | 容器需内网独立 IP、大型企业网 |
3.3 常用网络配置命令
- 查看所有网络
docker network ls
- 检查网络详情
docker network inspect <网络名>
- 删除网络
docker network rm <网络名>
- 为已启动容器加入网络
docker network connect <网络名> <容器名> docker network disconnect <网络名> <容器名>
3.4最佳实践
- 多服务单主机推荐用自定义 bridge 网络,便于服务发现与隔离。
- 生产环境分布式部署采用 overlay 网络(需 Docker Swarm/K8s 支持)。
- 性能/网络需求特殊时考虑 host 或 macvlan 模式。
- 合理规划端口映射,避免冲突。
- 避免滥用 host 模式,降低安全风险。
七、容器资源限制
- CPU 限制:
--cpus
、--cpu-shares
- 内存限制:
-m
或--memory
- 磁盘 IO 限制:
--device-read-bps
、--device-write-bps
- ulimit 资源限制:对文件数、进程数等进行限制
八、容器互联与互操作
- link(已过时):早期容器互联方式。
- 网络互通:推荐使用自定义网络实现服务间通信与 DNS 解析。
- 环境变量、依赖启动:可通过
--env
或 Compose 的depends_on
管理。
九、容器的元数据与调试
- 查看容器详细信息
docker inspect [容器ID/名]
- 查看容器文件系统变更
docker diff [容器ID/名]
- 实时监控
docker stats
十、容器常见问题与排查
- 端口未映射:检查
-p
参数。 - 数据未持久化:未正确挂载数据卷。
- 权限问题:主机与容器用户/组不一致。
- 资源瓶颈:合理配置 CPU/内存限制。
十一、容器的安全与隔离
- 用户权限:避免使用 root 用户运行应用。
- 命名空间隔离:进程、网络、挂载、IPC、UTS、用户等空间隔离。
- 能力控制:通过
--cap-drop/--cap-add
精细化权限。 - 安全模块:支持 seccomp、AppArmor、SELinux 加强安全。
十二、容器的自动化与守护
- 自动重启:
--restart=always|on-failure|unless-stopped
- 健康检查:
--health-cmd
,用于自动检测服务运行状况
十三、最佳实践
- 只运行一个主进程(PID 1),不建议在一个容器内运行多个服务。
- 使用数据卷管理数据,避免将重要数据仅存于容器内。
- 定期清理无用容器,合理设置日志轮转。
十四、常用命令速查
docker run -d -p 80:80 --name web nginx # 后台运行 nginx、端口映射
docker exec -it web bash # 进入容器终端
docker stop/start/restart/rm 容器ID或名 # 管理容器生命周期
docker logs -f web # 实时查看容器日志
docker ps -a # 查看所有容器
docker inspect web # 查看容器详细信息
docker cp web:/etc/nginx/nginx.conf ./ # 拷贝文件到本地