Container Networking是指容器相互连接和通信的能力,或者与非docker工作负载进行通信的能力。
默认创建容器是不会对外暴露任何端口的,除非使用-p选项指定,直接默认发布端口是不安全,相当于所有主机都可以访问。所以如果需要使容器互相通信,正常不需要发布容器的端口。而是通过将容器连接到相同的网络(通常是桥接网络),可以实现容器间通信。
IP和HostName:默认情况下,容器从连接的Docker network获取IP地址。容器从network的IP子网中接收IP地址,Docker守护进程为容器执行动态子网划分和IP地址分配。每个网络也有一个默认的子网掩码和网关。容器hostname默认为容器id
DNS:默认,容器继承宿主机的DNS解析,定义在/etc/resolv.conf。(/etc/hosts没有继承)
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
容器共享主机的网络命名空间,并且容器不会获得自己的ip地址分配。
overlay 网络驱动会在多个docker进程主机创建一个分布式网络
当初始化swarm服务或将docker主机加入到现有服务时,每台docker主机上会创建两个新的网络:
docker守护进程使用overlay网络防火墙设置需要为参与overlay网络的每个Docker主机的流量打开以下端口:
#创建overlay网络
docker network create -d overlay my-overlay
#--attachable可以让swarm服务和独立容器的overlay网络与其他docker主机上的容器通信
docker network create -d overlay --attachable my-attachable-overlay
自定义桥接在容器之间提供自动DNS解析:
容器在默认桥接网络只能互访IP地址,除非使用–link选项。自定义桥接网络,容器可以互相解析容器名。
自定义桥接网络会更安全:所有容器默认都会连接到默认的桥接网络,这是有隐患的。使用自定义网络会提供一个限定的范围。
可以动态地从用户定义的网络中附加和分离容器:在容器的生命周期内,可以动态地将其与用户定义的网络连接起来或断开连接。要从默认桥接网络中删除容器,需要停止容器并使用不同的网络选项重新创建它。
用户定义的网桥网络是使用docker network create创建和配置的。如果不同的应用程序组具有不同的网络需求,则可以在创建每个用户定义网桥时单独配置它。