解析Docker与docker-compose中volume参数的使用

目录

数据卷Volume的概念

数据挂载的实现方式

宿主机路径挂载在docker/docker-compose中的使用

卷标映射挂载在docker/docker-compose中的使用

A.匿名挂载

B.具名挂载

参考文献:


数据卷Volume的概念

在docker内有个“数据卷持久化”的概念,也就是我们常说的“数据挂载”。它的作用是,将宿主机上的数据与容器内的数据形成映射,实现数据的共享或者数据的保存;当删除容器的时候,在宿主机上仍然能够保留文件目录,这就是Volume,数据卷。

数据挂载的实现方式

docker实现数据挂载的方式本质上分为两种:

  1. 通过宿主机绝对路径挂载
  2. 通过卷标映射挂载(又包括匿名挂载与具名挂载)

宿主机路径挂载在docker/docker-compose中的使用

使用方法:

# docker
docker run -itd -v 宿主机路径:容器路径 --name 容器名 镜像

# docker-compose.yaml
services:
  service_name:
    container_name: container_name
    image: image:tag
    restart: always
    volumes:
      - 宿主机路径:容器路径

引例如下:

卷标映射挂载在docker/docker-compose中的使用

当使用卷标的方式进行数据挂载的时候,容器数据具体存放在宿主机的什么路径其实并不直观,但是docker提供了方法查看数据卷的宿主机目录,具体查看的方法如下,后文会在引例中直观说明。

# 查看所有的数据卷
sudo docker volume ls
# 查看指定数据卷的详细信息 
sudo docker volume inspect 数据卷名称

A.匿名挂载

使用方法:

# docker
docker run -itd -v 容器路径 --name 容器名 镜像

# docker-compose.yaml
services:
  service_name:
    container_name: container_name
    image: image:tag
    restart: always
    volumes:
      - 容器路径

引例: 

这种情况下,我们可以看到,当我们通过docker volume ls查看卷标的时候,我们只能查看到其对应的“匿名”的数据卷。如下图所示,如果我们随便查看一个数据卷的详细信息(命令为docker volume inspect 数据卷),可以看出其挂载点实际是在/var/lib/docker/volumes/<uuid>/_data下面的,其中uuid是docker自动生成的,而/var/lib/docker是docker的默认路径

B.具名挂载

使用方法:

# docker
docker run -itd -v 数据卷名称:容器路径 --name 容器名 镜像

# docker-compose.yaml
services:
  service_name:
    container_name: container_name
    image: image:tag
    restart: always
    volumes:
      - 数据卷名称:容器路径
volumes:
  数据卷名称:

引例: 

这种情况下,我们可以看到,当我们通过docker volume ls查看卷标的时候,我们能查看到其对应的“具名”的数据卷。可以看出其挂载点实际是在/var/lib/docker/volumes/<数据卷名称>/_data下面的,/var/lib/docker是docker的默认路径

别急,特别针对docker-compose,还有另一个现象要看,如下:

可以看到,当我们通过docker-compose启动容器时,数据卷的名称多了一个software的前缀,而这正是docker-compose.yaml的存放路径,同时其挂载点在/var/lib/docker/volumes/<yaml路径_数据卷名称>/_data下面的。特别的,如果docker-compose在根目录执行,则数据卷的名称的前缀会默认设置为default。

参考文献:

  1. http://blog.youkuaiyun.com/qq_41929714/article/details/128627429
  2. http://blog.youkuaiyun.com/AV_woaijava/article/details/86685950
  3. http://blog.youkuaiyun.com/weixin_43431218/article/details/132341357

### Docker Compose 使用 Volume 进行部署 #### 定义卷挂载方式 在 `docker-compose.yml` 文件中定义服务时,可以通过 volumes 字段来配置数据卷。这允许容器内的文件系统宿主机或其他容器共享数据。 ```yaml version: '3' services: webapp: image: springboot-app-image ports: - "8080:8080" environment: SPRING_PROFILES_ACTIVE: dev volumes: - ./data:/var/lib/mysql # 将本地目录映射到容器内路径 ``` 上述例子展示了如何将当前工作目录下的 data 文件夹挂载至容器中的 `/var/lib/mysql` 路径下[^1]。 #### 利用命名卷存储持久化数据 除了直接指定宿主机上的绝对或相对路径外,还可以创建并管理独立于任何特定容器之外的命名卷: ```yaml volumes: db-data: services: database: ... volumes: - db-data:/var/lib/postgresql/data # 使用命名卷代替具体路径 ``` 这种方式有助于简化迁移过程以及提高安全性,因为默认情况下这些卷不会暴露给外部访问者[^2]。 #### 实际案例分析-Spring Boot 应用程序的日志记录 对于 Spring Boot 类型的应用来说,在开发环境中通常希望把日志输出保存下来以便调试使用;而在生产环境里则可能更倾向于将其发送到集中式的日志管理系统去处理。通过调整 compose 文件可以轻松实现这两种需求之间的切换: ```yaml version: '3' services: app: build: . command: > sh -c "java $$JAVA_OPTS -jar /app.jar --spring.profiles.active=prod" logging: driver: "json-file" options: max-size: "10m" max-file: "3" volumes: - type: bind # 绑定挂载类型 source: ./logs # 主机端位置 target: /opt/app/logs # 容器内部目标地址 read_only: true # 设置只读权限 (可选) volumes: logs-volume: # 命名卷用于生产环境 ``` 在这个实例中,当处于非生产模式(`dev`)时会采用绑定挂载的方式让开发者能够方便地查看最新产生的日志文件;而一旦切换到了产品线,则转而利用名为 `logs-volume` 的命名卷来进行更加安全可靠的长期存档操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Felier.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值