一、容器网络管理
容器网络主要用于容器和容器之间、容器与外网、容器和宿主机的通信和连接。
1.1查看容器网络
docker network ls [OPTIONS]
参数 | 命令 |
-f | 过滤条件 |
-format string | 格式化打印结果 |
–no-trunc | 不缩略显示 |
-q | 只显示网络号 |
1.2创建容器网络
docker network create [OPTIONS] NETWORK(名字)
参数 | 命令 |
-d | 指定网络格式 |
–subnet strings | 指定子网网段 |
–ip-range strings | 指定容器的IP范围 |
–gateway strings | 子网的IPV4或者IPV6 |
创建一个容器网络,命名为test-bridge,其中为桥接模式
docker network create -d bridge test-bridge
1.3 删除容器网络
docker network rm <你容器网络的名字>
docker network ls docker network rm test-bridge docker network ls
1.4 容器网络详细信息
docker network inspect [OPTIONS]
参数 | 命令 |
-format string | 格式化打印结果 |
docker network inspect none
1.5 配置容器网络
基本格式
docker run/creat --network NETWORK
启动
docker run -it -d \ --network=host \ centos /bin/bash
然后查看网络格式
docker inspect <进程号> | grep NetworkMode
如果没有指定默认会使用桥接(bridge)模式进行连接
1.6 断开容器网络连接
连接:docker network connect [OPTIONS] NETWORKID CONTAINER 断开:docker network disconnect [OPTIONS] NETWORKID CONTAINER
例子,创建一个实列
docker run -it -d \ --network=host \ centos /bin/bash
先停止我们的容器
docker stop f2
去看我们NETWORK 的ID,然后在后面断开网络的时候,就直接输入,要断开的网络ID
docker network ls
docker network disconnect 5e77(NETWORKID) f2(容器进程号)
再去连接我们的none网络
docker network connect 5707(NETWORKID) f2(容器进程号)
二、none网络
none的话就是什么都没有的网络,在这个模式下,docker会拥有自己的网络空间,但是不会为docker进行任何的网络配置,也就是说除了本地接口外,没有任何的网卡、IP、路由等信息。
创建一个默认网络模式下的BusyBox
docker run --rm -it \ --name test-default \ busybox
ip a
可以看到docker容器分配的ip地址
我们再去ping一下外部容器
ping -c 3 wwww.baidu.com
可以看到已经分配的ip地址
然后我们再来看设置为none
docker run --rm -it \ --name test-none \ --network=none \ busybox
ip a
很清楚的可以看到我们没有分配了
三、host网络
创建一个host网络模式下的web应用
docker run -it -d --name test-host --network=host nginx docker inspect test-host
再去查看我们80端口的状态
ss -anptu | grep 80 curl -I 172.20.10.4(ip addr 查看)
四、bridge网络
在bridge模式下,我们会创建一个虚拟网桥Docker0,附加在其他的网卡上面可以自动转发包,将其中一个接口eth0,另外一个接口veth放置宿主机的命令空间,同时,守护进程还会从网桥的私有地址分配一个IP地址和子网给容器
先去下载我们的网桥管理工具
apt install -y bridge-utils brctl show
下面我们再来创建一个bridge的容器
docker run -it -d --name test-nginx --network=bridge -p 8000:80 nginx
在这里我们可以看到Docker0上面挂载了网络接口,下面我们再来看一个busybox的容器
docker run -it -d --name test-busybox --network=bridge busybox brctl show
下面我们再来看一个例子
brctl show docker run -d httpd brctl show
我们再进去看看网卡设置
docker ps docker exec -it 9720[刚刚的进程id] bash 第一种: ip addr/ifconfig【这个好像看不了】 apt-get update apt-get install net-tools ifconfig 第二种: ctrl+p+q 【我用这个看的】 docker inspect 9720
然后退出再去看我们网桥的配置
docker network inspect bridge
可以看到是一样de!
五、container网络
container网络是一种比较特别的网络模式,这个模式让指定创建的容器和已经存在的容器共享一个存储空间,新建的容器没有自己的网卡、IP地址等,而是和一个指定ip的容器共享IP地址、端口号。这两个容器之间不存在网络隔离,而这两个容器与宿主机还有其他机器存在网路隔离。
创建一个普通的容器
docker run -it --name test1 busybox ip a
crtl+p+q(不要直接退出了)
然后我们再去创建一个container的容器
docker run -it --name test-container --network=container:test1 busybox ip a
这样就可以看到我们两个容器所使用的网络就是一样的啦
docker ps
六、容器连接外部网络
其实在我们的虚拟机上,我们是可以直接联通外部的网络的
我们再去看我们的容器内部网络连通情况
docker run -it busybox ping -c 3 www.bing.com
可以看到默认情况下我们是可以访问外部网络(出容器以外的网络)的
下面我们可以通过
sudo su【管理员模式下】 iptables -t nat -S
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
其含义是: 如果网桥docker0收到来自172.17.0.0/16网段的外出包,把它交给MASQUERADE处理。而MASQUERADE的处理方式是将包的源地址替换成host的地址发送出去,即做了一次网络地址转换 (NAT)
下面我们再来看看是怎么转换的
【路由表】 ip r
我们是通过ens33发出的,所以我们去监听下ens33和docker0上的情况
tcpdump -i ens33 -n icmp 开另外一个端口 ping -c 3 www.bing.com
tcpdump -i docker0 -n icmp 开另外一个端口并进入容器 docker attch 【暂停端口号】 ping -c 3 www.bing.com
七、多节点网络
ip addr
小唐就用三台电脑来做一个示范吧
机器IP | 说明 |
192.168.2.106 | 主节点(xiaotang0711) |
192.168.2.100 | datanode(qiuyb) |
192.168.2.102 | datanode(root-u) |
主节点
设置我们的主节点
docker swarm init --advertise-addr=<IP-ADDRESS-OF-MANAGER> docker swarm init --advertise-addr=192.168.2.106
在去查看
docker node ls
再去查看我们节点的状态
docker node inspect ffu
加入主节点
docker swarm join-token manager
子节点
将我们上面所生成的放到节点机中
在每一个子节点中,输入主节点的类容
docker swarm join --token SWMTKN-1-0ktmburrukg72jsyri177tlpk4i8ftkatanwcrlqshfn67ex6r-7b448j9aihy08u3b6kn0z2cdx 192.168.2.106:2377 降级 docker node inspect ffu
如果 做错了,请在当前机器退出节点设置
docker swarm leave --force
查看swrm集群中的节点 docker node ls 脱离节点(在对应节点处执行) docker swarm leave 删除脱离节点【对于manager需要先将节点降为worker节点才能删除】 docker node rm XXX(编号)
7.1创建Overlay网络
同步swarm节点
docker network create -d overlay mynet
docker service ps test
在主节点和分节点上同时运行
docker service create --network mynet --name test --replicas 2 busybox ping 8.8.8.8 【进入容器】 docker ps
在主节点和分节点上同时运行(注意主节点子节点他们的容器id不一样)
docker container exec -it 57f sh
主节点
分节点
互相ping
ping 10.0.1.3[去另外一台主机的ip addr 看] ping www.baidu.com
7.2创建Macvlan网络
主节点
docker network create -d macvlan --subnet 192.168.2.106/24[你自己的ip] --gateway 192.168.2.106[你自己的getway] -o parent=ens33 mac-test
另外一台
docker network create -d macvlan \ --subnet 192.168.2.106/24 \ --gateway 192.168.2.106 \ -o parent=ens33 mac-test
再进入两个主机
再去看ip addr
然后我们就可以看到我们节点互通啦!!!