docker入门加实战—docker数据卷

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目录

注意:

markdown 复制代码
1. 在执行docker run命令时,使用 -v 数据卷:容器内目录 可以完成数据卷挂载
2. 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷

删掉原有的nginx容器

shell 复制代码
docker rm -f nginx

创建容器并指定数据卷

shell 复制代码
# 首先创建容器并指定数据卷,通过 -v 参数来指定数据卷
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx

查看数据卷

shell 复制代码
docker volume ls

查看数据卷详情

shell 复制代码
docker volume inspect html

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

进入这个目录,修改对应的html文件即可。

从需求中学习数据卷命令2

需求:

  • 查看mysql容器,判断是否有数据卷挂载

  • 基于宿主机目录实现MySQL数据目录、配置文件、初始化脚本的挂载(查阅官方镜像文档)

markdown 复制代码
1. 挂载/root/mysql/data到容器内的/var/lib/mysql目录
2. 挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录
3. 挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录

注意:

markdown 复制代码
1. 在执行docker run命令时,使用 -v 本地目录 : 容器内目录 可以完成本地目录挂载
2. 本地目录必须以"/"或 "./" 开头,如果直接以名称开头,会被识别为数据卷而非本地目录
	-v mysql : /var/lib/mysql 会被识别为一个数据卷叫mysql
	-v ./mysql : /var/lib/mysql 会被识别为当前目录下的mysql目录

查看MySQL容器是否有数据卷

shell 复制代码
# 查看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这个目录。这就是匿名数据卷对应的目录,其使用方式与普通数据卷没有差别。

挂载本地目录或文件

数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便。在很多情况下,我们会直接将容器目录与宿主机指定目录挂载。挂载语法与数据卷类似:

Bash 复制代码
# 挂载本地目录
-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容器

    shell 复制代码
    docker rm -f mysql
  2. 进入root目录

    shell 复制代码
    cd ~
  3. 创建并运行新mysql容器,挂载本地目录

    先提前创建这些目录

    shell 复制代码
    在 root目录操作
    mkdir mysql
    # 进入mysql目录
    cd mysql/
    #创建以下三个目录
    mkdir data
    mkdir conf
    mkdir init

    把主备好的配置文件和脚本放到过去:

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

    上传后内容如下:

    在root的家目录执行运行如下命令

    shell 复制代码
    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目录有文件了

相关推荐
.生产的驴39 分钟前
Docker 部署Nacos 单机部署 MYSQL数据持久化
android·运维·spring boot·sql·mysql·docker·容器
大新新大浩浩1 小时前
使用docker-compose单点搭建社区版seafile+onlyoffice在线word编辑平台
docker·容器·word
后端研发Marion3 小时前
【Docker】Mac安装Docker Desktop导致磁盘剩余空间较少问题如何解决?
macos·docker·eureka
TsengOnce5 小时前
Docker安装稳定版本nginx-1.26.2
linux·nginx·docker
你熬夜了吗?5 小时前
java实现代码沙盒(docker-java)
java·spring boot·docker
南猿北者8 小时前
docker compose
运维·docker·容器
hongkid8 小时前
docker 部署freeswitch(非编译方式)
docker·容器·freeswitch
尘佑不尘12 小时前
kali上安装docker,并且生成centos7容器和创建apache容器后台运行
笔记·web安全·docker·容器·apache
想学习java初学者12 小时前
Docker compose部署Activemq
docker·容器·activemq
椰汁菠萝13 小时前
docker运行ActiveMQ-Artemis
docker·容器·activemq