一. docker网络概述
最近在尝试使用docker实现出一个简易的lvs,因此需要对docker的网通信有一个比较清晰的认识。众所周知,docker是基于linux 的namespace和CGroup技术实现资源的隔离,因此在隔离的基础之上,需要实现容器和外部网络以及不同容器之间的通信。
今天一起了解一下docker中不同容器之间的通信原理。
二.docker网络管理
1.安装网桥管理工具
yum -y install bridge-utils //安装bridge-utils工具
brctl show //docker0网桥上关联了3接口,虚拟网卡对,其中一对插在docker0上,另外一对在容器上
2.docker网络基础
ip link show //ip接口查询
iptables -t nat -vnL //查看nat 规则POSTROUTING (地址委托,自动选择一个最合适的地址),从任何接口进来,只要不从docker0桥上出去,源地址172.18.0.0,目的地址是任何地址
进入busybox容器内,访问nginx容器服务
docker exec -it myhttp1 sh
wget -O - -q http://172.18.0.2
docker network ls
docker network inspect bridge
3.docker网络实践
创建两个网络名称空间:
ip netns add r1
ip netns add r2
ip netns list
网络名称空间中执行命令ifconfig:
ip netns exec r1 ifconfig //没有信息,因为没有被激活
ip netns exec r1 ifconfig -a
创建虚拟网卡对,人工分配到网络名称空间中:
ip link add name veth1.1 type veth peer name veth1.2
ip link show
把设备veth1.2挪到网络命名空间r1中:
ip link set dev veth1.2 netns r1
ip link show
在网络命名空间中查看已经挪过来的veth1.2:
ip netns exec r1 ifconfig -a
在网络命名空间中改名veth1.2为eth0:
ip netns exec r1 ip link set dev veth1.2 name eth0
ip netns exec r1 ifconfig -a
激活veth1.1:
ifconfig veth1.1 10.1.0.1/24 up
在网络命名空间中激活veth1.2(eth0):
ip netns exec r1 ifconfig eth0 10.1.0.2/24 up
ip netns exec r1 ifconfig
ping 10.1.0.2
把veth1.1挪到网络命名空间r2:
ip link set dev veth1.1 netns r2
ifconfig //可以看到veth1.1 消失了
ip netns exec r2 ifconfig veth1.1 10.1.0.3/24 up //激活
ip netns exec r2 ifconfig //可以看到veth1.1的ip信息
ip netns exec r2 ping 10.1.0.2 //在r2中ping r1的地址
4. docker 容器网络软交换
docker run --name t1 -ti --rm busybox:latest //退出就立即删除
docker ps -a //删除后查不到
bridge模式
这是docker默认的网络设置,各个容器都具有独立的网络命名空间,拥有自己的网卡。 docker为容器创建了独立的网络环境,实现了宿主机和容器、以及容器之间的网络隔离;还可以通过docker0网桥实现容器之间、容器与宿主机之间、或者容器与外界的网络通信。
docker run --name t1 --network bridge -ti --rm busybox:latest //指定网络bridge跟默认的一样
docker run --name t1 --network none -ti --rm busybox:latest //封闭式容器没有创建网络设备
docker run --name t1 --network bridge -h t1.maobe.com -ti --rm busybox:latest //设置主机名
hostname
cat /etc/resolv.conf
nslookup -type=A www.baidu.com
docker run --name t1 --network bridge -h t1.maobe.com --dns 114.114.114.114 -ti --rm busybox:latest //设置dns
cat /etc/resolv.conf
nslookup -type=A www.baidu.com
docker run --name t1 --network bridge -h t1.maobe.com --dns 114.114.114.114 --dns-search ilinux.io -ti --rm busybox:latest
cat /etc/resolv.conf
docker run --name t1 --network bridge -h t1.maobe.com --dns 114.114.114.114 --dns-search ilinux.io --add-host www.maobe.com:1.1.1.1 -ti --rm busybox:latest //注入host文件解析记录
cat /etc/hosts
docker run --name mynginx3 -p 8003:80 -d nginx:latest
iptables -t nat -vnL
Chain DOCKER (2 references)
docker port mynginx3
docker kill mynginx3
docker ps -a
docker run --name mynginx3 -p 172.17.0.10:8003:80 --rm -d nginx:latest //暴露宿主机的ip和端口
docker port mynginx3
docker kill mynginx3 //如果是加了--rm启动的话,kill就直接删掉了, docker ps -a也会不存在
container模式:
联盟式容器下的容器和宿主机之间的关系和bridge模式类似,在这种模式之下新创建的容器不会创建自己的网卡和IP,而是和前面指定的容器共享IP和端口范围等,并且该容器不具有独立的网络环境。
docker run --name t1 -ti --rm busybox:latest
docker run --name t2 --network container:t1 -ti --rm busybox:latest
echo "hello world" > /tmp/index.html
httpd -h /tmp
netstat -lntp
在ti1容器中:
wget -O - -q localhost
host模式
host模式也称宿主机网络,通过容器和宿主机之间共享网络命名空间,从而使容器和宿主机之间共享IP地址,可以充分利用容器的优势,以及宿主机的网络;类似daemonset系统级守护进程。
docker run --name t2 --network host -ti --rm busybox:latest
echo "hello container" > /tmp/index.html
httpd -h /tmp
在宿主机:curl localhost
5.docker网桥
docker0桥网络属性
自定义docker0桥的网络属性信息:
核心选项为bip,即bridge ip之意,用于指定docker0桥自身的IP地址;其它选项可通过此地址计算得出。
dockerd守护进程的C/S,其默认仅监听Unix SOcket格式的地址,/var/run/docker.sock;如果使用TCP套接字,
/etc/docker/daemon.json:
"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
也可向dockerd直接传递“-H|--host”选项;
docker 系统信息
docker info
创建docker网络:
docker network create -d bridge --subnet "172.26.0.0/16" --gateway "172.26.0.1" mybr0
ifconfig
ifconfig br-3625122d6da0 172.26.0.1/16 down //停止刚建的网桥
ip link set dev br-3625122d6da0 name mybr0 //改名
ifconfig mybr0 172.26.0.1/16 up //启动
ifconfig
创建mybr0的容器(需要把bridge name改过来):
docker run --name t2 --network mybr0 -ti --rm busybox:latest
ifconfig
docker run --name t1 -it --rm busybox:latest
cat /proc/sys/net/ipv4/ip_forward //宿主机查看网络是否可以转发