1. 程式人生 > >每天5分鐘玩轉Docker 學習總結(二)

每天5分鐘玩轉Docker 學習總結(二)

第五章 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 httpdhttpd容器的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 是一種具有更好移植性的容器間資料共享方案