一、数据持久化

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 下
  • 当在容器内或者容器外更改 映射文件夹内的内容时两端都会改变
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐