Docker的Image是只能读的,Container是可以写数据的,但是呢,一旦容器不小心被删除了,我们在容器中写的数据就没了。
1.Docker持久化数据方案
1.1基于本地文件系统的Volume
执行Docker create或Docker run时,通过-v参数将主机的目录作为容器的数据卷。这部分功能便是基于本地文件系统的Volume管理
1.2基于plugin的Volume
支持第三方的存储方案,比如NAS,aws
2.Volume的类型
- 受管理的data Volume,由docker后台自动创建
- 绑定挂载的Volume,具体挂载位置可以由用户指定。
3.用Mysql实战
docker run -d -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
-v mysql:/var/lib/mysql表示用mysql来命名这个volume,且volume的位置在/var/lib/mysql
docker volume ls
我们验证一下这个mysql的数据会存储在我们的磁盘中,而不是容器中,进入这个容器创建一个数据库
[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)
退出这个容器,然后删除掉这个容器
[root@master docker]# docker rm -f mysql1
mysql1
创建一个新容器mysql2,使用刚才的volume,然后看看数据库是否存在
[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.数据持久化之bind Mouting
相比上一个例子,这里就是说我们要自己指定目录来运行容器
4.1创建一个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创建一个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构建一个镜像
[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映射当前目录到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进入到容器中然后创建一个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]#
网友评论