Docker操作:容器数据卷

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Docker操作 (八)

容器数据卷
什么是容器数据卷
docker的理念回顾

将应用和环境打包成一个镜像。

如果数据都在容器中,那么容器删除,数据就会丢失!需求:数据可以长久化,MySQL,容器删了,删库跑路。=需求:MySQL数据可以存储在本地=

容器之间可以有一个数据共享技术!Docker容器中产生的数据,同步到本地。这就是卷技术,目前的挂载,将我们容器内的目录,挂载到Linux上面。

总结:容器的持久化和同步操作,容器间也可以数据共享。

使用数据卷

# 方式一:直接使用命令挂载 -v
docker run -it -v 主机目录:容器内目录
# 测试
root@liuxiaoweideAir ~ # docker run -it -v /Users/liuxiaowei/ceshi:/home centos /bin/bash  #主机目录:/Users/liuxiaowei/ceshi 容器目录:/home 
# 启动之后,通过docker inspect 容器id 检验卷如何挂载
root@liuxiaoweideAir liuxiaowei # docker inspect 3af3cfc435c3
        "Mounts": [
            {
   
                "Type": "bind",
                "Source": "/Users/liuxiaowei/ceshi",   # 主机内地址
                "Destination": "/home",                # docker 容器内的地址
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ]

测试文件的同步效果如图:
逆向测试
1、退出容器

2、然后在宿主机目录下进行操作

3、再启动容器

4、查看容器内目录文件同步变化
image.png

优点:以后修改只需在本地修改即可,容器内会自动同步。

实战:安装MySQL
思考:MySQL的数据持久化的问题

# 获取镜像
root@liuxiaoweideAir ~ # docker pull mysql:5.7
# 运行容器,需要做数据挂载, 安装启动mysql,需要配置密码的,这需要注意。去https://hub.docker.com/搜索mysql
# Start a mysql server instance
# Starting a MySQL instance is simple:
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 启动容器
-d 后台运行
-p 端口映射
-v 卷挂载 (两个-v 挂载两个目录)
-e 环境配置
--name 容器名字
root@liuxiaoweideAir ~ # docker run -d -p 3310:3306 -v /Users/liuxiaowei/mysql/conf:/etc/mysql/conf.d -v /Users/liuxiaowei/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456  --name mysql01 mysql:5.7
42053d1fb7043624bb199b7f5d876ccd2299d5047230cee847a4dcabb5657ddf

# 启动成功之后,利用Navicat或者SQL PRO连接测试,连接到服务器的3310 --- 3310和容器内的3306映射。如下图

image.png
image.png

# 在本地测试创建一个数据库,查看一下我们映射的路径是否同步。
本例:root@liuxiaoweideAir data # ls
auto.cnf        ib_logfile1        server-cert.pem
ca-key.pem        ibdata1            server-key.pem
ca.pem            ibtmp1            sys
client-cert.pem        mysql            test # 在mysql容器里建立的数据库
client-key.pem        performance_schema    test1 # 在mysql容器里建立的数据库
ib_buffer_pool        private_key.pem
ib_logfile0        public_key.pem
root@liuxiaoweideAir data # pwd
/Users/liuxiaowei/mysql/data

image.png

假设我们将容器删除

root@liuxiaoweideAir data # docker rm -f mysql01
mysql01
root@liuxiaoweideAir data # docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

root@liuxiaoweideAir data # ls
auto.cnf        ib_logfile0        public_key.pem
ca-key.pem        ib_logfile1        server-cert.pem
ca.pem            ibdata1            server-key.pem
client-cert.pem        mysql            sys
client-key.pem        performance_schema    test
ib_buffer_pool        private_key.pem        test1

发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能!

具名和匿名挂载

匿名挂载

- v 容器内路径
- P 随机映射端口
docker run -d -P --name nginx01 -v /etc/nginx nginx   

# 查看所有的卷的信息
root@liuxiaoweideAir liuxiaowei # docker volume ls    
DRIVER    VOLUME NAME
local     3e8ab2696b7005a359de2bdaf5fc70a01881652fc0a789b3dcbac3d12b42a841   # 匿名

# 具名挂载nginx "juming-nginx"
root@liuxiaoweideAir liuxiaowei # docker run -d -P --name nginx02 -v juming-nginx:/ect/nginx nginx
df397dd0401dc1f2904671efaeca9749c7813fca846ba097f890666785094327
root@liuxiaoweideAir liuxiaowei # docker volume ls
DRIVER    VOLUME NAME
local     f40d828c9c069666740ff54f90c35e6061071cf684198ca5c2e9caab7871fdf0
local     juming-nginx   # 具名
local     vsCodeServerVolume-liuxiaowei-recursing_leakey

# 查看一下这个具名卷
root@liuxiaoweideAir liuxiaowei # docker volume inspect juming-nginx
[
    {
   
        "CreatedAt": "2022-01-08T14:24:41Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",  # 挂载点
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用具名挂载

# 如何确定是具名挂载或者匿名挂载,还是指定路径挂载
-v 容器内路径        # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径:容器内路径    # 指定路径挂载

拓展:

# 通过 -v 容器内路径:ro rw 改变读写权限
ro  --- readonly    # 只读
rw  --- readwrite   # 可读可写
# 一旦设置了容器权限,容器对我们挂载出来的内容就有限定
docker run -d -p --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -p --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

# ro 说明这个路径只能通过宿主机来操作,容器内部无法操作
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2天前
|
存储 Docker 容器
docker中挂载数据卷到容器
【10月更文挑战第12天】
15 5
|
2天前
|
Docker 容器
docker中使用Dockerfile自动创建数据卷
【10月更文挑战第12天】
11 5
|
2天前
|
存储 关系型数据库 MySQL
docker中数据卷的创建与挂载
【10月更文挑战第12天】
9 3
|
3天前
|
存储 测试技术 开发者
docker中将数据卷挂载到容器
【10月更文挑战第11天】
15 3
|
4天前
|
缓存 运维 Docker
容器化运维:Docker Desktop 占用磁盘空间过大?教你轻松解决!
Windows Docker Desktop 使用过程中,因镜像、容器数据及构建缓存的累积,可能导致磁盘空间占用过高。通过删除无用镜像与容器、压缩磁盘以及清理构建缓存等方法,可有效释放空间。具体步骤包括关闭WSL、使用`diskpart`工具压缩虚拟磁盘、执行`docker buildx prune -f`清理缓存等。这些操作能显著减少磁盘占用,提升系统性能。
|
3天前
|
存储 关系型数据库 MySQL
docker中查看数据卷信息
【10月更文挑战第11天】
8 2
|
3天前
|
存储 应用服务中间件 云计算
深入解析:云计算中的容器化技术——Docker实战指南
【10月更文挑战第14天】深入解析:云计算中的容器化技术——Docker实战指南
16 1
|
4天前
|
存储 数据管理 Docker
docker中数据卷的特性
【10月更文挑战第10天】
14 2
|
2天前
|
存储 Kubernetes 监控
深入探索Docker容器化技术的奥秘
【10月更文挑战第15天】深入探索Docker容器化技术的奥秘
10 0
|
3天前
|
运维 Kubernetes 监控
掌握Docker容器化技术:构建、部署与管理的高效实践
【10月更文挑战第14天】掌握Docker容器化技术:构建、部署与管理的高效实践
12 0