容器(Container)详解——AI教你学Docker

1.4 容器(Container)详解

容器(Container)是 Docker 的核心运行单元。理解容器的生命周期、操作方式、数据管理、网络设置等,是迈向 Docker 高级使用的关键。

一、什么是容器?

  • 定义:容器是镜像(Image)的运行实例,本质是一个进程(或一组进程)在隔离的环境中运行。
  • 特征
    • 轻量级、启动快、资源占用小
    • 自带文件系统、网络、进程空间、资源限制
    • 与主机高度隔离,但可以通过端口、卷等方式与主机或其它容器交互

二、容器的生命周期

  1. 创建(create)
    • 创建但不启动容器(docker create)
  2. 启动(start)
    • 启动已创建的容器(docker start),或一条命令完成(docker run)
  3. 停止(stop)
    • 发送 SIGTERM 信号优雅停止
  4. 重启(restart)
    • 停止后立即重新启动
  5. 挂起/恢复(pause/unpause)
    • 挂起/恢复容器内所有进程
  6. 删除(rm)
    • 停止后可以删除容器
  7. 自动重启策略
    • 容器可设置在异常退出时自动重启(如 --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 ./            # 拷贝文件到本地
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值