• Docker Networking


    Container Networking

    Container Networking是指容器相互连接和通信的能力,或者与非docker工作负载进行通信的能力。

    默认创建容器是不会对外暴露任何端口的,除非使用-p选项指定,直接默认发布端口是不安全,相当于所有主机都可以访问。所以如果需要使容器互相通信,正常不需要发布容器的端口。而是通过将容器连接到相同的网络(通常是桥接网络),可以实现容器间通信。

    • IP和HostName:默认情况下,容器从连接的Docker network获取IP地址。容器从network的IP子网中接收IP地址,Docker守护进程为容器执行动态子网划分和IP地址分配。每个网络也有一个默认的子网掩码和网关。容器hostname默认为容器id

    • DNS:默认,容器继承宿主机的DNS解析,定义在/etc/resolv.conf。(/etc/hosts没有继承)

    Network Drivers

    • bridge:默认的网络驱动。当应用程序需要与同一主机上的其他容器通信的容器中运行时,通常使用桥接网络。
    • host:取消容器和Docker主机之间的网络隔离,直接使用主机的网络。
    • overlay:用于将多个Docker守护进程连接在一起,并使Swarm服务和容器能够跨节点通信。
    • ipvlan:IPvlan网络允许用户完全控制IPv4和IPv6寻址。
    • macvlan:Macvlan网络允许您为容器分配MAC地址,使其在网络上显示为物理设备。Docker守护进程根据容器的MAC地址将流量路由到容器。当处理期望直接连接到物理网络而不是通过Docker主机的网络堆栈路由的遗留应用程序时,使用macvlan驱动程序有时是最佳选择
    • none:将容器与主机和其他容器完全隔离
    • 网络插件:可以使用第三方的网络插件

    bridge

    bridge网络是一种Link Layer device,用于转发网段的流量。它可以是运行在主机内核中的硬件设备或软件设备。
    桥接网络适用于运行在同一Docker守护进程主机上的容器。它允许连接到同一桥接网络的容器进行通信,同时提供与未连接到该桥接网络的容器的隔离
    启动docker时,会创建一个默认的桥接网络,新的容器会默认连接到它。

    #创建网络
    docker network create my-net
    
    #删除网络
    docker network rm my-net
    
    #启动一个容器并加入my-net网络
    docker create --name my-nginx \
      --network my-net \
      --publish 8080:80 \
      nginx:latest
    
     #将运行的容器my-nginx加入my-net网络
     docker network connect my-net my-nginx
     #将运行的容器my-nginx断开my-net网络
     docker network disconnect my-net my-nginx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    host

    容器共享主机的网络命名空间,并且容器不会获得自己的ip地址分配。

    overlay

    overlay 网络驱动会在多个docker进程主机创建一个分布式网络

    当初始化swarm服务或将docker主机加入到现有服务时,每台docker主机上会创建两个新的网络:

    • 叫做ingress的overlay网络:处理与集群相关的控制和数据流量。创建swarm服务时没有连接到自定义的overlay网络,默认会连接到ingress网络
    • 叫做docker_gwbridge的bridge网络:用于将本机的docker进程连接到swarm服务中的其他进程

    docker守护进程使用overlay网络防火墙设置需要为参与overlay网络的每个Docker主机的流量打开以下端口:

    • TCP 2377端口:集群管理
    • TCP/UDP 7946:节点间通信
    • UDP 4789:overlay网络流量
      在创建overlay网络之前,需要使用docker swarm init初始化docker守护进程(作为swarm manager)或使用docker swarm join加入现有的swarm服务。这两种方式都会创建默认的ingress overlay网络,即使不使用swarm服务也需要这样做。
     #创建overlay网络
     docker network create -d overlay my-overlay
     #--attachable可以让swarm服务和独立容器的overlay网络与其他docker主机上的容器通信
     docker network create -d overlay --attachable my-attachable-overlay
    
    • 1
    • 2
    • 3
    • 4

    自定义网桥的优点

    1. 自定义桥接在容器之间提供自动DNS解析:
      容器在默认桥接网络只能互访IP地址,除非使用–link选项。自定义桥接网络,容器可以互相解析容器名。

    2. 自定义桥接网络会更安全:所有容器默认都会连接到默认的桥接网络,这是有隐患的。使用自定义网络会提供一个限定的范围。

    3. 可以动态地从用户定义的网络中附加和分离容器:在容器的生命周期内,可以动态地将其与用户定义的网络连接起来或断开连接。要从默认桥接网络中删除容器,需要停止容器并使用不同的网络选项重新创建它。

    4. 用户定义的网桥网络是使用docker network create创建和配置的。如果不同的应用程序组具有不同的网络需求,则可以在创建每个用户定义网桥时单独配置它。

  • 相关阅读:
    BUUCTF做题Upload-Labs记录pass-11~pass-20
    LeetCode 1113.报告的记录
    前端与后端:程序中两个不同的领域
    【编程不良人】快速入门SpringBoot学习笔记05---RestFul、异常处理、CORS跨域、Jasypt加密
    Flutter InteractiveViewer CustomPaint的使用总结
    Springboot2+thymeleaf+Jpa实现CRUD操作
    如何解决找不到xinput1_3.dll无法继续执行此代码?5个解决方法分享
    defer和async
    c语言中常用的字符串处理函数总结
    微信公众号怎么把个人改成企业?
  • 原文地址:https://blog.csdn.net/zincooo/article/details/132533313