docker入门加实战—docker数据卷

容器是隔离环境,容器内程序的文件、配置等都在容器的内部,要读写容器内的文件非常不方便。

因此,容器提供程序的运行环境,但是程序运行产生的数据、程序运行依赖的配置都应该与容器进行解耦

什么是数据卷

数据卷(volume)是一个虚拟目录,是容器内目录宿主机目录之间映射的桥梁。

以Nginx为例,我们知道Nginx中有两个关键的目录:

  • html:放置一些静态资源;
  • conf:放置配置文件;

如果我们要让Nginx代理我们的静态资源,最好是放到html目录;如果我们要修改Nginx的配置,最好是找到conf下的nginx.conf文件。

从dockerhub的nginx说明处,我们可以看到nginx静态文件的位置:

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

在上图中:

  • 创建了两个数据卷:confhtml
  • Nginx容器内部的conf目录和html目录分别与两个数据卷关联
  • 而数据卷conf和html分别指向了宿主机的/var/lib/docker/volumes/conf/_data目录和/var/lib/docker/volumes/html/_data目录

这样,容器内的confhtml目录就与宿主机的confhtml目录关联起来,被称为挂载。此时,操作宿主机的/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配置文件目录)
  1. 删除原来的MySQL容器

    docker rm -f mysql

  2. 进入root目录

    cd ~
  3. 创建并运行新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数据卷的更多相关文章

  1. Docker容器学习梳理 - Volume数据卷使用

    之前部署了Docker容器学习梳理--基础环境安装,接下来看看Docker Volume的使用. Docker volume使用 Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker ...

  2. SpringBoot Docker入门,SpringBoot Docker安装

    SpringBoot Docker入门,SpringBoot Docker安装 ================================ ©Copyright 蕃薯耀 2018年4月8日 ht ...

  3. docker进阶篇(一) ---- Volume(数据卷)

    引言 docker的镜像是由多个只读的文件系统叠加在一起形成的.当我们在我启动一个容器的时候,docker会加载这些只读层并在这些只读层的上面(栈顶)增加一个读写层.这时如果修改正在运行的容器中已有的 ...

  4. Docker——网络和存储(数据卷)

    iptables -t nat -vnL |grep docker 查看docker桥接网卡:brctl show 本地端口随机映射到docker容器的80端口上: docker run -d -P ...

  5. Docker系列(20)- 数据卷容器

    数据卷容器 什么是数据卷容器? 容器和容器之间实现数据共享 一个容器先于宿主机创建挂载方式,宿主机就会有改卷的目录 第二个容器使用命令--volumes-from 第一个容器,共享使用了第一个容器与宿 ...

  6. Docker入门与实战讲解

    转载自:http://blog.csdn.net/relax_hb/article/details/69668815 简述 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包 ...

  7. docker挂载本地目录和数据卷容器

    1.docker挂载本地目录 docker可以支持把一个宿主机上的目录挂载到镜像里. 交互模式运行docker run -it -v /home/dock/Downloads:/usr/Downloa ...

  8. Docker(六)容器数据卷

    容器数据卷 docker的理念回顾 将应用和环境打包成一个镜像 需求:数据可以持久化和同步 使用数据卷 指定路径挂载 docker run -it -v 主机目录:容器内目录 # 测试 [root@h ...

  9. Docker入门到实战

    1.系统要求 Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10. CentOS 7满足最低内核的要求,但由于内核版本比较低,部分功能(如 overlay2 存 ...

  10. docker入门 基础命令 docker安装

    docker入门   在学一门新知识的时候,超哥喜欢提问,why?what?how? wiki资料 什么是docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes ...

随机推荐

  1. 微型神经网络库MicroGrad-基于标量自动微分的类pytorch接口的深度学习框架

    一.MicroGrad MicroGrad是大牛Andrej Karpathy写的一个非常轻量级别的神经网络库(框架),其基本构成为一个90行python代码的标量反向传播(自动微分)引擎,以及在此基 ...

  2. nginx配置文件内容(1)

    nginx.conf内容 在Nginx服务器的主配置文件nginx.conf中,包括全局配置.I/O事件配置.HTTP配置这三大块内容,配置语句的格式为"关键字  值:"(末尾以分 ...

  3. 2021-8-2 Mysql个人练习题

    创建学生表 CREATE TABLE student( id int, uname VARCHAR(20), chinese FLOAT, english FLOAT, math FLOAT ); I ...

  4. 管理虚拟环境——virtualenvwrapper

    1.安装virtualenvwrapper 输入命令:pip install -i https://pypi.douban.com/simple/ virtualenv //下载virtualenvw ...

  5. Notepad正则表达式用法

    https://blog.csdn.net/cuckoo1/article/details/52165449

  6. 因为此网站发送了 Google Chrome 无法处理的杂乱凭据

    原文地址 thisisunsafe this is unsafe 这是不安全的,呵呵~ 具体描述 在chrome该页面上,直接键盘敲入这11个字符:thisisunsafe (鼠标点击当前页面任意位置 ...

  7. [nginx]日志中记录自定义请求头

    前言 假设在请求中自定义了一个请求头,key为"version",参数值为"1.2.3",需要在日志中捕获这个请求头. nginx日志配置 只需要用变量http ...

  8. 从数据库方向getshell方法总结

    前提 拿到数据库权限,可以执行sql语句,或者进入到phpmyadmin界面,或pmd界面 phpstudy 对应phpmyadmin界面 phpmyadmin.php upupw 对应pmd界面 u ...

  9. AI 与智能化 API 治理的探索实践

    7月 Eolink 受邀参加 QECon 2023 全球软件质量&效能大会(北京站).Eolink CEO 刘昊臻,发表了主题为「AI 与智能化 API 治理的探索实践」的演讲,分享 Eoli ...

  10. 产品代码都给你看了,可别再说不会DDD(三):战略设计

    这是一个讲解DDD落地的文章系列,作者是<实现领域驱动设计>的译者滕云.本文章系列以一个真实的并已成功上线的软件项目--码如云(https://www.mryqr.com)为例,系统性地讲 ...