zoukankan      html  css  js  c++  java
  • Docker 学习笔记 (第三天)

    Docker 网络

    1.1、docker0

    image-20211006055624063

    问题: docker 是如果处理容器网络访问的?

    # 测试 运行一个tomcat
    $ docker run -d --name tomcat01 tomcat
    $ ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        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
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:16:3e:13:78:90 brd ff:ff:ff:ff:ff:ff
        inet 172.23.104.112/20 brd 172.23.111.255 scope global dynamic eth0
           valid_lft 314146894sec preferred_lft 314146894sec
    3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
        link/ether 02:42:c9:5a:27:6c 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
    441: veth049f362@if440: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
        link/ether ea:55:6c:48:c4:7e brd ff:ff:ff:ff:ff:ff link-netnsid 0
    $ docker exec -it 容器id
    $ ip addr
    # 查看容器内部网络地址 发现容器启动的时候会得到一个 eth0@if551 ip地址,docker分配的!
    550: eth0@if551: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
    state UP group default
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
    valid_lft forever preferred_lft forever
    # 思考? linux能不能ping通容器内部! 可以 容器内部可以ping通外界吗? 可以!
    $ ping 172.17.0.2
    PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
    64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.069 ms
    64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.074 ms
    # linux 可以ping 通docker容器内部
    

    原理

    1、我们每启动一个docker容器,Docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个docker0桥接模式,使用的技术是 veth-pair 技术!

    https://www.cnblogs.com/bakari/p/10613710.html

    再次测试ip addr

    image-20211006063249658

    我们发现这个容器带来网卡,都是一对对的

    veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连,正因为有这个特性 veth-pair 充当一个桥梁,连接各种虚拟网络设备的OpenStac,Docker容器之间的连接,OVS的连接,都是使用evth-pair技术

    2 、在启动一个容器测试,发现又多了一对网络

    image-20211006063321980

    3、我们来测试下tomcat01和tomcat02是否可以ping通

    $ docker-tomcat docker exec -it tomcat01 ip addr #获取 tomcat01 的ip
    172.17.0.2
    550: eth0@if551: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
    state UP group default
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
    valid_lft forever preferred_lft forever
    $ docker-tomcat docker exec -it tomcat02 ping 172.17.0.2 #让tomcat02 ping tomcat01
    PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
    64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.098 ms
    64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.071 ms
    #  结论:容器和容器之间是可以互相ping通的
    

    image-20211006064319609

    结论:tomcat01和tomcat02公用一个路由器,docker0。

    所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip。

    小结: Docker使用的是Linux的桥接,宿主机是一个Docker容器的网桥 docker0

    image-20211006064346629

    Docker 中的所有的网络接口都是虚拟的。虚拟的转发效率高!

    只要容器删除,对应网桥一对就没了!

    1.2、link参数

    #参数说明
    --link list                      Add link to another container
     --link-local-ip list             Container IPv4/IPv6 link-local addresses
    
    $ docker exec -it tomcat02 ping tomca01 # ping不通ping: tomca01: Name or service not known# 运行一个tomcat03 --link tomcat02$ docker run -d -P --name tomcat03 --link tomcat02 tomcat5f9331566980a9e92bc54681caaac14e9fc993f14ad13d98534026c08c0a9aef# 用tomcat03 ping tomcat02 可以ping通$ docker exec -it tomcat03 ping tomcat02PING tomcat02 (172.17.0.3) 56(84) bytes of data.64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.115 ms64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.080 ms# 用tomcat02 ping tomcat03 ping不通
    

    探究: docker network inspect 网络id 网段相同
    docker inspect tomcat03

    image-20211006092514478

    其实这个tomcat03 就是本地配置了tomcat02的配置?

    在这里插入图片描述

    –link 本质就是在hosts配置中添加映射

    现在使用Docker已经不建议使用–link了!

    自定义网络,不使用docker0!

    docker0问题:不支持容器名连接访问!

    1.3、自定义网络

    $ docker network --help
    connect -- Connect a container to a network
    create -- Creates a new network with a name specified by the
    disconnect -- Disconnects a container from a network
    inspect -- Displays detailed information on a network
    ls -- Lists all the networks created by the user
    prune -- Remove all unused networks
    rm -- Deletes one or more networks
    

    查看所有的docker网络

    image-20211006092625667

    网络模式

    bridge :桥接 docker(默认,自己创建也是使用bridge模式)

    none :不配置网络,一般不用

    host :和所主机共享网络

    container :容器网络连通(用得少!局限很大)

    测试

    # 我们直接启动的命令 --net bridge,而这个就是我们得docker0
    # bridge就是docker0
    $ docker run -d -P --name tomcat01 tomcat
    等价于 => docker run -d -P --name tomcat01 --net bridge tomcat
    # docker0,特点:默认,域名不能访问。 --link可以打通连接,但是很麻烦!
    # 我们可以 自定义一个网络
    # --driver bridge
    # --subnet 192.168.0.0/16  子网
    # --gateway 192.168.0.1  网关
    $ docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
    

    image-20211006092717927

    启动两个tomcat,再次查看网络情况

    [root@iZ8vbgc3u6dvwrjyp45lyrZ ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
    8f3b8236b5d9d149612d1dbe6b533c21601cfd7392cb5bf226a8427b5fc1b3e3
    [root@iZ8vbgc3u6dvwrjyp45lyrZ ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
    3279bc773cacaa51368f4417e42159732f046c0d300ce881fb0a598663e79779
    [root@iZ8vbgc3u6dvwrjyp45lyrZ ~]# docker network inspect mynet
    [
        {
            "Name": "mynet",
            "Id": "be05f1f6f6909cee0d1e868acb718c47c3e2efb9f5f33ccc38b6955ae6fb3578",
            "Created": "2021-07-26T11:11:10.09948571+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": {
                "3279bc773cacaa51368f4417e42159732f046c0d300ce881fb0a598663e79779": {
                    "Name": "tomcat-net-02",
                    "EndpointID": "0d31467ee4bc86d1b55d1889a07b468b57aeb82a9b23bbb2e2df5632d158ac0f",
                    "MacAddress": "02:42:c0:a8:00:03",
                    "IPv4Address": "192.168.0.3/16",
                    "IPv6Address": ""
                },
                "8f3b8236b5d9d149612d1dbe6b533c21601cfd7392cb5bf226a8427b5fc1b3e3": {
                    "Name": "tomcat-net-01",
                    "EndpointID": "7ae56746e954749dfd52c5f2965cc667d307b198f792175cca80040aed59eb52",
                    "MacAddress": "02:42:c0:a8:00:02",
                    "IPv4Address": "192.168.0.2/16",
                    "IPv6Address": ""
                }
            },
            "Options": {},
            "Labels": {}
        }
    ]
    # 再次测试 ping 连接
    [root@iZ8vbgc3u6dvwrjyp45lyrZ ~]# docker exec -it  tomcat-net-01 ping 192.168.0.3
    PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
    64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.135 ms
    64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.099 ms
    # 现在不使用--link也可以ping名字了
    [root@iZ8vbgc3u6dvwrjyp45lyrZ ~]# docker exec -it tomcat-net-01 ping tomcat-net-02
    PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
    64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.095 ms
    64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.108 ms
    64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.093 ms
    

    在自定义的网络下,服务可以互相ping通,不用使用–link

    我们自定义的网络docker当我们维护好了对应的关系,推荐我们平时这样使用网络!

    1.4、网络连通

    # 测试两个不同的网络连通 再启动两个tomcat 使用默认网络,即docker0
    $ docker run -d -P --name tomcat01 tomcat
    $ docker run -d -P --name tomcat02 tomcat
    # 此时ping不通
    

    要将tomcat01 连通 tomcat—net-01 ,连通就是将 tomcat01加到 mynet网络

    一个容器两个ip(tomcat01)

    image-20211006092920397

    # 01 连通ok[root@iZ8vbgc3u6dvwrjyp45lyrZ ~]# docker exec -it tomcat01 ping tomcat-net-01PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.130 ms64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.097 ms64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.106 ms64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=4 ttl=64 time=0.109 ms# 02 是依旧打不通的[root@iZ8vbgc3u6dvwrjyp45lyrZ ~]# docker exec -it tomcat02 ping tomcat-net-01ping: tomcat-net-01: Name or service not known
    

    结论:假设要跨网络操作别人,就需要使用 docker network connect 连通!

  • 相关阅读:
    Get distinct count of rows in the DataSet
    单引号双引号的html转义符
    PETS Public English Test System
    Code 39 basics (39条形码原理)
    Index was outside the bounds of the array ,LocalReport.Render
    Thread was being aborted Errors
    Reportviewer Error: ASP.NET session has expired
    ReportDataSource 值不在预期的范围内
    .NET/FCL 2.0在Serialization方面的增强
    Perl像C一样强大,像awk、sed等脚本描述语言一样方便。
  • 原文地址:https://www.cnblogs.com/ft-greate/p/15370447.html
Copyright © 2011-2022 走看看