docker (2)---儲存、網路(利用docker容器上線靜態網站)
一、docker底層依賴的核心技術
1、名稱空間 (Namespaces)
2、控制組 (Control Groups)
3、聯合檔案系統 (Union File System)
4、Linux 虛擬網路支援:本地和容器內建立虛擬介面
(1) 名稱空間(Namespaces):
實現了容器間資源的隔離,每個容器擁有自己獨立的名稱空間 , 執行其中的應用就像是執行在獨立的作業系統中一樣 , 我們都可以看到檔案系統,網絡卡等資源保證了容器之間互不影響,namesaces管理程序號 , 每個程序名稱空間有一套自己的程序號管理方法 , 進
程名稱空間是一個父子關係的結構 , 子空間中的程序對於父空間是可見的。
(2) 控制組 (Control Groups) :
控制組 (Control groups)--CGroups 是 Linux 核心的一個特性 ,主要用來對共享資源進行隔離、限制、審計等 。cgroups 允許對於程序或程序組公平( 不公平 ) 的分配 CPU 時間、記憶體分配和 I/O 頻寬。
容器通過 cgroups 來得到所能夠管理資源的分配和使用。因此容器所獲得資源僅為所有系統資源的一個部分
1、資源限制 : 記憶體子系統為程序組設定記憶體使用上限,記憶體達到上限後再申請記憶體,就會發出 Out of Memory
2、 優先順序 : 通過優先順序讓一些組得到更多 CPU 等資源
3、 資源審計 : 用來統計系統上實際把多少資源用到適合的目的上 , 可以使用 cpuacct 子系統記錄某個程序組使用的 CPU 時間
4、 隔離 : 為組隔離名字空間 , 這樣一個組不會看到其他組的程序 .網路連線和檔案系統
5、 控制 : 掛起 . 恢復和啟動等操作
(3)聯合檔案系統 (Union File System) :
docker 中使用AUFS(another Union File System 或 v2 版本以後的Advanced multi-layered Unification File System) 控制為每一個成員目錄設定只讀 / 讀寫 / 寫出許可權 , 同時 AUFS 有一個類似分層的概念 , 對只讀許可權的分支可以邏輯上進行增量的修改.
二、docker的儲存
docker兩種儲存資源型別:
1、Data Volume (資料卷)
2、Data Volume Dontainers --- 資料卷容器
(1) Data Volume (資料卷):
Data Volume 本質上是 Docker Host 檔案系統中的目錄或檔案,使用類似與 Linux 下對目錄或者檔案進行 mount 操作。資料卷可以在容器之間共享和重用,對資料卷的更改會立馬生效,對資料卷的更新不會影響映象,卷會一直存在,直到沒有容器使用。
Data Volume(資料卷)的特點:
1、Data Volume 是目錄或檔案,而非沒有格式化的磁碟(塊裝置)。
2、容器可以讀寫 volume 中的資料。
3、volume 資料可以被永久的儲存,即使使用它的容器已經銷燬。
Data Volume 的使用:
1、在宿主機根目錄下建立一個目錄(資料卷)
2、啟動一個容器並將資料卷掛載到容器的目錄下
3、驗證 ( 持久化的需要對映目錄)
#
(2)Data Volume Dontainers --- 資料卷容器
資料卷容器就是一個普通的容器,只不過是專門用它提供資料卷供其他容器掛載使用
Data Volume Dontainers使用:
1、建立一個名為 dbdata 的資料卷,並在其中建立一個數據卷掛載到 /dbdata
docker run -dti -v /dbdata --name dbser centos:latest
2、再啟動兩個容器,並使用資料卷容器
docker run -dti --volumes-from dbser --name db1 centos:latest
#
3、驗證
#
容器 db1 和 db2 同時掛載了同一個資料捲到本地相同 /dbdata目錄。三個容器任何一個目錄下的寫入,都可以時時同步到另外兩個
三、docker 三種網路
docker 網路從覆蓋範圍可分為單個 host 上的容器網路和跨多個 host 的網路,docker 目前提供了對映容器埠到宿主主機和容器互聯機制來為容器提供網路服務,在啟動容器的時候,如果不指定引數,在容器外部是沒有辦法通過網路來訪問容器內部的網路應用和服務的
docker 安裝時會自動在host上建立三個網路
docker network ls (檢視docker 網路)
(1) docker--none網路
none 網路就是什麼都沒有的網路。掛在這個網路下的容器除了 lo,沒有其他 任何網絡卡。容器建立時,可以通過 --network=none 指定使用 none 網路
none網路的應用
封閉的網路意味著隔離,一些對安全性要求高並且不需要聯網的應用可以使用 none 網路。
(2)docker--host網路
連線到 host 網路的容器,共享 docker host 的網路棧,容器的網路配置與host 完全一樣。可以通過 --network=host 指定使用 host 網路
host 網路的應用
直接使用 Docker host 的網路最大的好處就是效能,如果容器對網路傳輸效率有較高要求,就可以選擇 host 網路。當然不便之處就是犧牲一些靈活性,比如要考慮埠衝突問題,Docker host上已經使用的埠就不能再用了。
Docker host 的另一個用途是讓容器可以直接配置 host 網路。比如某些跨host 的網路解決方案,其本身也是以容器方式執行的,這些方案需要對網路進行配置,比如管理 iptables
(3) docker--bridge 網路
docker 安裝時會建立一個 命名為 docker0 的 linux bridge。如果不指定--network,建立的容器預設都會掛到 docker0 上
#
eth0@if29 與 veth04c5851 是一對 veth pair
#
veth pair 是一種成對出現的特殊網路裝置,可以把它們想象成由一根虛擬網線連線起來的一對網絡卡,網絡卡的一頭(eth0@if29)在容器中,另一頭( veth04c5851)掛在網橋 docker0 上,其效果就是將 eth0@if29也掛在了docker0 上。
# 檢視網路配置資訊 ( 設定容器ip 網段、閘道器)
docker network inspect bridge
#
注:容器建立時,docker 會自動從 172.17.0.0/16 中分配一個 IP,這裡 16 位的掩碼保證有足夠多的 IP 可以供容器。
四、建立 user-defined網路 (自定義網路)
通過 bridge 驅動建立類似前面預設的 bridge 網路
1、利用bridge驅動建立名為my-net2網橋(docker會自動分配網段)
docker network create --driver bridge my-net2
# 檢視網路配置資訊
# 檢視網橋
2、利用bridge驅動建立名為my-net3網橋(user-defined (自定義)網段及閘道器)
docker network create --driver bridge --subnet 172.33.1.0/24 --gateway 172.33.1.1 my-net3
# 檢視網路配置資訊
# 檢視網橋
3、啟動容器使用新建的my-net3網路
docker run -it --network=my-net3 busybox:latest
4、啟動容器使用my-net3網路並指定ip(只有使用 --subnet 建立的網路才能指定靜態 IP,如果是docker自動分配的網段不可以指定ip)
docker run -it --network=my-net3 --ip 172.33.1.100 busybox:latest
5、讓已啟動不同vlan的busybox容器,可以連線到my-net2(其實在busybox中新建了my-net2的網絡卡)(新增網絡卡。訪問不同的網段)
# #docker network connect my-net3 08493ae30117 ( 連線)
6、使用--name指定啟動容器名字,可以使用docker自帶DNS通訊,但只能工作在user-defined 網路,預設的 bridge 網路是無法使用 DNS 的。
#docker run -it --network=my-net3 --name=bbox1 busybox:latest #docker run -it --network=my-net3 --name=bbox2 busybox:latest
7、容器之間的網路互聯
&1、建立一個 db 容器
docker run -dti --name db centos:latest
&2、建立一個 web 容器,並使其連線到 容器db
docker run -dti --name web --link db:dblink centos:latest /bin/bash
--link db:dblink 實際是連線對端的名字和這個連結的名字,也就是和 db 容器建立一個叫做 dblink 的連結
# 測試
注:此連結通訊是單向的
8、容器埠對映
在啟動容器的時候,如果不指定引數,在容器外部是沒有辦法通過網路來訪問容器內部的網路應用和服務的,當容器需要通訊時,我們可以使用 -P (大) &&-p (小)來指定埠對映
(1) -P : Docker 會隨機對映一個 49000 ~ 49900 的埠到容器內部開放的網路埠
(2) -p :則可以指定要對映的埠,並且在一個指定的埠上只可以繫結一個容器。
支援的格式
IP : HostPort : ContainerPort
IP : : ContainerPort
IP : HostPort :
&1、 檢視對映
docker port CONTAINER ID/NAMES
&2、對映所有介面地址,此時繫結本地所有介面上的 5200 到容器的 5200 介面,訪問任何一個本地介面的 5000 ,都會直接訪問到容器內部
docker run -dti -p 5200:5200 centos:latest /bin/bash
&3、多次使用可以實現多個介面的對映
docker run -dti -p 5400:5400 -p 5300:5300 centos:latest /bin/bash
&4、對映到指定地址的指定介面
此時會繫結本地 192.168.226.147 介面上的 5100 到容器的 5100 介面
docker run -dti -p 192.168.226.147:5100:5100 centos:latest /bin/bash
&5、對映到指定地址的任意介面
此時會繫結本地 192.168.226.147 介面上的任意一個介面到容器的 5500 介面
docker run -dti -p 192.168.226.147::5500 centos:latest /bin/bash
實驗、通過埠對映實現訪問本地的 IP:PORT 可以訪問到容器內的 web
1、將容器80埠對映到主機8090埠
docker run -itd -p 192.168.226.147:8090:80 --name http-test httpd:latest
2、檢視剛執行docker容器
docker ps
3、進入 容器
4、容器內部編輯網頁檔案 index.html
5、到宿主機上開啟瀏覽器輸入 IP:PORT 訪問驗證
http://192.168.226.147:8090/
6、宿主機上傳靜態網站測試檔案
7、解壓
8、把解壓的目錄上傳至容器下的網站根目錄
docker cp jd 67b3daf15a40:/usr/local/apache2/htdocs
9、進入容器,刪除原來的index.html 檔案
10、展開目錄
11、web 訪問
http://192.168.226.147:8090/
&n