本次將主要介紹Docker的兩個重要技術點:網絡設置和數據卷。
1. 數據卷
數據卷提供了一種宿主機和容器共享數據的方式,有些時候需要用它來做持久化和數據共享。當做持久化時,通常數據卷會比較大,可以將其放在單獨的磁盤、捲上,這個時候容器只是一個執行環境。當做數據共享時,可以用於開發和測試分佈式系統。數據卷主要通過參數-v來指定。
1.1創建一個數據卷
[root@izuf6bh06kx49y4h12z95sz ~]#docker run -it --name evcgtest -v /evcgdata lnt-evcg:1.0 /bin/bash
該命令創建了一個容器evcgtest,同時爲容器創建了一個/evcgdata數據卷,/evcgdata是容器內部的目錄,對應的宿主上目錄在/var/lib/docker/volumes下面,可以通過docker inspect命令查看。
[root@izuf6bh06kx49y4h12z95sz ~]#docker inspect 2e277999f107
[
{
......
"Mounts": [
{
"Type": "volume",
"Name": "f18a8393c21f88e18841f69340a836c8b4a330998aaa4387baa0e016c0f32198",
"Source": "/var/lib/docker/volumes/f18a8393c21f88e18841f69340a836c8b4a330998aaa4387baa0e016c0f32198/_data",
"Destination": "/evcgdata",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
......
}
]
可以看出"Destination": "/evcgdata"是容器的持久化目錄,"Source": "/var/lib/docker/volumes/f18a8393c21f88e18841f69340a836c8b4a330998aaa4387baa0e016c0f32198/_data"是對應宿主機的目錄。
1.2映射一個外部卷
如果以-v src:des的方式指定,那麼容器會直接將宿主機的指定目錄掛載到容器內部。
[root@izuf6bh06kx49y4h12z95sz ~]#docker run -it --name evcgtest -v /mnt/evcg/data:/evcgdata lnt-evcg:1.0 /bin/bash
上面命令直接將宿主機/mnt/evcg/data目錄映射到了容器/evcgdata目錄。實際使用中,我們可以將信息系統產生的日誌、上傳的圖片等資源通過數據卷存放到宿主機指定目錄,進行持久化保存。
1.3容器數據卷
由於容器本身包含文件系統,那麼當然也可以把容器的卷分享給另一個容器,通過--volumes-form來映射。創建一個容器數據卷,注意使用create創建即可。具體步驟如下:
[root@izuf6bh06kx49y4h12z95sz ~]#docker create -v /sharedata --name sharedata centos
通過—volumes-form使用容器數據卷。
[root@izuf6bh06kx49y4h12z95sz ~]# docker run -it --name dbtest --volumes-from sharedata centos /bin/bash
[root@a1e26bd877d7 /]# ls
bin dev etc home lib lib64 media mnt opt proc root run sbin sharedata srv sys tmp usr var
可以看到新創建的dbtest容器中有容器卷的sharedata目錄。
2. 網絡設置
Dokcer 通過使用 Linux 橋接提供容器之間的通信,Docker的網絡模式有四種,默認使用bridge模式,通過主機和容器的端口映射通信。
none
使用--net=none 指定,容器不能訪問外部網絡,內部存在迴路地址。
bridge
使用--net=bridge 指定,bridge是docker的默認網絡設置,橋接是在主機上的,通常爲docker0,每啓動一個容器時,會爲該容器創建一個veth,veth一端連接到docker0,另一端連接到容器eth0.
host
使用--net=host 指定,host就是使用宿主機的網絡,和宿主機公用一個Network Namespace,容器不會虛擬出自己的網卡和IP等,而是使用宿主機的IP和端口。但容器的文件系統、進程列表等還是與宿主機隔離的。
container
使用--net=container:containerid 指定,該模式指定新創建的容器和已經存在的另一個容器共享一個Network Namespace,而不是和宿主機共享。同樣兩個容器除了網絡方面,其它仍然是隔離的。