聊一聊docker數據管理與端口映射
前言
前面兩篇文章講述的是構建docker鏡像的三種方式以及如何搭建docker私有倉庫,而本文將講述有關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的狀態否則會遇到報錯。