Docker学习自我总结(三)

以下内容皆参考至狂神说docker学习视频

Docker网络学习

1. Docker网络模型

  1. 在wsl2中, ip addr查看网络如下
    在这里插入图片描述
# 我们发现这个容器带来网卡,都是一对对的
# veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连
# 正因为有这个特性,veth-pair充当一个桥梁, 连接各种虚拟网络设备
# OpenStac, Docker容器之间的链接,OVS的链接, 都是使用veth-pair技术
  1. 进入容器查看容器ip docker exec -it tomcat01 ip addr
    在这里插入图片描述

​ 如果出现 OCI runtime exec failed: exec failed:,则进入容器后执行:

apt update
apt install -y iproute2
  1. 我们测试一下tomcat01和tomcat02之间是否可以ping通!再次运行一个tomcat02
    在这里插入图片描述
    结论:容器与容器之间是可以相互ping通的!

绘制一个网络模型图

在这里插入图片描述

结论:tomcat01和tomcat02是共用的一个路由器,docker0

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

在这里插入图片描述

Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥docker0.

2. link的使用

思考一个场景,我们编写了一个微服务,database url =ip; 项目不重启,数据ip换掉了,我们希望可以处理这个问题,可以按名字来进行访问容器

​ 直接 docker exec -it tomcat02 ping tomcat01,发现是ping不通的;解决方法:通过–link既可以解决网络连通问题

​ 在启动tomcat时使用link命令: docker run -d -P --name tomcat03 --link tomcat02 tomcat,这个时候再 docker exec -it tomcat03 ping tomcat02,就可以ping通了

​ 反向可以ping通吗? 执行 docker exec -it tomcat02 ping tomcat03,发现反向ping不通

​ 探究其原因,查看host文件发现其实这个tomcat03就是在本地配置了tomcat02的配置,执行 docker exec -it tomcat03 cat /etc/hosts如下:

127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3  tomcat02 f22ed47ed1be
172.17.0.4  3a2bcaba804c

​ 本质探究:–link 就是我们在hosts配置中增加了一个172.17.0.3 tomcat02 f22ed47ed1be

3. 自定义网络

​ 我们现在玩Docker已经不建议使用–link了;Docker0的问题:它不支持容器名链接访问!

  1. 查看所有网络
    在这里插入图片描述
    2. 网络模式

    bridge: 桥接模式,桥接 docker 默认,自己创建的也是用brdge模式
    none: 不配置网络
    host: 和宿主机共享网络
    container:容器网络连通!(用的少, 局限很大)
    

    ​ 我们直接启动的命令默认有一个 --net 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 可以支持255*255个网络 192.168.0.2 ~ 192.168.255.254
    # --gateway 192.168.0.1
    docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
    root@程哥哥Redmibook:~# docker network ls
    NETWORK ID     NAME      DRIVER    SCOPE
    96771c136621   bridge    bridge    local
    9cbacd058f0e   host      host      local
    075850a6fdb4   mynet     bridge    local
    7febd5f666b6   none      null      local
    #自定义网络mynet创建成功
    

    ​ 在自己创建的网络里面启动两个容器,过程如下

    root@程哥哥Redmibook:~# docker network inspect mynet
    [
        {
            "Name": "mynet",
            "Id": "075850a6fdb48390ca67680b39630c13d19eda1beda7364496738318f02320d7",
            "Created": "2022-04-25T14:13:35.137312937+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": {}
        }
    ]
    root@程哥哥Redmibook:~# docker run -d -P --name tomcat-mynet01 --net mynet tomcat
    f055f7730993161a37fc21acada953f15969c8de4a30a7063b9ef689d038e4e2
    root@程哥哥Redmibook:~# docker run -d -P --name tomcat-mynet02 --net mynet tomcat
    99975b2eee389baac6d16c7c4e1469b779077c2249d0ee5a46d317ab6b29363a
    root@程哥哥Redmibook:~# docker network inspect mynet
    [
        {
            "Name": "mynet",
            "Id": "075850a6fdb48390ca67680b39630c13d19eda1beda7364496738318f02320d7",
            "Created": "2022-04-25T14:13:35.137312937+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": {
                "99975b2eee389baac6d16c7c4e1469b779077c2249d0ee5a46d317ab6b29363a": {
                    "Name": "tomcat-mynet02",
                    "EndpointID": "d967e96f6768727a1514a210009562e086286e676cfc56f160640bceac578de0",
                    "MacAddress": "02:42:c0:a8:00:03",
                    "IPv4Address": "192.168.0.3/16",
                    "IPv6Address": ""
                },
                "f055f7730993161a37fc21acada953f15969c8de4a30a7063b9ef689d038e4e2": {
                    "Name": "tomcat-mynet01",
                    "EndpointID": "76aadd24a3a2df0ed14e07f9bfd045449eb3d29c3e8257a5393ff4b97719e280",
                    "MacAddress": "02:42:c0:a8:00:02",
                    "IPv4Address": "192.168.0.2/16",
                    "IPv6Address": ""
                }
            },
            "Options": {},
            "Labels": {}
        }
    ]
    #再次ping成功
    docker exec -it tomcat-net-01 ping 192.168.0.3
    docker exec -it tomcat-net-01 ping tomcat-net-02
    

    ​ 我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络

    ​ 好处:

    	redis - 不同的集群使用不同的网络,保证集群时安全和健康的
    	mysql - 不同的集群使用不同的网络,保证集群时安全和健康的
    

    4.网络连通

    docker network connect 测试打通tomcat01 和mynet

    在这里插入图片描述
    # 连通之后就是讲tomcat01 放到了mynet网路下
    # 一个容器两个ip地址:
    # 阿里云服务器,公网ip,私网ip
    docker network connect  mynet tomcat01
    # 连通ok
    root@程哥哥Redmibook:~# docker exec -it tomcat01 ping tomcat-net-01
    PING 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.100 ms
    64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.085 ms
    ^C
    --- tomcat-net-01 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1000ms
    rtt min/avg/max/mdev = 0.085/0.092/0.100/0.012 ms
    # 依旧无法连通,没有connect
    root@程哥哥Redmibook:~# docker exec -it tomcat02 ping tomcat-net-01
    ping: tomcat-net-01: Name or service not known
    

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程哥哥吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值