docker入门加实战—docker数据卷
docker入门加实战—docker数据卷
容器是隔离环境,容器内程序的文件、配置等都在容器的内部,要读写容器内的文件非常不方便。
因此,容器提供程序的运行环境,但是程序运行产生的数据、程序运行依赖的配置都应该与容器进行解耦。
什么是数据卷
数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。
以Nginx为例,我们知道Nginx中有两个关键的目录:
html:放置一些静态资源;conf:放置配置文件;
如果我们要让Nginx代理我们的静态资源,最好是放到html目录;如果我们要修改Nginx的配置,最好是找到conf下的nginx.conf文件。
从dockerhub的nginx说明处,我们可以看到nginx静态文件的位置:

不过,容器运行的Nginx所有的文件都在容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,方便我们操作。如图:

在上图中:
- 创建了两个数据卷:
conf、html - Nginx容器内部的
conf目录和html目录分别与两个数据卷关联 - 而数据卷conf和html分别指向了宿主机的
/var/lib/docker/volumes/conf/_data目录和/var/lib/docker/volumes/html/_data目录
这样,容器内的conf和html目录就与宿主机的conf和html目录关联起来,被称为挂载。此时,操作宿主机的/var/lib/docker/volumes/html/_data就是在操作容器内的/usr/share/nginx/html/_data目录。只要我们将静态资源放入宿主机对应目录,就可以被Nginx代理了。
数据卷命令
数据卷的相关命令有:
| 命令 | 说明 | 文档地址 |
|---|---|---|
| docker volume create | 创建数据卷 | docker volume create |
| docker volume ls | 查看所有数据卷 | docs.docker.com |
| docker volume rm | 删除指定数据卷 | docs.docker.com |
| docker volume inspect | 查看某个数据卷的详情 | docs.docker.com |
| docker volume prune | 清除数据卷 | docker volume prune |
注意:容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建。
从需求中学习数据卷命令1
需求如下:
创建Nginx容器,修改nginx容器内的html目录下的index.html文件内容
将静态资源部署到nginx的html目录
注意:
1. 在执行docker run命令时,使用 -v 数据卷:容器内目录 可以完成数据卷挂载
2. 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
删掉原有的nginx容器
docker rm -f nginx

创建容器并指定数据卷
# 首先创建容器并指定数据卷,通过 -v 参数来指定数据卷
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
查看数据卷
docker volume ls

查看数据卷详情
docker volume inspect html

可以看到映射到的宿主机的目录为

进入这个目录,修改对应的html文件即可。
从需求中学习数据卷命令2
需求:
查看mysql容器,判断是否有数据卷挂载
基于宿主机目录实现MySQL数据目录、配置文件、初始化脚本的挂载(查阅官方镜像文档)
1. 挂载/root/mysql/data到容器内的/var/lib/mysql目录
2. 挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录
3. 挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录
注意:
1. 在执行docker run命令时,使用 -v 本地目录 : 容器内目录 可以完成本地目录挂载
2. 本地目录必须以“/”或 "./" 开头,如果直接以名称开头,会被识别为数据卷而非本地目录
-v mysql : /var/lib/mysql 会被识别为一个数据卷叫mysql
-v ./mysql : /var/lib/mysql 会被识别为当前目录下的mysql目录
查看MySQL容器是否有数据卷
# 查看MySQL容器详细信息
docker inspect mysql
# 关注其中.Config.Volumes部分和.Mounts部分
.Config.Volumes部分:

可以发现这个容器声明了一个本地目录,需要挂载数据卷,但是数据卷未定义。这就是匿名卷。
.Mounts部分:

可以发现,其中有几个关键属性:
- Name:数据卷名称。由于定义容器未设置容器名,这里的就是匿名卷自动生成的名字,一串hash值。
- Source:宿主机目录
- Destination : 容器内的目录
上述配置是将容器内的/var/lib/mysql目录,这时mysql数据存储的目录,与数据卷0d617a75a536b8d4a7ac0705403677721e1467a9859350d908861d340009a001挂载。于是在宿主机中就有了/var/lib/docker/volumes/0d617a75a536b8d4a7ac0705403677721e1467a9859350d908861d340009a001/_data这个目录。这就是匿名数据卷对应的目录,其使用方式与普通数据卷没有差别。
挂载本地目录或文件
数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便。在很多情况下,我们会直接将容器目录与宿主机指定目录挂载。挂载语法与数据卷类似:
# 挂载本地目录
-v 本地目录:容器内目录
# 挂载本地文件
-v 本地文件:容器内文件
再次说明一下:
本地目录必须以“/”或 "./" 开头,如果直接以名称开头,会被识别为数据卷而非本地目录
-v mysql:/var/lib/mysql # 会被识别为一个数据卷叫mysql,运行时会自动创建这个数据卷
-v ./mysql:/var/lib/mysql # 会被识别为当前目录下的mysql目录,运行时如果不存在会创建目录
从文档中可以看到,配置mysql配置文件的目录如下:

配置初始化脚本如下:

只有第一次才会生效
数据目录如下:

操作演示
删除并重新创建mysql容器,并完成本地目录挂载:
- 挂载
/root/mysql/data到容器内的/var/lib/mysql目录 - 挂载
/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录(初始化的SQL脚本目录) - 挂载
/root/mysql/conf到容器内的/etc/mysql/conf.d目录(这个是MySQL配置文件目录)
删除原来的MySQL容器
docker rm -f mysql

进入root目录
cd ~
创建并运行新mysql容器,挂载本地目录
先提前创建这些目录
在 root目录操作
mkdir mysql
# 进入mysql目录
cd mysql/
#创建以下三个目录
mkdir data
mkdir conf
mkdir init
把主备好的配置文件和脚本放到过去:

直接把目录上传到linux服务器:

上传后内容如下:


在root的家目录执行运行如下命令
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v ./mysql/data:/var/lib/mysql \
-v ./mysql/conf:/etc/mysql/conf.d \
-v ./mysql/init:/docker-entrypoint-initdb.d \
mysql

可以看到data目录有文件了

docker入门加实战—docker数据卷的更多相关文章
- Docker容器学习梳理 - Volume数据卷使用
之前部署了Docker容器学习梳理--基础环境安装,接下来看看Docker Volume的使用. Docker volume使用 Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker ...
- SpringBoot Docker入门,SpringBoot Docker安装
SpringBoot Docker入门,SpringBoot Docker安装 ================================ ©Copyright 蕃薯耀 2018年4月8日 ht ...
- docker进阶篇(一) ---- Volume(数据卷)
引言 docker的镜像是由多个只读的文件系统叠加在一起形成的.当我们在我启动一个容器的时候,docker会加载这些只读层并在这些只读层的上面(栈顶)增加一个读写层.这时如果修改正在运行的容器中已有的 ...
- Docker——网络和存储(数据卷)
iptables -t nat -vnL |grep docker 查看docker桥接网卡:brctl show 本地端口随机映射到docker容器的80端口上: docker run -d -P ...
- Docker系列(20)- 数据卷容器
数据卷容器 什么是数据卷容器? 容器和容器之间实现数据共享 一个容器先于宿主机创建挂载方式,宿主机就会有改卷的目录 第二个容器使用命令--volumes-from 第一个容器,共享使用了第一个容器与宿 ...
- Docker入门与实战讲解
转载自:http://blog.csdn.net/relax_hb/article/details/69668815 简述 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包 ...
- docker挂载本地目录和数据卷容器
1.docker挂载本地目录 docker可以支持把一个宿主机上的目录挂载到镜像里. 交互模式运行docker run -it -v /home/dock/Downloads:/usr/Downloa ...
- Docker(六)容器数据卷
容器数据卷 docker的理念回顾 将应用和环境打包成一个镜像 需求:数据可以持久化和同步 使用数据卷 指定路径挂载 docker run -it -v 主机目录:容器内目录 # 测试 [root@h ...
- Docker入门到实战
1.系统要求 Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10. CentOS 7满足最低内核的要求,但由于内核版本比较低,部分功能(如 overlay2 存 ...
- docker入门 基础命令 docker安装
docker入门 在学一门新知识的时候,超哥喜欢提问,why?what?how? wiki资料 什么是docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes ...
随机推荐
- 【阅读笔记】低照度图像增强-《Adaptive and integrated neighborhood-dependent approach for nonlinear enhancement of
本文介绍改进INDANE算法的低照度图像增强改进算法(AINDANE算法),<Adaptive and integrated neighborhood-dependent approach fo ...
- [爬虫]1.2.2 CSS选择器
CSS (Cascading Style Sheets) 是一种样式表语言,用于描述HTML元素的样式.CSS选择器是CSS规则的一部分,它决定了CSS规则应用于哪些元素.在网络爬虫的开发中,我们经常 ...
- shell 编程变量使用心得
类型 示例 用途 大写的变量名 IP 表示常量,比如,用来记录输入和输出文件名 小写变量名 mac 一般变量 左边下划线 _mac 临时的中间变量,只引用一次的变量 右边下划线 tmpfile_ 临时 ...
- 最全面的JAVA多线程知识总结
背景: 2023年经营惨淡,经历了裁员就业跳槽再就业,在找工作过程中对于知识的梳理和总结,本文总结JAVA多线程. 应用场景: 需要同时执行多个任务或处理大量并发请求时, 目前常用的场景有: We ...
- pandas: 设置列名&获取所有列名
解决方案 download_page_data_df.columns = column_name2excel 参考链接 https://www.cnblogs.com/bigtreei/p/10145 ...
- sqlmap指定参数注入
在参数前面加星号
- 深入理解 Flutter 图片加载原理
前言 随着Flutter稳定版本逐步迭代更新,京东APP内部的Flutter业务也日益增多,Flutter开发为我们提供了高效的开发环境.优秀的跨平台适配.丰富的功能组件及动画.接近原生的交互体验,但 ...
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-14-playwright操作iframe-番外篇
1.简介 通过前边三篇的学习,想必大家已经对iframe有了一定的认识和了解,今天这一篇主要是对iframe的一些特殊情况的介绍和讲解,主要从iframe的定位.监听事件和执行js脚本三个方面进行展开 ...
- 如何使用API接口获取Lazada商品详情数据
随着电商市场的不断发展壮大,越来越多的人开始选择在网上购买商品.其中,东南亚地区的Lazada电商平台备受欢迎.如果您是一名电商从业者,或者打算在Lazada上开店,那么获取商品详情信息将是一个非常重 ...
- Python图片与Base64相互转换
import base64 #必须的 pic=open("img.png","rb")#读取本地文件 pic_base=base64.b64encode(pic ...