Docker---數據共享與數據持久化

目錄

 

一.docker與宿主機之間數據共享

數據卷概念(data volume)

docker數據持久化

數據卷的特點

數據卷的實現方式

二.docker容器之間數據共享

數據卷容器的概念

數據卷容器的實現


一.docker與宿主機之間數據共享

數據卷概念(data volume)

  • 使用docker容器時,會產生一系列的數據文件。但是當我們關閉容器時,這些數據文件就會消失。
  • 如果我們想要這些數據文件保持持久化,而且宿主機與容器之間能夠數據共享,這就需要使用到數據卷。
  • docker容器的數據卷可以看成U盤,它存在與一個或者多個容器中,且由docker掛載到容器,但是不屬於聯合文件系統。
  • docker不會在容器刪除時刪除其掛載的數據卷。
  • 數據卷可以來存儲docker應用中的數據,而數據卷呈現給docker容器的形式就是一個目錄,支持多個容器間共享。
  • 使用docker的數據卷,類似於在系統中使用mount掛載一個文件系統

docker數據持久化

  • 容器在運行期間產生的數據不會寫入鏡像裏,重新用這個鏡像啓動新的容器就會初始化鏡像,會加入一個全新的讀寫入層來保存數據
  • 想要做到數據持久化,docker就要提供數據卷或者數據容器捲來解決問題
  • 此外,也可以通過commit提交一個新的鏡像來保存生產的數據

數據卷的特點

  • 數據卷可以在容器之間共享或重用數據
  • 在數據卷中更改可以直接生效
  • 數據卷中的更改不會包含在鏡像的更新中
  • 數據卷的生命週期一直持續到沒有容器使用它爲止

數據卷的實現方式

  • 通過命令掛載數據卷
1.命令格式爲:
docker run -it -v /宿主機的絕對路徑目錄:/容器內目錄  鏡像名 /bin/bash
#參數說明
#-v是指定掛載目錄, /bin/bash進入docker環境
2.此條命令會在宿主機和容器內創建指定的目錄,目錄裏的數據可以共享。此外可以使用
docker inspect 容器ID //查看數據卷的掛載結果
3.我們也可以給數據添加限制權限,比如宿主機只能讀去數據卷的內容,可以使用以下命令:
docker run -it -v /宿主機絕對路勁目錄:/容器內目錄:ro 鏡像名
另外,同樣能夠使用 docker inspect 容器ID 查看權限信息

實例如下:
[root@cloud mnt]# docker run -it -v /mnt/demo01:/demo02 httpd /bin/bash
root@6b4349ecc8d4:/usr/local/apache2# cd /
root@6b4349ecc8d4:/# ls
bin  boot  demo02  dev	etc  home  lib	lib64  media  mnt  opt	proc  root  run  sbin  srv  sys  tmp  usr  var
root@6b4349ecc8d4:/# cd demo02/
root@6b4349ecc8d4:/demo02# ls
root@6b4349ecc8d4:/demo02# echo "123456" > 1.txt
root@6b4349ecc8d4:/demo02# ls
1.txt
root@6b4349ecc8d4:/demo02# exit
exit
[root@cloud mnt]# ls
demo01
[root@cloud mnt]# ls demo01/
1.txt
[root@cloud mnt]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                      PORTS               NAMES
6b4349ecc8d4        httpd               "/bin/bash"         About a minute ago   Exited (0) 54 seconds ago                       nervous_buck
[root@cloud mnt]# docker inspect 6b4349ecc8d4
 "Mounts": [
            {
                "Type": "bind",
                "Source": "/mnt/demo01",
                "Destination": "/demo02",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

  • 通過dockerfile添加數據卷
1.Dockerfile對於docker鏡像而言就如同java中的某個類的.class文件對應上該類的.java文件
2.創建Dockerfile文件的方式:
首先在linux服務器根目錄上新建docker文件夾並且建立Dockerfile文件
如docker run -it -v /宿主機絕對路徑目錄:/docker內目錄 鏡像名,相當於
vim /docker/Dockerfile
FROM 鏡像名
VOLUME ["/生成的目錄路徑"] --privileged=true
CMD echo "successful building"
CMD /bin/bash
3.然後我們執行dockerfile文件(docker build和docker commit兩個命令都可以建立docker鏡像,但是docker commit需要在容器內進行,docker build不需要)
docker build -f /docker/Dockerfile -t 命名空間/鏡像名 . (注意此處有一個.)

實例如下:
[root@cloud docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              6678c7c2e56c        13 days ago         127MB
httpd               latest              c5a012f9cf45        3 weeks ago         165MB
[root@cloud docker]# 
[root@cloud docker]# cat Dockerfile 
# volume test
FROM nginx
VOLUME ["/demo03"] --privileged=true
CMD echo "successful building"
CMD /bin/bash

[root@cloud docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              6678c7c2e56c        13 days ago         127MB
httpd               latest              c5a012f9cf45        3 weeks ago         165MB
[root@cloud docker]# docker build -f /docker/Dockerfile -t demo/nginx .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM nginx
 ---> 6678c7c2e56c
Step 2/4 : VOLUME ["/demo03"] --privileged=true
 ---> Running in 50d079f73f8e
Removing intermediate container 50d079f73f8e
 ---> 5fc8cf76cfb7
Step 3/4 : CMD echo "successful building"
 ---> Running in 5df40d4f6f6d
Removing intermediate container 5df40d4f6f6d
 ---> 62982b04da33
Step 4/4 : CMD /bin/bash
 ---> Running in d229329a482c
Removing intermediate container d229329a482c
 ---> 8257b617bbc8
Successfully built 8257b617bbc8
Successfully tagged demo/nginx:latest
[root@cloud docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
demo/nginx          latest              8257b617bbc8        3 seconds ago       127MB
nginx               latest              6678c7c2e56c        13 days ago         127MB
httpd               latest              c5a012f9cf45        3 weeks ago         165MB
[root@cloud docker]# docker run -it -name demo demo/nginx /bin/bash
unknown shorthand flag: 'n' in -name
See 'docker run --help'.
[root@cloud docker]# docker run -it demo/nginx /bin/bash
root@06a79d51ebe0:/# ls
bin  boot  demo03  dev	etc  home  lib	lib64  media  mnt  opt	proc  root  run  sbin  srv  sys  tmp  usr  var
root@06a79d51ebe0:/# 

二.docker容器之間數據共享

數據卷容器的概念

  • 數據卷相當於一塊移動硬盤,而數據卷容器則相當於把多個移動硬盤掛載動一個移動硬盤之上,來實現數據之間的傳遞依賴
  • docker官方給出的解釋是:命名的容器掛載數據卷,其他的容器通過掛載這個父容器實現數據共享,掛載數據卷的容器,稱之爲數據卷容器

數據卷容器的實現

  • 建立父容器
1.命令格式爲:
docker run -it --name 父容器名字 -v /容器內目錄 鏡像名 /bin/bash
  • 建立子容器繼承父容器
1.命令格式:
docker run -it --name 子容器 --volumes-from 父容器 鏡像名 /bin/bash

 

注:容器之間配置信息的傳遞,數據卷的生命週期會一直持續到沒有容器使用這個數據卷爲止。即只要有一個容器仍然在使用該數據卷,那麼該數據卷都可以一直進行數據共享。如果說我們把父容器關閉,子容器之間照樣可以進行數據共享,而且通過繼承子容器生產的新的容器,一樣可以與子容器進行數據共享

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章