docker网络大全

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值