• Docker---初识Docker网络


    docker0网络详解

    我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0。

    一、启动两个tomcat容器

    [root@localhost ~]# docker run -d -P --name tomcat01 tomcat              # 启动镜像,生成tomcat01容器之后,使用ip addr命令发现多了一对网卡。
    [root@localhost ~]# docker run -d -p 3120:8080 --name tomcat02 tomcat    # 启动镜像,生成tomcat02容器之后,使用ip addr命令发现多了一对网卡。
    [root@localhost ~]# ip addr                                              # 执行上面两步之后,查看服务器ip地址,发现多了两对网卡。

    二、查看两个tomcat容器的ip地址

    [root@localhost ~]# docker exec -it tomcat01 ip addr                     # 启动容器时,查看容器的内部网络地址:ip addr,这里显示:172.17.0.2。
    [root@localhost ~]# docker exec -it tomcat02 ip addr                     # 启动容器时,查看容器的内部网络地址:ip addr,这里显示:172.17.0.3。

    三、测试宿主机和容器、容器和容器之间的网络是否可以通

    [root@localhost ~]# ping 172.17.0.2                                      # 在服务器上ping tomcat01容器,即linux服务器上可以ping通docker容器内部。
    [root@localhost ~]# ping 172.17.0.3                                      # 在服务器上ping tomcat02容器,即linux服务器上可以ping通docker容器内部。
    [root@localhost ~]# docker exec -it tomcat01 ping 172.17.0.3             # 在tomcat01容器中 ping tomcat02容器,可以ping通,即容器之间可以互相ping通。

    四、删除容器,发现第一步生成的网卡信息也同时没有了

    [root@localhost ~]# docker stop tomcat01      # 停止tomcat01容器
    [root@localhost ~]# docker rm tomcat01        # 删除tomcat01容器
    [root@localhost ~]# ip addr                   # 查看网卡信息

    总结1:tomcat01和tomcat02是共用的一个路由器,即docker0。所有的容器不指定网络的情况下,都是docker0路由的,docker0会给我们的容器分配一个默认的可用IP。

    总结2:Docker中的所有的网络接口都是虚拟的,因为虚拟的转发效率高(如内网传递文件)。只要容器删除,对应的网桥一对也没有了。

    总结3:docker网络使用桥接模式,使用的技术是veth-pair技术。就是一对虚拟设备接口,他们都是成对出现的。veth-pair充当一个桥梁,连接各种虚拟网络设备的。

    总结4:docker0特点:是默认的网络模式,不能通过容器名访问。解决方法:一、--link可以打通连接,二、自定义网络可以打通连接。

    容器互联之--link

    测试tomcat01容器直接ping tomcat02容器,发现无法ping通,使用--link可以解决这一问题。

    [root@localhost ~]# docker exec -it tomcat01 ping tomcat02                      # 无法ping通
    [root@localhost ~]# docker run -d -P --name  tomcat03 --link tomcat02 tomcat    # 启动镜像,生成tomcat03容器
    [root@localhost ~]# docker exec -it tomcat03 ping tomcat02                      # 可以ping通,因为--link就是在tomcat03容器中的hosts文件中添加了172.17.0.3	tomcat02 b41c08fb9421配置。现在不建议使用了。
    [root@localhost ~]# docker exec -it tomcat02 ping tomcat03                      # 无法ping通,即单向的,是因为在tomcat02容器中的hosts文件没有修改配置。
    
    [root@localhost ~]# docker exec -it tomcat03 cat /etc/hosts                     # 查看tomcat03容器的hosts文件

    容器互联之自定义网络

    一、查看所有的docker网络

    [root@localhost ~]# docker network --help  # 查看帮助文档
    [root@localhost ~]# docker network ls

    二、网络模式

    • bridge      桥接模式(默认的,自己创建的也使用bridge模式),就是在docker上面搭桥。
    • none        不配置网络
    • host        主机模式,就是和宿主机共享网络
    • container   容器内网络连通(用的少)

    三、自定义一个网络

    [root@localhost ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
    --driver bridge           使用的也是桥接模式
    --subnet 192.168.0.0/16   子网地址(范围:192.168.0.2-192.168.255.255)
    --gateway 192.168.0.1     网关

    四、查看自定义网络的信息

    [root@localhost ~]# docker network inspect mynet

    五、测试容器之间网络连通

    [root@localhost ~]# docker run -d -P --name tomcat05 --net mynet tomcat      # 使用自定义网络创建tomcat05容器
    [root@localhost ~]# docker run -d -P --name tomcat06 --net mynet tomcat      # 使用自定义网络创建tomcat06容器
    [root@localhost ~]# docker exec -it tomcat05 ip addr                         # 查看tomcat05容器的ip地址为:192.168.0.2
    [root@localhost ~]# docker exec -it tomcat06 ip addr                         # 查看tomcat06容器的ip地址为:192.168.0.3
    
    [root@localhost ~]# docker exec -it tomcat05 ping tomcat06                   # 可以ping通,不使用--link也可以通过容器名称ping通容器了
    [root@localhost ~]# docker exec -it tomcat05 ping 192.168.0.3                # 可以ping通

    网络连通:不在同一个网段上的两个容器

    一、使用docker0(即bridge)创建一个容器

    [root@localhost ~]# docker run -d -P --name tomcat01 tomcat                # 直接启动的命令,默认就带参数--net bridge,而这个就是我们的docker0。
    [root@localhost ~]# docker run -d -P --name tomcat02 --net bridge tomcat   # 等同上面的命令,创建tomcat02容器

    二、使用mynet 创建一个容器

    [root@localhost ~]# docker run -d -P --name tomcat05 --net mynet tomcat 

    三、测试两个容器直接的网络连接情况

    [root@localhost ~]# docker exec -it tomcat01 ping tomcat05

    四、打通不在同一个网段的两个容器的网络连接

    [root@localhost ~]# docker network connect mynet tomcat01      # tomcat01容器与mynet这个网段连通
    [root@localhost ~]# docker network inspect mynet               # 查看自定义网络mynet的信息

    五、再次测试网络连接情况

    [root@localhost ~]# docker exec -it tomcat01 ping tomcat05    # 可以ping通
    [root@localhost ~]# docker exec -it tomcat02 ping tomcat05    # 不可以ping通,因为tomcat02与mynet这个网络没有连通

  • 相关阅读:
    [0] RUP、FDD、SCRUM
    [0] Visual studio 2010 快捷键大全
    [0] Node.js
    Laravel开发:Laravel核心——服务容器的细节特性
    Laravel开发:Laravel核心——Ioc服务容器
    Composer的Autoload源码实现2——注册与运行
    Composer的Autoload源码实现1——启动与初始化
    PHP自动加载功能原理解析
    Lumen开发:phpunit单元测试
    php闭包简单实例
  • 原文地址:https://www.cnblogs.com/liuhaidon/p/13630695.html
Copyright © 2020-2023  润新知