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