1、docker的數據管理
在docker中,爲了方便查看容器內產生的數據或者將多個容器之間的數據實現共享,會涉及到容器的數據管理操做,管理docker容器中的數據主要有兩種方式:數據卷和數據卷容器。node
一、數據卷
數據卷是一個供容器使用的特殊目錄,位於容器中,可將宿主機的目錄掛載到數據捲上,對數據卷的修改操做當即可見,而且更新數據不會影響鏡像,從而實現數據在宿主機與容器之間的遷移,數據卷的使用相似於Linux下對目錄進行的mount掛載操做(注意:是將宿主機本地的目錄掛載到容器中,舉例:若宿主機本地/data目錄掛載的是/dev/sdb1,那麼要將/data作數據卷映射時,容器中指定的目錄使用的文件系統也是/dev/sdb1,我不知道這樣解釋,大家能不能理解它的工做原理)。web
掛載宿主機目錄做爲數據卷舉例:docker
使用-v選項能夠建立數據卷(只是運行容器時,建立一個目錄),建立數據卷的同時將宿主機的目錄掛載到數據捲上使用,以實現宿主機與容器之間的數據遷移。apache
須要注意的是,宿主機本地目錄的路徑必須是使用絕對路徑,若是路徑不存在,Docker會自動建立相應的路徑。bash
[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/ 掛載的文件系統 文件系統 類型 容量 已用 可用 已用% 掛載點 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/ #查看發現,該目錄掛載的和宿主機掛載的文件系統是同一個,說明沒問題。 Filesystem Type Size Used Available Use% Mounted on node4:dis-stripe fuse.glusterfs 80.0G 129.4M 79.8G 0% /tmp/registry
二、數據卷容器
若是須要在容器之間共享一些數據,最簡單的方法就是使用數據卷容器。數據卷容器就是一個普通的容器,專門提供數據卷給其餘容器掛載使用。使用方法以下:首先,須要建立一個容器做爲數據卷容器,以後在其餘容器建立時用--volumes-from掛載數據卷容器中的數據卷使用。網絡
容器卷建立及使用舉例:tcp
[root@localhost ~]# docker run -itd --name datasrv -v /data1 -v /data2 docker.io/sameersbn/bind /bin/bash #建立運行一個容器,容器名爲datasrv,並建立兩個數據卷:data1和data2。 d9e578db8355da35637d2cf9b0a3406a647fe8e70b2df6172ab41818474aab08 [root@localhost ~]# docker exec -it datasrv /bin/bash #進入建立的容器 root@d9e578db8355:/# ls | grep data #查看是否有對應的數據卷 data1 data2 [root@localhost ~]# docker run -itd --volumes-from datasrv --name ftpsrv docker.io/fauria/vsftpd /bin/bash #運行一個名爲ftpsrv的容器,使用--volumes-from來將datasrv容器中的數據卷掛載到這個ftpsvr新容器上。 eb84fa6e85a51779b652e0058844987c5974cf2a66d1772bdc05bde30f8a254f [root@localhost ~]# docker exec -it ftpsrv /bin/bash #進入新建立的容器 [root@eb84fa6e85a5 /]# ls | grep data #查看新的容器是否能夠看到datasrv提供的數據卷 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 #進入提供數據卷的datasrv容器 root@d9e578db8355:/# cat /data1/test.txt #能夠看到剛在ftpsrv容器建立的文件,OK。 data volumes test
注意,生產環境中最注重的就是存儲的可靠性,以及存儲的可動態擴展性,必定要在作數據卷時考慮到這一點,在這方面比較出色的還要數GFS文件系統了,我上面只是作了簡單的配置,若在生產環境中,必定要好好考慮,就好比上面作的鏡像卷容器,就能夠在宿主機本地掛載GFS文件系統,而後建立鏡像卷容器時,將掛載GFS的目錄映射到容器中的鏡像卷,這樣纔是一個合格的鏡像卷容器。ide
2、docker網絡通訊
一、端口映射
docker提供了映射容器端口到宿主機和容器互聯機制來爲容器提供網絡服務。測試
在啓動容器的時候,若是不指定對應的端口,在容器外是沒法經過網絡來訪問容器內的服務的。docker提供端口映射機制來將容器內的服務提供給外部網絡訪問,實質上就是將宿主機的端口映射到容器中,使外部網絡訪問宿主機的端口可訪問容器內的服務。3d
實現端口映射,須要在運行docker run命令時使用-P(大寫)選項實現隨機映射,Docker通常會隨機映射到一個端口訪問在49000~49900的端口到容器內部開放的網絡端口,但不是絕對的,也有例外狀況不會映射到這個範圍;也可使用在運行docker run命令時使用-p(小寫)選項實現指定要映射的端口(經常使用此種方法)。
端口映射舉例:
[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 #查看發現沒問題咯 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端口。
二、容器互聯
容器互聯是經過容器的名稱在容器之間創建一條專門的網絡通訊隧道從而實現的互聯。簡單說,就是會在源容器和接收容器之間創建一條隧道,接收容器能夠看到源容器指定的信息。
在運行docker run命令時,使用--link選項實現容器之間的互聯通訊,格式以下:
--link name: alias #其中name是要鏈接的容器名稱,alias是這個鏈接的別名。
容器互聯是經過容器的名稱來執行的,--name選項能夠給容器建立一個友好的名稱,這個名稱是惟一的,若是已經命名了一個相同名稱的容器,當要再次使用這個名稱的時候,須要先使用docker rm命令來刪除以前建立的同名容器。
容器互聯舉例:
[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,並關聯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通了,因此能夠說這兩個容器確定是互聯的咯 #若此時又建立了web3這個新容器,要同時和web一、web2進行互聯,命令以下: [root@localhost ~]# docker run -dit -P --name web3 --link web1:web1 --link web2:web2 docker.io/httpd /bin/bash #運行容器時,關聯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 ..............#省略部份內容