2021-05-12 14:32:11
深入理解Docker資料管理與埠對映
docker資料管理
什麼是docker的資料管理?
? 先想一想關於Linux系統管理中的磁碟管理,其實本質上也都是對儲存的資料進行管理,docker中的資料管理也是如此。docker中,對資料的管理主要在於兩個方面,其一是為了方便檢視容器內的資料,其二是實現多個容器的資料共用。
? 那麼管理docker的資料的方式有兩個:資料卷和資料卷容器。下面會逐個介紹。
docker的資料管理方式
資料卷
? 資料卷是一個供容器使用的特殊目錄,位於容器中,可將宿主機的目錄掛載到資料卷上,對資料卷的修改操作立刻可見(其實上篇文章中已經接觸到了),並且更新資料不會影響映象,從而實現資料在宿主機與容器之間的遷移。
? 其實,在docker中,資料卷的使用可以類比於Linux下對目錄進行的mount操作。
資料卷容器
? 顯然,資料卷容器和資料卷不是同一個概念,但是作用是一樣的。只不過資料卷容器的目的是在容器間共用一些資料。資料卷容器就可以認為是一個普通的容器,只不過是專門用來提供資料卷給其他容器掛載使用的。
資料卷和資料卷容器的概念和區別可以通過下圖來理解:
資料卷就是宿主機中提供的一塊空間(目錄空間)掛載給容器,使得容器與宿主機之間可以共用檔案資料,而資料卷容器是將一個容器內的一個空間(目錄)掛載給另一個容器,使得容器與容器之間共用檔案資料。
下面來實際來操作一下是如何通過中兩種方式對docker進行資料管理的。
如何進行對docker的資料管理?
1、建立資料卷(為後面的資料卷容器做準備)
#目前是空映象和空容器環境
[root@localhost ~]# docker run -d -v /data/data1 -v /data/data2 --name web httpd
Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
123275d6e508: Pull complete
e984dd982a6e: Pull complete
963280e5cf81: Pull complete
6faf90d050b2: Pull complete
962b56984bb0: Pull complete
Digest: sha256:d5dc0d279039da76a8b490d89a5c96da83a33842493d4336b42ccdfbd36d7409
Status: Downloaded newer image for httpd:latest
8e21b3e1366970633f01ae4d77b0f55a2d52782997138cc1e8ab70904d5f487b
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8e21b3e13669 httpd "httpd-foreground" About a minute ago Up About a minute 80/tcp web
[root@localhost ~]# docker exec -it 8e21b3e13669 /bin/bash
root@8e21b3e13669:/usr/local/apache2# ls /data/
data1 data2
2、掛載主機目錄作為資料卷:資料卷實際案例
[root@localhost ~]# docker run -d -v /var/www:/data/data1 --name web1 httpd:latest
5ff89e3dbdd25bbb1b105678c50364758fe62cb5c7d10aa5f47e8865ddd5e8d8
#引數解釋:
-d:守護行程
-v:資料捲操作
/var/www:宿主機目錄將被掛載的目錄
/data/data1:容器中資料卷
--name:容器名稱
3、測試
[root@localhost ~]# cd /var/www/
[root@localhost www]# touch file
[root@localhost www]# ls
file
[root@localhost www]# docker exec -it web1 /bin/bash #在新的容器中檢視目錄內容
root@5ff89e3dbdd2:/usr/local/apache2# ls /data/data1/
file
root@5ff89e3dbdd2:/usr/local/apache2#
4、資料卷容器實際案例
#前面已經進行建立了一個名為web的容器,其中所建立的資料卷分別掛載到了/data/data1與/data/data2目錄上,使用--volumes-from選項來掛載web容器中的資料捲到新的容器
[root@localhost ~]# docker run -it --volumes-from web --name web_test httpd:latest /bin/bash
root@afafb9631fc9:/usr/local/apache2# ls /
bin boot data dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@afafb9631fc9:/usr/local/apache2# ls /data/
data1 data2
#兩個目錄(資料卷容器)提供給新的容器web_test使用
我們可以進行測試,在其中一個目錄中建立檔案,如何進入原本的資料卷容器中檢視是否有該檔案
root@afafb9631fc9:/usr/local/apache2# cd /data/data1
root@afafb9631fc9:/data/data1# touch newfile
root@afafb9631fc9:/data/data1# exit
exit
[root@localhost ~]# docker exec -it web /bin/bash
root@8e21b3e13669:/usr/local/apache2# ls /data/data1
newfile
? 測試成功了,這樣可以通過資料卷容器實現容器之間的資料共用了。通過這些機制,即使容器在執行過程中出現故障,使用者也不必擔心資料發生丟失了,如果發生意外,只需要快速重新建立容器即可。
下面簡述一下有關docker的埠對映
docker網路通訊之埠對映
? 其實docker的埠對映應該在先前的網路部分進行講述的,還記得docker0網路模式的原理嗎?其實,在docker中,預設的選擇是docker網橋模式,而實現網路通訊也是依賴於NAT地址轉換,簡單而言就是外部網路可以通過存取宿主機的ip地址結合埠號對docker內部的容器進行存取通訊獲取資料資訊。
? 埠對映有兩種命令方式,一種是加入選項-P,另一種是使用-p。-P表示docker自己分配一個埠,適用於自己未規定而又避免與其他容器衝突埠的情況,-p則表示指定埠,適用於自定義的情況,節省資源和優化管理的情況。
下面看看實際案例:
[root@localhost ~]# docker run -d -P httpd
Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
123275d6e508: Pull complete
e984dd982a6e: Pull complete
963280e5cf81: Pull complete
6faf90d050b2: Pull complete
962b56984bb0: Pull complete
Digest: sha256:d5dc0d279039da76a8b490d89a5c96da83a33842493d4336b42ccdfbd36d7409
Status: Downloaded newer image for httpd:latest
e7a9cda3fea1904401b274a35b51d93a23b95cd0c8e548bb4982e21e8586d657
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e7a9cda3fea1 httpd "httpd-foreground" 5 seconds ago Up 4 seconds 0.0.0.0:32768->80/tcp charming_ride
我們測試一下這個Apache服務是否成功,從獲取到成功差不多就30s
使用小寫嘗試一下:
[root@localhost ~]# docker run -d -p 54544:80 httpd
26d52f0d0a49a8c3b87aa4f4eb251eee080c9ba776902987e0173d7a290412d0
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
26d52f0d0a49 httpd "httpd-foreground" 5 seconds ago Up 4 seconds 0.0.0.0:54544->80/tcp busy_khorana
e7a9cda3fea1 httpd "httpd-foreground" 3 minutes ago Up 3 minutes 0.0.0.0:32768->80/tcp charming_ride
測試驗證:
看了都成功了。接下來說說容器的互聯。
容器互聯
容器互聯是指通過容器的名稱在容器間建立一條專門的網路通訊隧道從而實現容器的互聯。在使用docker run 命令的時候使用--link選項就可以實現容器之間的互聯通訊。
格式為:--link name:alias
name——容器名
alias——這個連線的別名
需要注意的是:容器互聯是通過容器的名稱來執行的,--name選項可以給容器建立一個友好的名稱,這個名稱是唯一的,即不可重複。
具體案例演示:
1、建立容器
[root@localhost ~]# docker run -itd -P --name test1 CentOS /bin/bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
8a29a15cefae: Pull complete
Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
Status: Downloaded newer image for centos:latest
9f2ce34c7867d8b159201f9a3521a28570a3843a8fca08a60f58b12ff7565188
2、建立接收容器
[root@localhost ~]# docker run -itd -P --name test2 --link test1:test1 centos /bin/bash
f3c2974dcd19796cd8a48ecaf398370f891887cbfb92a192e8d7e706ccbefd62
3、進入一個容器中進行測試(ping)
[root@localhost ~]# docker exec -it test2 /bin/bash
[root@f3c2974dcd19 /]# ping test1
PING test1 (172.17.0.2) 56(84) bytes of data.
64 bytes from test1 (172.17.0.2): icmp_seq=1 ttl=64 time=0.089 ms
64 bytes from test1 (172.17.0.2): icmp_seq=2 ttl=64 time=0.070 ms
64 bytes from test1 (172.17.0.2): icmp_seq=3 ttl=64 time=0.062 ms
64 bytes from test1 (172.17.0.2): icmp_seq=4 ttl=64 time=0.065 ms
64 bytes from test1 (172.17.0.2): icmp_seq=5 ttl=64 time=0.063 ms
^C
--- test1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 13ms
rtt min/avg/max/mdev = 0.062/0.069/0.089/0.014 ms
需要注意的是,我們的容器需要是up的狀態否則會遇到報錯。
相關文章