『現學現忘』Docker基礎 — 29、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

說明roread 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 
# 在我們編輯完成保存時,,出現如下圖的提示:

image

意思是:設置了「只讀」選項。對於寫操作不支援。

步驟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(只讀)許可權,只允許宿主機單向的寫操作,來同步到容器中。而容器中是無法在數據卷目錄中做任何寫操作,如創建文件或者修改文件內容等。

我感覺是:一個容器在啟動時,會自動同步宿主機上掛載目錄中的內容。(這點要記住)