每天5分鐘玩轉Docker 學習總結(二)
阿新 • • 發佈:2019-01-24
第五章 Docker 網路
Docker 安裝時會建立三個網路:bridge\host\none
5.1 none網路
- 什麼都沒有的網路,掛在這個網路下的容器除了lo,沒有任何網絡卡
- 用途:生成隨機密碼
5.2 host網路
- 連線到host網路的容器共享Docker host的網路棧,容器的網路配置與host完全一樣
- 使用 –network=host 指定使用host網路
host網路應用場景
- host主機也是連線在host網路,可以得到良好的效能,犧牲靈活性,比如埠衝突(Docker host上已經使用的埠就不能使用了)
- 讓容器可以直接配置host網路,比如某些跨host的網路解決方法,如管理iptables
5.3 bridge網路
- Docker安裝時會建立一個名為docker0的Linux bridge
- 不指定–network預設掛在docker0上
- 繫結好後是一對veth pair
- 容器建立時,docker會自動從172.17.0.0/16中分配一個IP
5.4 user-defined網路
除了none\host\bridge0三個自動建立的網路,使用者也可以根據業務需要建立user-defined
網路
Docker提供三種user-defined網路驅動
bridge、overlay、macvlan
bridge
- 類似bridge0網路
docker network create --driver bridge my-net
- 指定網段:
--subnet
和--gateway
- 指定靜態IP:
--ip
(只有使用了–subnet建立的網路才能指定靜態IP) - 同一網路中的容器、閘道器都是可以通訊的
- 要使建立的bridge與bridge0通訊,可以加路由器
5.5 容器間通訊
容器間可以通過IP、Docker DNS Server、joined 容器 三種方式通訊
1、IP通訊
- 兩個容器要能通訊,必須要有屬於同一網路的網絡卡
- 在建立時
--network
指定相應的網路
2、Docker DNS Server
- docker daemon實現了一個內嵌的DNS server,使容器可以通過”容器名”通訊。在啟動時用
--name
- 只能在
user-defined
網路中使用docker DNS。預設的bridge網路無法使用DNS
3、joined容器
- join可以使兩個容器共享一個網路棧,共享網絡卡和配置資訊
- joined容器之間可以通過127.0.0.1直接通訊
- 適用以下場景:
- 不同容器中的程式希望通過loopback高效地通訊,比如Web Server與App Server
- 希望監控其他容器的網路流量,比如執行在獨立容器中的網路監控程式
5.6 將容器與外部世界連線
容器訪問外部世界
- 容器可以訪問外部網路,實際是因為:網橋docker0收到容器的外出包,把它將包的源地址替換成host的地址傳送出去,即做了一次網路地址轉換(NAT)
外部世界訪問容器
- 埠對映
-p
! - 可將容器對外提供服務的埠對映到host的某個埠,外網通該埠訪問容器
docker run -d -p 80 httpd
httpd容器的80埠被對映到host 32773上,可以通過<host ip>:<32773>
訪問容器的Web服務docker run -d -p 80:32773
將80埠對映到host的32773埠
- docker-proxy監聽host的32773埠
- 當curl訪問0.0.0.0:32773時,docker-proxy轉發給容器 0.0.0.0:80
- httpd容器相應請求並返回結果
第六章 Docker 儲存
Docker為容器提供兩種村存放資料的資源
- 由storage driver 管理的映象層和容器層
- Data Volume
6.1 storage driver
- 對於某些容器可以直接將資料放在由storage driver維護的層中,如無狀態的應用
6.2 Data Volume
Data Volume本質是Docker Host檔案系統中的目錄或檔案,能夠直接被moune到容器的檔案系統中。Data Volume具有以下特點:
- Data Volume是目錄或檔案,而非沒有格式化的磁碟(塊裝置)
- 容器可以讀寫volume中的資料
- volume資料可以被永久地儲存,即使使用它的容器已經銷燬
如何設定volume的容量?
volume實際是docker host檔案系統的一部分,目前沒有方法設定volume的容量
Docker提供兩種型別的volume:bind mount 和 docker managed
bind mount
- bind mount 是將host上已存在的目錄或檔案mount到容器
docker run -v <host path>:<container path> name
- bind mount 時還可以指定資料的讀寫許可權,預設可讀可寫
- bind mount 缺點:限制了容器的可移植性,只能在當前host下
docker managed volume
- 不需要指定mount源,只需指明mount point即可
- docker managed volume建立過程
- 容器啟動時,告訴docker需要一個volume存放資料,mount到容器的目錄/abc下
- docker在
/var/lib/docker/volumes
中生成一個隨機目錄作為mount源 - 如果/abc已經在容器中存在,則將資料複製到moumt源
- 將volume mount到 /abc
bing mount 與 docker managed volume的不同點
- bind mount支援單個檔案,volume只支援目錄
- bind mount支援許可權修改,volume不支援
- bind mount移植性弱,volume移植性強,無須指定host目錄
6.3 資料共享
容器與host共享資料
- bind mount 直接將要共享的目錄mount到容器
docker cp
實現容器和host之間資料的複製
容器之間共享資料
將共享資料放在bind mount中,然後mount到多個容器
6.4 volume container
- 首先建立一個 volume container,它不需要處於執行狀態,容器mount了兩個volumes
- 其他容器可以通過
--volumes-from
使用vc_data 這個volume container
docker run --name web1 -d -p 80 --volume-from vc_data httpd
- volume container 特點:
- 與bind mount比,不必為每一個容器指定host path,所有path都在volume container 中定義好,容器只需與volume container關聯,實現了容器與host的解耦
- 使用volume container的容器,其mount point是一致的,有利於配置的規範和標準
6.5 data-packed volume container
- 可以將資料打包到映象中,然後通過 docker managed volume共享
- 通過Dockerfile構建映象
- FROM busybox:latest
- ADD htdocs /usr/local/apach2/htdocs
- VOLUME /usr/local/apache2/htdocs
- docker build 新映象,然後建立container
6.6 Data Volume生命週期管理
- docker 不會銷燬bind mount,只能由host刪除
- docker rm -v 引數,會將容器使用到的volume一併刪除,前提是沒有其他容器mount該volume
6.7 小結
- docker為容器提供了兩種儲存資源:資料層和 Data Volume
- 資料層包括映象層和容器層,由storage driver管理
- Data Volume有兩種型別:bind mount和docker managed volume
- bind mount 可以實現容器與host之間,容器與容器之間共享資料
- volume container 是一種具有更好移植性的容器間資料共享方案