Docker 系统性入门+进阶实践-05Docker的存储

Docker的存储

数据的持久化如何实现,Volume有哪些类型和使用场景

本章介绍

默认情况下,在运行中的容器里创建的文件,被保存在一个可写的容器层

  • 如果容器被删除了,数据也就没有了
  • 这个可写的容器层和特定的容器绑定的,也就是说这些数据无法方便的和其它容器共享
    docker主要提供了两种方式做数据的持久话
  • Data Volume由docker管理(/var/lib/docker/volumes),持久化数据的最好方式
  • Bind Mount, 由用户指定存储的数据具体mount在系统什么位置

数据持久化之Data Volume

  1. Dockerfile文件
FROM ubuntu:21.04

COPY test.txt /app/

WORKDIR /app

VOLUME ["/app"]
  • 注意:只有当创建容器的时候不指定-v参数,Dockerfile中的VOLUME才会起作用(帮助我们创建一个随机的volume进行数据的挂载)
  • Dockerfile中VOLUME的作用是当我们创建容器时不指定-v参数的话,docker会自动帮助我们创建volume
  1. test.txt文件
    hello world
  2. 创建镜像
    sudo docker image build -t volume-test .
  3. 创建启动容器方式1
    sudo docker container run --rm -it volume-test sh
    因为加了--rm参数,所以当容器退出的时候会自动删除容器,注意:同时会把VOLUME挂载出来的数据也一并删除掉
  4. 创建启动容器方式2
    sudo docker container run -it volume-test sh
    去掉了--rm参数,当我们退出容器后,不会自动删除容器
    当我们通过命令删除容器后 sudo docker container rm container_id
    通过VOLUME挂载出来的数据不会被删除。
  5. 如果我们像删除该容器挂载出来的数据
    sudo docker volume prune
    该命令将会删除没有被任何容器使用的卷,慎重使用。
  6. 查看所有卷
    sudo docker volume ls
  7. 查看某一个卷的详细信息
    sudo docker volume inspect f8fc7bbb231086997b4576f1e2d0c83a4077196a3761c8976c44eeaabf3c3cac
  8. 当我们删除了原有的容器,再次创建容器的时候,虽然原来的数据保存下来了,
    但是我们新创建的容器又会重新创建一个卷放到/var/lib/docker/volumes目录下面,
    如果我们想使新创建的容器使用之前的卷数据怎么办呢?
    创建容器:
    sudo docker container run -it -v app-data:/app volume-test sh
    该命令的意思是将容器内app目录下的内容挂载到主机:/var/lib/docker/volumes/app-data/_data/目录下面
    因为我们为目录起了名字,所以这次我们在把容器删除掉,通过镜像重新创建容器,
    创建容器时还指定原来的数据卷,这样新的容器就使用原来的数据了。perfect

Data Volume练习之mysql

  1. 拉取mysql5.7镜像
    sudo docker pull mysql:5.7
  2. 通过镜像构建我们的容器
    sudo docker container run --name mysql-5.7 -d -e MYSQL_ROOT_PASSWORD=123456 -v mysql-data:/var/lib/mysql mysql:5.7
  3. 进入容器
    sudo docker container exec -it mysql-5.7 sh
  4. 登录mysql服务
    mysql -uroot -p123456
    创建个数据库,创建个表,插入几条数据,然后退出把容器直接删除。
  5. 重新按照上面的命令创建容器,挂载原来的volue
    sudo docker container run --name mysql-5.7 -d -e MYSQL_ROOT_PASSWORD=123456 -v mysql-data:/var/lib/mysql mysql:5.7
  6. 当我们再次进入容器,连接数据库时会发现,原来的数据库、数据表、插入的数据全部都在,perfect。

数据持久化值Bind Mount

  1. Dockerfile文件
FROM ubuntu:21.04

WORKDIR /app

COPY a.txt /app/
  1. 构建镜像
    sudo docker image build -t bind-mount .
  2. 创建容器-使用bind mount进行挂载到自定义目录(挂载到当前目录的data目录下)
    sudo docker container run -it -v $(pwd)/data:/app bind-mount sh
  3. bind-mount挂载成功之后,我们看看data volume
    sudo docker volume ls
    发现没有数据,正确。

Bind Mount练习之Docker-python-flask开发环境

  1. Dockerfile文件
FROM python:3.10

WORKDIR /app

RUN pip install flask -i https://pypi.douban.com/simple/

ENTRYPOINT ["python", "/app/main.py"]

  1. main.py文件
from flask import Flask

app = Flask(__name__)


@app.route("/")
def hello():
    return "hello world 哈哈哈 abc 123456"


app.run("0.0.0.0", "5000")
  1. 构建镜像
    sudo docker image build -t python-flask .
  2. 通过镜像构建容器并启动
    docker container run -it -p 5000:5000 -v ${pwd}:/app python-flask
    核心是-v,将当前目录的文件挂载到容器内部,如果想运行celery,由于windows不支持,所以
    我们就可以把http服务在win运行,把celery服务在docker容器内运行,perfect。
  3. 如果有一些目录不想挂载到容器内部,可以使用新建文件
    .dockerignore文件:
.idea
__pycache__

就可以忽略掉这些文件。

机器之间共享数据

  • 多个机器之间的容器共享数据
  1. Docker的volume支持多种driver, 默认创建的volume driver都是local
    这一节我们看看一个叫sshfs的driver,如何让docker使用不在同一台机器上的文件系统做volume

参考文档

posted @ 2022-05-27 20:35  专职  阅读(90)  评论(0编辑  收藏  举报