Docker的Image是只能讀的佑吝,Container是可以寫(xiě)數(shù)據(jù)的损谦,但是呢宪摧,一旦容器不小心被刪除了,我們?cè)谌萜髦袑?xiě)的數(shù)據(jù)就沒(méi)了氧骤。
1.Docker持久化數(shù)據(jù)方案
1.1基于本地文件系統(tǒng)的Volume
??執(zhí)行Docker create或Docker run時(shí)呻疹,通過(guò)-v參數(shù)將主機(jī)的目錄作為容器的數(shù)據(jù)卷。這部分功能便是基于本地文件系統(tǒng)的Volume管理
1.2基于plugin的Volume
??支持第三方的存儲(chǔ)方案筹陵,比如NAS刽锤,aws
2.Volume的類型
- 受管理的data Volume,由docker后臺(tái)自動(dòng)創(chuàng)建
- 綁定掛載的Volume朦佩,具體掛載位置可以由用戶指定并思。
3.用Mysql實(shí)戰(zhàn)
docker run -d -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
-v mysql:/var/lib/mysql表示用mysql來(lái)命名這個(gè)volume,且volume的位置在/var/lib/mysql
docker volume ls
我們驗(yàn)證一下這個(gè)mysql的數(shù)據(jù)會(huì)存儲(chǔ)在我們的磁盤中语稠,而不是容器中宋彼,進(jìn)入這個(gè)容器創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)
[root@master docker]# docker exec -it mysql1 /bin/bash
root@cf35a60f6911:/# mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.18 MySQL Community Server - GPL
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
mysql> create database docker;
Query OK, 1 row affected (0.01 sec)
退出這個(gè)容器,然后刪除掉這個(gè)容器
[root@master docker]# docker rm -f mysql1
mysql1
創(chuàng)建一個(gè)新容器mysql2,使用剛才的volume输涕,然后看看數(shù)據(jù)庫(kù)是否存在
[root@master docker]# docker run -d -v mysql:/var/lib/mysql --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
39396d68893a651ed22abec7b57ff987b89e56f2227aceb519e3387bbb89a95c
[root@master docker]# docker exec -it mysql2 /bin/bash
root@39396d68893a:/# mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.18 MySQL Community Server - GPL
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| docker |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
4.數(shù)據(jù)持久化之bind Mouting
相比上一個(gè)例子音婶,這里就是說(shuō)我們要自己指定目錄來(lái)運(yùn)行容器
4.1創(chuàng)建一個(gè)Dockerfile
# this same shows how we can extend/change an existing official image from Docker Hub
FROM nginx:latest
# highly recommend you always pin versions for anything beyond dev/learn
WORKDIR /usr/share/nginx/html
# change working directory to root of nginx webhost
# using WORKDIR is prefered to using 'RUN cd /some/path'
COPY index.html index.html
# I don't have to specify EXPOSE or CMD because they're in my FROM
4.2創(chuàng)建一個(gè)index.html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>hello</title>
</head>
<body>
<h1>Hello Docker! </h1>
</body>
</html>
4.3構(gòu)建一個(gè)鏡像
[root@master docker-nginx]# docker build -t mikezzmeric/mynginx .
Sending build context to Docker daemon 3.072kB
Step 1/3 : FROM nginx:latest
---> 540a289bab6c
Step 2/3 : WORKDIR /usr/share/nginx/html
---> Running in fd9d8524f1a6
Removing intermediate container fd9d8524f1a6
---> 923275a5e9f4
Step 3/3 : COPY index.html index.html
---> deb67ab6fc35
Successfully built deb67ab6fc35
Successfully tagged mikezzmeric/mynginx:latest
4.4映射當(dāng)前目錄到docker中的/usr/share/nginx/html
[root@master docker-nginx]# docker run -d -v $(pwd):/usr/share/nginx/html -p 7070:80 --name web mikezzmeric/mynginx
903abb342088fb61158c4312caa9bfd05f1ae3c4dc633d80259ee6e5f2c43c11
4.5進(jìn)入到容器中然后創(chuàng)建一個(gè)test.txt文件,退出容器占贫,能在本地看到該文件
[root@master docker-nginx]# docker exec -it web /bin/bash
root@903abb342088:/usr/share/nginx/html# ls
Dockerfile index.html
root@903abb342088:/usr/share/nginx/html# touch test.txt
root@903abb342088:/usr/share/nginx/html# exit
exit
[root@master docker-nginx]# ls
Dockerfile index.html test.txt
[root@master docker-nginx]#