Docker數(shù)據(jù)卷(Volume)
一、數(shù)據(jù)卷概念
數(shù)據(jù)卷是宿主機中的一個目錄或者文件,當容器目錄和數(shù)據(jù)卷目錄綁定后,對方的修改會立即同步。
一個數(shù)據(jù)卷可以被多個容器同時掛載,一個容器也可以被掛載多個數(shù)據(jù)卷。
簡單來說,數(shù)據(jù)卷本質其實是共享文件夾,是宿主機與容器之間數(shù)據(jù)共享的橋梁。
數(shù)據(jù)卷的作用:
- 容器數(shù)據(jù)持久化
- 外部機器和容器間接通信
- 容器之間數(shù)據(jù)交換
卷技術就是為了實現(xiàn)數(shù)據(jù)的持久化和同步操作,容器間也是數(shù)據(jù)共享。
二、數(shù)據(jù)卷的配置方式
1、語法格式
docker run ... –v 宿主機目錄(文件):容器內(nèi)目錄(文件) ...
- 目錄必須是絕對路徑
- 如果宿主機目錄不存在,會自動創(chuàng)建
- 可以掛載多個數(shù)據(jù)卷(直接繼續(xù)跟 -v 參數(shù))
#在創(chuàng)建啟動容器時掛載數(shù)據(jù)卷
[root@localhost opt]# docker run -id --name test -v /opt/test_data:/root/test_data centos:7 /bin/bash
aba73cea46edcd2a30c7a5ba7d782b3c263270f9281684084fff878b00d9b42d
可以在宿主機掛載的目錄中創(chuàng)建一個文件或者目錄,然后進入容器內(nèi)查看是否同步數(shù)據(jù)。
2、掛載方式
- 匿名掛載:-v 容器內(nèi)路徑
- 具名掛載:-v 數(shù)據(jù)卷名:容器內(nèi)路徑
- 指定路徑掛載:-v /宿主內(nèi)路徑:容器內(nèi)路徑
說明:匿名掛載只需要填寫容器內(nèi)路徑,Docker 會默認幫我們創(chuàng)建匿名數(shù)據(jù)卷進行映射和掛載。一般使用具名掛載和指定路徑掛載。具名掛載會在 /var/lib/docker/volumes/ 目錄下創(chuàng)建對應的數(shù)據(jù)卷目錄;而匿名掛載生成的目錄名則是隨機的。
#指定路徑掛載
[root@localhost opt]# docker run -id --name test -v /opt/test_data:/root/test_data centos:7 /bin/bash
#具名掛載
[root@localhost opt]# docker run -id --name test1 -v my_data:/root/test_data centos:7 /bin/bash
[root@localhost opt]# docker volume inspect my_data
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my_data/_data",
"Name": "my_data",
"Options": {},
"Scope": "local"
}
]
#查看已有的容器數(shù)據(jù)卷
[root@localhost opt]# docker volume ls
DRIVER VOLUME NAME
local 6c415d518ce61e5e047bcf8fc33ae43f7882ea6ec38c07675bdb1568eb0d1b7f
local a2575ccb30033360d5c784a686628771e80d12903f83e8773146aa9dad7a765f
local e4f571f1544d753bb2505e391ad88c4d02100ca2ef3caf0ae8dc9bcd42c7160d
local my_data
local test
#匿名掛載
[root@localhost opt]# docker run -id --name test3 -v /root/test_data centos:7 /bin/bash
c7bd0c7aa231847042cac9c4ef827b3bbd281144e79f230f9c30b1d8d52a3e5f
[root@localhost opt]# docker volume ls
DRIVER VOLUME NAME
local 4ee1d7e862c36848a7ab57af9dd79c0577e46c4545a05b70dd96203466d27303
local 6c415d518ce61e5e047bcf8fc33ae43f7882ea6ec38c07675bdb1568eb0d1b7f
local a2575ccb30033360d5c784a686628771e80d12903f83e8773146aa9dad7a765f
local e4f571f1544d753bb2505e391ad88c4d02100ca2ef3caf0ae8dc9bcd42c7160d
local my_data
local test
[root@localhost opt]# docker volume inspect 6c415d518ce61e5e047bcf8fc33ae43f7882ea6ec38c07675bdb1568eb0d1b7f
[
{
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/6c415d518ce61e5e047bcf8fc33ae43f7882ea6ec38c07675bdb1568eb0d1b7f/_data",
"Name": "6c415d518ce61e5e047bcf8fc33ae43f7882ea6ec38c07675bdb1568eb0d1b7f",
"Options": {},
"Scope": "local"
}
]
3、volume 的基本使用
docker volume 命令:
- create:創(chuàng)建數(shù)據(jù)卷
- inspect:查看數(shù)據(jù)卷元數(shù)據(jù)
- ls:查看數(shù)據(jù)卷列表
- prune:刪除所有未使用的卷
- rm:刪除數(shù)據(jù)卷
#創(chuàng)建一個自定義容器
[root@localhost opt]# docker volume create my_data
#查看所用容器卷
[root@localhost opt]# docker volume ls
#查看指定容器卷信息
[root@localhost opt]# docker volume inspect
#刪除容器卷
[root@localhost opt]# docker volume rm
4、MySQL數(shù)據(jù)卷掛載實戰(zhàn)
1)搜索和下載鏡像的步驟就省去了
2)創(chuàng)建啟動鏡像
[root@localhost opt]# docker run -id --name my_mysql -p 3600:3306 -v /opt/mysql/conf:/ect/mysql/conf.d -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
8bace46562e55239fe7689b638be1eabaf416cc0c3093e009feac292af0779ca
3)進行驗證,我們先進入容器創(chuàng)建一個新的數(shù)據(jù)庫以及表,再插入一條數(shù)據(jù),然后退出容器
[root@localhost opt]# docker exec -it my_mysql /bin/bash
bash-4.2# mysql -uroot -p123456
......
mysql> use test;
Database changed
mysql> create table t_test(id int,name varchar(255));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t_test values(1,"huhai");
Query OK, 1 row affected (0.06 sec)
mysql> select * from t_test;
+------+-------+
| id | name |
+------+-------+
| 1 | huhai |
+------+-------+
1 row in set (0.00 sec)
mysql> exit
Bye
bash-4.2# exit
exit
4)然后我們將這個容器給停止之后刪除,再創(chuàng)建一個相同路徑的數(shù)據(jù)卷進行掛載,查看是否有我們已經(jīng)有的數(shù)據(jù)
[root@localhost opt]# docker stop my_mysql
my_mysql
[root@localhost opt]# docker rm my_mysql
my_mysql
[root@localhost opt]# docker run -id --name my_mysql -p 3600:3306 -v /opt/mysql/conf:/ect/mysql/conf.d -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
e208b09a924d9849b2f4cca225e3d51ac59f00f1ee64f11b2ba134183f170c76
[root@localhost opt]# docker exec -it my_mysql /bin/bash
bash-4.2# mysql -uroot -p123456
......
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql> use test;
Database changed
mysql> select * from t_test;
+------+-------+
| id | name |
+------+-------+
| 1 | huhai |
+------+-------+
1 row in set (0.00 sec)
mysql> exit
Bye
bash-4.2# exit
exit
三、遷移與備份
? Docker 實際應用中,我們會安裝很多容器,然后進行配置。試想一下,一臺 Linux 服務器的容器怎么轉移到另一臺 Linux 服務器?這就涉及到了遷移與備份,我們可以將容器先保存為鏡像,然后將鏡像保存為壓縮包,其他地方需要時可以將這個壓縮包轉回鏡像。大概分為以下三種情況:
- 將開發(fā)環(huán)境下的 Docker 中對應的容器持久化為鏡像
- 將鏡像保存為一個壓縮包,發(fā)送到生產(chǎn)環(huán)境服務器中
- 生產(chǎn)環(huán)境中需要將壓縮包–>鏡像–>容器
1、容器保存為鏡像
1)命令:docker commit
2)作用:將容器保存為鏡像
3)語法格式:docker commit 容器名稱(或容器ID) 鏡像名稱:鏡像標簽
如果不寫鏡像標簽則默認為 latest
[root@localhost opt]# docker commit my_mysql my_mysql:1.0
sha256:1f381fd1b9c929034e5f454e005b0a74535cbcce5406b7b8ea6c8e218ae11886
[root@localhost opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my_mysql 1.0 1f381fd1b9c9 6 seconds ago 495 MB
docker.io/tomcat latest 1dad8c5497f9 4 weeks ago 474 MB
docker.io/mysql 5.7 d410f4167eea 5 weeks ago 495 MB
docker.io/openjdk 8 b273004037cc 5 months ago 526 MB
docker.io/hello-world latest feb5d9fea6a5 15 months ago 13.3 kB
docker.io/centos 7 eeb6ee3f44bd 16 months ago 204 MB
2、鏡像保存為tar包
1)命令:docker save
2)作用:將鏡像保存為 tar 包
3)語法:docker save -o tar包名 鏡像名稱(或鏡像ID)
-o 代表輸出到的文件
可以指定tar包的路徑,即在tar包前面加路徑
鏡像后面可以跟鏡像標簽
#不加路徑則默認在當前路徑下創(chuàng)建tar包
[root@localhost opt]# docker save -o my_mysql.tar my_mysql
[root@localhost opt]# ll
總用量 900220
......
-rw------- 1 root root 510828544 1月 12 10:45 my_mysql.tar
drwxr-xr-x 4 root root 4096 1月 11 17:44 mysql
......
#加對應路徑
[root@localhost opt]# docker save -o ~/my_mysql2.tar my_mysql
[root@localhost opt]# ll ~
總用量 498904
......
-rw------- 1 root root 510828544 1月 12 10:48 my_mysql2.tar
drwxr-xr-x. 2 root root 4096 12月 16 16:28 公共
......
3、tar包恢復為鏡像
1)命令:docker load
2)作用:恢復鏡像
3)語法:docker load -i tar包文章來源:http://www.zghlxwxcb.cn/news/detail-713331.html
-i 代表指定導入的文件文章來源地址http://www.zghlxwxcb.cn/news/detail-713331.html
#首先刪除創(chuàng)建的容器
[root@localhost opt]# docker rm my_mysql
my_mysql
#然后刪除剛才備份的鏡像
[root@localhost opt]# docker rmi my_mysql:1.0
#通過tar包恢復鏡像
[root@localhost opt]# docker load -i my_mysql.tar
bd3382c8b69e: Loading layer [==================================================>] 10.75 kB/10.75 kB
Loaded image: my_mysql:1.0
#創(chuàng)建啟動容器
[root@localhost opt]# docker run -id --name my_mysql -p 3600:3306 -v /opt/mysql/conf:/ect/mysql/conf.d -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 my_mysql:1.0
1fb2a85039f89050d8c85c2edb34032a0633e927a38b3a6bcaef7c3949ee0f68
到了這里,關于Docker數(shù)據(jù)卷(Volume)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!