溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Docker的數(shù)據(jù)管理及網(wǎng)絡通信問題

發(fā)布時間:2020-05-25 01:36:18 來源:網(wǎng)絡 閱讀:601 作者:warrent 欄目:云計算

博文大綱:

  • 一、docker的數(shù)據(jù)管理
    1、數(shù)據(jù)卷
    2、數(shù)據(jù)卷容器
  • 二、docker網(wǎng)絡通信
    1、端口映射
    2、容器互聯(lián)

一、docker的數(shù)據(jù)管理

在docker中,為了方便查看容器內產(chǎn)生的數(shù)據(jù)或者將多個容器之間的數(shù)據(jù)實現(xiàn)共享,會涉及到容器的數(shù)據(jù)管理操作,管理docker容器中的數(shù)據(jù)主要有兩種方式:數(shù)據(jù)卷和數(shù)據(jù)卷容器。

1、數(shù)據(jù)卷

數(shù)據(jù)卷是一個供容器使用的特殊目錄,位于容器中,可將宿主機的目錄掛載到數(shù)據(jù)卷上,對數(shù)據(jù)卷的修改操作立即可見,并且更新數(shù)據(jù)不會影響鏡像,從而實現(xiàn)數(shù)據(jù)在宿主機與容器之間的遷移,數(shù)據(jù)卷的使用類似于Linux下對目錄進行的mount掛載操作(注意:是將宿主機本地的目錄掛載到容器中,舉例:若宿主機本地/data目錄掛載的是/dev/sdb1,那么要將/data做數(shù)據(jù)卷映射時,容器中指定的目錄使用的文件系統(tǒng)也是/dev/sdb1,我不知道這樣解釋,你們能不能理解它的工作原理)。

掛載宿主機目錄作為數(shù)據(jù)卷舉例:

使用-v選項可以創(chuàng)建數(shù)據(jù)卷(只是運行容器時,創(chuàng)建一個目錄),創(chuàng)建數(shù)據(jù)卷的同時將宿主機的目錄掛載到數(shù)據(jù)卷上使用,以實現(xiàn)宿主機與容器之間的數(shù)據(jù)遷移。

需要注意的是,宿主機本地目錄的路徑必須是使用絕對路徑,如果路徑不存在,Docker會自動創(chuàng)建相應的路徑。

[root@localhost ~]# docker run -d -p 5000:5000 -v /data/registry/:/tmp/registry docker.io/registry
#這是運行了一個私有倉庫的容器,其中-p是端口映射的選項,這里不做解釋。
# -v才是目錄映射,將本地/data/registry/目錄映射到容器中的/tmp/registry目錄。
#然后容器中的/tmp/registry目錄下的內容就和宿主機的/data/registry/內容一樣了。
[root@localhost ~]# df -hT /data/registry/           #先查看本地/data/registry/ 掛載的文件系統(tǒng)
文件系統(tǒng)         類型            容量  已用  可用 已用% 掛載點
node4:dis-stripe fuse.glusterfs   80G  130M   80G    1% /data/registry
[root@localhost ~]# docker exec -it a6bf726c612b /bin/sh #進入私有倉庫的容器中,該容器沒有/bin/bash,所以使用的是/bin/sh。
/ # df -hT /tmp/registry/    #查看發(fā)現(xiàn),該目錄掛載的和宿主機掛載的文件系統(tǒng)是同一個,說明沒問題。
Filesystem           Type            Size      Used Available Use% Mounted on
node4:dis-stripe     fuse.glusterfs
                                    80.0G    129.4M     79.8G   0% /tmp/registry

2、數(shù)據(jù)卷容器

如果需要在容器之間共享一些數(shù)據(jù),最簡單的方法就是使用數(shù)據(jù)卷容器。數(shù)據(jù)卷容器就是一個普通的容器,專門提供數(shù)據(jù)卷給其他容器掛載使用。使用方法如下:首先,需要創(chuàng)建一個容器作為數(shù)據(jù)卷容器,之后在其他容器創(chuàng)建時用--volumes-from掛載數(shù)據(jù)卷容器中的數(shù)據(jù)卷使用。

容器卷創(chuàng)建及使用舉例:

[root@localhost ~]# docker run -itd --name datasrv -v /data1 -v /data2  docker.io/sameersbn/bind /bin/bash
#創(chuàng)建運行一個容器,容器名為datasrv,并創(chuàng)建兩個數(shù)據(jù)卷:data1和data2。
d9e578db8355da35637d2cf9b0a3406a647fe8e70b2df6172ab41818474aab08
[root@localhost ~]# docker exec -it datasrv /bin/bash     #進入創(chuàng)建的容器
root@d9e578db8355:/# ls | grep data             #查看是否有對應的數(shù)據(jù)卷
data1
data2
[root@localhost ~]# docker run -itd --volumes-from datasrv --name ftpsrv docker.io/fauria/vsftpd /bin/bash
#運行一個名為ftpsrv的容器,使用--volumes-from來將datasrv容器中的數(shù)據(jù)卷掛載到這個ftpsvr新容器上。
eb84fa6e85a51779b652e0058844987c5974cf2a66d1772bdc05bde30f8a254f
[root@localhost ~]# docker exec -it ftpsrv /bin/bash         #進入新創(chuàng)建的容器
[root@eb84fa6e85a5 /]# ls | grep data          #查看新的容器是否可以看到datasrv提供的數(shù)據(jù)卷
data1
data2
[root@eb84fa6e85a5 /]# echo " data volumes test" > /data1/test.txt       #在ftpsrv容器中向data1目錄寫入文件進行測試
[root@eb84fa6e85a5 /]# exit          #退出該容器
exit
[root@localhost ~]# docker exec -it datasrv /bin/bash     #進入提供數(shù)據(jù)卷的datasrv容器
root@d9e578db8355:/# cat /data1/test.txt            #可以看到剛在ftpsrv容器創(chuàng)建的文件,OK。
 data volumes test

注意,生產(chǎn)環(huán)境中最注重的就是存儲的可靠性,以及存儲的可動態(tài)擴展性,一定要在做數(shù)據(jù)卷時考慮到這一點,在這方面比較出色的還要數(shù)GFS文件系統(tǒng)了,我上面只是做了簡單的配置,若在生產(chǎn)環(huán)境中,一定要好好考慮,就比如上面做的鏡像卷容器,就可以在宿主機本地掛載GFS文件系統(tǒng),然后創(chuàng)建鏡像卷容器時,將掛載GFS的目錄映射到容器中的鏡像卷,這樣才是一個合格的鏡像卷容器。

二、docker網(wǎng)絡通信

1、端口映射

docker提供了映射容器端口到宿主機和容器互聯(lián)機制來為容器提供網(wǎng)絡服務。

在啟動容器的時候,如果不指定對應的端口,在容器外是無法通過網(wǎng)絡來訪問容器內的服務的。docker提供端口映射機制來將容器內的服務提供給外部網(wǎng)絡訪問,實質上就是將宿主機的端口映射到容器中,使外部網(wǎng)絡訪問宿主機的端口可訪問容器內的服務。

實現(xiàn)端口映射,需要在運行docker run命令時使用-P(大寫)選項實現(xiàn)隨機映射,Docker一般會隨機映射到一個端口訪問在49000~49900的端口到容器內部開放的網(wǎng)絡端口,但不是絕對的,也有例外情況不會映射到這個范圍;也可以使用在運行docker run命令時使用-p(小寫)選項實現(xiàn)指定要映射的端口(常用此種方法)。

端口映射舉例:

[root@localhost ~]# docker run -d -P docker.io/sameersbn/bind      #隨機映射端口
9b4b7c464900df3b766cbc9227b21a3cad7d2816452c180b08eac4f473f88835
[root@localhost ~]# docker run -itd -p 68:67 docker.io/networkboot/dhcpd /bin/bash
#將容器中的67端口映射到宿主機的68端口
6f9f8125bcb22335dcdb768bbf378634752b5766504e0138333a6ef5c57b7047
[root@localhost ~]# docker ps -a     #查看發(fā)現(xiàn)沒問題咯
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                                                                    NAMES
6f9f8125bcb2        docker.io/networkboot/dhcpd   "/entrypoint.sh /b..."   2 seconds ago       Up 1 second         0.0.0.0:68->67/tcp                                                       keen_brattain
9b4b7c464900        docker.io/sameersbn/bind      "/sbin/entrypoint...."   4 minutes ago       Up 4 minutes        0.0.0.0:32768->53/udp, 0.0.0.0:32769->53/tcp, 0.0.0.0:32768->10000/tcp   coc_gates
#此時,訪問宿主機的68端口就相當于訪問第一個容器的67端口;訪問宿主機的32768端口,就相當于訪問容器的53端口。

2、容器互聯(lián)

容器互聯(lián)是通過容器的名稱在容器之間建立一條專門的網(wǎng)絡通信隧道從而實現(xiàn)的互聯(lián)。簡單說,就是會在源容器和接收容器之間建立一條隧道,接收容器可以看到源容器指定的信息。

在運行docker run命令時,使用--link選項實現(xiàn)容器之間的互聯(lián)通信,格式如下:

--link name: alias    #其中name是要連接的容器名稱,alias是這個連接的別名。

容器互聯(lián)是通過容器的名稱來執(zhí)行的,--name選項可以給容器創(chuàng)建一個友好的名稱,這個名稱是唯一的,如果已經(jīng)命名了一個相同名稱的容器,當要再次使用這個名稱的時候,需要先使用docker rm命令來刪除之前創(chuàng)建的同名容器。

容器互聯(lián)舉例:

[root@localhost ~]# docker run -tid -P --name web1  docker.io/httpd /bin/bash    #運行容器web1
c88f7340f0c12b9f5228ec38793e24a6900084e58ea4690e8a847da2cdfe0b
[[root@localhost ~]# docker run -tid -P --name web2 --link web1:web1 docker.io/httpd /bin/bash
#運行容器web2,并關聯(lián)web1容器
c7debd7809257c6375412d54fe45893241d2973b7af1da75ba9f7eebcfd4d652
[root@localhost ~]# docker exec -it web2 /bin/bash     #進入web2容器
root@c7debd780925:/usr/local/apache2# cd
root@c7debd780925:~# ping web1        #對web1進行ping測試
bash: ping: command not found        #sorry,提示沒有ping命令,下載一個咯
root@c7debd780925:~#apt-get update    #更新一下
root@c7debd780925:~#apt install iputils-ping     #安裝ping命令
root@c7debd780925:~#apt install net-tools      #這個是安裝ifconfig命令,可以不安裝,我這里只是做個筆記
root@c7debd780925:~# ping web1     #再對web1進行ping測試
PING web1 (172.17.0.2) 56(84) bytes of data.
64 bytes from web1 (172.17.0.2): icmp_seq=1 ttl=64 time=0.079 ms
64 bytes from web1 (172.17.0.2): icmp_seq=2 ttl=64 time=0.114 ms
              ..............#省略部分內容
#ping通了,所以可以說這兩個容器肯定是互聯(lián)的咯
#若此時又創(chuàng)建了web3這個新容器,要同時和web1、web2進行互聯(lián),命令如下:
[root@localhost ~]# docker run -dit -P --name web3 --link web1:web1 --link web2:web2 docker.io/httpd /bin/bash
#運行容器時,關聯(lián)web1和web2。
#以下是進入web3
[root@localhost ~]# docker exec -it web3 /bin/bash
root@433d5be6232c:/usr/local/apache2# cd
#以下是安裝ping命令
root@433d5be6232c:~# apt-get update
root@433d5be6232c:~# apt install iputils-ping
#以下是分別對web1,web2進行ping測試
root@433d5be6232c:~# ping web1
PING web1 (172.17.0.2) 56(84) bytes of data.
64 bytes from web1 (172.17.0.2): icmp_seq=1 ttl=64 time=0.102 ms
64 bytes from web1 (172.17.0.2): icmp_seq=2 ttl=64 time=0.112 ms
              ..............#省略部分內容
root@433d5be6232c:~# ping web2
PING web2 (172.17.0.3) 56(84) bytes of data.
64 bytes from web2 (172.17.0.3): icmp_seq=1 ttl=64 time=0.165 ms
64 bytes from web2 (172.17.0.3): icmp_seq=2 ttl=64 time=0.115 ms
              ..............#省略部分內容
#OK,沒問題

———————— 本文至此結束,感謝閱讀 ————————

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI