1. 程式人生 > >Docker數據管理及網絡通信

Docker數據管理及網絡通信

mage web 內部 隨機 contain fastboot docker網絡 服務 數據管理

Docker數據管理及網絡通信

在Docker中,為了方便查看容器中產生的數據或者將多個容器中的數據共享,就涉及到容器的數據管理操作。管理Docker容器中的數據主要有兩種方式:數據卷(Date Volumes)和數據卷容器(Data Volumes Containers)。

數據卷

數據卷是一個供容器使用的特殊目錄,位於容器中,可將宿主機的目錄掛載到數據卷上,對數據卷的修改操作立刻可見,並且更新數據不會影響鏡像,從而實現數據在宿主機和容器之間遷移。數據卷的使用類似於Linux下對目錄進行的mount操作。

創建數據卷

在docker run命令中使用-v可以在容器內創建數據卷,也可以多次-v從而創建多個數據卷,使用--name選項可以給容器創建一個自定義名稱。下面創建一個叫test的容器,並且創建兩個數據卷分別掛載到/data1和/data2目錄上。

[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會自動創建相應的路徑。

下面重新創建一個為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

下面開始創建

[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文件。

[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

這樣就實現了宿主機到容器和容器到宿主機的數據遷移,當我們將容器停止運行甚至刪除的時候,我們創建的文件依舊不會消失。

[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提供端口映射及時來將容器內的服務提供給外網訪問,實質上就是將宿主機的端口映射到容器中,使得外部網絡訪問宿主機的端口便可以訪問容器內的服務。

為實現端口映射,需要在運行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建立了互聯,相當於創建了一條安全隧道,而且不用映射端口,避免了暴露端口給外部網絡。

Docker數據管理及網絡通信