1. 程式人生 > 實用技巧 >websocket的應用---Django

websocket的應用---Django

理解Docker0

原理

  1. 我們每啟動一個docker容器,docker就會給docker容器分配一個ip,我們只要安裝了docker,就會有一個網絡卡docker0 橋接模式,使用的技術是veth-pair技術!

  2. 每啟動一個容器就會給容器分配一個網絡卡,發現網絡卡都是成對出現,這就是veth-pair技術,是一對虛擬裝置介面,一段連著協議,一段彼此相連。veth-pair充當一個橋樑,連線各種虛擬網路裝置。

  3. openstack,Docker容器之間的連線,OVS的連線,都是使用veth-pair技術

  4. 容器之間可以通過ip地址相互 ping 通。

    • docker0的網路模型圖

    tomcat01和tomcat02是用的一個公用的路由器:docker0.

    s所有容器不指定網路下,都是使用docker0,docker會給容器分配一個預設的可用ip

    小結

    Docker使用的是linux的橋接,宿主機中是一個Docker容器的網橋 docker0 。

    Docker中所有的網路介面都是虛擬的,虛擬的轉發效率高!(內網傳遞檔案!)

    只要容器刪除,對應的一對網橋就沒有了。

    --link

    Docker中兩個容器不用ip,直接用容器名進行 ping ,這是 ping 不通的。

     1  [root@VM-0-14-centos ~]# docker ps 
     2  CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
    
    3 345cdedafc19 tomcat "catalina.sh run" 12 seconds ago Up 12 seconds 0.0.0.0:9001->8080/tcp tomcat02 4 61537737e9c0 tomcat "catalina.sh run" 20 seconds ago Up 19 seconds 0.0.0.0:9000->8080/tcp tomcat01 5 [root@VM-0-14-centos ~]# docker exec -it tomcat02 ping
    tomcat01 6 ping: tomcat01: Name or service not known 7 #這裡發現直接 ping 容器名字是 ping 不通,通過 --link 就能解決了 8 [root@VM-0-14-centos ~]# docker run -d -P --name tomcat03 --link tomcat01 tomcat 9 bc26e16b083d3ea1e52a4d8ee5762d31a4023e3dd72e476b600588678bb1e3a9 10 [root@VM-0-14-centos ~]# docker exec -it tomcat03 ping tomcat01 11 PING tomcat01 (172.17.0.2) 56(84) bytes of data. 12 64 bytes from tomcat01 (172.17.0.2): icmp_seq=1 ttl=64 time=0.153 ms 13 64 bytes from tomcat01 (172.17.0.2): icmp_seq=2 ttl=64 time=0.113 ms 14 64 bytes from tomcat01 (172.17.0.2): icmp_seq=3 ttl=64 time=0.108 ms 15 64 bytes from tomcat01 (172.17.0.2): icmp_seq=4 ttl=64 time=0.112 ms 16 #反向是不可以 ping 通的 17 [root@VM-0-14-centos ~]# docker exec -it tomcat01 ping tomcat03 18 ping: tomcat03: Name or service not known

  5. 
    

    這裡顯示建立容器docker自動給容器分配的ip

    在建立tomcat03時候就已經配置了和tomcat02連通的配置。如何檢視配置?

    
    
    
    #檢視hosts配置
     [root@VM-0-14-centos ~]# 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.2      tomcat01 61537737e9c0
     172.17.0.4      bc26e16b083d

    --link 就是在hosts配置中增加了一個172.17.0.2 tomcat01 61537737e9c0 綁定了

    不建議使用--link太笨了。建議使用自定義網路。

    自定義網路

    檢視所有docker網路 docker network ls

    網路模式

    bridge : 橋接模式 docker上面搭橋(預設)(自己建立也是使用橋接模式)

    none : 不配置網路

    host : 和宿主機共享網路

    container :容器網路連通(用得少)

    測試

     #我們直按啟動的命令  --net bridge,而這個就是我們的docker0,預設是--net bridge
     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
     ​
     [root@VM-0-14-centos ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
     47053a6c6ad25977b5ccaca5996e7582e49a0ec0a361078505a805fb15ebe716
     [root@VM-0-14-centos ~]# docker network ls
     NETWORK ID          NAME                DRIVER              SCOPE
     1a796e623d62        bridge              bridge              local
     07b2cb229c0e        host                host                local
     47053a6c6ad2        mynet               bridge              local
     ee79b9f66b12        none                null                local
     7f0e24ce21ca        redis               bridge              local
     ​
     
    
     [root@VM-0-14-centos ~]# docker run -d -P--name tomcat-net-01 --net mynet tomcat
     unknown shorthand flag: '-' in ---name
     See 'docker run --help'.
     [root@VM-0-14-centos ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
     3cbdd9de3925fdb41cae22e761267697eec8faf67159ac8fa23ff4330ed5d6d5
     [root@VM-0-14-centos ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat 
     46b69f2c19844bbc1a136cc71dacf15e0d283c9be192c1f5ac794d5e662a3974
     [root@VM-0-14-centos ~]# docker network inspect mynet 
     [
         {
             "Name": "mynet",
             "Id": "47053a6c6ad25977b5ccaca5996e7582e49a0ec0a361078505a805fb15ebe716",
             "Created": "2020-09-17T14:34:12.808558135+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": {
                 "3cbdd9de3925fdb41cae22e761267697eec8faf67159ac8fa23ff4330ed5d6d5": {
                     "Name": "tomcat-net-01",
                     "EndpointID": "126b689de44ddc3dbcfa2bd2fa952f54203a4233ec505b2b72193f8a56a6ba24",
                     "MacAddress": "02:42:c0:a8:00:02",
                     "IPv4Address": "192.168.0.2/16",
                     "IPv6Address": ""
                 },
                 "46b69f2c19844bbc1a136cc71dacf15e0d283c9be192c1f5ac794d5e662a3974": {
                     "Name": "tomcat-net-02",
                     "EndpointID": "b517ac34133f8653230f86814c835e1eb1d897b5e83b95600dc7a234d2805a33",
                     "MacAddress": "02:42:c0:a8:00:03",
                     "IPv4Address": "192.168.0.3/16",
                     "IPv6Address": ""
                 }
             },
             "Options": {},
             "Labels": {}
         }
     ]
     #  再次測試 ping 連線
     [root@VM-0-14-centos ~]# 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.160 ms
     64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.112 ms
     64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.086 ms
     ^C
     --- 192.168.0.3 ping statistics ---
     3 packets transmitted, 3 received, 0% packet loss, time 1001ms
     rtt min/avg/max/mdev = 0.086/0.119/0.160/0.031 ms
     #  不使用--link也可以直接 ping 通
     [root@VM-0-14-centos ~]# 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.071 ms
     64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.156 ms
     64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.096 ms

    自定義的網路docker已經分配好對應的關係。推薦平時這樣使用

    好處:

    redis - 不同的叢集使用不同的網路,保證叢集是安全和健康的 mysql - 不同的叢集使用不同的網路,保證叢集是安全和健康的

    網路連通

    在docker0預設下建立tomcat01和tomcat02,然後用tomcat01去 ping tomcat-net-01是ping不通的

 #  測試打通tomcat01 - mynet
 ​
 #  連通之後就是將tomcat01放到了mynet網路下
 #  一個容器兩個ip地址!
 #  阿里雲服務,公網ip 私網ip
 ​

#  tomcat01成功連通了mynet網路
 [root@VM-0-14-centos ~]#  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.106 ms
 64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.093 ms
 64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.111 ms
 #  tomcat02是打不通的
 [root@VM-0-14-centos ~]#  docker exec -it tomcat02 ping tomcat-net-01 
 ping: tomcat-net-01: Name or service not known

結論︰假設要跨網路操作別人,就需要使用docker network connect 連通!