18-數據持久化-Data Volume

18-數據持久化-Data Volume

Data Volume 使用場景。一般來講有些容器自己會產生一些數據,我們不想數據隨著容器的銷毀而銷毀,我們想保存數據,正常一般用在數據庫,比如我們想保存數據庫中的數據,這個時候我們就會使用 Data Volume

創建數據庫容器

我們通過創建一個 mysql 的數據庫來看看如何數據持久化。

我們先查看一下 mysql 的安裝方式,通過 docker hub 來查找。

我們點擊 5.7.25, 5.7, 5 (5.7/Dockerfile) 這一條查看它的Dockerfile

...
VOLUME /var/lib/mysql
...

我們可以看到上面這一句,含義就是創建容器的時候就會產生一個 /var/lib/mysqlData Volume

例子1:

  1. 創建一個無密碼的mysql容器

    docker run -d -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql1 mysql
    

    正常mysql數據庫是需要賬戶和密碼的,為了方便我們不使用密碼。

  2. 查看本地的 Data Volume

    [vagrant@10 ~]$ docker volume ls
    DRIVER              VOLUME NAME
    local               1f40fd662b4cf5b83abde370c659a42bf0a706ef58451baa11c4d58c1bc17083
    

    可以看到本地產生了一個 Data Volume,這就是 mysql的創建的過程中會去創建一個 Volume,也就是之前在它的Dockerfile中看到的那一段。

  3. 查看指定volume的詳細信息

    [vagrant@10 ~]$ docker volume inspect 1f40fd662b4cf5b83abde370c659a42bf0a706ef58451baa11c4d58c1bc17083
    [{"CreatedAt": "2019-02-14T01:32:54Z","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/1f40fd662b4cf5b83abde370c659a42bf0a706ef58451baa11c4d58c1bc17083/_data","Name": "1f40fd662b4cf5b83abde370c659a42bf0a706ef58451baa11c4d58c1bc17083","Options": null,"Scope": "local"}
    ]
    

    我們發現這個volume是mount到本地的 /var/lib/docker/volumes/下。

  4. 再次創建一個mysql容器

    docker run -d -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql2 mysql
    
  5. 查看本地的 Data Volume

    [vagrant@10 ~]$ docker volume ls
    DRIVER              VOLUME NAME
    local               1f40fd662b4cf5b83abde370c659a42bf0a706ef58451baa11c4d58c1bc17083
    local               4a6269797a9e1f4c4fd43f80fd96a1bb9ac8174aec867947b5aee182fae0d3b8
    

    又產生了一個新的volume。

  6. 查看新產生的volume的詳細信息

    [vagrant@10 ~]$ docker volume inspect 4a6269797a9e1f4c4fd43f80fd96a1bb9ac8174aec867947b5aee182fae0d3b8
    [{"CreatedAt": "2019-02-14T01:37:02Z","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/4a6269797a9e1f4c4fd43f80fd96a1bb9ac8174aec867947b5aee182fae0d3b8/_data","Name": "4a6269797a9e1f4c4fd43f80fd96a1bb9ac8174aec867947b5aee182fae0d3b8","Options": null,"Scope": "local"}
    ]
    

    如果我們刪除volume對應的mysql容器,這個volume是不會自動刪除的,我們實驗一下。

    刪除mysql2

    docker stop mysql2 && docker rm mysql2
    

    查看本地volume情況

    [vagrant@10 ~]$ docker volume ls
    DRIVER              VOLUME NAME
    local               1f40fd662b4cf5b83abde370c659a42bf0a706ef58451baa11c4d58c1bc17083
    local               4a6269797a9e1f4c4fd43f80fd96a1bb9ac8174aec867947b5aee182fae0d3b8
    

    我們發現這個volume是沒有跟著刪除的,達到了數據持久化的目的,解決了數據丟失。

  7. volume設置別名

    我們可以發現volume的名字有點太長了,并且不友好。

    那我們可以給volume設定一個別名,這樣更方便我們識別volume。

    刪除我們之前創建的所有mysql容器和數據卷volume。

    docker stop mysql1 && docker rm mysql1
    docker volume rm 1f40fd
    

    查看數據卷是否全部刪除

    [vagrant@10 ~]$ docker volume ls
    DRIVER              VOLUME NAME
    

    重新創建一個mysql容器

    docker run -d -v mysql:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql1 mysql
    

    查看本地的volume

    [vagrant@10 ~]$ docker volume ls
    DRIVER              VOLUME NAME
    local               mysql
    
  8. 驗證是否數據的生成的數據同步到這個mysql數據卷內

    進入mysql容器

    docker exec -it mysql1 /bin/bash
    

    進入mysql數據庫命令行

    mysql -u root
    

    顯示當前數據庫的databases

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    4 rows in set (0.03 sec)
    

    創建一個新的docker databases

    mysql> create database docker;
    Query OK, 1 row affected (0.01 sec)
    

    查看mysql當前的databases

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | docker             |
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.00 sec)
    

    退出mysql和容器

    exit
    exit
    

    刪除mysql1容器

    docker stop mysql1 && docker rm mysql1
    

    查看volume是否還在

    [vagrant@10 ~]$ docker volume ls
    DRIVER              VOLUME NAME
    local               mysql
    

    我們發現是還在的。那我們后面再重新創建一個mysql并使用這個volume,是不是剛剛創建的docker databease還會存在呢?答案是的。

    再次創建一個mysql2容器,并還是使用剛剛的mysql數據卷

    docker run -d -v mysql:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql2 mysql
    

    進入mysql容器并查看databases

    docker exec -it mysql2 /bin/bash
    
    root@b0614271afc6:/# mysql -u root
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | docker             |
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.01 sec)
    

    我們發現docker database還在。

總結

在以后的工作中,如果你使用docker,那么你可能會經常使用volume,它可以幫助我們保護數據而不隨著容器的銷毀而銷毀。

docker的數據持久化也比較簡單,在容器的Dockerfile中添加 VOLUME 字段,那么容器在創建的時候會映射到docker的volume上并生成一個名字,但是這個名字很難記,是一堆字符串。那么我們可以通過 -v參數來修改這個volume的名字,讓我們可以更好的識別它。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536028.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536028.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536028.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

19-數據持久化-Bind Mounting

19-數據持久化-Bind Mounting Bind Mounting 與 Data Volume區別 Data Volume 需要在 Dockerfile 內聲明需要創建的 volume 目錄。 Bind Mounting 則不需要在 Dockerfile 聲明 volume,只需要在創建容器的時候,也就是 run 的時候聲明即可。 如: dock…

go自定義包教程

go自定義包教程 而是環境為 go version go1.11 linux/amd64linux mint 19 創建一個自定義的包 切換到src目錄下,創建demo目錄 cd src mkdir demo再創建smap 文件夾 cd demo mkdir smap創建包文件 cd smap touch map.gomap.go文件內容 package smapimport "…

在Linux中對硬盤進行分區、格式化和掛載

在Linux中對硬盤進行分區、格式化和掛載 我最近有一個全新的4-TB硬盤加入我的電腦。所以我需要在Linux中安裝它。為此,我需要執行以下操作: 分區格式化掛載檢查是否已安裝硬盤驅動器 分區 首先,在通過SATA和電源線將硬盤連接到計算機后&am…

Angular gitlab持續集成之runner配置

gitlab持續集成 安裝Runner 正常安裝 sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64sudo chmod x /usr/local/bin/gitlab-runner sudo useradd --comment GitLab Runner --creat…

javascript編譯壓縮

javascript編譯 js是JavaScript 源碼文件, .min.js是壓縮版的js文件。 .min.js文件經過壓縮,相對編譯前的js文件體積較小,傳輸效率快。經過編碼將變量和函數原命名改為毫無意義的命名,以防止他人窺視和竊取 js 源代碼 在線版 g…

vscode設置中文

vscode設置中文 當我們安裝完成vscode后,會發現它是中文的,因為默認情況下,vscode使用的語言為英文(us)。 那很多同學是不喜歡英文的,不是看不懂,而是不方便哈。 修改語言配置文件 使用快捷鍵組合【CtrlShiftp】 在…

linux下編譯boost

linux下編譯boost 下載boot庫 官方下載地址 下載完成會解壓。 編譯 1.進入解壓后的文件夾內 cd boost_1_69_0 執行下面的語句 ./bootstrap.sh --with-librariesall --with-toolsetgcc–with-libraries 指定編譯哪些boost庫,all的話就是全部編譯,只想…

C++通過原子變量代替互斥量

C通過原子變量代替互斥量 廢話不多說&#xff0c;直接上代碼。 實現類似lock_guard功能 #include <atomic> #include <thread>class ClockGuard { public:ClockGuard(std::atomic_flag & atomic):m_lockedFlag(atomic){lock();}~ClockGuard(){unlock();}voi…

conky安裝配置

conky安裝配置 安裝conky sudo apt-get install conky-all修改配置 在主目錄下創建’.conkyrc’ 文件內容&#xff1a; # set to yes if you want Conky to be forked in the background background no cpu_avg_samples 2 net_avg_samples 2 out_to_console no # X font w…

Windows子系統安裝圖形界面

Windows子系統安裝圖形界面 有很多同學需要使用 linux 系統,但是又不想真正安裝一個 linux 系統。于是微軟大哥就把 ubuntu 系統集成到 windows 內了&#xff0c;你說 微軟 屌不屌&#xff1f; 言歸正傳。 安裝Xlaunch 因為這個是最靠譜的圖形化界面了&#xff0c;所以不解…

C++ 判斷類是否有某變量

C 判斷類是否有某變量 話不多說上代碼。 #define HAS_MEMBER(member)\template<typename T, typename... Args>struct has_member_##member\ {\private:\template<typename U> static auto Check(int) -> decltype(std::declval<U>().member(std::declv…

C++將地址轉換為字符串

C將地址轉換為字符串 有時候在做程序設計的時候&#xff0c;有可能需要做一個類似messageBus的功能&#xff0c;并且需要一個key保證唯一&#xff0c;那么如何實現這個key的唯一呢&#xff1f;大致兩種思路: 使用函數簽名&#xff0c;因為messagebus綁定的是一個函數&#xf…

Angular 8之升級和新功能摘要

Angular 8之升級和新功能摘要 Angular 8已經到來,并帶來了大量的工作流程和性能改進。就像我們之前發布的幾個版本一樣,讓我們回顧一下Angular 8的新功能,以及如何將Angular 7應用程序升級到Angular 8。 Angular 8中明顯的新功能數量有限,但確實還有一些好東西: Differen…

Linux下查看顯卡PCIE速率x16x8x4及設定

Linux下查看顯卡PCIE速率x16x8x4 由于linux軟件并不是很齊全所以查看顯卡占用PCIE的帶寬并不直觀&#xff0c;所以本文介紹如何查看。 Windows下使用GPU-Z即可查看 Linux 確定當前顯卡型號 lspci | grep NVIDIA返回 02:00.0 3D controller: NVIDIA Corporation GM107M [GeFor…

Deepin安裝最新顯卡RTX2080Ti及CUDA10.1

Deepin安裝最新顯卡RTX2080Ti及CUDA10.1 廢話不多說直接上教程。 本系統為Deepin 15.10.2&#xff0c;是基于debian 9發布的&#xff0c;不排除后續deepin升級為debian 10&#xff0c;就目前來看是和ubuntu 16.04一樣&#xff0c;使用的是debian 9&#xff0c;所以下載安裝包等…

Anaconda安裝Tensorflow環境

Anaconda安裝Tensorflow環境 Anaconda安裝 下載安裝包&#xff0c;請到這個地址下載 安裝 打開終端執行&#xff1a; bash Anaconda3-5.3.1-Linux-x86_64.sh安裝過程全部yes即可。 然后重新啟動。 驗證是否安裝成功 conda --version如果沒有報錯&#xff0c;并且輸出下面內容…

Windows下Qt Creator設置IDE菜單字體樣式

Windows下Qt Creator設置IDE菜單字體樣式 本文為解決以下問題&#xff1a; IDE的菜單字體太小IDE的菜單字體樣式&#xff0c;可以更換為微軟雅黑 創建樣式文件 在Qt Creator目錄下C:\Qt\Qt5.12.2創建 custom-style.css 文件&#xff0c;內容如下&#xff1a; QWidget { fo…

Clonezilla再生龍備份與還原linux系統

文章目錄Clonezilla再生龍備份與還原linux系統簡介功能與要求一、制作再生龍啟動盤1.下載鏡像2.制作啟動盤二、系統分區三、備份系統四、還原系統注意事項Clonezilla再生龍備份與還原linux系統 簡介 再生龍&#xff08;Clonezilla&#xff09;是一個免費的災難恢復、硬盤克隆…

ubuntu Qt Creator不能輸入中文

ubuntu Qt Creator不能輸入中文 解決方式為下面的腳本&#xff0c;如果你的Qt是安裝在根目錄下&#xff0c;那么需要加sudo&#xff0c;如果不是&#xff0c;直接運行即可 sudo bash ChineseInputForQt-v1.1.sh# 或者bash ChineseInputForQt-v1.1.sh腳本內容為&#xff1a; …

修改gitlab數據卷的位置

修改gitlab數據卷的位置 在使用docker安裝gitlab的時候&#xff0c;一開始沒有考慮其他事情&#xff0c;直接在本地創建了一個數據卷就掛載到容器上了&#xff0c;導致后續數據越來越多&#xff0c;想將數據放到其他盤&#xff0c;大致可以這樣操作。 1.停止容器 docker sto…