上一篇:Docker(4)—鏡像
1. 如何保證數據持久化?
到這裏我們應該知道,docker技術就是使用下載好的鏡像文件生成運行實例—容器,也就是說鏡像文件相當於是一個模板,比如mysql的鏡像文件,無論在docker上面運行多少次mysql,使用的始終是下載好的同一個mysql鏡像文件。那我運行期間產生的數據怎麼保存?第二次運行的時候想使用第一次運行期間產生的數據怎麼辦?
在Docker中,數據卷提供數據持久化功能。數據卷呈現爲一種目錄或者文件的形式存在於一個或者多個容器中,由docker掛載到容器,但是不屬於聯合文件系統的一部分,所以當docker關閉或者刪除容器的時候,不會影響到數據卷中的數據。數據卷可以用於存儲數據,也可以用來在容器間進行數據共享。
2. Dockerfile保留字指令
指令 | 描述 |
---|---|
FROM | 基礎鏡像,當前新鏡像是基於哪個鏡像的 |
MAINTAINER | 鏡像維護者的姓名和郵箱地址 |
RUN | 容器構建時需要運行的命令 |
EXPOSE | 當前容器對外暴露出的端口 |
WORKDIR | 指定在創建容器後,終端默認登錄進來工作的目錄,一個落腳點 |
ENV | 用來在構建鏡像過程中設置環境變量 |
ADD | 將宿主機目錄下的文件拷貝進鏡像且ADD命令會自動處理URL和解壓tar壓縮包 |
COPY | 類似ADD,拷貝文件和目錄到鏡像中。將從構建上下文目錄中<源路徑>的文件/目錄複製到新的一層的鏡像內的<目標路徑>位置 {COPY src dest} |
VOLUME | 容器數據卷,用於數據保存和持久化工作 |
CMD | 指定一個容器啓動時要運行的命令。Dockerfile中可以有多個CMD指令,但只有最後一個生效,CMD會被docker run之後的參數替換。 |
ENTRYPOINT | 指定一個容器啓動時要運行的命令。ENTRYPOINT的目的和CMD一樣,都是在指定容器啓動程序及參數。 |
ONBUILD | 當構建一個被繼承的Dockerfile時運行命令,父鏡像在被子繼承後父鏡像的onbuild被觸發。 |
3. 數據卷特點?
- 數據卷可以在容器間共享或者重用數據
- 數據卷中的更改不會包含在容器的更新中
- 數據卷中的更改可以直接生效
- 數據卷的生命週期一直持續到沒有容器使用它爲止
3. 實現宿主機與容器之間的數據共享?
在這裏需要明確兩個概念:
1. 宿主機:
宿主機指的就是我們通過VMWare-----》CentOs
的方式進入的Linux系統就是我們的宿主機。
2. 容器
就是宿主機上拉取的鏡像文件生成的運行實例~
需求:
現在我有一個centos鏡像,希望centos鏡像運行起來的時候其containerdata
目錄與宿主機的mydata
兩個目錄之間能夠進行數據共享;
命令:
docker run -it -v 宿主機中的共享目錄(mydata)路徑:容器中的共享目錄(containerdata)的路徑
容器名
示例:
比如mydata在宿主機的根目錄下(/mydata
),containerdata在容器的根目錄下(/containerdata
)
下圖是宿主機的根目錄,現在沒有mydata
文件夾
下圖是容器centos的根目錄,現在也沒有containerdata
文件夾
1.首先進行目錄綁定:
docker run -it -v /mydata:/containerdata centos
2.查看宿主機和容器的綁定關係
docker inspect 容器ID
3.查看宿主機和容器中是否分別有mydata
和containerdata
文件夾
宿主機:
容器:
現在在mydata
目錄中創建一個文檔:
[root@bogon mydata]# touch file.txt
[root@bogon mydata]# ll
總用量 0
-rw-r--r--. 1 root root 0 3月 22 14:57 file.txt
[root@bogon mydata]#
既然mydata
目錄和centos的容器中的containerdata
目錄進行了數據共享,那麼現在containerdata
目錄下應該也有一個file.txt
文檔。查看containerdata
目錄:
[root@7453e78d6615 /]# cd containerdata/
[root@7453e78d6615 containerdata]# ls -l
total 0
-rw-r--r--. 1 root root 0 Mar 22 06:57 file.txt
[root@7453e78d6615 containerdata]#
發現containerdata
目錄下確實有file.txt
文檔,現在通過容器編輯該文檔:
在該文檔中輸入一段話,按照數據共享的原理,在宿主機的mydata
目錄下的file.txt
文檔中應該也會有這樣一句話:
此時再次查看宿主機的containerdata
下的file.txt
:
到這裏就實現了宿主機與容器之間的數據共享~
注意:
通過上面的綁定操作之後,即使我們的容器關閉運行了,但是如果我們在宿主機的mydata
目錄下進行的操作依然會被同步到與其綁定的centos
鏡像中的containerdata
目錄下:
示例:
關閉centos的運行並退出:`
查看此時運行的鏡像文件:
確認上面的centos鏡像文件已經退出運行了~
此時在宿主機的mydata
目錄下創建一個file001.txt
文件,並添加內容:this content is edited in the host
此時再運行centos鏡像文件,到containerdata
目錄下查看:
查看上次關閉的centos鏡像ID:docker ps -l
重新啓動上次關閉的centos鏡像文件:docker start 鏡像ID
進入處於運行狀態的centos容器:docker attach 鏡像ID
查看containerdata
目錄下是否有新增的file001.txt
文檔:
[root@e2fde7599c8b /]# cd containerdata/
[root@e2fde7599c8b containerdata]# ls -l
total 8
-rw-r--r--. 1 root root 38 Mar 22 07:22 file.txt
-rw-r--r--. 1 root root 35 Mar 22 07:13 file001.txt
[root@e2fde7599c8b containerdata]# cat file001.txt
this content is edited in the host
[root@e2fde7599c8b containerdata]#
發現我們在宿主機上新建的file001.txt
文檔以及裏面的數據同步到了centos
容器相應的綁定位置;
4. 宿主機與容器數據共享的時候添加權限
宿主機與容器進行數據共享的目錄綁定命令:
docker run -it -v /宿主機共享文件的絕對路徑:/容器共享文件的絕對路徑 :ro 鏡像名
注:ro就是read only(只讀權限)
通過以上命令進行共享數據目錄綁定之後,我們可以從宿主機上寫數據(增刪改),而容器上只能讀數據