1.04 docker的網路

尹成發表於2018-12-10

1.網路分類

  • 單機
    • Bridge Network
    • Host Network
    • None Network
  • 多機
    • Overlay Network

2.網路基礎

  • 公有IP和私有IP
    • public IP:網際網路上的唯一標識,可以訪問Internet
    • private IP:不可在網際網路上使用,僅限機構內部使用
    • A類:10.0.0.0~10.255.255.255(10.0.0.0/8)
    • B類:172.16.0.0~172.31.255.255(172.16.0.0/12)
    • C類:192.168.0.0~192.168.255.255(192.168.0.0/16)
  • 網路地址轉換NAT
  • 有一個公有IP,路由來做NAT轉換
  • ping:驗證IP的可達性
  • telnet:驗證服務的可用性
    在這裡插入圖片描述

3.Linux網路名稱空間namespace
在這裡插入圖片描述

  • 檢視後臺程式
    在這裡插入圖片描述
  • 互動執行
    在這裡插入圖片描述
  • exit退出後,本機也可以檢視網路介面,但他們是不同的,是隔離開的,這就是通過namespace實現的網路隔離
    在這裡插入圖片描述
  • 直接檢視容器的網路埠,在本機可以ping通,因為本機也虛擬出了一個網段
    在這裡插入圖片描述
  • 檢視本機的network namespace
    在這裡插入圖片描述
  • 建立namespace
    在這裡插入圖片描述
  • 刪除namespace
    在這裡插入圖片描述
  • 再次建立namespace
    在這裡插入圖片描述
  • 在namespace中執行ip a建立一個迴環口
    在這裡插入圖片描述
  • 檢視回環口狀態
    在這裡插入圖片描述
  • 使之變為up狀態
    在這裡插入圖片描述
  • 再次檢視回環口狀態
    在這裡插入圖片描述
  • 建立另一個namespace test2
    在這裡插入圖片描述
  • 新增link,然後檢視,多了兩個veth的介面
    在這裡插入圖片描述
  • 檢視veth的介面
    在這裡插入圖片描述
  • 將veth-test1新增到namespace的test1中,然後檢視test1中的介面
    在這裡插入圖片描述
  • 可以在本地檢視ip link,本地的veth-test1不見了
    在這裡插入圖片描述
    在這裡插入圖片描述
  • 將veth-test2新增到namespace的test2中,然後檢視test2中的介面
    在這裡插入圖片描述
  • 然後可以在本地檢視ip link,本地的veth-test2不見了
    在這裡插入圖片描述
  • 為test1和test2分配IP地址
    在這裡插入圖片描述
  • 此時檢視test1和test2,並沒有IP
    在這裡插入圖片描述
  • 開啟2個埠
    在這裡插入圖片描述
  • 再次檢視test1和test2
    在這裡插入圖片描述
  • test1和test2此時已經有IP了
    在這裡插入圖片描述
    在這裡插入圖片描述
  • test1和test2互相可以ping通
  • 這就是docker底層應用namespace網路隔離的原理
  • 建立容器,就會同時建立一個namespace
    在這裡插入圖片描述

4.Bridge詳解

  • 關掉test6,就留一個test5
    在這裡插入圖片描述
  • 列舉當前機器docker有哪些網路
    在這裡插入圖片描述
  • 檢視bridge網路的連線情況
  • 可以看到test5的container連線的是docker bridge網路
    在這裡插入圖片描述
    在這裡插入圖片描述
  • 檢視本機的網路卡
    在這裡插入圖片描述
    在這裡插入圖片描述
  • 檢視test5的ip a,下面的eth0@if15就與上面的veth是一對的
    在這裡插入圖片描述
  • 可以通過brctl檢視所有的bridge
  • 可以看到如下veth與 ip a 檢視到的docker0的veth是一樣的
    在這裡插入圖片描述
  • 再建立一個container
    在這裡插入圖片描述
  • 再次檢視所有的bridge
    在這裡插入圖片描述
  • 檢視ip a,docker0下也多了一個veth與之對應
    在這裡插入圖片描述
  • 進入容器互動執行
    在這裡插入圖片描述
  • ping 外網
    在這裡插入圖片描述
  • 本機的eth0可以去訪問外網,NAT網路地址轉換實現了docker0也可以訪問外網,也就是iptables實現的

5.容器通訊

  • 建立一個container
    在這裡插入圖片描述
  • 建立另一個container
    在這裡插入圖片描述
  • 檢視程式
    在這裡插入圖片描述
  • 互動訪問test8,然後ping IP和ping 主機名,都是通的
    在這裡插入圖片描述
    在這裡插入圖片描述
    在這裡插入圖片描述
  • 這裡假設,訪問test7的mysql,就可以test7:3306
    在這裡插入圖片描述
  • 反過來,互動執行test7,不能直接ping 主機名,是有方向的
    在這裡插入圖片描述
  • 檢視,停止,刪除test8
    在這裡插入圖片描述

6.埠對映

  • 首先,後臺建立並執行一個nginx的container
    在這裡插入圖片描述
  • 檢視程式,nginx預設使用80埠
    在這裡插入圖片描述
  • 檢視網路狀況
  • web連線到了bridge上,IP是172.17.0.2
    在這裡插入圖片描述
    在這裡插入圖片描述
  • 本機可以ping通nginx的container
    在這裡插入圖片描述
  • 80埠也是可連通的
    在這裡插入圖片描述
  • 可以檢視nginx的歡迎頁面
    在這裡插入圖片描述
  • 停止並刪掉剛才的web容器
    在這裡插入圖片描述
  • 重新建立容器,指定-p引數,將容器的80埠對映到本地的80埠
    在這裡插入圖片描述
  • 檢視程式,已經對映到了本地的80埠
    在這裡插入圖片描述
  • 此時訪問本地的80埠,也會返回nginx歡迎頁
    在這裡插入圖片描述
  • 通過瀏覽器訪問虛擬機器IP也可以
    在這裡插入圖片描述
  • 拓撲圖如下,nginx是繫結到172.17.0.2:80,剛才-p引數是將192.168.205.10:80轉發到了172.17.0.2:80
  • 如果是在阿里雲建立的,192.168.205.10就是對外的IP
  • 阿里雲也是給兩個IP,有一個是對外的IP

7.網路的none和host

  • 介紹host和none網路
    在這裡插入圖片描述
  • 建立新的容器,使用none網路
    在這裡插入圖片描述
  • 檢視none網路,連線了test10
    在這裡插入圖片描述
    在這裡插入圖片描述
  • 外界檢視不到test10的網路
    在這裡插入圖片描述
  • 進入test10容器,並檢視網路,沒有對外的介面,是一個孤立的容器
    在這裡插入圖片描述
  • 應用場景:安全性要求極高,儲存絕密資料等
  • 建立新的容器,使用host網路
    在這裡插入圖片描述
  • 檢視host網路,連線了test11
    在這裡插入圖片描述
  • 進入test11容器,並檢視網路,與本機看到的是一樣的,與主機共享namespace,類似虛擬機器NAT模式
    在這裡插入圖片描述

8.多容器部署和應用

  • 建立redis容器
    在這裡插入圖片描述
  • 建立並進入目錄
    在這裡插入圖片描述
  • 建立app.py,寫入以下內容
    from flask import Flask
    from redis import Redis
    import os
    import socket

app = Flask(name)
redis = Redis(host=os.environ.get(‘REDIS_HOST’, ‘127.0.0.1’), port=6379)

@app.route(’/’)
def hello():
redis.incr(‘hits’)
return ‘Hello Container World! I have been seen %s times and my hostname is %s.\n’ % (redis.get(‘hits’),socket.gethostname())

if name == “main”:
app.run(host=“0.0.0.0”, port=5000, debug=True)

  • 建立Dockerfile,寫入以下內容
    FROM python:2.7
    LABEL maintaner="sjc_job@126.com"
    COPY . /app
    WORKDIR /app
    RUN pip install flask redis
    EXPOSE 5000
    CMD [ “python”, “app.py” ]
  • 構建image
    在這裡插入圖片描述
  • 建立flask容器
    在這裡插入圖片描述
  • 進入容器,互動執行
    在這裡插入圖片描述
  • 檢視環境變數
    在這裡插入圖片描述
    在這裡插入圖片描述
  • 直接可以ping redis了
    在這裡插入圖片描述
  • 多次訪問5000埠,實現自增
    在這裡插入圖片描述
    在這裡插入圖片描述
  • 停止並刪掉flask-redis
    在這裡插入圖片描述
  • 重啟啟動容器,加-p引數指定埠對映
    在這裡插入圖片描述
  • 本地也可以訪問容器內的服務了
  • 這裡的自增1是redis做的,web服務是flask釋出的
    在這裡插入圖片描述
    在這裡插入圖片描述

9.overlay網路和etcd通訊

  • etcd是一個開源免費的K-V的分散式儲存
    在這裡插入圖片描述
  • 解壓
    在這裡插入圖片描述
  • 進入解壓目錄
    在這裡插入圖片描述
  • 執行如下啟動命令,然後回車,後臺執行
    在這裡插入圖片描述
    nohup ./etcd --name docker-node1 --initial-advertise-peer-urls http://192.168.174.141:2380
    –listen-peer-urls http://192.168.174.141:2380
    –listen-client-urls http://192.168.174.141:2379,http://127.0.0.1:2379
    –advertise-client-urls http://192.168.174.141:2379
    –initial-cluster-token etcd-cluster
    –initial-cluster docker-node1=http://192.168.174.141:2380,docker-node2=http://192.168.174.142:2380
    –initial-cluster-state new&
  • 第二臺機器,進入/usr/local目錄,下載tar包
    在這裡插入圖片描述
  • 解壓
    在這裡插入圖片描述
  • 進入解壓目錄
    在這裡插入圖片描述
  • 執行如下啟動命令,然後回車,後臺執行
    在這裡插入圖片描述
    nohup ./etcd --name docker-node2 --initial-advertise-peer-urls http://192.168.174.142:2380
    –listen-peer-urls http://192.168.174.142:2380
    –listen-client-urls http://192.168.174.142:2379,http://127.0.0.1:2379
    –advertise-client-urls http://192.168.174.142:2379
    –initial-cluster-token etcd-cluster
    –initial-cluster docker-node1=http://192.168.174.141:2380,docker-node2=http://192.168.174.142:2380
    –initial-cluster-state new&
  • 在第一臺機器etcd資料夾中執行,檢視etcd叢集狀態
    在這裡插入圖片描述
  • 第二臺機器也同樣執行,檢查狀態
    在這裡插入圖片描述
  • 第一臺機器停止docker
    在這裡插入圖片描述
  • 手動後臺執行docker,命令執行完打回車
    在這裡插入圖片描述
  • 第二臺機器停止docker
    在這裡插入圖片描述
  • 手動後臺執行docker,命令執行完打回車
    在這裡插入圖片描述
  • 可以將兩個機器都exit退出,然後再重新連線
  • node01中,建立網路,overlay是驅動
    在這裡插入圖片描述
  • 檢視網路,多個demo
    在這裡插入圖片描述
  • node02中檢視網路,也多個demo,兩邊資料是同步的,etcd實現的
    在這裡插入圖片描述
  • node01中檢視etcd記錄的資訊,最終看到id與建立network產生的id一致
    在這裡插入圖片描述
    在這裡插入圖片描述
    在這裡插入圖片描述
    在這裡插入圖片描述
  • 可以檢視網路的基本資訊
    在這裡插入圖片描述
  • node01中建立容器
    在這裡插入圖片描述
  • 此時將命令複製到node02執行,會直接報錯,說test12已經存在
    在這裡插入圖片描述
  • node02中重新建立,改名為test13
    在這裡插入圖片描述
    學院Go語言視訊主頁
    https://edu.csdn.net/lecturer/1928

[清華團隊帶你實戰區塊鏈開發]
(https://ke.qq.com/course/344443?tuin=3d17195d)
掃碼獲取海量視訊及原始碼 QQ群:
721929980
在這裡插入圖片描述

相關文章