docker虚拟网络

 

封闭式网络
桥接式网络
联盟式网络
开放式网络

 

 

 

 

叠加网络

如何叠加?
物理机的物理网卡做一个虚拟的桥,让各个虚拟机连到这个桥上,来实现报文的隧道转发。

 

 

 

docker的网络

 

安装完后提供了三种网络
[root@localhost vagrant]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
244a0bdfb5a6        bridge              bridge              local            # net桥,自动创建软交换机docker0,可以当做网卡使用
98103accc8c5        host                host                local            # 让容器直接使用主机的网络名称空间(开放式网络)
bb173b2423b5        none                null                local            # 只有lo接口:没有网卡            (封闭式网络)

 

 

1、什么是LO接口?
     在LINUX系统中,除了网络接口eth0,还可以有别的接口,比如lo(本地环路接口)。
2、LO接口的作用是什么?
     假如包是由一个本地进程为另一个本地进程产生的, 它们将通过外出链的'lo'接口,然后返回进入链的'lo'接口.具体参考包过滤器的相关内容。
第三种网络存在的意义:
    运行一些不需要网络通信的复杂程序,
启动每一个容器,都会给其自动分配一对网卡设备,一半在容器,一半在docker0桥上(桥接式网络)

 

 

[root@localhost ~]# docker run -d redis:latest
0e5a52bb5efd9acbd5c1c132de64a5a591a641723b3226dc27f2fe32f03775f5
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
0e5a52bb5efd        redis:latest        "docker-entrypoint.s…"   6 seconds ago       Up 5 seconds        6379/tcp            agitated_dijkstra
[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    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
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:6c:3e:95 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
       valid_lft 77184sec preferred_lft 77184sec
    inet6 fe80::a00:27ff:fe6c:3e95/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:8b:6e:8c:f7 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:8bff:fe6e:8cf7/64 scope link
       valid_lft forever preferred_lft forever
7: veth8bf9a87@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
    link/ether 4a:ef:9c:53:42:79 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::48ef:9cff:fe53:4279/64 scope link
       valid_lft forever preferred_lft forever
veth8bf9a87@if6  被关联到了docker0上
如何查看?
yum -y install bridge-utils
[root@localhost ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.02428b6e8cf7       no              veth8bf9a87            # 并没有if6
                                                        ***********        

 

 

# 另一半在容器内部;执行ifconfig会看到eth0
ping  172.17.0.1 可以ping通


每创建一个容器,启动后,会自动生成iptables规则
[root@localhost ~]# iptables -t nat -vnL
Chain PREROUTING (policy ACCEPT 9 packets, 368 bytes)
 pkts bytes target     prot opt in     out     source               destination
    9   368 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 9 packets, 368 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 109 packets, 6895 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DOCKER     all  --  *      *       0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 109 packets, 6895 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0

 

 

 

#  POSTROUTING可以看到从任何接口进来,只要不从docker0出去,原地址来自172.17.0.0/16的任何一台主机,都要MASQUERADE(地址伪装)  ---->net桥的原因    


这样就可以实现   
1、容器之间的访问
2、主机和容器之间的通信

3?外部host想访问其中一个容器
    映射的方式?
    物理机的一个端口使用dnet的方式,使其转发到其间的一个容器,让其再访问这个端口

必然的面临的问题   多web.png
如何用众所周知的端口映射到不同的web
    而叠加网络可以解决这个问题
 
(联盟式网络)

 

 

 

 

 

创建容器时默认使用桥接式网络(net桥)
# docker network inspect bridge

[root@localhost ~]# docker run --help

Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Run a command in a new container

Options:
    ...
  -m, --network string                 Connect a container to a network (default "default"指的是bridge)
   ...

 

posted @ 2018-12-23 16:00  慕沁  阅读(1079)  评论(0)    收藏  举报