1. 程式人生 > >Docker-使用數據卷在宿主機和容器間的數據共享

Docker-使用數據卷在宿主機和容器間的數據共享

功能 gif spa pull 找到 是否 運行命令 如果 res

場景一:現在用Docker創建了N個容器,但是這些容器之間需要數據共享,這個時候我們應該怎麽辦?[參考第四步]

場景二:docker創建了一個容器並進入容器,添加了一些定制功能,此時除了用docker commit去生成一個新的鏡像,使數據作為鏡像的一部分進行保存以外,我們還能通過什麽方式去保持數據?[參考第三步]

一、數據卷

數據卷聽起來很陌生,但是我們換種方式大家可能就覺得簡單理解了。數據卷可以理解為容器中的一個目錄。

容器數據卷:命名的容器掛載數據卷,其他容器通過掛載這個(父容器)實現數據共享,掛載數據卷的容器,稱之為數據卷容器。簡單點來說,就是活動硬盤對接活動硬盤。

所以為了保存數據,我們在docker中使用卷,即數據卷。

二、容器卷的作用

數據卷的作用:

  a.容器的持久化

  b.容器間繼承+共享數據

目前我們也可以通過命令去做這個動作,從容器內拷貝文件到主機,命令如下:

docker cp 容器id:容器內路徑 目錄主機路徑

//比如目錄主機路徑為根目錄/,容器內路徑為/volumecontainer

//命令可以寫為:docker cp 容器id:/volumecontainner /

三、創建數據卷[數據卷容器的添加方式]

數據卷容器有2中添加方式,一種是直接命令添加,一種是dockerfile文件添加。

1、直接命令添加:

  1. docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 鏡像名id
  2. 查看數據卷是否掛載成功
  3. 容器和宿主機之間數據共享
  4. 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-使用數據卷在宿主機和容器間的數據共享