此文档为翻阅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 | docker run -itd --name=wan_1 --network=mynet centos_10_23 |
1 | docker exec -it 8549430966f7 bash |
ping wan_1
joined方式
两个容器共享一个网络栈他,共享网卡核配置信息。joined容器之间通过127.0.0.1直接通信
1 | docker run -itd --name=wan1 centos_10_23 |
joined合适以下场景
1,不同容器中的程序希望通过loopback高效快速通信,比如web-Server和app-serve。
2,独立的网络监控容器用来监控网络流量。
容器访问外网
容器访问外网(SNAT)
通过宿主机的iptables的snat,在宿主机查看
外界访问容器
通过Docker-proxy
每一个映射端口,host都会启动一个Docker-proxy进程来处理访问容器的流量