docker网络

网络基础

端口映射
docker run -d -P --name test1 nginx
docker中容器默认是无法沟通的,只有当容器的web服务应用程序端口映射到本机宿主机的端口

#docker port 查看端口映射情况
[root@server01 ~]# docker ps -a  #查看容器
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS       
74b9933c9c5a        nginx               "/docker-entrypoint.…"   18 seconds ago      Up 16 seconds
[root@server01 ~]# docker port test1  #查看端口
80/tcp -> 0.0.0.0:32768  #映射到宿主机随机端口

docker的-p指定端口8000
docker run -d -p 8000:80 --name test2 nginx

0.0.0.0:111(本机的所有ip都可以访问)
192.168.200.10:111(只有此ip地址和端口才能访问)
127.0.0.1:111(本区域可以访问)

指定传输协议

docker run -d -p 8000:80/tcp --name test3 nginx
#还规定了协议

端口暴露
expose命令:可以指定一定方位内额度端口

容器互联
一个容器可以同时加入多个网络中,使用不同的地址可以访问不同网络中的容器

  • 将两个容器处于统一网络当中
    #创建两个名字镜像busybox
    [root@localhost ~]# docker run -itd --name=container1 busybox
    1d9b72bf8016ef7a20b1750e32b7fff5cdf79651df8d73496a6fa885a6b515b2
    [root@localhost ~]# docker run -itd --name=container2 busybox
    429128533cfea0e58c0ee69add173e86a85d786620d5a3c325d82ccdaa012a65
    
    #创建一个独立的容器网络,使用bridge驱动
    [root@localhost ~]# docker network create -d bridge --subnet 172.25.0.0/16 demo_net
    4f44d43938df86510c70d0593c4ab5b59a67cf5df09d5b6893a04dbe87d2e8bd
    #docker network create 创建一个网络
    #-d bridge  类型
    #--subnet 172.25.0.0/16  定义这个网段
    #这个网络名叫 demo_net
    [root@localhost ~]# docker network ls
    NETWORK ID     NAME       DRIVER    SCOPE
    6df808d90fb7   bridge     bridge    local
    4f44d43938df   demo_net   bridge    local
    ff177a4017b7   host       host      local
    8c0975d854fe   none       null      local
    
    #将container2加入到dome_net这个网络中
    [root@localhost ~]# docker network connect demo_net container2 
    [root@localhost ~]# docker network inspect demo_net   #查看这个网络里的模块
    "Containers": {
                "429128533cfea0e58c0ee69add173e86a85d786620d5a3c325d82ccdaa012a65": {
                    "Name": "container2",  
                    "EndpointID":   "caddb2d673156b8e74ca8754b4b9e332213bb7a837f5c5c2a6276b25aa80d59c",
                    "MacAddress": "02:42:ac:19:00:02",  #此容器本来随机地址
                    "IPv4Address": "172.25.0.2/16",  #现在是此地址在范围内
                    "IPv6Address": ""
                }
            },
    
    #创建一个容器并加入到demo_net网络给他3的IP地址
    [root@localhost ~]# docker run --network=demo_net --ip=172.25.3.3 -itd --name=container3 busybox
    [root@localhost ~]# docker network inspect demo_net 
    "Containers": {
              "23e87e8993b455df9181405ecda0092bc324d09172d03afa99891abe126c79db": {
                  "Name": "container3",
                  "EndpointID": "9c98ef849927a365b7263c3cf9a374a302d9d9f57384dcabf241896aa8304086",
                  "MacAddress": "02:42:ac:19:03:03",
                  "IPv4Address": "172.25.3.3/16",  #又分走一个3的ip地址
                  "IPv6Address": ""
              },
              "429128533cfea0e58c0ee69add173e86a85d786620d5a3c325d82ccdaa012a65": {
                  "Name": "container2",
                  "EndpointID":  "caddb2d673156b8e74ca8754b4b9e332213bb7a837f5c5c2a6276b25aa80d59c",
                  "MacAddress": "02:42:ac:19:00:02",
                  "IPv4Address": "172.25.0.2/16",
                  "IPv6Address": ""
    
    #2此时拥有两个网络,bridge,demo_net
    #1只有一个网络,bridge
    #3只有一个网络,demo_net
    #此时2和3同一网络中,1和2也在同一网络中,所以2和1,3都是可以互联的,1和3是不能互联的。
      
    
检验互联网络
[root@localhost ~]# docker exec -it container1 ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:03    #172.17这个网络
          inet addr:172.17.0.3  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:656 (656.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

[root@localhost ~]# docker exec -it container2 ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:04    #172.17这个网络
          inet addr:172.17.0.4  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:656 (656.0 B)  TX bytes:0 (0.0 B)

eth1      Link encap:Ethernet  HWaddr 02:42:AC:19:00:02    #172.25这个网络
          inet addr:172.25.0.2  Bcast:172.25.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:21 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2424 (2.3 KiB)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback                      
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

[root@localhost ~]# docker exec -it container3 ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:19:03:03    #只有一个172.25这个网络
          inet addr:172.25.3.3  Bcast:172.25.255.255  Mask:255.255.0.0  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:656 (656.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

  • link参数:会在源和接收器之间创建一个隧道。
    #创建一个容器并设置名字
    [root@localhost ~]# docker run -itd --name test busybox
    [root@localhost ~]# docker run -itd --name=link --link test:test busybox
    test:test  ==  名字:别名
    [root@localhost ~]# docker exec -it link ping test  #试ping
    

网络模式

docker 自动创建3个网络

demo_net:是自建的网络
使用docker run 创建容器时,可以使用--net指定加入的网络

常用的4个网络模式

  • host模式:--net=host指定
    Network namespace:隔离网络,提供了一份独立的网络环境,包括网卡,路由,lptables规则等,都会与其他的network namespace隔离,使用Host模式后,将不会获得一个独立的network namespace,而是与宿主机使用同一个network namespace,不会特别安全,但是容器的其他方面,还是和宿主机隔离的。

  • Container模式:--net=container:name_or_ID指定
    可以指定一个新创建的容器和已存在的容器共享一个network namespace,此时所有的网络配置都是一样的,但其他还是隔离的。两个容器的进程可以通过lo网卡设备通信。

    --net=container:container_id(已存在的容器)/container_name(新创建的容器)
    [root@localhost ~]# docker run -itd --name=con1 busybox  #已存在的容器
    11be5847a56d71792c548750d11a32276096e7017fb2eb6372eccbbe42ec9a53
    [root@localhost ~]# docker exec -it con1 ifconfig  #查看网络信息
    eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:07  
              inet addr:172.17.0.7  Bcast:172.17.255.255  Mask:255.255.0.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:8 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0 
              RX bytes:656 (656.0 B)  TX bytes:0 (0.0 B)
    
    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    
    [root@localhost ~]# docker run -itd --net=container:con1 --name=con2 busybox  #创建新的容器并指定模式与con1使用同一网络
    44beb2676dec17aad14afe835e0ebaf54afad8fddb694c21b8d1f943a882f531
    [root@localhost ~]# docker exec -it con2 ifconfig  #查看网络信息
    eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:07  
              inet addr:172.17.0.7  Bcast:172.17.255.255  Mask:255.255.0.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:8 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0 
              RX bytes:656 (656.0 B)  TX bytes:0 (0.0 B)
    
    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    #发现一模一样的网络信息
    
  • None模式:--net=none指定
    就是啥也没有,需要自己配置

  • Bridge模式:--net=bridge指定,默认设置
    是docker默认的网络模式(其实是不需要指定的),属于一种NAT网络模式,docker daemon在启动时会建立一个docker0的网桥(-b参数可以指定)每一个容器使用bridge模式时,都会为容器创建一对虚拟的网络接口(veth pair)设备,这对接口一端在容器的network namespace,另一端在docker0,这样实现容器与宿主机之间的通信。

    bridge模式下,docker容器与外部网络通信都是通过IPtable规则控制的,也就是docker网络性能底下得到一个原因,使用iptables -vnL -t nat 可以查看nat表。

原文地址:https://www.cnblogs.com/wml3030/p/15452334.html