1.04 docker的網路
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
相關文章
- 【Docker】(11)---Docker的網路概念Docker
- Docker的網路(三)Docker
- Docker的網路管理Docker
- Docker 網路Docker
- Docker網路Docker
- kvm網路,docker網路,,vm網路Docker
- Docker 新網路 overlay 網路Docker
- Docker 網路管理Docker
- Docker網路原理Docker
- Docker網路管理Docker
- [Docker 系列]docker 學習八,Docker 網路Docker
- Docker容器的網路連線Docker
- Docker的網路模式詳解Docker模式
- 更安全的本地Docker網路Docker
- Docker 網路管理的未來Docker
- 6.Docker網路Docker
- Docker網路一覽Docker
- 41_Docker網路Docker
- docker容器網路bridgeDocker
- Docker四種網路模式Docker模式
- Docker幾種網路模式Docker模式
- 重建docker0網路Docker
- Docker 基礎 : 網路配置Docker
- Docker網路模型深度解析Docker模型
- Docker | Docker技術基礎梳理(五) - Docker網路管理Docker
- Docker網路雙向連線Docker
- 容器技術之Docker網路Docker
- docker系列(五):網路通訊Docker
- 詳解 Docker 容器網路配置Docker
- 單一docker主機網路Docker
- Docker不同宿主機網路打通Docker
- docker的網路-單主機(三種原生網路)none、host、bridgeDockerNone
- 詳解五種Docker容器的網路模式Docker模式
- Docker執行nginx映象及docker網路埠對映DockerNginx
- docker容器跨主機網路overlayDocker
- Docker網路配置基礎知識Docker
- 關於Docker中網路效能疑惑Docker
- Docker實踐(2)—虛擬網路Docker