您好,登錄后才能下訂單哦!
什么是容器數據卷
如果數據都在容器中,一旦容器刪除,數據就會丟失!
eg : mysql容器刪了,就是我們常說的刪庫跑路。 需求:數據可以持久化,即時刪掉容器,我們的數據還在
容器直接可以有一個數據共享的技術!Docker容器產生的數據,同步到本地!
這就是卷技術!目錄的掛載,將我們容器的目錄掛載到linux上面!
總結:卷技術就是為了實現數據的持久化和同步操作,容器間也是可以數據共享的
使用數據卷
方式一:直接使用命令來掛載 -v
# 命令 docker run -it -v 主機的目錄:容器內目錄 -p 主機端口:容器端口 # 測試 # 主機home目錄下為空 [root@bogon home]# ls # 啟動contes鏡像 將主機的home與容器的home進行綁定 [root@bogon home]# docker run -v /home:/home/ -it centos [root@8dc073caf39c /]# cd home/ # 容器home目錄下為空 [root@8dc073caf39c home]# ls # 在容器目錄下創建test.java文件 [root@8dc073caf39c home]# touch test.java [root@8dc073caf39c home]# ls test.java # 切換到主機home目錄后發現 出現了test.java文件 [root@8dc073caf39c home]# [root@bogon home]# ls test.java # 在主機home目錄下創建test2.java文件 [root@bogon home]# touch test2.java [root@bogon home]# ls test2.java test.java [root@bogon home]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8dc073caf39c centos "/bin/bash" 3 minutes ago Up 3 minutes focused_nobel # 進入正在運行的容器 [root@bogon home]# docker exec -it 8dc073caf39c /bin/bash # 進入容器home目錄 [root@8dc073caf39c /]# cd home/ # 發現存在test2.java文件 [root@8dc073caf39c home]# ls test.java test2.java # 通過 inspect 命令查看容器信息 [root@bogon home]# docker inspect 8dc073caf39c "Mounts": [ { "Type": "bind", "Source": "/home", # 主機目錄 "Destination": "/home", # 容器目錄 "Mode": "", "RW": true, "Propagation": "rprivate" } ], ## 結論:如果我們使用 -v 做了數據綁定 # 1、容器停止,主機對數據做出修改 容器啟動后 數據也會同步過來 # 2、刪除容器,主機該目錄下數據還存在 ## 好處:在使用了數據卷后,我們以后修改配置文件時,只需要在本地修改,容器內會自動同步
安裝mysql
mysql的數據持久化問題
# -e MYSQL_ROOT_PASSWORD=my-secret-pw 設置初始密碼為my-secret-pw # 官方命令: docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag # 測試 # 解讀 # -d 后臺運行 # -p 3306:3306 綁定端口 # -v /home/mysql/conf:/etc/mysql/conf.d 數據卷掛載技術綁定mysql配置文件 # -v /home/mysql/data:/var/lib/mysql 數據卷掛載技術綁定mysql數據 # -e MYSQL_ROOT_PASSWORD=123456 環境配置---》設置mysql初始密碼為123456 # --name mysql0 給容器起名為mysql01 [root@bogon home]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql 6d75b6312f725de2c71709116af5755604ea60cd073f1daf3755c578c1e64f57
具名和匿名掛載
# 匿名掛載 -v 容器內路徑! docker run -d -P --name nginx01 -v /etc/nginx nginx # 具名掛載 -v 卷名:容器內路徑 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx # 測試匿名掛載 [root@localhost test]# docker run -d -P --name nginx01 -v /etc/nginx nginx 214dab398d9997a730b970b6e3bb08fa7e39bbb0ca91ad59f6b3f235d8f1b9bc # 查看所有 volume 的情況 [root@localhost test]# docker volume ls DRIVER VOLUME NAME local 2c22e1c50ff7330b815b692f8f71a1fca878209223846c95626f7efd9dc2a83b # 匿名掛載 # 測試具名掛載 # 通過 -v 卷名:容器內路徑 [root@localhost test]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx a678d79886565601bf466ff41734cb5334bdaf9e881b9cbf11edb84e9d790251 # 查看所有 volume 的情況 [root@localhost test]# docker volume ls DRIVER VOLUME NAME local 2c22e1c50ff7330b815b692f8f71a1fca878209223846c95626f7efd9dc2a83b # 匿名掛載 local juming-nginx # 具名掛載 # 查看某個數據卷的信息 # 命令 docker volume inspect 卷名 # 所有docker容器內的卷 在沒有指定目錄的情況下都在 /var/lib/docker/volumes/XXX/_data [root@localhost test]# docker volume inspect juming-nginx [ { "CreatedAt": "2020-08-13T09:18:34+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", "Name": "juming-nginx", "Options": null, "Scope": "local" } ] # 我們通過具名掛載可以方便的找到我們的一個卷,大多數情況在使用的----具名掛載 # 如何確定是具名掛載還是匿名掛載 還是指定路徑掛載! # -v 容器內路徑 # 匿名掛載 # -v 卷名:容器內路徑 # 具名掛載 # -v 主機路徑:容器內路徑 # 指定路徑掛載
拓展
# 通過 -v 卷名:容器內路徑:ro rw 改變讀寫權限 # ro--->read only 只讀 # rw--->read write 讀寫 docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx
初識DockerFile
DockerFile就是用來構建 docker 鏡像的構建文件!命令腳本! 先體驗一下!
[root@localhost docker-test-volume]# cat dockerfile FORM centos VOLUME ["volume01", "volume02"] CMD echo "-----end-----" CMD /bin/bash # 構建 # 命令 docker build -f shell腳本文件 -t 鏡像名:版本號 [root@localhost docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t centos:1.0 . Sending build context to Docker daemon 2.048kB Step 1/4 : FROM centos ---> 0d120b6ccaa8 Step 2/4 : VOLUME ["volume01", "volume02"] ---> Running in 4e6de7bc2f15 Removing intermediate container 4e6de7bc2f15 ---> f9e48207902b Step 3/4 : CMD echo "-----end-----" ---> Running in b22adea363e5 Removing intermediate container b22adea363e5 ---> a7518e2e1c72 Step 4/4 : CMD /bin/bash ---> Running in ae1b746bef6b Removing intermediate container ae1b746bef6b ---> d840628c30a9 Successfully built d840628c30a9 Successfully tagged centos:1.0 # 查看鏡像 [root@localhost overlay2]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos 1.0 d840628c30a9 12 minutes ago 215MB # 我們自己生成的鏡像 centos latest 0d120b6ccaa8 2 days ago 215MB # 啟動我們生成的鏡像 [root@1af673cf9c88 /]# docker run -it d840628c30a9 /bin/bash [root@1af673cf9c88 /]# ls -l total 0 lrwxrwxrwx. 1 root root 7 May 11 2019 bin -> usr/bin drwxr-xr-x. 5 root root 360 Aug 13 02:18 dev drwxr-xr-x. 1 root root 66 Aug 13 02:18 etc drwxr-xr-x. 2 root root 6 May 11 2019 home lrwxrwxrwx. 1 root root 7 May 11 2019 lib -> usr/lib lrwxrwxrwx. 1 root root 9 May 11 2019 lib64 -> usr/lib64 drwx------. 2 root root 6 Aug 9 21:40 lost+found drwxr-xr-x. 2 root root 6 May 11 2019 media drwxr-xr-x. 2 root root 6 May 11 2019 mnt drwxr-xr-x. 2 root root 6 May 11 2019 opt dr-xr-xr-x. 117 root root 0 Aug 13 02:18 proc dr-xr-x---. 2 root root 162 Aug 9 21:40 root drwxr-xr-x. 11 root root 163 Aug 9 21:40 run lrwxrwxrwx. 1 root root 8 May 11 2019 sbin -> usr/sbin drwxr-xr-x. 2 root root 6 May 11 2019 srv dr-xr-xr-x. 13 root root 0 Aug 11 09:58 sys drwxrwxrwt. 7 root root 145 Aug 9 21:40 tmp drwxr-xr-x. 12 root root 144 Aug 9 21:40 usr drwxr-xr-x. 20 root root 262 Aug 9 21:40 var drwxr-xr-x. 2 root root 6 Aug 13 02:18 volume01 # 這是我們生成鏡像的時候自動掛載的數據卷目錄 drwxr-xr-x. 2 root root 6 Aug 13 02:18 volume02 # 這個卷和外部一定有一個同步的目錄!我們來找一下 # 1、 根據容器id查詢該容器的信息--》數據卷信息 # docker inspect 1af673cf9c88 # 2、 根據數據卷信息找到 volume01 對應的數據卷名稱 # docker volume inspect 8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3 # 3、 根據數據卷名稱 查詢數據卷的信息--》找到linux中對應的目錄 # docker volume inspect 8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3 # 在容器內部創建一個文件 在數據卷 volume01 中創建了test.java文件 [root@1af673cf9c88 volume01]# touch test.java [root@1af673cf9c88 volume01]# ls test.java # 退出容器 [root@1af673cf9c88 volume01]# exit exit # 查看該容器的信息 [root@localhost overlay2]# docker inspect 1af673cf9c88 # 找到掛載卷 volume01 對應的的名字, 即:8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3 "Mounts": [ { "Type": "volume", "Name": "8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3", "Source": "/var/lib/docker/volumes/8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3/_data", "Destination": "volume01", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }, { "Type": "volume", "Name": "046d0baa3cc0bc3540c5e7248808358371641bfba4e0bbd139c99fe851751da2", "Source": "/var/lib/docker/volumes/046d0baa3cc0bc3540c5e7248808358371641bfba4e0bbd139c99fe851751da2/_data", "Destination": "volume02", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ], # 根據數據卷名字 8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3 找到該卷在 linux 所在位置 [root@localhost overlay2]# docker volume inspect 8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3 [ { "CreatedAt": "2020-08-13T10:27:12+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3/_data", "Name": "8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3", "Options": null, "Scope": "local" } ] # 在/var/lib/docker/volumes/8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3/_data/目錄下找到我們的test.java文件 [root@localhost volumes]# cd /var/lib/docker/volumes/8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3/_data/ [root@localhost _data]# ls test.java
數據卷容器
多個mysql數據同步!
# 通過 --volumes-from 容器名 實現容器間的數據共享 # 啟動一個鏡像 名字是docker01 [root@localhost _data]# docker run -it --name docker01 centos:1.0 /bin/bash [root@a85fbed0ebc9 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02 # 啟動同一個鏡像 名字是docker02 關聯 docker01 此時,docker01被稱為數據卷容器 [root@localhost _data]# docker run -it --name docker02 --volumes-from docker01 centos:1.0 [root@a89fb82eeeb5 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02 # 在容器 docker02 的 volume01 目錄下創建 test.txt [root@a89fb82eeeb5 /]# cd volume01/ [root@a89fb82eeeb5 volume01]# ls [root@a89fb82eeeb5 volume01]# touch test.txt [root@a89fb82eeeb5 volume01]# ls test.txt # 查看容器信息 [root@a89fb82eeeb5 volume01]# [root@localhost _data]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a89fb82eeeb5 centos:1.0 "/bin/sh -c /bin/bash" About a minute ago Up About a minute docker02 a85fbed0ebc9 centos:1.0 "/bin/bash" 4 minutes ago Up 4 minutes docker01 # 進入容器名為 docker01 的容器 [root@localhost _data]# docker exec -it a85fbed0ebc9 /bin/bash [root@a85fbed0ebc9 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02 # 進入該容器的 volume01 目錄下 [root@a85fbed0ebc9 /]# cd volume01/ # 發現test.txt文件 [root@a85fbed0ebc9 volume01]# ls test.txt # 創建 test01.txt [root@a85fbed0ebc9 volume01]# touch test01.txt [root@a85fbed0ebc9 volume01]# ls test.txt test01.txt # 進入容器名為 docker02 的容器 [root@localhost _data]# docker exec -it a89fb82eeeb5 /bin/bash [root@a89fb82eeeb5 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02 [root@a89fb82eeeb5 /]# cd volume01/ # 發現test01.txt文件 [root@a89fb82eeeb5 volume01]# ls test.txt test01.txt # 啟動同一個鏡像 名字是docker03 關聯 docker01 [root@localhost _data]# docker run -it --name docker03 --volumes-from docker01 centos:1.0 # 進入volume01目錄下 發現 test.txt test01.txt 文件 [root@11d93f9bcd89 /]# cd volume01/ [root@11d93f9bcd89 volume01]# ls test.txt test01.txt #測試過程: 1、運行centos:1.0鏡像 容器名為docker01 # 2、運行centos:1.0鏡像 容器名為docker02 通過 --volumes-from docker01 與其進行數據共享 # 3、運行centos:1.0鏡像 容器名為docker03 通過 --volumes-from docker01 與其進行數據共享 # 4、運行centos:1.0鏡像 容器名為docker04 通過 --volumes-from docker03 與其進行數據共享 # 5、運行centos鏡像 容器名為docker05 通過 --volumes-from docker03 與其進行數據共享 # 經過測試 發現: # 1、在任何一個容器的volume01目錄中添加文件,其他四個容器中的該目錄都會出現添加的這個文件,進行數據共享 # 2、停止并刪除 容器名為docker01的容器,其他四個容器中volume01目錄下的文件還存在 # 3、停止并刪除 容器名為docker01的容器,向其他四個容器任意一個容器的volume01目錄下添加文件,其余三個容器也會做數據共享 # 4、各個容器中的數據卷名稱不同,但是對應同一個linux系統中數據目錄;即各個容器中的數據卷目錄都指向linux系統中同一個數據目錄 [root@localhost _data]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 78cd51a35c41 centos "/bin/bash" 17 minutes ago Up 17 minutes trusting_tharp e6e0988c50cd centos "/bin/bash" 17 minutes ago Up 17 minutes docker05 c5ebc03e6819 centos:1.0 "/bin/sh -c /bin/bash" 19 minutes ago Up 19 minutes docker04 11d93f9bcd89 centos:1.0 "/bin/sh -c /bin/bash" 22 minutes ago Up 22 minutes docker03 a89fb82eeeb5 centos:1.0 "/bin/sh -c /bin/bash" 31 minutes ago Up 31 minutes docker02 [root@localhost _data]# docker inspect e6e0988c50cd "Mounts": [ { "Type": "volume", "Name": "fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62", "Source": "/var/lib/docker/volumes/fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62/_data", "Destination": "volume01", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }, ] [root@localhost _data]# docker inspect c5ebc03e6819 "Mounts": [ { "Type": "volume", "Name": "fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62", "Source": "/var/lib/docker/volumes/fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62/_data", "Destination": "volume01", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }, ] [root@localhost _data]# docker inspect 11d93f9bcd89 "Mounts": [ { "Type": "volume", "Name": "fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62", "Source": "/var/lib/docker/volumes/fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62/_data", "Destination": "volume01", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }, ]
多個mysql實現數據共享
docker run -d -p 3306:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql
結論:
容器之間配置信息傳遞,數據卷容器的生命周期一直持續到沒有容器使用位置。
但是一旦持久化到本地,這個時候,本地的數據不會刪除。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。