前面兩篇文章講述的是構建docker鏡像的三種方式以及如何搭建docker私有倉庫,而本文將講述有關docker中的數據管理及端口映射的內容。web
先想想關於Linux系統管理中的磁盤管理,其實本質上也都是對存儲的數據進行管理,docker中的數據管理也是如此。docker中,對數據的管理主要在於兩個方面,其一是爲了方便查看容器內的數據,其二是實現多個容器的數據共享。docker
那麼管理docker的數據的方式有兩個:數據卷和數據卷容器。下面會逐個介紹。shell
數據卷是一個供容器使用的特殊目錄,位於容器中,可將宿主機的目錄掛載到數據捲上,對數據卷的修改操做馬上可見(其實上篇文章中已經接觸到了),而且更新數據不會影響鏡像,從而實現數據在宿主機與容器之間的遷移。apache
其實,在docker中,數據卷的使用能夠類比於Linux下對目錄進行的mount操做。centos
顯然,數據卷容器和數據卷不是同一個概念,可是做用是同樣的。只不過數據卷容器的目的是在容器間共享一些數據。數據卷容器就能夠認爲是一個普通的容器,只不過是專門用來提供數據卷給其餘容器掛載使用的。bash
數據卷和數據卷容器的概念和區別能夠經過下圖來理解:網絡
數據卷就是宿主機中提供的一塊空間(目錄空間)掛載給容器,使得容器與宿主機之間能夠共享文件數據,而數據卷容器是將一個容器內的一個空間(目錄)掛載給另外一個容器,使得容器與容器之間共享文件數據。tcp
下面來實際來操做一下是如何經過中兩種方式對docker進行數據管理的。ide
一、建立數據卷(爲後面的數據卷容器作準備)測試
#目前是空鏡像和空容器環境 [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
二、掛載主機目錄做爲數據卷:數據卷實際案例
[root@localhost ~]# docker run -d -v /var/www:/data/data1 --name web1 httpd:latest 5ff89e3dbdd25bbb1b105678c50364758fe62cb5c7d10aa5f47e8865ddd5e8d8 #參數解釋: -d:守護進程 -v:數據卷操做 /var/www:宿主機目錄將被掛載的目錄 /data/data1:容器中數據卷 --name:容器名稱
三、測試
[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#
四、數據卷容器案例
#前面已經進行建立了一個名爲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的端口映射應該在先前的網絡部分進行講述的,還記得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選項能夠給容器建立一個友好的名稱,這個名稱是惟一的,即不可重複。
具體案例演示:
一、建立容器
[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
二、建立接收容器
[root@localhost ~]# docker run -itd -P --name test2 --link test1:test1 centos /bin/bash f3c2974dcd19796cd8a48ecaf398370f891887cbfb92a192e8d7e706ccbefd62
三、進入一個容器中進行測試(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的狀態不然會遇到報錯。