1. 程式人生 > >docker存儲與網絡

docker存儲與網絡

結構 server1 ipv config none 不能 user 進程啟動 問題

目錄

  • 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存儲與網絡