zoukankan      html  css  js  c++  java
  • Docker网络[6]

    推荐: 狂神说Java Docker学习

    1. 理解Docker 0

    清空所有网络

    # 测试  运行一个tomcat
    $ docker run -d --name tomcat01 tomcat

     再启动一个容器tomcat02测试,发现又多了一对网络

     

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

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

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

     

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

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

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

    Docker中所有网络接口都是虚拟的,虚拟的转发效率高(内网传递文件)

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

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

    2. --link 

    $ 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 tomcat
    5f9331566980a9e92bc54681caaac14e9fc993f14ad13d98534026c08c0a9aef
    # 用tomcat03 ping tomcat02 可以ping通
    $ 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.115 ms
    64 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

     

     查看tomcat03里面的/etc/hosts发现有tomcat02的配置

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

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

    自定义网络,不适用docker0!

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

    3.自定义网络

    $ docker network
    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网络

     网络模式:

    • 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可以打通连接,但是很麻烦!
    # 我们可以 自定义一个网络
    $ docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

    $ docker network inspect mynet;

     

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

     

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

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

    好处:

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

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

    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) 

     01连通 ,加入后此时,已经可以tomcat01 和 tomcat-01-net ping通了

    02是依旧不通的

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

     5.  实战:部署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 # 通过脚本运行六个redis for port in $(seq 1 6); docker run -p 637${port}:6379 -p 1667${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
    # 进入其中一个redis容器
    $ docker exec
    -it redis-1 /bin/sh #redis默认没有bash
    # 建立redis集群
    > 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

    docker搭建redis集群完成!

    我们使用docker之后,所有的技术都会慢慢变得简单起来!

     

    参考:

    Docker容器学习笔记二(狂神说Java)

  • 相关阅读:
    wget(转)
    852. Peak Index in a Mountain Array
    617. Merge Two Binary Trees
    814. Binary Tree Pruning
    657. Judge Route Circle
    861. Score After Flipping Matrix
    832. Flipping an Image
    461. Hamming Distance
    654. Maximum Binary Tree
    804. Unique Morse Code Words
  • 原文地址:https://www.cnblogs.com/dong320/p/14199699.html
Copyright © 2011-2022 走看看