Docker 學習之 Docker 容器數據卷

容器數據卷

什麼是容器數據卷

docker 理念回顧

將應用和環境打包成一個鏡像!

問題:數據?如果數據都在容器中,那麼我們刪除容器,數據就會丟失!需求:數據可以持久化!

容器之前可以有一個數據共享技術! Docker 容器中產生的數據,同步到本地!

這就是卷技術!目錄的掛載,將我們的容器內的目錄,掛載到 Linux 上

 總結:容器的持久化和同步操作!容器間也是可以數據共享的! 

使用數據卷

方式一:直接使用命令來掛載 -v

docker run -it -v 主機目錄:容器目錄

# 測試
[root@zhujixiang home]# docker run -it -v /home/cesi:/home centos /bin/bash

# 啓動起來之後我們可以通過 docker inspect 容器id

測試文件的同步

 再次測試:

# 1、先關閉容器
# 2、修改本地文件
# 3、打開容器,進入容器查看
# 4、發現同步到了容器內部的文件

好處:只在本地修改即可,會自動同步到容器內部!

實戰:安裝MySQL

# 1、獲取鏡像
[root@zhujixiang /]# docker pull mysql:5.7

# 2、運行容器,需要做數據掛載  安裝啓動 mysql 需要配置密碼

# 啓動MySQL
-d 後臺運行
-p 端口暴露
-v 卷掛載
-e 環境配置
--name 容器名字
[root@zhujixiang /]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

# 3、本地測試,可以連接到MySQL服務器
# 4、在本地建立一個數據庫,發現可以同步到映射的文件夾
# 5、即使刪除容器,本地依舊存在   實現了容器數據持久化
[root@zhujixiang data]# ls
auto.cnf    client-cert.pem  ibdata1      ibtmp1      private_key.pem  server-key.pem
ca-key.pem  client-key.pem   ib_logfile0  mysql       public_key.pem   sys
ca.pem      ib_buffer_pool   ib_logfile1  performance_schema  server-cert.pem  test_zjx

具名掛載和匿名掛載

# 匿名掛載
docker run -d -P /etc/nginx ngin

# 查看所有的 volume 的情況
[root@zhujixiang /]# docker volume ls
DRIVER              VOLUME NAME
local               1f53f4e57b5c9a933e1982266f4d59bf24ffc75a13eed0a922284fe178356c2d
# 這裏發現,這種就是匿名掛載,我們在 -v 的時候只寫了容器內的路徑,沒有寫容器外的路徑!

# 具名掛載
[root@zhujixiang home]# docker run -d -P -v juming-nginx:/etc/nginx nginx
[root@zhujixiang home]# docker volume ls
DRIVER              VOLUME NAME
local               juming-nginx
# 通過 -v 卷名:容器內路徑
# 查看一下這個卷

 

所有的 docker 容器內的卷,沒有指定目錄的情況下都是在 /var/lib/docker/volumes/xxx 目錄下

我們通過具名掛載可以更方便的找到一個卷,大多是情況下使用具名掛載

# 如何確定是匿名掛載還是具名掛載,還是指定路徑掛載
-v 容器內路徑             # 匿名掛載
-v 卷名:容器內路徑        # 具名掛載
-v /宿主機路徑:容器內路徑  # 指定路徑掛載

拓展:

# 通過 -v 容器內路徑:ro  rw  改變讀寫權限
ro  readonly   # 只讀
rw  readwrite  # 可讀可寫

# 一旦這個設置了容器權限,容器對我們掛載出來的內容就有了限定
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
# 只要看到 ro 就說明只能通過宿主機來操作,容器內部沒有辦法操作,默認是 rw

初識Dockerfile

Dockerfile 就是用來構建 Docker 鏡像的創建文件!命令腳本!體驗一下!

# 創建一個 dockerfile 文件,名字可以隨機 建議使用 dockerfile
# 文件中的內容  指令(大寫)  參數
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "----end----"

CMD /bin/bash

# 這裏面每一個命令,就是鏡像的一層

# 啓動自己寫的容器

這個卷和外部一定有一個同步的目錄!

 

查看一下卷掛載的路徑

測試一下剛纔的文件是否同步出去了!

這種方式我我們未來使用的十分多,因爲我們通常會構建自己的鏡像!

假設構建鏡像的時候我們沒有掛載卷,要手動鏡像掛載 -v 卷名:容器內路徑

[root@zhujixiang home]# cd /var/lib/docker/volumes/60449cb067e6ca8d7f1185b2393f4f9a90d7edf0c8335a92267c5657d181496a/_data
[root@zhujixiang _data]# ls
container.txt

數據卷容器

兩個 MySQL 同步數據!

# 啓動3個容器,通過我們自己剛纔寫的鏡像啓動

# 測試:刪除 docker01 ,查看一下 docker02 和 docker03 是否還可以訪問這個文件
# 測試依舊可以訪問文件

多個 mysql 實現數據共享

[root@zhujixiang /]# docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

[root@zhujixiang /]# docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7

# 這個時候,就可以實現兩個容器數據同步!

結論

容器之間配置信息的傳遞,數據卷容器的生命週期一直持續到沒有容器使用爲止。

但是一旦你持久化到了本地,這個時候,本地的數據是不會刪除的!

 PS:我只是一個剛剛開始學習 Docker 的小白,學習源自B站 遇見狂神說

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章