Docker(六)數據管理與網絡通信
在Docker中,為了方便查看容器內產生的數據或者將多個容器中的數據實現共享,就涉及到容器的數據管理操作
管理Docker容器中數據主要有兩種方法:
數據卷<Data Volumes>
數據卷容器<Data Volumes Container>
數據卷
數據卷是一個供容器使用的特殊目錄,位於容器中,可以將宿主機的目錄掛載到數據卷上,對數據卷的操作立刻可見,並更新數據不會影響鏡像,從而實現宿主機與容器之間的遷移
1:創建數據卷
-v:可以在容器內創建數據卷,多次使用-v可創建多個數據卷
--name:可給容器創建一個好友的自定義名稱
下面使用httpd:centos鏡像創建一個名為web的容器,並創建兩個數據卷分別掛載到/data1 /data2
[root@xyue ~] docker run -d -v /data1 -v /data2 --name web httpd:centos 955f7c7b5784454f742ecbeaf516341c8289c00bb4c30d7991658363faa83322 [root@xyue ~] docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 955f7c7b5784 httpd:centos "/run.sh" 2 minutes ago Up 2 minutes 80/tcp web
進入容器中,可以看到兩個數據卷已經創建成功分別掛載到 /data1 /data2目錄上
[root@xyue ~] docker exec -it web /bin/bash [root@955f7c7b5784 /]# ls -l total 16 -rw-r--r--. 9 root root 12005 Aug 4 22:05 anaconda-post.log lrwxrwxrwx. 1 root root 7 Aug 4 22:04 bin -> usr/bin drwxr-xr-x. 3 root root 18 Aug 13 07:51 boot drwxr-xr-x. 2 root root 6 Aug 14 02:08 data1 drwxr-xr-x. 2 root root 6 Aug 14 02:08 data2
2:掛載主機目錄作為數據卷
使用-v選項可以在創建數據卷的同時,將宿主機的目錄掛載到數據卷上使用,以實現宿主機與容器之間遷移
註意:
宿主機本地目錄的路徑必須使用絕對路徑,如果路徑不存在,Docker會自動創建相應的路徑
下面使用httpd:centos鏡像創建一個名為web—1的容器,並且將宿主機上的/var/www/目錄掛載到容器/data1目錄上去
[root@xyue ~] docker run -d -v /var/www/:/data1 --name web-1 httpd:centos
c8ff659f1e5b8419f535877a52734b1de61202c92ff9046171d134ded18f3250
[root@xyue ~] docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c8ff659f1e5b httpd:centos "/run.sh" 15 seconds ago Up 14 seconds 80/tcp web-1
我們在宿主機本地目錄/var/www裏面創建一個file,進入容器中進入相對應的掛載目錄就可以看到剛剛我們創建的文件夾
#宿主機/var/www裏面的目錄
[root@xyue ~]# cd /var/www/
[root@xyue www]# mkdir file
[root@xyue www]# ls
file html
#進入容器/data1查看
[root@xyue www]# docker exec -it web-1 /bin/bash
[root@c8ff659f1e5b /]# cd /data1/
[root@c8ff659f1e5b data1]# ls
file html
#如果掛載的宿主機目錄在掛載前已有目錄掛在後一樣能遷移到容器目錄
數據卷容器
如果需要在容器之間共享數據,最簡單的方法就是用數據卷容器。數據卷容器就是一個普通的容器,專門提供數據卷提供給其他容器掛載使用。
我們使用之前創建好的數據卷容器web,其中所創建的數據卷分別掛載到/data1 /data2 使用--volumes-from來掛載web容器中的數據卷到新的容器,新的容器名為db1
[root@xyue ~] docker run -it --volumes-from web --name db1 httpd:centos /bin/bash
[root@13c3a949ed6d /] ls
anaconda-post.log boot data2 etc lib media opt root run.sh srv tmp var
bin data1 dev home lib64 mnt proc run sbin sys usr
#在db1容器數據卷/data1目錄中創建一個文件夾file再進入web容器中的/data1查看就可以看到桐言的一個file
[root@13c3a949ed6d /] cd /data1
[root@13c3a949ed6d data1] ls
[root@13c3a949ed6d data1] touch file
[root@13c3a949ed6d data1] ls
file
[root@13c3a949ed6d data1] exit
exit
[root@xyue ~] docker exec -it web /bin/bash
[root@955f7c7b5784 /] cd /data1
[root@955f7c7b5784 data1] ls
file
Docker網絡通信
Docker提供了映射容器端口到宿主機和容器互聯機制來為容器提供網絡服務
端口映射
實現端口映射,需要docker run 命令時使用-P 選項來實現端口映射Docker會隨機映射一個端口範圍49000~49900的端口到容器內部開放的網絡端口映射
例如:
[root@xyue ~]# docker run -d -P httpd:centos
dcb542da6d70226c19bdff9459b87853b0a0bbc161e61e71b889417b2ec1d75e
#用docker ps -a 可以看到本機的32768端口映射到web容器中的80端口,用網頁訪問32768端口就可以訪問web容器中的80端口
[root@xyue ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dcb542da6d70 httpd:centos "/run.sh" 5 seconds ago Up 5 seconds 0.0.0.0:32768->80/tcp adoring_jepsen
用小寫的-p可以自己指定端口,只要自己指定的端口沒有被占用都可以
[root@xyue ~]# docker run -d -p 12380:80 httpd:centos
容器互聯
容器互聯是通過容器的名稱在容器間建立一條專門的網絡通信隧道從而實現容器的互聯
-
在運行docker run --link選項可以實現容器中間的互聯通信,格式為:--link name:alias
註意: 容器互聯是通過容器的名稱來執行,--name選項可以給榮放棄創建一個好友的名稱,這個名稱是唯一的。
1:創建源容器
首先使用docker run 命令建立容器A 使用--name 指定容器名稱為web1
[root@xyue ~] docker run -d -P --name web1 httpd:centos
d699b567ccd43c36b6874269d3d97d2f77f70ccaf1869e4832849b4734caec09
[root@xyue ~] docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d699b567ccd4 httpd:centos "/run.sh" 12 seconds ago Up 12 seconds 0.0.0.0:32769->80/tcp web1
2:創建接收容器
然後使用docker run命令建立容器B,使用--name指定名稱為web2使用--link指定連接容器以實現互聯
[root@xyue ~] docker run -d -P --name web2 --link web1:web1 httpd:centos
77a11f9aa6a09a2d0d60f70b61349c52aef358a4b39ce551a3934a5db6ae587c
[root@xyue ~] docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77a11f9aa6a0 httpd:centos "/run.sh" 5 seconds ago Up 4 seconds 0.0.0.0:32770->80/tcp web2
測試容器互聯
進web2pingwen1
[root@xyue ~]# docker exec -it web2 /bin/bash
[root@13e278b0e173 /]# ping web1
PING abc (172.17.0.7) 56(84) bytes of data.
64 bytes from abc (172.17.0.7): icmp_seq=1 ttl=64 time=0.157 ms
64 bytes from abc (172.17.0.7): icmp_seq=2 ttl=64 time=0.041 ms
^C
--- abc ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.041/0.099/0.157/0.058 ms
Docker(六)數據管理與網絡通信