1、什么是容器的网络?
大家都知道,容器引擎安装成功之后会有一个自己的私有网段,桥接于宿主机的网卡,以nat方式和外界通信,并且一般情况下容器和容器之间是隔离状态,不能相互通信,那么为了解决这个问题,docker网络就出现了。
2、docker网络的三种形式
bridge
桥接到宿主机网卡上边,一般不指定网络的话,就是默认三使用桥接
overlay
工作在应用层,通过软件的方式实现docker网络之间的通信
macvlan
基于硬件,也就是网卡,来实现docker网络通信
3、指定网络
--network host 和宿主机统一个网络
docker run -it --network host --name vm3 ubuntu
--network none 禁用网络功能,只有lo回环接口
docker run -it --network none --name vm3 ubuntu
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
不指定网络,如果不指定则默认桥接
docker run -it --name vm1 ubuntu
[root@docker1 /]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.02420a563505 no veth258f39a
4、自定义docker网络
桥接网络创建
1、不指定ip,ip由docker-engine分配
docker network inspect my_net1 查看网络
docker network create my_net1(默认桥接)
运行两个交互型镜像,指定网络,可以互相ping通,内部dns服务
docker run -it --network my_net1 --name vm1 ubuntu
docker run -it --network my_net1 --name vm2 ubuntu
vm1和vm2之间可以直接通信,可以ping通
2、指定ip,管理员可以指定ip
docker network create --subnet 172.20.0.0/24 --gateway 172.20.0.1 my_net2 可以自己指定网络
docker run -it --name vm3 --network my_net2 --ip 172.20.0.10 ubuntu
docker run -it --name vm4 --network my_net2 --ip 172.20.0.20 ubuntu
vm1和vm2之间可以通信
3、让不同网络的容器可以通信
让my_net1和my_net2的容器可以通信
docker network connect my_net1 vm3 相当与给vm3由添加了一块和其他容器网络一致的网卡
docker container attach vm3 唤醒vm3
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
34: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:14:00:0a brd ff:ff:ff:ff:ff:ff
inet 172.20.0.10/24 brd 172.20.0.255 scope global eth0
valid_lft forever preferred_lft forever
38: eth1@if39: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:12:00:04 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.4/16 brd 172.18.255.255 scope global eth1
valid_lft forever preferred_lft forever
ping vm1 vm2 都ok
创建的网卡:
[root@docker1 /]# brctl show
bridge name bridge id STP enabled interfaces
br-786ea9228cc1 8000.02421232d0aa no
br-8ebe05ead984 8000.0242a2efbee2 no veth0fc1761
vethdf1267a
docker0 8000.02420a563505 no
共享网络,vm1和vm2共享一个网络my_net,可以相互通信,两个容器之间可以使用localhost高苏通信
docker run -it --name vm1 --network my_net1 ubuntu
docker run -it --name vm2 --network container:vm1 ubuntu
--link 解析,同步变量
docker run -it --name vm1 nginx
docker run -it --name vm2 --link vm1:web(vm1的别名) ubuntu
env
cat /etc/hosts 有解析
docker stop vm1
docker run -it --name vm3 ubuntu vm3占用了vm1的ip
docker start vm1 vm1起来之后,ip会变化
env
cat /etc/hosts 解析变化
5、端口映射
docker container cp index.html vm1:/usr/share/nginx/html 从宿主机复制到容器中
端口映射
docker run -d --name web -p 80:80 nginx
外网是通过docker-proxy和iptables DNAT来访问容器
-A POSTROUTPING -s docker容器ip -o docker0 -j MASQUERADE
内部网络通过iptables DNAT访问容器
curl 宿主机ip
curl docker容器ip
curl localhost
docker network ls 查看
docker network prune 删除自定义网络
6、跨主机容器网络
解决方法:
macvlan网络方案:基于网卡的通信(网卡为混杂模式),容器直接和主机网卡连连,容器独占网卡,可以设置子接口分给不同的容器,子网卡网络,vlan可以将网络分为4096个逻辑网路,彼此隔离,vlan id为1~4096
server1:
ip link set eth1 promisc on 开启混杂模式
docker network create -d macvlan --subnet 172.20.0.0/24 --gateway 172.20.0.1 -o parent=eth1 macvlan1
docker run -it --name vm1 --network macvlan1 --ip 172.20.0.10 ubuntu
server2:
ip link set eth1 promisc on 开启混杂模式
docker network create -d macvlan --subnet 172.20.0.0/24 --gateway 172.20.0.1 -o parent=eth1 macvlan1
docker run -it --name vm1 --network macvlan1 --ip 172.20.0.11 ubuntu
server1上的vm1和server2上的vm1可以互相通信
网卡子接口的创建和使用:
docker network create -d macvlan --subnet 172.21.0.0/24 --gateway 172.21.0.1 -o parent=eth1.1 macvlan2
docker run -it --name vm2 --network macvlan2 --ip 172.21.0.10 ubuntu