Docker存儲和網絡


Docker存儲資源類型

docker兩種存儲資源類型

  用戶在使用 Docker 的過程中,勢必需要查看容器內應用產生的數據,或者需要將容器內數據進行備份,甚至多個容器之間進行數據共享,這必然會涉及到容器的數據管理。

(1)Data Volume (數據卷)

(2)Data Volume Dontainers --- 數據卷容器

Data volume 數據卷

  Data Volume 本質上是 Docker Host 文件系統中的目錄或文件,使用類似與 Linux 下對目錄或者文件進行 mount 操作。數據卷可以在容器之間共享和重用,對數據卷的更改會立馬生效,對數據卷的更新不會影響鏡像,卷會一直存在,直到沒有容器使用。

Data Volume 有以下特點:   

a)Data Volume 是目錄或文件,而並非格式化的磁盤(塊設備)。  

b)容器可以讀寫 volume 中的數據。   

c)volume 數據可以被永久的保存,即使使用它的容器已經銷毀。

比如說我把根下面的目錄掛給了容器

Data Volume的使用: 通過-v 參數格式為 <host path>:<container path>

a)運行一個容器,並創建一個數據卷掛載到容器的目錄上

 docker run -dti -v /web centos:latest /bin/bash 

利用 centos:latest 的鏡像運行一個容器,並在容器內創建一個數據卷掛載到容器的 /web 目錄上

b)  運行一個容器,本地創建/date目錄掛載到容器的/var/log/目錄上(就是說把宿主機真是存在的目錄映射、掛載給容器,這樣就算你刪掉這個容器,之前這個目錄里的數據也會被保存下來,宿主機上的目錄可以查看到,這就是容器怎么去做數據的存儲)

docker run -dti -v /data:/var/log centos:latest /bin/bash

DataVolumeDontainers --- 數據卷容器

  如果用戶需要在容器之間共享一些持續更新的數據,最簡單的方法就是使用數據卷容器,其實數據卷容器就是一個普通的容器,只不過是專門用它提供數據卷供其他容器掛載使用。

Data Volume Dontainers使用:

a)創建一個名為 dbdata 的數據卷,並在其中創建一個數據卷掛載到 /dbdata

docker run -dti -v /dbdata --name dbser centos:latest 
--name 參數為給容器指定名字為dbser方便記憶

b)其他容器使用--volume-from 去掛載dbdata容器中的/dbdata數據卷 

eg :

創建 db1&db2 兩個容器, 並掛載 /dbdata 數據卷到本地  

docker run -dti --volumes-from dbser --name db1 centos:latest  

docker run
-dti --volumes-from dbser --name db2 centos:latest

此時,容器 db1 和 db2 同時掛載了同一個數據卷到本地相同 /dbdata 目錄。三個容器任何一個目錄下的寫入,都可以時時同步到另外兩個

如何批量停止容器

for id in `docker ps -a | grep centos: | awk -F " +" '{print $1}'`;do docker stop $id;done

Docker網絡介紹

大量的互聯網應用服務需要多個服務組件,這往往需要多個容器之間通過網絡通信進行相互配合。

  docker 網絡從覆蓋范圍可分為單個 host 上的容器網絡和跨多個 host 的網絡 docker 目前提供了映射容器端口到宿主主機和容器互聯機制來為容器提供網絡服務,在啟動容器的時候,如果不指定參數,在容器外部是沒有辦法通過網 絡來訪問容器內部的網絡應用和服務的。

docker 安裝時會自動在host上創建三個網絡,我們查看一下docker網絡:

docker network ls 

Docker--none網絡

none 網絡就是什么都沒有的網絡。掛在這個網絡下的容器除了 lo,沒有其他任何網卡。容器創建時,可以通過 --network=none 指定使用 none 網絡

#首先先下載image busybox

docker search busybox

docker pull busybox

#查看網卡信息(這是沒有指定網絡為空的情況下)

docker run –it busybox /bin/sh

 

指定為空

docker run –it --network=none busybox /bin/sh

none 網絡的應用

封閉的網絡意味着隔離,一些對安全性要求高並且不需要聯網的應用可以使用 none 網絡。

比如某個容器的唯一用途是生成隨機密碼,就可以放到 none 網絡中避免密碼被竊取。

當然大部分容器是需要網絡的,我們接着看 host 網絡。

Docker host 網絡

host 網絡連接到 host 網絡的容器,共享 docker host 的網絡棧,容器的網絡配置與 host 完全一樣。可以通過 --network=host 指定使用 host 網絡

docker run -itd --network=host busybox /bin/sh

 

在容器中可以看到 host 的所有網卡,並且連 hostname 也是 host(宿主機) 的。host 網絡的使用場景又是什么呢?

  直接使用 Docker host 的網絡最大的好處就是性能,如果容器對網絡傳輸效率有較高要求,就可以選擇 host 網絡。 當然不便之處就是犧牲一些靈活性,比如要考慮端口沖突問題,Docker host 上已經使用的端口就不能再用了。

  Docker host 的另一個用途是讓容器可以直接配置 host 網路。比如某些跨 host 的網絡解決方案,其本身也是以容器方式運行的,這些方案需要對網絡進 行配置,比如管理 iptables。

Docker Bridge網絡

docker 安裝時會創建一個 命名為 docker0 的 linux bridge。如果不指定 --network,創建的容器默認都會掛到 docker0 上

 

當前 docker0 上只有一台網絡設備,我們創建一個容器看看有什么變化

一個新的網絡接口 veth429b8b 被掛到了 docker0 上,veth429b8b就是新創建容器的虛擬網卡。

進入剛才運行的容器查看網絡,容器有一個網卡 eth0@if21

 

實際上 eth0@if21 和 veth429b8b 是一對 veth pair。

veth pair 是一種成對出現的特殊網絡設備,可以把它們想象成由一根虛擬網線連接起來的一對網卡,網卡的一頭(eth0@if21)在容器中,另一頭 (veth429b8b)掛在網橋 docker0 上,其效果就是將 eth0@if21 也掛在了 docker0 上。

eth0@if21已經配置了 IP 172.17.0.3,為什么是這個網段呢? 看一下 bridge 網絡的配置信息:

docker network inspect bridge

 

 

 

bridge 網絡配置的 subnet 就是 172.17.0.0/16,並且網關是 172.17.0.1, 在docker0上:

 

容器創建時,docker 會自動從 172.17.0.0/16 中分配一個 IP,這里 16 位的 掩碼保證有足夠多的 IP 可以供容器使用。

創建 user-defined 網絡(自定義網絡)

我們可通過 bridge(網橋的驅動) 驅動創建類似前面默認的 bridge (網絡的類型)網絡

(1)利用bridge驅動創建名為my-net1網橋(docker會自動分配網段):

docker network create --driver bridge my-net1

(2)查看一下當前 host 的網絡結構變化:

docker network ls

 

(3)查看容器my-net1網橋配置(bridge就是容器和網橋形成一對veth pair)

docker network inspect my-net1

 

(4)利用bridge驅動創建名為my-net2網橋(user-defined網段及網關)

docker network create --driver bridge --subnet 10.10.20.0/24 --gateway 10.10.20.1 my-net2    

 

(5)啟動容器使用新建的my-net2網絡模式

docker run -it --network=my-net2 httpd     

 

(6)啟動容器使用my-net2網絡並指定ip(只有使用 --subnet 創建的網絡才能指定靜態 IP,如果是docker自動分配的網段不可以指定ip)

docker run -it --network=my-net2 --ip 10.10.20.100 httpd

 

(7)讓我們已啟動容器htt1連接到除它本身網絡之外的網絡(讓現有的容器怎么連接另外的網絡)

docker network connect my-net1 htt1

 

(8)使用--name指定啟動容器名字,可以使用docker自帶DNS通信,但只能工作在user-defined(用戶自定義) 網絡,默認的 bridge 網絡是無法使用 DNS 的

docker run -itd --network=my-net2 --name=box1 busybox

docker run -itd --network=my-net2 --name=box2 busybox

 

 

(9)容器之間的網絡互聯

 a). 首先創建一個 db 容器

 docker run -dti --name db centos:latest

 b). 創建一個 web 容器,並使其連接到 db

 docker run -dti --name web --link db:dblink centos:latest

--link db:dblink實際是連接對端的名字和這個鏈接的名字,也就是和 db 容器建立一個叫做 dblink 的鏈接 

 c). 查看鏈接的情況

 docker ps –a

 d). 使用 ping 命令來測試網絡鏈接的情況

 

link的指定是單向的,不能反過來連

(10)容器端口映射(現在你的容器之間可以訪問了,但是除容器之外的客戶端到底是怎么訪問到你服務的呢)

在啟動容器的時候,如果不指定參數,在容器外部是沒有辦法通過網絡來訪問容 器內部的網絡應用和服務的

當容器需要通信時,我們可以使用 -P (大) &&-p (小)來指定端口映射

-P : Docker 會隨機映射一個 4900049900 的端口到容器內部開放的網絡端口

-p :則可以指定要映射的端口,並且在一個指定的端口上只可以綁定一個容器

支持的格式有

IP :HostPort : ContainerPort #:左邊是宿主機端口,右邊是容器端口

IP : : ContainerPort  #這樣的話會在宿主機里隨機開啟一個端口,充當這個容器的固定端口

IP : HostPort :#我們把宿主機上的一個固定端口映射給容器隨機開的一個端口

查看映射

docker port

a)映射所有接口地址,此時綁定本地所有接口上的 5000 到容器的 5000 接口, 訪問任何一個本地接口的 5000 ,都會直接訪問到容器內部

docker run -dti -p 5000:5000 centos:latest 

 

b)多次使用可以實現多個接口的映射

docker run -dti -p 5000:5000 -p 5022:22 centos:latest 

c)映射到指定地址的指定接口 此時會綁定本地 192.168.4.169 接口上的 5000 到容器的 5000接口

docker run -dti -p 192.168.4.169:5000:5000 centos:latest 

d) 映射到指定地址的任意接口 此時會綁定本地 192.168.4.169 接口上的任意一個接口到容器的 5000 接口

docker run -dti -p 192.168.4.169::5000 centos:latest 

e) 使用接口標記來指定接口的類型

docker run -dti -p 192.168.4.169::5000/UDP centos:latest 

(11)實驗:通過端口映射實現訪問本地的 IP:PORT 可以訪問到容器內的 web

a)將容器80端口映射到主機8080端口

docker run -itd -p 8080:80 --name http-test httpd   (注意,映射的時候不要指定環境變量)

b) 查看剛運行docker

docker ps

c) 進入容器

 docker exec –itd 7cbfa7375128  /bin/bash

d) 容器內部編輯網頁文件 index.html ********

echo “hhhhhhhhhhhh” > /usr/local/htdocs/index.html

e)到宿主機上打開瀏覽器輸入 IP:PORT 訪問驗證 http://192.168.4.170:8080

網絡排排查命令:

iptables -t nat -L

ip r
tcpdump -i docker0 -n icmp  #抓包

tcpdump -i eth0 -n icmp
 
        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM