在Docker中,爲了方便查看容器中產生的數據或者將多個容器中的數據共享,就涉及到容器的數據管理操做。管理Docker容器中的數據主要有兩種方式:數據卷(Date Volumes)和數據卷容器(Data Volumes Containers)。linux
數據卷是一個供容器使用的特殊目錄,位於容器中,可將宿主機的目錄掛載到數據捲上,對數據卷的修改操做馬上可見,而且更新數據不會影響鏡像,從而實現數據在宿主機和容器之間遷移。數據卷的使用相似於Linux下對目錄進行的mount操做。web
在docker run命令中使用-v能夠在容器內建立數據卷,也能夠屢次-v從而建立多個數據卷,使用--name選項能夠給容器建立一個自定義名稱。下面建立一個叫test的容器,而且建立兩個數據卷分別掛載到/data1和/data2目錄上。docker
[root@master ~]# docker run -itd -v /data1 -v /data2 --name test 2850c25d855b /bin/bash ab19b153f1f9cb325685f340d30f4c11ecb918fd7e43df49554ba565d9ef681d [root@master ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS ab19b153f1f9 2850c25d855b "/bin/bash" 7 seconds ago Up 5 second
容器運行起來後,能夠進入到容器中,能夠看到兩個數據卷已經分別掛載到/data1和/data2目錄中。安全
[root@master ~]# docker exec -it ab19b153f1f9 /bin/bash root@ab19b153f1f9:/# ls bin data1 dev fastboot lib media opt root sbin srv tmp var boot data2 etc home lost+found mnt proc run selinux sys usr
在使用-v選項建立數據卷的同時,能夠將宿主機的目錄掛載到數據捲上使用,以實現宿主機與容器之間的數據遷移,注意宿主機本地目錄的路徑必須爲絕對路徑,若是路徑不存在,Docker會自動建立相應的路徑。bash
下面從新建立一個爲test1的容器,並將宿主機的/abc/test掛載到容器的/data1目錄中。注意這時我本地是沒有abc這個目錄的。網絡
[root@master /]# ls bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr
下面開始建立tcp
[root@master /]# docker run -itd -v /abc/test:/data1 --name test1 2850c25d855b /bin/bash eb86e9da0e38410bdd5c1e40b3724c6277652eb70769ae336eaaca223fa4a945 [root@master /]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES eb86e9da0e38 2850c25d855b "/bin/bash" 6 seconds ago Up 5 seconds test1 ab19b153f1f9 2850c25d855b "/bin/bash" 11 minutes ago Up 11 minutes test [root@master /]# ls abc boot etc lib media opt root sbin sys usr bin dev home lib64 mnt proc run srv tmp var [root@master /]# ls /abc/ test
下面測試在/abc/test目錄下面建立abc.txt文件,而後到容器內查看/data1目錄中,是否也有test.txt文件。ide
[root@master /]# cd /abc/test/ [root@master test]# touch abc.txt [root@master test]# docker exec -it eb86e9da0e38 /bin/bash root@eb86e9da0e38:/# cd /data1/ root@eb86e9da0e38:/data1# ls abc.txt
能夠看到兩邊都會有abc.txt,一樣咱們在容器中建立def.txt文件,再到宿主機中查看是否有def.txt文件。測試
root@eb86e9da0e38:/data1# touch def.txt root@eb86e9da0e38:/data1# exit exit [root@master test]# ls abc.txt def.txt
這樣就實現了宿主機到容器和容器到宿主機的數據遷移,當咱們將容器中止運行甚至刪除的時候,咱們建立的文件依舊不會消失。3d
[root@master test]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES eb86e9da0e38 2850c25d855b "/bin/bash" 6 minutes ago Up 6 minutes test1 ab19b153f1f9 2850c25d855b "/bin/bash" 18 minutes ago Up 18 minutes test [root@master test]# docker stop eb86e9da0e38 eb86e9da0e38 [root@master test]# docker rm eb86e9da0e38 eb86e9da0e38 [root@master test]# ls abc.txt def.txt
當須要在容器之間共享一些數據,最簡單的方法使用數據卷容器。數據卷容器就是一個普通的容器,專門提供數據卷給其餘容器掛載使用。首先須要建立一個容器做爲數據卷容器,以後在其餘容器建立時用--volumes-from掛載數據卷容器中的數據卷使用。
[root@master test]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ab19b153f1f9 2850c25d855b "/bin/bash" 27 minutes ago Up 27 minutes test #咱們在以前的操做中在這個容器中已經掛載了/data1和/data2數據卷
下面咱們再來建立一個web容器,使用--volumes-from將test容器的數據卷掛載到web容器中。
[root@master test]# docker run -itd --volumes-from test --name web 2850c25d855b /bin/bash 0da89589b4dae025a51bbe290f79ef6e9d7672bba2d8512d92cd69beeb762d24 [root@master test]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0da89589b4da 2850c25d855b "/bin/bash" 4 seconds ago Up 3 seconds web ab19b153f1f9 2850c25d855b "/bin/bash" 30 minutes ago Up 30 minutes test
咱們咱們分別進入到web和test容器中,查看兩邊的數據卷容器。
[root@master test]# docker exec -it 0da89589b4da /bin/bash root@0da89589b4da:/# ls bin data1 dev fastboot lib media opt root sbin srv tmp var boot data2 etc home lost+found mnt proc run selinux sys usr
[root@master test]# docker exec -it ab19b153f1f9 /bin/bash root@ab19b153f1f9:/# ls bin data1 dev fastboot lib media opt root sbin srv tmp var boot data2 etc home lost+found mnt proc run selinux sys usr
咱們在web容器的/data1中建立abc.txt,而後到test容器/data1中查看是否生成這個文件。
root@0da89589b4da:/# cd /data1 root@0da89589b4da:/data1# touch abc.txt root@0da89589b4da:/data1# ls abc.txt root@ab19b153f1f9:/# cd /data1 root@ab19b153f1f9:/data1# ls abc.txt
能夠看到兩邊都有abc.txt文件,經過這種方式實現了容器間的數據共享,這樣的話用戶就沒必要擔憂數據發生丟失。
Docker提供了映射容器端口到宿主機和容器互聯機制來爲容器提供網絡服務。
在啓動容器的時候,若是不指定端口,在容器外將沒法經過網絡來訪問容器內的服務。Docker提供端口映射及時來將容器內的服務提供給外網訪問,實質上就是將宿主機的端口映射到容器中,使得外部網絡訪問宿主機的端口即可以訪問容器內的服務。
爲實現端口映射,須要在運行docker run命令時使用-P(大寫)選項實現隨機映射,Docker會隨機映射一個端口範圍在49000~49900的端口到容器內部開放的網絡端口。這個根據容器須要纔會打開宿主機端口。
[root@master test]# docker run -d -P 5182e96772bf35b134b4dbcd743bd229605197fcbf067063b8889808bb74d1b09d1e19863b2a
還能夠運行-p(小寫)指定映射端口。
[root@master test]# docker run -itd -p 80:80 2850c25d855b /bin/bash [root@master test]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dcb873983873 2850c25d855b "/bin/bash" 3 seconds ago Up 1 second 0.0.0.0:80->80/tcp nervous_ptolemy
容器互聯是經過容器名稱在容器之間創建一條專門的網絡通行隧道從而實現的互聯。簡單來講就是在源容器和接受容器之間創建一條隧道,接受容器能夠看到源容器指定的信息。在運行docker run命令時使用--link從而實現容器互聯,格式爲--link name:alias,其中name爲要鏈接的容器名稱,alias是這個鏈接的別名。首先建立源容器:
[root@master test]# docker run -itd -P --name web1 5182e96772bf /bin/bash b6d1f618f71083085f0646edee76fa7aa771bc8526c69424206c1c3f492c074c [root@master test]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b6d1f618f710 5182e96772bf "/bin/bash" 2 seconds ago Up 1 second web1
建立接受容器
[root@master test]# docker run -itd -P --name web2 --link web1:web1 5182e96772bf /bin/bash d5b7ff409fa0f40931582fad8eb754771e811318132d5069dcf2231ff093f40c [root@master test]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d5b7ff409fa0 5182e96772bf "/bin/bash" 3 seconds ago Up 2 seconds web2 b6d1f618f710 5182e96772bf "/bin/bash" 29 seconds ago Up 28 seconds web1
測試容器互聯
[root@master test]# docker exec -it web2 /bin/bash [root@d5b7ff409fa0 /]# 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.107 ms 64 bytes from web1 (172.17.0.2): icmp_seq=2 ttl=64 time=0.085 ms ^C --- web1 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1000ms rtt min/avg/max/mdev = 0.085/0.096/0.107/0.011 ms
能夠看到web2和web1創建了互聯,至關於建立了一條安全隧道,並且不用映射端口,避免了暴露端口給外部網絡。