Docker 系统性入门+进阶实践-05Docker的存储
Docker的存储
数据的持久化如何实现,Volume有哪些类型和使用场景
本章介绍
默认情况下,在运行中的容器里创建的文件,被保存在一个可写的容器层
- 如果容器被删除了,数据也就没有了
- 这个可写的容器层和特定的容器绑定的,也就是说这些数据无法方便的和其它容器共享
docker主要提供了两种方式做数据的持久话 - Data Volume由docker管理(/var/lib/docker/volumes),持久化数据的最好方式
- Bind Mount, 由用户指定存储的数据具体mount在系统什么位置
数据持久化之Data Volume
- Dockerfile文件
FROM ubuntu:21.04
COPY test.txt /app/
WORKDIR /app
VOLUME ["/app"]
- 注意:只有当创建容器的时候不指定-v参数,Dockerfile中的VOLUME才会起作用(帮助我们创建一个随机的volume进行数据的挂载)
- Dockerfile中VOLUME的作用是当我们创建容器时不指定-v参数的话,docker会自动帮助我们创建volume
- test.txt文件
hello world
- 创建镜像
sudo docker image build -t volume-test .
- 创建启动容器方式1
sudo docker container run --rm -it volume-test sh
因为加了--rm参数,所以当容器退出的时候会自动删除容器,注意:同时会把VOLUME挂载出来的数据也一并删除掉 - 创建启动容器方式2
sudo docker container run -it volume-test sh
去掉了--rm参数,当我们退出容器后,不会自动删除容器
当我们通过命令删除容器后sudo docker container rm container_id
通过VOLUME挂载出来的数据不会被删除。 - 如果我们像删除该容器挂载出来的数据
sudo docker volume prune
该命令将会删除没有被任何容器使用的卷,慎重使用。 - 查看所有卷
sudo docker volume ls
- 查看某一个卷的详细信息
sudo docker volume inspect f8fc7bbb231086997b4576f1e2d0c83a4077196a3761c8976c44eeaabf3c3cac
- 当我们删除了原有的容器,再次创建容器的时候,虽然原来的数据保存下来了,
但是我们新创建的容器又会重新创建一个卷放到/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
- 拉取mysql5.7镜像
sudo docker pull mysql:5.7
- 通过镜像构建我们的容器
sudo docker container run --name mysql-5.7 -d -e MYSQL_ROOT_PASSWORD=123456 -v mysql-data:/var/lib/mysql mysql:5.7
- 进入容器
sudo docker container exec -it mysql-5.7 sh
- 登录mysql服务
mysql -uroot -p123456
创建个数据库,创建个表,插入几条数据,然后退出把容器直接删除。 - 重新按照上面的命令创建容器,挂载原来的volue
sudo docker container run --name mysql-5.7 -d -e MYSQL_ROOT_PASSWORD=123456 -v mysql-data:/var/lib/mysql mysql:5.7
- 当我们再次进入容器,连接数据库时会发现,原来的数据库、数据表、插入的数据全部都在,perfect。
数据持久化值Bind Mount
- Dockerfile文件
FROM ubuntu:21.04
WORKDIR /app
COPY a.txt /app/
- 构建镜像
sudo docker image build -t bind-mount .
- 创建容器-使用bind mount进行挂载到自定义目录(挂载到当前目录的data目录下)
sudo docker container run -it -v $(pwd)/data:/app bind-mount sh
- bind-mount挂载成功之后,我们看看data volume
sudo docker volume ls
发现没有数据,正确。
Bind Mount练习之Docker-python-flask开发环境
- Dockerfile文件
FROM python:3.10
WORKDIR /app
RUN pip install flask -i https://pypi.douban.com/simple/
ENTRYPOINT ["python", "/app/main.py"]
- 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")
- 构建镜像
sudo docker image build -t python-flask .
- 通过镜像构建容器并启动
docker container run -it -p 5000:5000 -v ${pwd}:/app python-flask
核心是-v,将当前目录的文件挂载到容器内部,如果想运行celery,由于windows不支持,所以
我们就可以把http服务在win运行,把celery服务在docker容器内运行,perfect。 - 如果有一些目录不想挂载到容器内部,可以使用新建文件
.dockerignore文件:
.idea
__pycache__
就可以忽略掉这些文件。
机器之间共享数据
- 多个机器之间的容器共享数据
- Docker的volume支持多种driver, 默认创建的volume driver都是local
这一节我们看看一个叫sshfs的driver,如何让docker使用不在同一台机器上的文件系统做volume
分类:
docker
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· spring官宣接入deepseek,真的太香了~