『現學現忘』Docker基礎 — 29、Docker容器數據卷的應用
- 2022 年 3 月 22 日
- 筆記
- 高級測試技能 - Docker基礎
1、驗證容器和宿主機之間數據共享
通過上面的操作,接下來我們演示一下通過數據卷的掛載,實現容器和宿主機之間的數據共享。
步驟1:在宿主機中的HostDataVolume目錄中創建host.txt文件。
# 查看宿主機當前位置
[root@192 HostDataVolume]# pwd
/home/HostDataVolume
# HostDataVolume目錄中創建host.txt文件
[root@192 HostDataVolume]# touch host.txt
# 查看創建的文件
[root@192 HostDataVolume]# ls -l
總用量 0
-rw-r--r--. 1 root root 0 3月 18 20:18 host.txt
步驟2:在CentOS容器的ContainerDataVolume目錄查看內容。
# 進入ContainerDataVolume目錄
[root@5f63a0fc88c5 /]# cd /home/ContainerDataVolume/
[root@5f63a0fc88c5 ContainerDataVolume]# pwd
/home/ContainerDataVolume
# 查看ContainerDataVolume目錄查看內容
[root@5f63a0fc88c5 ContainerDataVolume]# ls -l
total 0
-rw-r--r--. 1 root root 0 Mar 18 12:18 host.txt
我們可以看到,宿主機HostDataVolume
目錄中創建的host.txt
文件,同步到了CentOS容器的ContainerDataVolume
目錄中了。
步驟3:在CentOS容器的ContainerDataVolume目錄中創建container.txt文件。
# 查看容器中的當前位置
[root@5f63a0fc88c5 ContainerDataVolume]# pwd
/home/ContainerDataVolume
# 創建container.txt文件
[root@5f63a0fc88c5 ContainerDataVolume]# touch container.txt
# 在host.txt文件中添加hello docker,說明數據卷中可以讀寫文件。
[root@0115c0470f8d ContainerDataVolume]# vi host.txt
[root@0115c0470f8d ContainerDataVolume]# cat host.txt
hello docker
# 查看ContainerDataVolume目錄的內容
[root@5f63a0fc88c5 ContainerDataVolume]# ls -l
total 0
-rw-r--r--. 1 root root 0 Mar 18 12:23 container.txt
-rw-r--r--. 1 root root 0 Mar 18 12:18 host.txt
步驟4:在宿主機的HostDataVolume目錄中查看內容。
# 查看宿主機的位置
[root@192 HostDataVolume]# pwd
/home/HostDataVolume
# 查看HostDataVolume目錄中的內容
[root@192 HostDataVolume]# ll
總用量 0
-rw-r--r--. 1 root root 0 3月 18 20:23 container.txt
-rw-r--r--. 1 root root 0 3月 18 20:18 host.txt
# 查看host.txt文件中是否有內容。
[root@192 HostDataVolume]# cat host.txt
hello docker
我們可以看到,在CentOS容器的ContainerDataVolume
目錄中創建container.txt
文件,同步到了宿主機的HostDataVolume
目錄中。
這就驗證了,數據卷掛載實現了容器和宿主機之間數據共享。
2、容器停止退出後,主機修改後數據是否同步
接上面練習,繼續驗證容器停止退出後,主機修改數據卷中的數據後,重啟容器是否同步。
步驟1:停止CentOS容器。
# 退出centos容器
[root@5f63a0fc88c5 ContainerDataVolume]# exit
exit
# 當前docker中沒有運行的容器
[root@192 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
步驟2:在宿主機的/hmoe/HostDataVolume目錄中創建文件和修改文件。
# 查看宿主機當前位置
[root@192 HostDataVolume]# pwd
/home/HostDataVolume
# 創建文件host-02.txt,
[root@192 HostDataVolume]# touch host-02.txt
[root@192 HostDataVolume]# ll
總用量 4
-rw-r--r--. 1 root root 0 3月 18 20:23 container.txt
-rw-r--r--. 1 root root 0 3月 18 21:07 host-02.txt
-rw-r--r--. 1 root root 13 3月 18 21:03 host.txt
# 修改container.txt文件,在文件中添加hello world
[root@192 HostDataVolume]# vim container.txt
[root@192 HostDataVolume]# cat container.txt
hello world
步驟3:重新啟動CentOS容器,並查看ContainerDataVolume目錄中的內容。
# 查看centos容器,是Exited狀態
[root@192 ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
0115c0470f8d centos "/bin/bash" 10 minutes ago Exited (0) 6 minutes ago
# 啟動centos容器
[root@192 ~]# docker start 0115c0470f8d
0115c0470f8d
# 進入centos容器
[root@192 ~]# docker attach 0115c0470f8d
[root@0115c0470f8d /]#
# 進入ContainerDataVolume,查看內容
[root@0115c0470f8d /]# cd /home/ContainerDataVolume/
# 查看是否有host-02.txt
[root@0115c0470f8d ContainerDataVolume]# ls -l
total 8
-rw-r--r--. 1 root root 12 Mar 18 13:08 container.txt
-rw-r--r--. 1 root root 0 Mar 18 13:07 host-02.txt
-rw-r--r--. 1 root root 13 Mar 18 13:03 host.txt
# 查看container.txt文件中的內容
[root@0115c0470f8d ContainerDataVolume]# cat container.txt
hello world
我們可以看到,容器停止退出後,主機修改掛載的數據卷中的數據後,重啟容器依然同步。
所以我們以後修改一些相關的配置文件,掛載了數據卷之後,只需要在本地修改即可,容器內會自動同步。
3、帶只讀許可權的掛載數據卷
命令:docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 鏡像名或鏡像ID
說明ro
:read only
只讀。
還是復用之前的練習之上。
步驟1:啟動CentOS容器,加入帶ro許可權的掛載。
# 啟動centos容器
[root@192 ~]# docker run -it -v /home/HostDataVolume:/home/ContainerDataVolume:ro centos /bin/bash
# 查看ContainerDataVolume文件夾中的內容
[root@2c8d185e17b1 /]# ls /home/ContainerDataVolume/
container.txt host-02.txt host.txt
# 說明:
# 因為啟動容器之前ContainerDataVolume文件夾和裡邊的文件就存在
# 在使用ContainerDataVolume目錄做數據卷掛載,不會刪除已經存在的文件。
# 如果需要ContainerDataVolume目錄中的文件,
# 可以在上面啟動centos容器之前,把宿主機/home/HostDataVolume中的目錄文件全部刪除。
# 這樣在啟動容器之後,centos容器的ContainerDataVolume目錄會自動同步,也就沒有文件了。
步驟2:在宿主機的/home/HostDataVolume目錄中,創建host-03.txt文件。
# 查看宿主機的當前位置
[root@192 HostDataVolume]# pwd
/home/HostDataVolume
# 創建host-03.txt文件
[root@192 HostDataVolume]# touch host-03.txt
# 查看是否創建成功host-03.txt文件
[root@192 HostDataVolume]# ll
總用量 8
-rw-r--r--. 1 root root 12 3月 18 21:08 container.txt
-rw-r--r--. 1 root root 0 3月 18 21:07 host-02.txt
-rw-r--r--. 1 root root 0 3月 18 22:27 host-03.txt
-rw-r--r--. 1 root root 13 3月 18 21:03 host.txt
# 在host-03.txt添加內容
[root@192 HostDataVolume]# vim host-03.txt
[root@192 HostDataVolume]# cat host-03.txt
hello world,hello docker.
步驟3:在CentOS容器中查看/home/ContainerDataVolume目錄中的內容。
# 查看ContainerDataVolume目錄中的內容
[root@2c8d185e17b1 /]# ls -l /home/ContainerDataVolume/
total 8
-rw-r--r--. 1 root root 12 Mar 18 13:08 container.txt
-rw-r--r--. 1 root root 0 Mar 18 13:07 host-02.txt
-rw-r--r--. 1 root root 0 Mar 18 14:27 host-03.txt
-rw-r--r--. 1 root root 13 Mar 18 13:03 host.txt
# 查看host-03.txt文件中的內容
[root@2c8d185e17b1 /]# cat /home/ContainerDataVolume/host-03.txt
hello world,hello docker.
我們可以看到,宿主機上的創建的host-03.txt
文件,同步到CentOS容器中了。
同時我們也可以查看到host-03.txt
文件中的內容。
步驟4:在CentOS容器的/home/ContainerDataVolume目錄中,創建文件和編寫內容。
# 進入ContainerDataVolume目錄
[root@2c8d185e17b1 /]# cd /home/ContainerDataVolume/
[root@2c8d185e17b1 ContainerDataVolume]# pwd
/home/ContainerDataVolume
# 創建container-02.txt文件
[root@2c8d185e17b1 ContainerDataVolume]# touch container-02.txt
touch: cannot touch 'container-02.txt': Read-only file system
# 我們可以看到提示,不能創建container-02.txt文件,因為是只讀文件系統。
# 修改container.txt文件中的內容
[root@2c8d185e17b1 ContainerDataVolume]# cat container.txt
hello world
[root@2c8d185e17b1 ContainerDataVolume]# vi container.txt
# 在我們編輯完成保存時,,出現如下圖的提示:
意思是:設置了「只讀」選項。對於寫操作不支援。
步驟5:使用docker inspect
命令查看當前CentOS容器。
# 查看當前運行的centos容器
[root@192 HostDataVolume]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2c8d185e17b1 centos "/bin/bash" 25 minutes ago Up 25 minutes
# 查看centos容器的具體數據
[root@192 HostDataVolume]# docker inspect 2c8d185e17b1
[
{
"Id": "2c8d185e17b113326ea298f34896b6469e7717fa7450eeec5138767a5bb6915f",
"Created": "2021-03-18T14:20:33.842841276Z",
... # 省略
"HostConfig": { # 主機配置
"Binds": [
"/home/HostDataVolume:/home/ContainerDataVolume:ro"
], # 可以看到主機綁定的掛載上顯示ro
... # 省略
},
"Mounts": [ # 容器掛載配置
{
"Type": "bind",
"Source": "/home/HostDataVolume",
"Destination": "/home/ContainerDataVolume",
"Mode": "ro", # 這裡標識的只讀模式
"RW": false, # 這裡的讀寫許可權,標識為false,
"Propagation": "rprivate"
} # "RW" 之前版本的表示為 "VolumesRW"參數
],
"Config": {
... # 省略
# 新版的Dodker把Volumes資訊放到了Mounts的Json字待串里了
"Volumes": null,
... # 省略
},
... # 省略
}
]
總結:
通過上面的演示:數據卷掛載設置ro
(只讀)許可權,只允許宿主機單向的寫操作,來同步到容器中。而容器中是無法在數據卷目錄中做任何寫操作,如創建文件或者修改文件內容等。
我感覺是:一個容器在啟動時,會自動同步宿主機上掛載目錄中的內容。(這點要記住)