Docker存储之数据持久化
一、数据持久化1.1、image layer 和 container layer 的关系image layer 是只读的container layer 是在image layer 之上创建的 一个可读可写层contaner 数据仅限于该 container 临时存储,通过container 无法保存数据1.2、引入了 持久化数据的机制 Data Volume ...
一、数据持久化
1.1、image layer 和 container layer 的关系
- image layer 是只读的
- container layer 是在image layer 之上创建的 一个可读可写层
- contaner 数据 仅限于该 container 临时存储, 通过container 无法保存数据
1.2、引入了 持久化数据的机制 Data Volume
1.3、docker 持久化数据数据的方案
- 基于本地文件系统的Volume :可以在执行 docker create 或者 docker run 时, 通过 -v 参数将主机的目录作为容器的数据卷。这部分功能便于基于本地文件系统的volume管理
- 基于plugin的Volume:支持第三方的存储方案, 比如 NAS, AWS
1.4、Volume 的类型
1. 受管理的data Volume , 由 docker 后台自动创建,位置是固定的,名字是随机的
2. 绑定挂载的Volume ,具体挂载位置可以由用户指定
二、Docker数据持久化之Data Volume
使用场景: 在docker容器被删除的时候,数据不丢失
2.1、创建第一个 mysql container
注意:在 mysql 的 Dockerfile 内定义了VOLUME ["var/lib/mysql"]
- 创建一个 mysql 的container
docker run -p 3306:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=123 -e MYSQL_DATABASE=jeesite -d hub.c.163.com/library/mysql:latest --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
- 查看 mysql1 的日志: docker logs mysql1
- 查看 使用情况: docker volume ls
- 删除:docker volume rm [VOLUME NAME 上面 VOLUME 的全名]
之前:
之后:
新增:local b3d0f2d56c4b027b532e850db145b239d80f7ad770fb79bf0a7900f4b46114ee
- 查看 volume 详情 : docker volume inspect [VOLUME NAME 上面 VOLUME 的全名]
其中 红线部分为 数据挂载的地方
2.2、创建第二个 mysql container
docker run -p 3307:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=123 -e MYSQL_DATABASE=jeesite -d hub.c.163.com/library/mysql:latest --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
- 查看 volume 列表: docker volume ls
- 查看第二个volume 详情: docker volume inspect [VOLUME NAME 上面 VOLUME 的全名]
- 验证 volume 不会随 container 的删除而删除
停止并删除 mysql1 mysql2: docker stop mysql1 mysql2 &&docker rm mysql1 mysql2
查看volume: docker volume ls (发现docker volume 还在)
- 本地目录的数据文件也存在
2.3、volume 起别名: -v 参数
- 重新创建 mysql1 container 并将mysql的数据存储位置命名为mysql
docker run -p 3306:3306 -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ROOT_PASSWORD=123 -e MYSQL_DATABASE=jeesite -d hub.c.163.com/library/mysql
- 再次查看生成 volume,发现生成的 volume 为 mysql 了:docker volume ls
2.4、判断 volume 持久性
- 进入 mysql1 容器内: docker exec -it mysql1 /bin/bash
- 进入mysql: mysql -u root -萍123 即可
- 创建docker 数据库: create database docker;
- 查看数据库是否创建成功 : show databases;
- 退出mysql: exit
- 退出 mysql1 容器: exit
- 关闭并删除 mysql1 容器: docker rm -f mysql1
- 查看mysql1 的 volume: docker volume ls (发现mysql 的 volume 还在)
- 重新创建 mysql1 并指定volume 还是 mysql
docker run -p 3307:3306 -v mysql:/var/lib/mysql --name mysql2 -e MYSQL_ROOT_PASSWORD=123 -e MYSQL_DATABASE=jeesite -d hub.c.163.com/library/mysql
查看 volume: docker volume ls
到 mysql1 容器内查看 docker:
- docker exec -it mysql2 /bin/bash
- mysql -u root -p123
- show databases; 发现 docker 数据库还在
三、Docker数据持久化之Bind Mounting
3.1、bind mounting 和 data volume 的区别
- data volume: 需要在Dockerfile定义 Volume
- bind mounting: 将本地的文件映射到容器内,只需要 -v 指明容器外部文件夹和容器映射文件夹的对应关系即可
3.2、bind mouting的使用
- 编写 Dockerfile
FROM nginx:latest base image 为 nginx
WORKDIR /usr/share/nginx/html 工作目录为 /usr/share/nginx/html
COPY index.html index.html 复制当前文件夹的index.html 到工作目录
- 创建自定义镜像:docker build -t docker-nginx .
- 创建 nginx 容器: docker run -d -p 80:80 --name web docker-nginx
- 查看容器情况: docker ps
- 访问容器: curl 127.0.0.1
- 停止并删除 web 容器:docker rm -f web
- 创建一个 含 bind mounting 的容器将本地的文件映射到容器内
docker run -d -p 80:80 -v $(pwd):/usr/share/nginx/html --name web docker-nginx
注:
- -v $(pwd):/usr/share/nginx/html 将本地的当前目录映射到容器的/usr/share/nginx/html 下
- 当在容器内或者容器外更改 映射文件夹内的内容时两端都会改变
更多推荐
所有评论(0)