濮阳杆衣贸易有限公司

主頁 > 知識(shí)庫 > Docker容器數(shù)據(jù)卷原理及使用方法解析

Docker容器數(shù)據(jù)卷原理及使用方法解析

熱門標(biāo)簽:智能外呼系統(tǒng)如何部署 高德地圖標(biāo)注在建線路 濟(jì)源電話外呼系統(tǒng)怎么樣 山東400電話如何辦理 ai電銷機(jī)器人 如何開發(fā) 電銷機(jī)器人對(duì)公司貢獻(xiàn) 電話機(jī)器人服務(wù)差 蘭州語音電銷機(jī)器人軟件 宿州防封外呼系統(tǒng)廠家

什么是容器數(shù)據(jù)卷

如果數(shù)據(jù)都在容器中,一旦容器刪除,數(shù)據(jù)就會(huì)丟失!

eg : mysql容器刪了,就是我們常說的刪庫跑路。 需求:數(shù)據(jù)可以持久化,即時(shí)刪掉容器,我們的數(shù)據(jù)還在
容器直接可以有一個(gè)數(shù)據(jù)共享的技術(shù)!Docker容器產(chǎn)生的數(shù)據(jù),同步到本地!

這就是卷技術(shù)!目錄的掛載,將我們?nèi)萜鞯哪夸洅燧d到linux上面!

總結(jié):卷技術(shù)就是為了實(shí)現(xiàn)數(shù)據(jù)的持久化和同步操作,容器間也是可以數(shù)據(jù)共享的

使用數(shù)據(jù)卷

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

# 命令
	docker run -it -v 主機(jī)的目錄:容器內(nèi)目錄 -p 主機(jī)端口:容器端口

# 測(cè)試
# 主機(jī)home目錄下為空
[root@bogon home]# ls
# 啟動(dòng)contes鏡像 將主機(jī)的home與容器的home進(jìn)行綁定
[root@bogon home]# docker run -v /home:/home/ -it centos 
[root@8dc073caf39c /]# cd home/
# 容器home目錄下為空
[root@8dc073caf39c home]# ls
# 在容器目錄下創(chuàng)建test.java文件
[root@8dc073caf39c home]# touch test.java
[root@8dc073caf39c home]# ls
test.java
# 切換到主機(jī)home目錄后發(fā)現(xiàn) 出現(xiàn)了test.java文件 
[root@8dc073caf39c home]# [root@bogon home]# ls
test.java
# 在主機(jī)home目錄下創(chuàng)建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
# 進(jìn)入正在運(yùn)行的容器 
[root@bogon home]# docker exec -it 8dc073caf39c /bin/bash
# 進(jìn)入容器home目錄
[root@8dc073caf39c /]# cd home/
# 發(fā)現(xiàn)存在test2.java文件
[root@8dc073caf39c home]# ls
test.java test2.java


# 通過 inspect 命令查看容器信息
[root@bogon home]# docker inspect 8dc073caf39c
    "Mounts": [
      {
        "Type": "bind",
        "Source": "/home",			# 主機(jī)目錄
        "Destination": "/home",		# 容器目錄
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
      }
    ],
## 結(jié)論:如果我們使用 -v 做了數(shù)據(jù)綁定
  # 1、容器停止,主機(jī)對(duì)數(shù)據(jù)做出修改 容器啟動(dòng)后 數(shù)據(jù)也會(huì)同步過來
  # 2、刪除容器,主機(jī)該目錄下數(shù)據(jù)還存在
  ## 好處:在使用了數(shù)據(jù)卷后,我們以后修改配置文件時(shí),只需要在本地修改,容器內(nèi)會(huì)自動(dòng)同步

安裝mysql

mysql的數(shù)據(jù)持久化問題

					  					 # -e MYSQL_ROOT_PASSWORD=my-secret-pw 設(shè)置初始密碼為my-secret-pw
# 官方命令:	docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

# 測(cè)試	
# 解讀
	# -d										后臺(tái)運(yùn)行
	# -p 3306:3306								綁定端口
  # -v /home/mysql/conf:/etc/mysql/conf.d 	數(shù)據(jù)卷掛載技術(shù)綁定mysql配置文件
  # -v /home/mysql/data:/var/lib/mysql		數(shù)據(jù)卷掛載技術(shù)綁定mysql數(shù)據(jù)
  # -e MYSQL_ROOT_PASSWORD=123456				環(huán)境配置---》設(shè)置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 容器內(nèi)路徑!
docker run -d -P --name nginx01 -v /etc/nginx nginx 
# 具名掛載
-v 卷名:容器內(nèi)路徑
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx


# 測(cè)試匿名掛載	
[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		# 匿名掛載


# 測(cè)試具名掛載
# 通過 -v 卷名:容器內(nèi)路徑
[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															# 具名掛載


# 查看某個(gè)數(shù)據(jù)卷的信息	
# 命令
	docker volume inspect 卷名
# 所有docker容器內(nèi)的卷 在沒有指定目錄的情況下都在 /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"
  }
]
# 我們通過具名掛載可以方便的找到我們的一個(gè)卷,大多數(shù)情況在使用的----具名掛載

# 如何確定是具名掛載還是匿名掛載 還是指定路徑掛載!
# -v 容器內(nèi)路徑			 # 匿名掛載
# -v 卷名:容器內(nèi)路徑		# 具名掛載
# -v 主機(jī)路徑:容器內(nèi)路徑	  # 指定路徑掛載

拓展

# 通過 -v 卷名:容器內(nèi)路徑:ro rw 改變讀寫權(quán)限
# 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

初識(shí)DockerFile

DockerFile就是用來構(gòu)建 docker 鏡像的構(gòu)建文件!命令腳本! 先體驗(yàn)一下!

[root@localhost docker-test-volume]# cat dockerfile 
FORM centos

VOLUME ["volume01", "volume02"]
CMD echo "-----end-----"
CMD /bin/bash

# 構(gòu)建
# 命令	docker build -f shell腳本文件 -t 鏡像名:版本號(hào)
[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
# 啟動(dòng)我們生成的鏡像
[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			# 這是我們生成鏡像的時(shí)候自動(dòng)掛載的數(shù)據(jù)卷目錄
drwxr-xr-x.  2 root root  6 Aug 13 02:18 volume02

# 這個(gè)卷和外部一定有一個(gè)同步的目錄!我們來找一下
# 1、 根據(jù)容器id查詢?cè)撊萜鞯男畔?-》數(shù)據(jù)卷信息		
	# docker inspect 1af673cf9c88
# 2、 根據(jù)數(shù)據(jù)卷信息找到 volume01 對(duì)應(yīng)的數(shù)據(jù)卷名稱
	# docker volume inspect 8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3
# 3、 根據(jù)數(shù)據(jù)卷名稱 查詢數(shù)據(jù)卷的信息--》找到linux中對(duì)應(yīng)的目錄
	# docker volume inspect 8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3

# 在容器內(nèi)部創(chuàng)建一個(gè)文件	在數(shù)據(jù)卷 volume01 中創(chuàng)建了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 對(duì)應(yīng)的的名字, 即: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": ""
      }
    ],
# 根據(jù)數(shù)據(jù)卷名字 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

數(shù)據(jù)卷容器

多個(gè)mysql數(shù)據(jù)同步!

# 通過 --volumes-from 容器名 	實(shí)現(xiàn)容器間的數(shù)據(jù)共享

# 啟動(dòng)一個(gè)鏡像 名字是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
# 啟動(dòng)同一個(gè)鏡像 名字是docker02	關(guān)聯(lián)	docker01 此時(shí),docker01被稱為數(shù)據(jù)卷容器
[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 目錄下創(chuàng)建 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
# 進(jìn)入容器名為 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
# 進(jìn)入該容器的 volume01 目錄下
[root@a85fbed0ebc9 /]# cd volume01/
# 發(fā)現(xiàn)test.txt文件
[root@a85fbed0ebc9 volume01]# ls
test.txt
# 創(chuàng)建 test01.txt
[root@a85fbed0ebc9 volume01]# touch test01.txt
[root@a85fbed0ebc9 volume01]# ls
test.txt test01.txt
# 進(jìn)入容器名為 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/
# 發(fā)現(xiàn)test01.txt文件
[root@a89fb82eeeb5 volume01]# ls
test.txt test01.txt

# 啟動(dòng)同一個(gè)鏡像 名字是docker03	關(guān)聯(lián)	docker01
[root@localhost _data]# docker run -it --name docker03 --volumes-from docker01 centos:1.0
# 進(jìn)入volume01目錄下 發(fā)現(xiàn) test.txt test01.txt 文件
[root@11d93f9bcd89 /]# cd volume01/
[root@11d93f9bcd89 volume01]# ls
test.txt test01.txt

#測(cè)試過程:	 1、運(yùn)行centos:1.0鏡像 容器名為docker01
#			2、運(yùn)行centos:1.0鏡像 容器名為docker02 通過 --volumes-from docker01 與其進(jìn)行數(shù)據(jù)共享
#			3、運(yùn)行centos:1.0鏡像 容器名為docker03 通過 --volumes-from docker01 與其進(jìn)行數(shù)據(jù)共享
#			4、運(yùn)行centos:1.0鏡像 容器名為docker04 通過 --volumes-from docker03 與其進(jìn)行數(shù)據(jù)共享
#			5、運(yùn)行centos鏡像 容器名為docker05 通過 --volumes-from docker03 與其進(jìn)行數(shù)據(jù)共享

# 經(jīng)過測(cè)試 發(fā)現(xiàn):
#		1、在任何一個(gè)容器的volume01目錄中添加文件,其他四個(gè)容器中的該目錄都會(huì)出現(xiàn)添加的這個(gè)文件,進(jìn)行數(shù)據(jù)共享
#		2、停止并刪除 容器名為docker01的容器,其他四個(gè)容器中volume01目錄下的文件還存在
#		3、停止并刪除 容器名為docker01的容器,向其他四個(gè)容器任意一個(gè)容器的volume01目錄下添加文件,其余三個(gè)容器也會(huì)做數(shù)據(jù)共享
#		4、各個(gè)容器中的數(shù)據(jù)卷名稱不同,但是對(duì)應(yīng)同一個(gè)linux系統(tǒng)中數(shù)據(jù)目錄;即各個(gè)容器中的數(shù)據(jù)卷目錄都指向linux系統(tǒng)中同一個(gè)數(shù)據(jù)目錄

[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": ""
      },
		]	

多個(gè)mysql實(shí)現(xiàn)數(shù)據(jù)共享

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

結(jié)論:

容器之間配置信息傳遞,數(shù)據(jù)卷容器的生命周期一直持續(xù)到?jīng)]有容器使用位置。

但是一旦持久化到本地,這個(gè)時(shí)候,本地的數(shù)據(jù)不會(huì)刪除。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

標(biāo)簽:巴中 云南 衡水 南寧 畢節(jié) 安陽 晉中 佛山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Docker容器數(shù)據(jù)卷原理及使用方法解析》,本文關(guān)鍵詞  Docker,容器,數(shù)據(jù),卷,原理,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Docker容器數(shù)據(jù)卷原理及使用方法解析》相關(guān)的同類信息!
  • 本頁收集關(guān)于Docker容器數(shù)據(jù)卷原理及使用方法解析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    卫辉市| 利川市| 奉化市| 大田县| 临朐县| 健康| 东乌| 玉溪市| 延长县| 周宁县| 环江| 满城县| 西乌珠穆沁旗| 蒙自县| 新乐市| 汤原县| 上思县| 张掖市| 黄骅市| 呼和浩特市| 苏尼特右旗| 班戈县| 镇原县| 临洮县| 泗阳县| 固阳县| 湟中县| 和静县| 承德市| 甘洛县| 海伦市| 泸定县| 浏阳市| 咸宁市| 花垣县| 突泉县| 永安市| 分宜县| 盘山县| 宁国市| 仲巴县|