6.4 数据卷
6.4.1 数据卷简介
**数据卷(Volume)**是Docker中一种用于持久化存储容器数据的机制,它将主机上的目录或文件挂载到容器内部的指定目录,使得容器内部的数据可以被持久化到主机上的文件系统中,即使容器被删除或重新创建,数据仍然可以被保留。
数据卷是容器中虚拟的文件或目录,指向宿主中真实文件或目录。
使用数据卷的好处包括:
-
数据持久化:通过数据卷,容器的数据可以在容器被删除或停止后仍然保留在主机上,从而避免数据丢失。
-
数据共享:多个容器可以共享同一个数据卷,从而实现数据共享和通信。
-
数据备份和恢复:通过备份数据卷,可以方便地进行数据备份和恢复。
在Docker中,可以使用docker volume create
命令来创建一个数据卷,然后使用docker run
命令时使用-v
选项将数据卷挂载到容器内部的指定目录中,例如:
docker volume create mydata
docker run -v mydata:/data myimage上述命令会将名为`mydata`的数据卷挂载到容器内部的`/data`目录中。
除了使用命令行,也可以在docker-compose.yml
文件中定义数据卷,例如:
version: '3'
services:
myservice:
image: myimage
volumes:
mydata:/data
上述docker-compose.yml
文件中使用volumes
关键字定义了名为mydata
的数据卷,并在myservice
服务中将其挂载到容器内部的/data
目录中。
6.4.2 数据卷指令
以下是Docker中常用的数据卷操作指令:
docker volume create
– 创建一个数据卷docker volume inspect
– 查看数据卷的详细信息docker volume ls
– 列出所有数据卷docker volume prune
– 删除所有未被使用的数据卷docker run -v
– 在容器中挂载一个数据卷docker volume rm
– 删除一个指定的数据卷
docker run -v mydata:/data myimage
上述命令将名为 mydata
的数据卷挂载到容器内部的 /data
目录上
docker volume rm mydata
上述命令将名为 mydata
的数据卷删除。需要注意的是,在删除数据卷之前,需要先停止正在使用该数据卷的容器。
6.5 Dockerfile自定义镜像
官网文档: https://docs.docker.com/engine/reference/builder
6.5.1镜像结构
Docker的镜像结构主要由多个镜像层(Image Layer)组成,每个镜像层都包含了一些文件系统的变化。镜像层采用了联合文件系统(UnionFS)的技术,即将多个文件系统层联合起来呈现为一个统一的文件系统,从而实现了镜像的分层存储。
具体来说,每个镜像层都是只读的,并且是在上一个镜像层的基础上进行的修改。当创建新的镜像时,Docker会将这些镜像层堆叠在一起,形成一个新的镜像。由于镜像层是只读的,因此创建新的镜像不会改变原有的镜像层,从而实现了镜像的可重用性和高效性。
6.5.2 Dockerfile语法
Dockerfile是一个文本文件,用于定义Docker镜像的构建方式和配置信息(可以将一个SpringBoot工程定义为一个镜像)。Dockerfile中包含了一系列的指令和参数,用于描述镜像的构建过程、所需的环境和依赖关系等信息。
- 基本指令
- FROM – 定义基础镜像,即当前镜像继承的父镜像。
- MAINTAINER – 定义镜像的维护者。
- RUN – 定义在镜像构建过程中需要执行的命令。
- CMD – 定义容器启动时需要执行的命令。
- EXPOSE – 定义容器暴露的端口。
- ENV – 定义环境变量。
- ADD/COPY – 将文件或目录从主机复制到镜像中。
- VOLUME – 定义容器的挂载点,用于持久化存储数据。
- WORKDIR – 定义容器中的工作目录。
- USER – 定义容器运行时的用户。
- ARG – 定义构建时的参数。
- ONBUILD – 定义一个镜像,该镜像会在其他镜像中作为基础镜像时触发执行。
- LABEL – 定义镜像的元数据,例如版本、描述等信息。
- DockerFile示例
下面是使用 Java 的 Dockerfile 示例,用于构建一个 Spring Boot 应用程序的镜像:
# 指定基础镜像
FROM openjdk:11-jre-slim
# 设置工作目录
WORKDIR /app
# 复制应用程序代码
COPY target/myapp.jar .
# 暴露端口
EXPOSE 8080
# 在容器启动时运行应用程序
CMD ["java", "-jar", "myapp.jar"]
该 Dockerfile 的解释如下:
-
FROM
指令指定基础镜像openjdk:11-jre-slim
。 -
WORKDIR
指令设置工作目录为/app
。 -
COPY
指令将构建后的应用程序myapp.jar
复制到镜像中。 -
EXPOSE
指令指定容器监听的端口8080
。 -
CMD
指令在容器启动时运行命令java -jar myapp.jar
,其中myapp.jar
是应用程序的可执行 JAR 文件。
该 Dockerfile 用于构建一个 Spring Boot 应用程序的镜像,该应用程序在容器启动时会监听端口 8080
。你可以使用以下命令构建该镜像:
$ docker build -t my_spring_boot_app .
其中 -t
参数指定镜像的名称为 my_spring_boot_app
,.
表示 Dockerfile 文件所在目录。
然后,可以使用以下命令运行该镜像:
$ docker run -p 8080:8080 my_spring_boot_app
其中 -p
参数将容器的端口 8080
映射到主机的端口 8080
,从而使应用程序可以通过主机的 IP 地址进行访问。
- DockerFile存放位置
通常情况下,Dockerfile 文件应该放在 Spring Boot 项目的根目录下。这样,当你在根目录下执行 docker build
命令时,Docker 会自动查找 Dockerfile 文件并使用它来构建镜像。
如果你的 Spring Boot 项目有多个模块,你可以在每个模块的根目录下分别创建 Dockerfile 文件,并在构建镜像时指定要使用的 Dockerfile 文件。例如,假设你有一个名为 myapp
的 Spring Boot 项目,其中包括一个名为 web
的模块和一个名为 service
的模块,那么你可以在 myapp
的根目录下创建一个名为 Dockerfile
的文件,并在 web
模块和 service
模块的根目录下分别创建名为 Dockerfile.web
和 Dockerfile.service
的文件。然后,你可以使用以下命令构建每个模块的镜像:
$ docker build -t myapp-web -f web/Dockerfile.web .
$ docker build -t myapp-service -f service/Dockerfile.service .
其中 -t
参数指定镜像的名称,-f
参数指定要使用的 Dockerfile 文件,.
表示 Dockerfile 文件所在目录。
6.6 DockerCompose文件
DockerCompose的详细语法参考官网:https://docs.docker.com/compose/compose-file/
6.6.1 概念
Docker Compose 是一个用于定义和运行多个 Docker 容器的工具,它可以让你轻松地定义和管理多个容器应用程序的组件,以及它们之间的相互关系和依赖关系。
通常情况下,一个容器应用程序可能由多个容器组成,例如一个 Web 应用程序可能需要一个 Web 服务器容器、一个数据库容器和一个缓存容器。使用 Docker Compose,你可以使用 Docker Compose 文件来定义这些容器,以及它们之间的相互关系和依赖关系,然后使用 docker-compose
命令来启动、停止和管理这些容器。
Docker Compose 文件使用 YAML 格式编写,它包含了一些基本的元素,例如服务、容器、网络和卷。通过定义这些元素,你可以轻松地创建一个完整的容器应用程序。
6.6.2 示例
以下是一个简单的 Docker Compose 文件示例,用于定义一个 Web 应用程序的容器组成部分:
version: '3'
services:
web:
build: .
ports:
- "8000:8000"
depends_on:
- db
db:
image: postgres
environment:
POSTGRES_PASSWORD: mypassword
该 Docker Compose 文件中包含两个服务 web
和 db
,分别对应 Web 服务器容器和数据库容器。web
服务使用 Dockerfile 构建镜像,并将容器端口 8000
映射到主机端口 8000
,同时指定了 db
服务为它的依赖项。db
服务使用 Postgres 镜像,并设置了 POSTGRES_PASSWORD
环境变量。
使用以下命令可以启动该容器应用程序:
$ docker-compose up
该命令会启动 web
和 db
服务,并创建对应的容器。你可以使用以下命令来停止容器应用程序:
$ docker-compose down
使用 Docker Compose 可以轻松地定义和管理多个容器应用程序的组件和依赖关系,从而简化了容器化应用程序的开发和部署过程。