Docker单主机网络

此文档为翻阅cloudman的每天5分钟玩转docker技术的读书笔记。

docker网络(单host上容器网络)
显示docker网络
docker network list

docker run时通过–network指定网络

none网络

1
docker run -it --network=none busybox

none网络就是什么都没有的网络,挂载在这个网络的容器除了loopback没有其他任何网卡。

使用场景:对于一些安全性要求高且不需要联网的应用可以使用。

host网络

连接到host网络的容器,共享docker 宿主机的网络,并且连hostname也是宿主机的。

1
docker run -itd  --network=hhost busybox

使用场景:用host网络性能比较高,容器可以直接操作宿主机网络,缺点是牺牲了灵活性,需要考虑端口冲突问题。

bridge网络

docker使用最广泛的方式,docker安装时会创建一个docker0的linux bridge,如果不指定容器网络默认都会挂到docker0上

启动个容器,查看docker0
docker run -itd centos_10_23

docker 内的网卡eth0@if28和linux bridge上的vethfe788c9是一堆veth-pair

默认bridge配置的subnet就是172.17.0.3/16网关为172.17.0.1配在docker0上,容器创建时会自动从172.17.0.3/16里面抽出一个地址。

user-define(用户自定义网络)

user-define网络支持:bridge,overlay和macvlan网络驱动,macvlan和overlay属于跨宿主机的容器的通信,这里先不讨论,这里讨论使用bridge驱动创建user-define网络。

创建一个bridge为driver的user-define网络

docker network create –driver bridge my_net

查看网络状态

inspect一下,发现新创建的网络默认subnet地址自动会从上一个开始,

创建好后,多了个网桥

指定网段,只需要加–subnet 和–gateway参数

1
docker network create --driver bridge --subnet 192.168.1.0/24 --gateway 192.168.1.1 my_net

容器指定ip,run时加上–ip,只能是使用的–subnet的网络的容器才能使用指定ip功能

1
docker run -itd --network=my_net --ip 192.168.1.100 centos_10_23

定义另外一个network网络

1
docker network create --subnet 192.168.2.0/24 --gateway=192.168.2.1 my_net2

在mynet_2上创建容器

1
docker run -itd --network=my_net2 centos_10_23

宿主机上查看路由

开启路由转发
sysctl net.ipv4.ip_forward

在容器内测试192.168.2.2 ping 192.168.1.100,发现网关都能通就是ping不通192.168.1.100

默认宿主机上的iptables DROP掉了这两个网桥的连接

给my_net2的容器加入my_net网络

docker network connect my_net 60cae2aee142

在去ping 192.168.1.100 就ok了

容器和容器间的通信

3种方式:IP、Docker DNS server 、joined

IP方式
使用docker network connect将现有容器加入到指定网络实现容器间的通信。

Docker DNS server
Docker daemon内嵌了一个DNS Server通过Docker run –name定义的容器名进行通信,只能是user-define网络可以使用,默认的bridge不行 。

1
2
docker run -itd  --name=wan_1 --network=mynet centos_10_23 
docker run -itd --name=wan_2 --network=my_net centos_10_23
1
docker exec -it 8549430966f7 bash  

ping wan_1

joined方式
两个容器共享一个网络栈他,共享网卡核配置信息。joined容器之间通过127.0.0.1直接通信

1
2
docker run -itd --name=wan1 centos_10_23
docker run -itd --name=wan2 --network=container:wan1 centos_10_23

joined合适以下场景
1,不同容器中的程序希望通过loopback高效快速通信,比如web-Server和app-serve。
2,独立的网络监控容器用来监控网络流量。

容器访问外网

容器访问外网(SNAT)
通过宿主机的iptables的snat,在宿主机查看

外界访问容器
通过Docker-proxy
每一个映射端口,host都会启动一个Docker-proxy进程来处理访问容器的流量