Skip to content

📒 容器技术

Docker 原理

  • 镜像构建
    • Docker 镜像构建为前后端架构:Buildx 为客户端,BuildKit 为服务端。
  • 存储
    • 默认情况
      • 位于 /var/lib/docker,卸载时不会自动清除。
      • 层次化结构,由 Image 层(只读)和 Container 层(运行时数据,可写)组成。如果需要修改 Image 层数据,采用 copy-on-write 方式。
      • 与容器强绑定,容器删除后数据也消失。
    • 持久化存储
      • Volume:
        • /var/lib/docker/volumes 下创建,不随容器消失。
        • 可以放置在远端存储。
        • 使用 docker volume 命令操作,
      • Bind mount:
        • 挂载宿主机的文件系统。
        • 允许挂载 NFS(使用 Docker 自己的 NFS 驱动,即不需要在宿主机上挂载)。
  • 网络

    • 网络对容器透明,它只能看到一个具有 IP 地址的网络接口、网关、路由表和 DNS 服务。
    • 在 Linux 上,Docker 使用 iptables 实现网络。目前有迁移到 nftables 的计划。
    • Docker 自动为 FORWARD 链添加 DROP 策略,阻止宿主机作为路由器。如果需要,应当手动添加规则。
    • 支持的网络驱动有:bridge(默认)、hostnoneoverlayipvlanmacvlan
    • bridge:部署时建议使用用户定义的 bridge 网络。
      • 默认网桥 bridge
        • 自动创建,容器默认连接到该网桥。
        • 容器间只能通过 IP 地址通信。需要使用 --link 参数在双方创建连接才能使用自动 DNS。
        • 必须停止容器才能移出默认网桥。
      • 用户定义 bridge
        • 自动 DNS 功能:容器可以使用 IP 地址或容器名相互沟通。
        • 热插拔:不需要关闭容器即可移动到其他网络。

    Compose 中的网络

    Compose 会自动为应用创建一个网络,容器可以通过服务名相互访问。

    • host
      • 端口映射不生效。
    • 端口映射:
      • Docker 使用 iptables 进行相关 NAT、PNAT 和 masquerade 操作。
      • 默认情况下所有外部主机都能访问公开端口,如果需要限制,需要自己写 iptables 规则。
      • IPv6 下可能配置为直连路由。
      • -p host:docker
    • 容器
    • 重启策略:noalwaysunless-stoppedon-failure