Docker 的持久化存储和数据共享
一、Docker持久化数据的方案:
基于本地文件系统的Volume。
可以再执行Docker create 或 Docker run 时,通过-v 参数将主机的目录作为容器的数据卷。这部分功能便是基于本地文件系统的volume管理。基于plugin的volume。
支持第三方的存储方案,比如NAS,aws。- Volume的类型:
- 受管理的data Volume,由docker后台自动创建。
- 绑定挂载的Volume,具体挂载位置可以由用户指定。
二、数据持久化(Data Volume):
-
基本使用语法:
- Dockerfile 文件:
VOLUME ["/var/lib/mysql"]
docker run -v mysql:/var/lib/mysql
- Dockerfile 文件:
-
查看容器日志:
docker logs Containers[name]
-
创建一个Mysql容器并指定环境变量
-e
docker run -d --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
-
查看volume:
-
docker volume ls
[root@localhost ~]# docker volume ls DRIVER VOLUME NAME local c35e826ea5fdb38953f9b3b591feb967617a6d43bf762934faf7176476fb546a
-
-
删除volume:
-
docker volume rm VOLUME NAME
[root@localhost ~]# docker volume rm c35e826ea5fdb38953f9b3b591feb967617a6d c35e826ea5fdb38953f9b3b591feb967617a6d
-
-
查看volume详细信息:
-
docker volume inspect VOLUME NAME
[root@localhost ~]# docker volume inspect 93de872031ef88cddeb7a2324e134fe9376 [ { "CreatedAt": "2019-01-12T17:28:11+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/93de872031ef88cddeb7a2324e134fe9376f02ef52884a59781ade39bb30227a/_data", # 可以看到它的挂载点再哪个目录 "Name": "93de872031ef88cddeb7a2324e134fe9376f02ef52884a59781ade39bb30227a", "Options": null, "Scope": "local" } ]
-
-
当你删除mysql容器的时候,volume也是存在的。
-
给volume自定义命名:
docker run -d -v mysql:/var/lib/mysql --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
-v 前者的mysql 指的是 docker volume ls 指定的名字: 后面的指的是docker volume inspect mysql时 挂载点存放的名字
示例实现volume的数据存储:
-
1:创建mysql容器并自定义命名:
docker run -d -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysq
-
2:进入容器:
docker exec -it mysql1
-
3:进入容器中mysql 数据库的shell模式:
-
mysql -u root
root@54027808eb47:/# mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.13 MySQL Community Server - GPL Copyright (c) 2000, 2018, 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.
-
-
4:再mysql容器shell终端中创建一个数据库:
create database docker
-
5:查看创建的数据库:
-
show databases;
mysql> show databases; +--------------------+ | Database | +--------------------+ | docker | # 这个就是新创建的数据库 | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)
-
完成以上操作,
exit
退出到本机上。
-
-
6:删除上面创建的mysql1容器:
- 1:首先停止mysql1容器:
docker stop mysql1
- 2:删除mysql1容器:
docker rm mysql1
- 1:首先停止mysql1容器:
-
7:可以查看一下当前指定的volume
-
docker volume ls
[root@localhost ~]# docker volume ls DRIVER VOLUME NAME local mysql # 可以看到volume 还存在
-
-
8.再创建一个mysql2容器并且指定 使用哪个volume:
docker run -d -v mysql:/var/lib/mysql --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
- 注意:再-v 后面 前者的mysql名字一定要跟docker volums 中的mysql名字对应上
-
9.进入mysql2容器中:
docker exec -it mysql2 /bin/bash
-
10.查看mysql2容器中数据库是否有mysql1那时候创建的docker数据库:
-
mysql -u root
-
show databases;
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | docker | # 有当时mysql1容器创建docker数据库 | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)
-
-
创建mysql2容器的时候,-v 后面一定要指明用哪个volume
三、数据持久化(Bind Mounting):
- 基本语法:
docker -run -v /home/aaa:/root/aaa
示例实现Mounting的数据存储:
-
1:首先再文件夹中创建一个Dockerfile 文件:
[root@localhost docker-nginx]# more Dockerfile FROM nginx:latest WORKDIR /usr/share/nginx/html COPY index.html index.html
-
2:创建一个镜像:
docker run -d -v $(pwd):/usr/share/nginx/html -p 80:80 --name web docker-nginx
-v后面就是Bind Mounting 的语法
-
3:进入刚创建好的web容器:
docker exec -it web
-
4:cd到/usr/share/nginx/html 文件中,可以看到创建的Dockerfile 跟 index.html
-
5:再该目录中创建一个touch test.txt文件 写入abc:
-
6:退出该容器,会看到本地也会新创建一个test.txt文件。