当前位置:首页 » 《关注互联网》 » 正文

15-01、docker入门之docker网络的详解_迷逝

9 人参与  2021年08月19日 07:43  分类 : 《关注互联网》  评论

点击全文阅读


一、docker的默认网络

默认网络docker0的原理

我们在查看宿主机的IP地址,如下图:
在这里插入图片描述
docker0的网络是:172.17.0.1/16,每当启动一个容器,就会生产两个
在这里插入图片描述
这个就是evth-pair技术,通过ovc的连接可以相互通信。
在这里插入图片描述
下图更详细:
在这里插入图片描述
此时docker0,就相当于一个路由器,这就是docker的默认网络。

  • 所有的docker容器,在不指定网络的情况下都属于docker0;
  • docker0会给我们每一个容器分配1个可用的IP;
  • docker0的作用是直接让容器和宿主机通信,间接性让容器间通信(必须使用–link链接,但是一般不这么干)。
    在这里插入图片描述

疑问:容器之间是否能ping通对方?

分别启动两个tomcat容器,使用如下命令,让tomcat01 ping tomcat02
在这里插入图片描述

docker exec -it tomcat01 ping tomcat02

结果如图:
在这里插入图片描述

docker0的缺点

  • 容器之间不能直接互通;
  • 要想互通必须使用–link;
  • 而且link是单项的,必须两端都配置

二、容器间的连通(link的用法)

解决问题:
我们再启动一个tomcat03,使用link命令链接 tomcat02

docker run -d -P --name tomcat03 --link tomcat02 tomcat

通过命令–link就可以解决这个问题,如下图现在tomcat03可以ping通tomcat02
在这里插入图片描述
但是其实这个命令挺坑的。如上图,如果反向,能否ping通?
在这里插入图片描述

[root@localhost ~]# docker network  ls
NETWORK ID     NAME      DRIVER    SCOPE
ffb8c87e33c6   bridge    bridge    local
76dde8bbf8a5   host      host      local
42401e5761c9   none      null      local

原因是什么呢?
当我们让tomcat03 --link tomcat02的时候,容器内部发生了什么变化呢?其实很简单,在tomcat03内部的hosts文件中多了一条本地映射,如下图:在这里插入图片描述
而tomcat02因为没有link tomcat03 所以hosts文件中没有这一条,因此反向是无法ping通的。
==这也就是link的原理,其实就是在容器hosts文件中写了一条映射。这样的话由于局限性很大,所以我们一般也不是很常用。==我们一般在生产中,是这样做的。就是自定义docker网络。

三、自定义daocker网络

自定义daocker网络的目的就是方便容器之间互联。

[root@localhost ~]# docker network  ls     #查询docker的所有网络
NETWORK ID     NAME      DRIVER    SCOPE
ffb8c87e33c6   bridge    bridge    local
76dde8bbf8a5   host      host      local
42401e5761c9   none      null      local

docker网络的类型

  • bridge:桥接模式(默认,自己创建的也是用这种模式)
  • host:和宿主机共享网络
  • none:不配置网络
  • container:容器内网络连通(这里是看不到的,用的比较少,了解即可)

我们之前在启动tomcat的时候,所使用的命令是:docker run -d -P --name tomcat tomcat ,其实他是个阉割版,他省略了网络的参数,如果敲全的话应该是下面这个:

docker run -d -P --name tomcat --net bridge tomcat

多了个--net bridge,其实这个就是docker0网络。你不加默认就是docker0网络,所以大部分时候我们是不加的。在我们自定义网络之后,每次启动就要加上了。

创建docker网络

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

注释及演示过程

docker network create \    
--driver bridge \              #桥接模式  
--subnet 192.168.0.0/16 \      #网段
--gateway 192.168.0.1 \        #网关
mynet                          #网络的名字


[root@localhost ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 myne
t
5c86080c7b61dfd92006e3cc506351c825052bd4ca214ffb3965ca08f23a16af
[root@localhost ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
ffb8c87e33c6   bridge    bridge    local
76dde8bbf8a5   host      host      local
5c86080c7b61   mynet     bridge    local    #这个就是我们新建的
42401e5761c9   none      null      local

[root@localhost ~]# docker network inspect mynet   #查看网络的详细信息
[
    {
        "Name": "mynet",
        "Id": "efe52fe3d7fe632c6e7047e5d1afdeafc7266518efa81a19ee16f014acdf0d68",
        "Created": "2021-08-16T20:45:31.865520553+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

###我们再自己创建的网络中启动两个tomcat
[root@localhost ~]# docker run -d -P --name tomcat-net-01 --network mynet tomcat
9eded0646076d8b8e150a48dbca89495bd93ae96aca77501667a5333b6672a71
[root@localhost ~]# docker run -d -P --name tomcat-net-02 --network mynet tomcat
bf75b548b9e898c5f99b8464112000667f86c5847ac224ffb32dfb639c637270
[root@localhost ~]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "efe52fe3d7fe632c6e7047e5d1afdeafc7266518efa81a19ee16f014acdf0d68",
        "Created": "2021-08-16T20:45:31.865520553+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "9eded0646076d8b8e150a48dbca89495bd93ae96aca77501667a5333b6672a71": {
                "Name": "tomcat-net-01",
                "EndpointID": "a5341a641690b019f6e6b3e5297cd1ab40d5c29d119e0cec0174245dcff4b7ca",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",     ##tomcat-net-01的IP
                "IPv6Address": ""
            },
            "bf75b548b9e898c5f99b8464112000667f86c5847ac224ffb32dfb639c637270": {
                "Name": "tomcat-net-02",
                "EndpointID": "266bdee560e20c808ba6b85daa4fbcdee89e70d86090e05efaf3e72f1a9bb563",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",    ##tomcat-net-02的IP
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

[root@localhost ~]# docker network rm mynet   #删除网络
mynet
[root@localhost ~]#

四、自定义网络的好处

现在我们看看自定义网络的好处。

容器之间可以直接ping通

我并没有使用–link,但是直接可以ping通
在这里插入图片描述

五、容器和网络打通

根据上面的实验我们已经实现了同一网络容器间的互通技术。
那么问题由来了,如下图这种不同的docker网络,容器间互通该如何打通网络呢?
例如:我想让docker0网络中的tomcat-01能和mynet网络中的tomcat-net-01互通,该怎么办?
在这里插入图片描述
像上图中的直连是绝对不能通的,我们必须如下图,让tomcat01和mynet这个网络互通就OK了。是不是有点像pptp?
在这里插入图片描述
docker网络中的重点必会命令connect

  • connect 命令他是docker网络的核心。
  • 功能:链接一个网络到一个容器
[root@localhost ~]# docker network --help

Usage:  docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network    #docker网络的核心命令,链接一个网络到一个容器
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks

Run 'docker network COMMAND --help' for more information on a command.
[root@localhost ~]#



[root@localhost ~]# docker network connect --help

Usage:  docker network connect [OPTIONS] NETWORK CONTAINER

Connect a container to a network

Options:
      --alias strings           Add network-scoped alias for the container
      --driver-opt strings      driver options for the network
      --ip string               IPv4 address (e.g., 172.30.100.104)
      --ip6 string              IPv6 address (e.g., 2001:db8::33)
      --link list               Add link to another container
      --link-local-ip strings   Add a link-local address for the container
[root@localhost ~]#

tomcat01的网络是默认网络docker0,现在让他链接到mynet网络内

[root@localhost ~]# docker network connect mynet tomcat01  

搞定,我们看看mynet网络信息中发生了什么变化。

[root@localhost ~]# docker network inspect mynet     #查询mynet网络信息

在这里插入图片描述
他居然在mynet中的网络,那还在docker0网络中吗?任然在,因此他的拓扑变成了如下图
在这里插入图片描述


点击全文阅读


本文链接:http://zhangshiyu.com/post/25715.html

网络  容器  自定义  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1