『現學現忘』Docker基礎 — 32、通過DockerFile的方式掛載資料卷

繁華似錦Fighting發表於2022-03-25

1、簡單瞭解一下DockerFile

我們這裡先簡單的概括一下DockerFile:

  • Dockerfile就是用來構建Docker映象的構建檔案,是一個命令指令碼。
  • 通過這個指令碼可以生成映象,映象是一層一層的,而指令碼也是一個個的命令,每個命令都是一層。

(理解到這裡就可以了)

2、通過DockerFile的方式掛載資料卷

目標:在Dockerfile中使用VOLUME指令來給映象新增一個或多個資料卷。

(1)建立DockerFile檔案

在宿主機的/home目錄中建立一個mydocker目錄。

mydocker目錄中,建立一個檔案dockerfile

如下所示:

# 進入/home目錄
[root@192 ~]# cd /home/
[root@192 home]# ll
總用量 0

# 建立並進入mydocker目錄
[root@192 home]# mkdir mydocker
[root@192 home]# cd mydocker/

# 建立Dockerfile檔案
[root@192 mydocker]# touch dockerfile
[root@192 mydocker]# ll
總用量 0
-rw-r--r--. 1 root root 0 3月  19 19:59 dockerfile

(2)編輯Dockerfile檔案

dockerfile檔案中編寫如下內容。

FROM centos # 新增基礎映象
VOLUME ["volume01", "volume02"] # 新增兩個容器資料卷,屬於匿名掛載
CMD echo "--finished----success--" # 容器構建完成輸出的資訊
CMD /bin/bash # 指定終端命令

說明:

  • 建立一個Dockerfile檔案,名字可以隨機起,建議使用Dockerfile命名。
  • 檔案中的指令都大寫。
  • Dockerfile裡面的每個命令,就是映象的一層!

提示:

出於可移植和分享的考慮,用-v 主機目錄:容器目錄這種方法不能夠直接在Dockerfile中實現。

是由於宿主機目錄是依賴於特定宿主機的,並不能夠保證在所有的宿主機上都存在這樣的特定目錄。

(3)構建Dokcer映象

構建Dokcer映象使用docker build命令。

執行命令:docker build -f /home/mydocker/dockerfile -t wukong/centos:1.0 .

提示:

  • -f:指明Dockerfile檔案的路徑。
  • -t:定義映象的名稱空間/映象名:TAG。(名稱空間可以省略)
  • 最後的. 表示是在指定映象構建過程中上下文環境的目錄。(先按固定寫法記)
# 從Dockerfile生成映象
[root@192 mydocker]# docker build -f /home/mydocker/dockerfile -t wukong/centos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos # 可以看到一步一步的執行Dockerfile檔案的每一條語句
 ---> 300e315adb2f
Step 2/4 : VOLUME ["volume01", "volume02"]
 ---> Running in 5b470e19ab85
Removing intermediate container 5b470e19ab85
 ---> 9f32b7e2ec23
Step 3/4 : CMD echo "--finished----success--"
 ---> Running in 8e5e921be91d
Removing intermediate container 8e5e921be91d
 ---> c25f409aaaa3
Step 4/4 : CMD /bin/bash
 ---> Running in 3a09eb701bf5
Removing intermediate container 3a09eb701bf5
 ---> 98b1b6590b78
Successfully built 98b1b6590b78 # 最後生成的映象ID
Successfully tagged wukong/centos:1.0

# 檢視本地Docker映象
[root@192 mydocker]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
wukong/centos   1.0       98b1b6590b78   3 minutes ago   209MB
mysql           5.7       a70d36bc331a   8 weeks ago     449MB
centos          latest    300e315adb2f   3 months ago    209MB

(4)啟動映象,並操作映象

執行命令:docker run -it wukong/centos /bin/bash

啟動容器,並且檢視wukong/centos容器的根目錄。

# 啟動進入容器
[root@192 ~]# docker run -it 98b1b6590b78 /bin/bash
[root@b2094527a8c4 /]#

# 檢視wukong/centos容器的根目錄
[root@b2094527a8c4 /]# ls -l
total 0
lrwxrwxrwx.   1 root root   7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x.   5 root root 360 Mar 19 12:52 dev
drwxr-xr-x.   1 root root  66 Mar 19 12:52 etc
drwxr-xr-x.   2 root root   6 Nov  3 15:22 home
lrwxrwxrwx.   1 root root   7 Nov  3 15:22 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 Nov  3 15:22 lib64 -> usr/lib64
drwx------.   2 root root   6 Dec  4 17:37 lost+found
drwxr-xr-x.   2 root root   6 Nov  3 15:22 media
drwxr-xr-x.   2 root root   6 Nov  3 15:22 mnt
drwxr-xr-x.   2 root root   6 Nov  3 15:22 opt
dr-xr-xr-x. 126 root root   0 Mar 19 12:52 proc
dr-xr-x---.   2 root root 162 Dec  4 17:37 root
drwxr-xr-x.  11 root root 163 Dec  4 17:37 run
lrwxrwxrwx.   1 root root   8 Nov  3 15:22 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 Nov  3 15:22 srv
dr-xr-xr-x.  13 root root   0 Mar 19 04:07 sys
drwxrwxrwt.   7 root root 145 Dec  4 17:37 tmp
drwxr-xr-x.  12 root root 144 Dec  4 17:37 usr
drwxr-xr-x.  20 root root 262 Dec  4 17:37 var
drwxr-xr-x.   2 root root   6 Mar 19 12:52 volume01
drwxr-xr-x.   2 root root   6 Mar 19 12:52 volume02

從上面我們到,在容器的根目錄多了兩個資料夾volume01volume02

其實這兩個資料夾就是我們在Dockerfile檔案中定義的資料卷掛載,是以匿名掛載的方式掛載資料卷的。

在容器啟動的時候,會自動掛載這兩個資料卷目錄。

然後我們進入volume01目錄建立一個檔案container.txt

# 建立container.txt檔案
[root@b2094527a8c4 /]# mkdir /volume01/container.txt

# 檢視檔案是否建立成功
[root@b2094527a8c4 /]# ls -l /volume01
total 0
drwxr-xr-x. 2 root root 6 Mar 19 12:58 container.txt

(5)檢視資料卷

我們通過docker inspect命令,檢視容器的詳細資訊。

# 檢視當前執行的容器
[root@192 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS         PORTS
b2094527a8c4   98b1b6590b78   "/bin/bash"   8 minutes ago   Up 8 minutes

# 檢視容器詳細資訊
[root@192 ~]# docker inspect b2094527a8c4

下圖是擷取容器掛載部分的內容。

image

上圖就證明容器啟動時,自動建立了volume01volume02兩個掛載資料卷目錄。

並且使用匿名掛載的方式進行掛載。

我們進入宿主機的/var/lib/docker/volumes/2a2c26cec7ba4908a33a381aa90367a5e4123bb6e6fd9f5ef0887911a962ba19/_data目錄,檢視是否存在container.txt檔案。

[root@192 ~]# cd /var/lib/docker/volumes/2a2c26cec7ba4908a33a381aa90367a5e4123bb6e6fd9f5ef0887911a962ba19/_data
[root@192 _data]# ll
總用量 0
drwxr-xr-x. 2 root root 6 3月  19 20:58 container.txt

說明在容器中volume01目錄下建立的container.txt,同步到宿主機中了。

提示:

使用DockerFile掛載資料卷的方式我們未來使用的十分多,因為我們通常會構建自己的映象。

假設構建映象時候沒有掛載資料卷,那我們就要手動進行資料卷的掛載了,-v 卷名:容器內路徑

相關文章