0
点赞
收藏
分享

微信扫一扫

docker networking

Gaaidou 2021-09-24 阅读 39
PaaS

一. 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 //宿主机查看网络是否可以转发

举报

相关推荐

0 条评论