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
相关文章
|
1天前
|
Kubernetes 监控 开发者
掌握容器化:Docker与Kubernetes的最佳实践
【10月更文挑战第26天】本文深入探讨了Docker和Kubernetes的最佳实践,涵盖Dockerfile优化、数据卷管理、网络配置、Pod设计、服务发现与负载均衡、声明式更新等内容。同时介绍了容器化现有应用、自动化部署、监控与日志等开发技巧,以及Docker Compose和Helm等实用工具。旨在帮助开发者提高开发效率和系统稳定性,构建现代、高效、可扩展的应用。
|
1天前
|
Docker 容器
docker 修改容器内的系统时间
【10月更文挑战第27天】docker 修改容器内的系统时间
27 2
|
7天前
|
Web App开发 iOS开发 Docker
Docker 容器的日志
【10月更文挑战第31天】
19 5
|
7天前
|
Docker 容器
docker中查看已创建的数据卷
【10月更文挑战第16天】
21 3
|
7天前
|
存储 缓存 Docker
docker中挂载数据卷到容器
【10月更文挑战第16天】
17 2
|
7天前
|
Docker 容器
docker中创建命名数据卷
【10月更文挑战第16天】
10 2
|
8天前
|
存储 JSON 数据格式
docker中查看数据卷
【10月更文挑战第15天】
11 2
|
8天前
|
存储 Docker 容器
docker中使用命名数据卷
【10月更文挑战第15天】
10 2
|
8天前
|
存储 Docker 容器
docker中创建命名数据卷
【10月更文挑战第15天】
18 2
|
9天前
|
存储 Docker 容器
docker中挂载现有目录作为数据卷
【10月更文挑战第14天】
13 1