docker兩種存儲資源類型html
用戶在使用 Docker 的過程當中,勢必須要查看容器內應用產生的數據,或者須要將容器內數據進行備份,甚至多個容器之間進行數據共享,這必然會涉及到容器的數據管理。linux
(1)Data Volume (數據卷)web
(2)Data Volume Dontainers --- 數據卷容器docker
Data Volume 本質上是 Docker Host 文件系統中的目錄或文件,使用相似與 Linux 下對目錄或者文件進行 mount 操做。數據卷能夠在容器之間共享和重用,對數據卷的更改會立馬生效,對數據卷的更新不會影響鏡像,卷會一直存在,直到沒有容器使用。centos
Data Volume 有如下特色: 瀏覽器
a)Data Volume 是目錄或文件,而並不是格式化的磁盤(塊設備)。 安全
b)容器能夠讀寫 volume 中的數據。 bash
c)volume 數據能夠被永久的保存,即便使用它的容器已經銷燬。網絡
好比說我把根下面的目錄掛給了容器tcp
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
若是用戶須要在容器之間共享一些持續更新的數據,最簡單的方法就是使用數據卷容器,其實數據卷容器就是一個普通的容器,只不過是專門用它提供數據卷供其餘容器掛載使用。
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 網絡從覆蓋範圍可分爲單個 host 上的容器網絡和跨多個 host 的網絡 docker 目前提供了映射容器端口到宿主主機和容器互聯機制來爲容器提供網絡服務,在啓動容器的時候,若是不指定參數,在容器外部是沒有辦法經過網 絡來訪問容器內部的網絡應用和服務的。
docker 安裝時會自動在host上建立三個網絡,咱們查看一下docker網絡:
docker network ls
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 網絡中避免密碼被竊取。
固然大部分容器是須要網絡的,咱們接着看 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 安裝時會建立一個 命名爲 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 能夠供容器使用。
咱們可經過 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 會隨機映射一個 49000 ~ 49900 的端口到容器內部開放的網絡端口 -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