zoukankan      html  css  js  c++  java
  • Docker学习笔记04---网络部分

    Docker学习笔记04

    狂神B站视频链接:https://www.bilibili.com/video/BV1og4y1q7M4 下半场:https://blog.csdn.net/u014073556/article/details/109624184

    Docker网络

    理解Docker0

    docker rmi -f $(docker images -aq)
    docker stop $(docker ps -a -q)
    docker rm $(docker ps -a -q)
    

    首先清空环境

    测试环境网络地址

    image

    三个网络

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

    image

    [root@localhost ~]# docker run -d -P --name tomcat01 tomcat
    
    
    # 查看容器的内部网络地址 ip addr,发现容器启动的时候回得到一个eth0@if8 ip地址,是docker分配的!
    docker exec -it tomcat01 ip addr
    [root@localhost ~]# docker exec -it tomcat01 ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
        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
    7: eth0@if8: <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通容器内部?
    [root@localhost ~]# 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.101 ms
    64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.063 ms
    
    #linux可以ping通docker容器的内部
    

    原理

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

    再次测试ip add

    [root@localhost ~]# ip add
    11: veth215323c@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
        link/ether ee:a6:6d:d4:1d:b3 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet6 fe80::eca6:6dff:fed4:1db3/64 scope link
           valid_lft forever preferred_lft forever
    13: veth56aed16@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
        link/ether d2:b8:37:68:b2:c8 brd ff:ff:ff:ff:ff:ff link-netnsid 1
        inet6 fe80::d0b8:37ff:fe68:b2c8/64 scope link
           valid_lft forever preferred_lft forever
    
    

    2、再次启动一个新的容器测试,发现又多了一对网卡~!

    [root@localhost ~]# docker run -d -P --name tomcat02 tomcat
    064a3acb0a239732e7bed338bb37fa09c17111652f1990e9fbfaf4420c808689
    

    image

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

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

    image

    # 可以正常ping通
    

    image

    绘制一个网络模型图:

    image

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

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

    小结

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

    image

    Docker 中的所有的网络接口都是虚拟的。虚拟的转发效率高!(内网之间传递数据文件!)

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

    思考

    当我们写了一个微服务,database url=ip:,项目不重启,数据库ip换掉了,我们希望可用处理这个问题,可用用名字来访问么?

    [root@localhost ~]# docker exec -it tomcat02 ping tomcat01
    
    # 如何可用解决网络不通的问题
    # 通过--link 可用解决网络连通问题(不推荐)
    [root@localhost ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
    2037b9bc1fbdcde9346b24d92e123e74e836850b15be70522933356214cae257
    [root@localhost ~]# docker exec -it tomcat03 ping tomcat02
    PING 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.128 ms
    64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.048 ms
    

    探究docker 网络

    [root@localhost ~]# docker network --help
    
    Usage:  docker network COMMAND
    
    Manage networks
    
    Commands:
      connect     Connect a container to a network
      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.
    
    

    探究inspect

    [root@localhost ~]# docker inspect 2037b9bc1fbd
    

    image

    其实这个tomcat03就是在本地配置了tomcat02的hosts文件

    # 查看hosts文件配置 在这里发现
    [root@localhost ~]# 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 064a3acb0a23
    172.17.0.4      2037b9bc1fbd
    

    本质探究: --link 就是我们在hosts文件中增加了一个 172.17.0.3 tomcat02 064a3acb0a23

    我们现在不建议使用 --link

    推荐使用:自定义网络

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

    自定义网络

    查看所有的docker网络

    image

    # 我们直接启用的命令 --net bridge,而这个就是我们的docker0
    docker run -d -P --name tomcat01 tomcat
    
    docker run -d -P --name tomcat01 --net bridge tomcat
    # docker0的特点:默认,域名不能直接访问, --link可以打通名字之间相互连接!
    
    #我们可以自定一个网络
    
    [root@localhost ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
    6e863e4a877e7db305d9148e6046ca5417412f0fd8c4935bd3fd4f05f26841e5
    [root@localhost ~]# docker network ls
    NETWORK ID     NAME                        DRIVER    SCOPE
    0000d3a7dce8   bridge                      bridge    local
    88b9e0608efb   host                        host      local
    6e863e4a877e   mynet                       bridge    local
    aec12a3125b1   none                        null      local
    

    image

    测试

    [root@localhost ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
    9a081e4eab1b75edaf701979d01c215ecc42dde5bdc3de9112a8a848079a8f52
    [root@localhost ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
    b0292eed3923ca993c27fde7e6bf6f1a459b1007f2c01dfc72a2bf9c5c8d9ae0
    [root@localhost ~]# docker network inspect mynet
    [
        {
            "Name": "mynet",
            "Id": "6e863e4a877e7db305d9148e6046ca5417412f0fd8c4935bd3fd4f05f26841e5",
            "Created": "2021-08-11T19:15:19.693872074+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": {
                "9a081e4eab1b75edaf701979d01c215ecc42dde5bdc3de9112a8a848079a8f52": {
                    "Name": "tomcat-net-01",
                    "EndpointID": "9b93d5e2e7dc559b584723a1df761c515f8be9f1268300e416aa7b45f3b540ad",
                    "MacAddress": "02:42:c0:a8:00:02",
                    "IPv4Address": "192.168.0.2/16",
                    "IPv6Address": ""
                },
                "b0292eed3923ca993c27fde7e6bf6f1a459b1007f2c01dfc72a2bf9c5c8d9ae0": {
                    "Name": "tomcat-net-02",
                    "EndpointID": "bef3b118eb81f57d68acac2d31eb2ab010a6035c881e6eb2b6183cd139ab6afb",
                    "MacAddress": "02:42:c0:a8:00:03",
                    "IPv4Address": "192.168.0.3/16",
                    "IPv6Address": ""
                }
            },
            "Options": {},
            "Labels": {}
        }
    ]
    

    image

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

    好处:不同的集群使用不同的网络,保证集群是安全和健康的!

    网络连通

    image

    image

    image

    # 测试打通 tomcat01 -mynet
    # 连通后就是将 tomcat01 放到 mynet 网络下?
    [root@localhost ~]# docker exec -it tomcat-net-01 ping tomcat01
    # 一个容器两个IP地址
    # 阿里云服务: 公网ip 私网ip
    

    image

    [root@localhost ~]# docker network inspect mynet
    

    image

    实战

    image

    shell脚本!
    #创建网卡
    [root@localhost ~]# docker network create --driver bridge --subnet 172.38.0.0/16 --gateway 172.38.0.1 redis
    docker network create redis --subnet 172.38.0.0/16
    
    #通过脚本创建六个redis配置
    for port in $(seq 1 6); 
    do 
    mkdir -p /mydata/redis/node-${port}/conf
    touch /mydata/redis/node-${port}/conf/redis.conf
    cat  EOF /mydata/redis/node-${port}/conf/redis.conf
    port 6379 
    bind 0.0.0.0
    cluster-enabled yes 
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    cluster-announce-ip 172.38.0.1${port}
    cluster-announce-port 6379
    cluster-announce-bus-port 16379
    appendonly yes
    EOF
    done
    
    docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} 
    -v /mydata/redis/node-${port}/data:/data 
    -v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf 
    -d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
    done
    
    
    [root@localhost conf]# docker run -p 6371:6379 -p 16371:16379 --name redis-1 -v /mydata/redis/node-1/data:/data -v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
    
    docker run -p 6371:6379 -p 16371:16379 --name redis-1 
    -v /mydata/redis/node-1/data:/data 
    -v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf 
    -d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf 
    
    docker run -p 6372:6379 -p 16372:16379 --name redis-2 
        -v /mydata/redis/node-2/data:/data 
        -v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf 
        -d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
        
    docker run -p 6373:6379 -p 16373:16379 --name redis-3 
    -v /mydata/redis/node-3/data:/data 
    -v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf 
    -d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
    #创建集群
    redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172. 38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
    

    image

    image

    进入redis

    docker exec -it redis-1 /bash/sh
    

    无法联网解决

    docker容器内无法联网问题解决,本人centos8
    firewall-cmd --zone=public --add-masquerade --permanent
    firewall-cmd --reload
    systemctl restart docker
    
    freewall-cmd  --add-service=docker
    

    IDEA整合Docker

    创建项目

    1、使用IDEA构建一个SpringBoot项目

    2、编写一个helloController

    @RestController
    public class HelloController{
        
        @GetMapping("/hello");
        public String hello(){
            return "hello,world!!!"
        }
    }
    

    3、启动测试一下,端口修改一下,避免8080端口冲突!本地访问没有问题即可!

    4、jar包打包

    image

    有了jar包就可以做镜像了!最后测试jar包是否可以使用!

    愿路途漫长,以后莫失莫忘。 愿你不骄不躁,安稳顺心。

    作者:菜鸟-传奇
    本文版权归作者和博客园共有,不以任何盈利为目的,欢迎转载。
  • 相关阅读:
    PAT (Advanced Level) Practice 1055 The World's Richest (25 分) (结构体排序)
    PAT (Advanced Level) Practice 1036 Boys vs Girls (25 分)
    PAT (Advanced Level) Practice 1028 List Sorting (25 分) (自定义排序)
    PAT (Advanced Level) Practice 1035 Password (20 分)
    PAT (Advanced Level) Practice 1019 General Palindromic Number (20 分) (进制转换,回文数)
    PAT (Advanced Level) Practice 1120 Friend Numbers (20 分) (set)
    从零开始吧
    Python GUI编程(TKinter)(简易计算器)
    PAT 基础编程题目集 6-7 统计某类完全平方数 (20 分)
    PAT (Advanced Level) Practice 1152 Google Recruitment (20 分)
  • 原文地址:https://www.cnblogs.com/cainiao-chuanqi/p/15131342.html
Copyright © 2011-2022 走看看