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


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 卷名:容器內路徑


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM