Docker-使用數據卷在宿主機和容器間的數據共享
場景一:現在用Docker創建了N個容器,但是這些容器之間需要數據共享,這個時候我們應該怎麽辦?[參考第四步]
場景二:docker創建了一個容器並進入容器,添加了一些定制功能,此時除了用docker commit去生成一個新的鏡像,使數據作為鏡像的一部分進行保存以外,我們還能通過什麽方式去保持數據?[參考第三步]
一、數據卷
數據卷聽起來很陌生,但是我們換種方式大家可能就覺得簡單理解了。數據卷可以理解為容器中的一個目錄。
容器數據卷:命名的容器掛載數據卷,其他容器通過掛載這個(父容器)實現數據共享,掛載數據卷的容器,稱之為數據卷容器。簡單點來說,就是活動硬盤對接活動硬盤。
所以為了保存數據,我們在docker中使用卷,即數據卷。
二、容器卷的作用
數據卷的作用:
a.容器的持久化
b.容器間繼承+共享數據
目前我們也可以通過命令去做這個動作,從容器內拷貝文件到主機,命令如下:
docker cp 容器id:容器內路徑 目錄主機路徑
//比如目錄主機路徑為根目錄/,容器內路徑為/volumecontainer
//命令可以寫為:docker cp 容器id:/volumecontainner /
三、創建數據卷[數據卷容器的添加方式]
數據卷容器有2中添加方式,一種是直接命令添加,一種是dockerfile文件添加。
1、直接命令添加:
- docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 鏡像名id
- 查看數據卷是否掛載成功
- 容器和宿主機之間數據共享
- docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 鏡像名
//直接運行命令 docker run -it -v /:/volumeContainer [imageid]
//在本機的根目錄下,volumeContainer 指的是在容器內的目錄
Ps:ro是只讀,在容器內不能對容器卷進行編輯
在命令添加時可能會涉及到的一些命令:
docker ps:顯示當前運行中的容器
docker ps -l:顯示上一次運行的容器
docker start 容器id:啟用容器
docker inspect 容器id:查看數據卷是否掛載成功
cat 文件名稱:顯示文件中的內容
2、Dockerfile添加
dockerfile文件的使用,具體可以參考另外一篇博文:https://www.cnblogs.com/wendyw/p/9728381.html
dockerfile文件添加數據卷容器大致步驟如下:
2.1 根目錄下新建mydocker文件夾並進入
2.2 可在dockerfile中使用Volume指令來給鏡像添加一個或多個數據卷
//比如:VOLUME[“/dataVolumeContainer1”,”/dataVolumeContainer2”,xxx]
//在dockerfie文件中添加如上命令就可以一次生成多個數據卷
2.3 File構建
2.4 Build後生成鏡像-獲得一個新鏡像 xxx/centos
2.5 run容器
在完成Dockefile文件的運行後,查看是否添加成功,可以執行如下命令:
Docker inspect 容器id:查看本機默認路徑下的容器卷
四、實戰-不同容器之間共享容器卷
比如用centos鏡像生成容器test1、test2、test3,已經是生成容器卷,/VolumeContainer是容器內數據卷
1、 打開虛擬機centos7終端,執行docker images出現錯誤:【Failed to restart dock.service: Unit not found.】,執行如下代碼:
docker 服務開啟2、登錄阿裏雲,把已經創建好數據卷的鏡像pull下來
Ps:如果使用你本地的鏡像,這一步就忽略
docker login --username=xxx registry.cn-hangzhou.aliyuncs.com
//xxx是阿裏雲賬號登錄名稱[登錄你自己的賬號,去拉取你的鏡像]
docker pull registry.cn-hangzhou.aliyuncs.com/abc/mycentos:1.4.1
//從阿裏雲上去下載mycentos
//abc是命名空間[需要自己去創建對應的命名空間,且已經創建好鏡像],拉下來的代碼中已經有數據卷
3、找到對應鏡像的imageid,先啟動一個父容器test001
docker images //找到mycentos對應的imageid
docker run -it [imageid] //進入容器,並且容器名字命令為test001
另外打開一個終端,查看正在運行中的代碼:
docker ps //查看正在運行中的代碼
4、容器間傳遞共享,容器test002、test003繼承與test001
//--name 給容器命名,B --volume-from A是指容器B繼承與容器A
docker run -it --name test002 --volumes-from test001 [imageid]
//test002容器繼承與test001
docker run -it --name test003 --volumes-from test001 [imageid]
docker run -it --name test004 --volumes-from test003 [imageid]
5、分別刪除、增加、修改test002、test003中的文件內容,都能進行同步更新。
總結:容器之間配置信息的傳遞,任何一個容器的刪除,不影響其他容器的使用,數據卷的生命周期一直持續到沒有容器使用它為止。
Docker-使用數據卷在宿主機和容器間的數據共享