docker存儲與網絡
目錄
- Docker存儲
- 掛載主機目錄
- 創建一個數據卷
- 掛載一個宿主機目錄作為數據卷
- 數據卷容器
- 創建一個數據卷容器
- 利用數據卷容器遷移數據
- 刪除數據盤
- 掛載主機目錄
- Docker網絡
- 簡介
- bridge網絡
- bridge網絡基本用法
- 基於bridge網絡的容器訪問外部網絡
- 外部網絡訪問基於bridge網絡的容器
- none網絡
- host網絡
- 自定義網絡
- 自定義bridge網絡
- 創建一個自定義網絡
- 通過指定子網和網關的方式創建自定義網絡
- 使用自定義網絡與默認網絡互通
- 同一臺宿主機容器互聯
Docker存儲
docker提供數據卷來實現數據共享與持久化,而數據卷的掛載有兩種方式:
- 掛載主機目錄(Bind mounts)
- 數據卷容器(Data Volumes)
數據卷是一個可供容器使用的特殊目錄,它繞過文件系統,可以提供很多有用的特性:
- 數據卷可以在容器之間共享和重用
- 對數據卷的修改會立馬生效
- 對數據卷的更新不會影響鏡像
- 卷會一直存在,只到沒有容器使用
掛載主機目錄
創建一個數據卷
docker run -d -P --name web -v /webapp docker.io/centos:6 /bin/bash 選項說明: -d:將容器放入後臺運行 -P:將容器中的端口暴露到宿主機的一個隨機端口 -v:創建一個數據卷,這個數據卷會自動映射到宿主機的某個目錄,一般在/var/lib/docker/vfs下
掛載一個宿主機目錄作為數據卷
docker run -d -P --name web -v /data:/webapp docker.io/centos:6 /bin/bash #將宿主機的/data目錄掛載至容器的/webapp目錄
docker掛載數據卷的默認為權限為讀寫(rw),用戶也可以通過ro指定為只讀:
docker run -d -P --name web -v /data:/webapp:ro docker.io/centos:6 /bin/bash
數據卷容器
創建一個數據卷容器
docker run -it -v /dbdata --name dbdata docker.io/centos:6 #創建一個數據卷容器dbdata,並創建一個數據卷掛載至/dbdata
其他容器可以通過--volumes-from來掛載dbdata容器中的數據卷:
docker run -it --volumes-from dbdata --name db1 centos:6
docker run -it --volumes-from dbdata --name db2 centos:6
容器db1和db2都掛載同一個數據卷到/dbdata目錄,三個容器任何一方在該目錄的寫入,其他 容器都能看到
--volumes-from參數可以多次使用,從多個容器掛載多個數據卷
如果刪除了掛載的容器,數據卷並不會被自動刪除,如果要刪除一個數據卷,必須在刪除最後一個還掛載著它的容器時顯示的使用docker rm -v 命令來指定同時刪除關聯的容器。
利用數據卷容器遷移數據
備份數據:
#先創建一個容器worker,並使用--volumes-from將dbdata掛載到worker容器,然後使用-v參數將容器的/backup目錄映射到宿主機的backup目錄。然後在容器中執行備份操作,這樣就把數據備份到宿主機的/backup目錄中了
docker run -it --volumes-from dbdata -v /backup:/backup --name worker centos:6
tar zcf /backup/backup.tar.gz /dbdata
還原數據:
#創建一個新容器,並用-v參數掛載本地的備份目錄,然後執行解壓操作,將備份文件解壓至/dbdata目錄
docker run -it -v /dbdata --name dbdata2 centos:6 /bin/bash #創建一個容器dbdata2
docker run -it --volumes-from dbdata2 -v /backup:/backup centos:6 tar xf /backup/backup.tar.gz
刪除數據盤
查看主機上現有的數據盤
docker volume ls
默認情況下,在刪除容器時,docker並不會刪除其數據盤,查看沒有容器在使用的數據盤方法如下:
docker volume ls -f dangling=true
如果想要刪除沒有使用的數據盤,使用如下指令:
docker volume rm VOLUME_NAME
刪除掉容器時,同時刪掉數據盤,則使用:
docker rm -v container_name
Docker網絡
簡介
當Docker進程啟動時,會在主機上創建一個名為docker0的虛擬網橋,此主機上啟動的docker容器會連接到這個虛擬網橋上。虛擬網橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連接在了一個二層網絡中。從docker0子網中分配一個ip給容器使用,並設置docker0的ip地址為容器的默認網關。在主機上創建一對虛擬網卡veth pair設備,docker將veth pair設備的一端放在新創建的容器中,並命名為eth0(容器的網卡),另一端放在主機中,以vethxxx這樣類似的名字命名,並將這個網絡設備加入到docker0網橋中。可以通過brctl show
命令查看。而這種網絡模式即稱之為bridge網絡模式。
除了bridge模式以外,docker原生網絡,還支持另外兩種模式: none和host
可以通過如下方法查看docker的網絡:
root@k8s-m:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
93392a2471d3 bridge bridge local
05c5ebb39921 host host local
3cb2552dc6e9 none null local
bridge網絡
bridge網絡基本用法
網絡結構示意圖:
查看bridge網絡信息:
# 通過如下命令會列出bridge網絡的相關信息,其中"Containers"字段的表示是信息是指當前節點上有哪些容器使用了該網絡
docker network inspect bridge
創建使用bridge網絡容器的示例:
docker run -d --name web1 --net bridge nginx
基於bridge網絡的容器訪問外部網絡
默認情況下,基於bridge網絡容器即可訪問外部網絡,這是因為默認情況下,docker使用了iptables的snat轉發來實現容器對外部的訪問(需要內核開啟net.ipv4.ip_forward=1)
外部網絡訪問基於bridge網絡的容器
如果想讓外界可以訪問到基於bridge網絡創建的容器提供的服務,則必須要告訴docker要使用的端口。
可以通過如下方法查看鏡像會使用哪些端口:
docker inspect nginx | jq .[]."ContainerConfig"."ExposedPorts"
在創建容器的時候可以指定這個容器的端口與主機端口的映射關系:
docker run -d --name web -p 8888:80 nginx
-p: 可以指定主機與容器的端口關系,冒號左邊是主機的端口,右邊是映射到容器中的端口
-P:該參數會分配鏡像中所有的會使用的端口,並映射到主機上的隨機端口
這種端口映射基於iptables的dnat實現
查看容器的端口情況:
docker port web
如果創建容器時,-p參數後面只一個指定端口,意思是主機會隨機一個端口,映射到容器的該指定端口:
docker run -d --name web -p 80 nginx
下面是一個基於端口映射的示例:
docker run -d --dns 8.8.8.8 -p 8080:80 -p 2022:22 --name webserver1 httpd:2.4
docker run -d --dns 8.8.8.8 -P --name webserver1 httpd:2.4
none網絡
故名思議,none網絡就是什麽都沒有的網絡。使用none網絡的容器除了lo,沒有其他任何網卡,完全隔離。用於既不需要訪問外部服務,也不允許外部服務訪問自己的應用場景。
查看none網絡信息:
docker network inspect none
創建使用none網絡容器的示例:
docker run -d --name web_none --net none nginx
host網絡
使用host網絡的主機,與宿主機共享網絡地址,可以獲得最好的數據轉發性能。缺點是,同一個宿主機上的多個容器共享同一個ip地址,如果多容器使用相同的端口,需要自行解決端口沖突問題。
同樣的,可以通過如下方式查看host網絡信息:
docker network inspect host
創建一個使用host網絡容器的示例:
# 可以看到該容器沒有自己的IP地址,因為它直接使用宿主機IP地址
docker run -d --name web_host -net host nginx
自定義網絡
Docker除了提供三種的默認網絡模式之外,也允許用戶針對一些特定的應用場景去創建一些自定義的網絡。這樣屬於這個網絡的容器就可以單獨隔離出來,它們之間可以相互通信,而不在這個網絡的容器就不能直接訪問到它們。一個容器可以屬於多個網絡,同一個自定義網絡下的容器可以通過各自的容器名訪問到對方,因為會使用到docker內嵌的一個dns功能。
Docker提供三種自定義網絡驅動:
- bridge
- overlay
- macvlan
自定義bridge網絡
創建一個自定義網絡
1、創建一個叫作my_net
的自定義網絡:
docker network create --driver bridge my_net #--driver用於指定網絡類型
可以通過docker network ls
查看到新創建的my_net
網絡相關信息,Subnet表示這個網絡下的子網IP段,那麽基於my_net
自定義網絡創建的容器IP都會以該IP段開頭。
2、基於my_net網絡創建容器:
docker run -d --name web2 --net my_net nginx
通過指定子網和網關的方式創建自定義網絡
1、通過指定子網和網關的方式創建my_net2網絡:
docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 my_net2
2、創建一個容器使用my_net2網絡:
docker run --it --network=my_net2 busybox
3、創建一個容器的使用my_net2網絡的同時指定其ip地址:
docker run --it --network=my_net2 --ip=172.22.16.8 busybox
使用自定義網絡與默認網絡互通
假設我們在默認的bridge網絡中,還有一個httpd的容器:
docker run -d --name webserver httpd:2.4
此時默認網絡中的容器與my_net2網絡中的容器是無法互相通信的。宿主機上網絡結構如下:
如果想讓默認bridge網絡的httpd與my_net2中的容器通信,可以給httpd容器添加一塊自定義網絡的網卡,使用如下指令:
docker network connect my_net2 webserver
如果要將webserver新添加的這塊網卡移除,可以使用如下命令:
docker network disconnect bridge webserver
同一臺宿主機容器互聯
同一臺宿主機上的容器互聯有兩種方式,第一種是基於ip,默認情況下,同一個宿主機上的容器ip是互通的。另一種方式是使用--link
實現:
docker run -d --name db1 -e "MYSQL_ROOT_PASSWORD=123456" -P mysql:5.6
docker run -d --link db1:db1 --name webserver1 httpd:2.4
docker存儲與網絡