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
從上面我們到,在容器的根目錄多了兩個資料夾volume01
和volume02
。
其實這兩個資料夾就是我們在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
下圖是擷取容器掛載部分的內容。
上圖就證明容器啟動時,自動建立了volume01
和volume02
兩個掛載資料卷目錄。
並且使用匿名掛載的方式進行掛載。
我們進入宿主機的/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 卷名:容器內路徑
。