一、概述
Docker 有多个选项可以为正在运行的容器持久化和共享数据。但是,我们可能需要多个文件存储来运行容器,例如,创建备份或授予不同的访问权限。或者对于同一个容器,我们可能需要添加命名卷并将它们绑定到特定路径。
在本教程中,我们将了解如何在一个容器上挂载多个卷。我们将看到一些使用命令行和Docker Compose 的示例。
2. Docker 容器上的多个挂载
Docker 使用Storage来持久化数据,因此如果容器重新启动,我们不会丢失我们的信息。此外,如果我们想在集群环境中共享,数据持久性将是相关的。
我们将创建一些使用卷和绑定挂载的示例,以突出最常见的开发用例。
2.1。使用多个卷
首先,让我们创建两个不同的命名卷:
docker volume create --name first-volume-data && docker volume create --name second-volume-data
假设我们想为我们的Web 应用程序挂载两个不同的卷,但其中一个路径必须是只读的。
如果我们使用命令行,我们可以使用-v选项:
docker run -d -p 8080:8080 -v first-volume-data:/container-path-1 -v second-volume-data:/container-path-2:ro --name web-app web-app:latest
我们还可以使用anonymous卷,例如,通过包含-v container-path。Docker 将为我们创建它,但一旦我们删除容器,它就会被删除。
让我们检查我们的容器以检查我们的挂载是否正确:
docker inspect 0050cda73c6f
我们可以看到相关信息,例如来源和目的地、类型,以及第二卷的只读状态:
"Mounts": [
 {
 "Type": "volume",
 "Name": "first-volume-data",
 "Source": "/var/lib/docker/volumes/first-volume-data/_data",
 "Destination": "/container-path-1",
 "Driver": "local",
 "Mode": "z",
 "RW": true,
 "Propagation": ""
 },
 {
 "Type": "volume",
 "Name": "second-volume-data",
 "Source": "/var/lib/docker/volumes/second-volume-data/_data",
 "Destination": "/container-path-2",
 "Driver": "local",
 "Mode": "z",
 "RW": false,
 "Propagation": ""
 }
 ]
同样,Docker 建议我们使用–mount选项:
docker run -d \
 --name web-app \
 -p 8080:8080 \
 --mount source=first-volume-data,target=/container-path-1 \
 --mount source=second-volume-data,target=/container-path-2,readonly \
 web-app:latest
结果与-v选项相同。然而,除了更清晰之外,当我们处于Swarm模式时,–mount是我们可以将卷与服务一起使用的唯一方法。
所以,如果我们想为我们的web 应用创建一个有多个挂载的服务,我们需要使用–mount选项:
docker service create --name web-app-service \
 --replicas 3 \
 --publish published=8080,target=80 \
 --mount source=first-volume-data,target=/container-path-1 \
 --mount source=second-volume-data,target=/container-path-2,readonly \
 web-app
同样,我们可以检查我们的服务:
docker service inspect web-app-service
同样,我们将在我们的服务规范中获得有关容器的一些信息:
"Mounts": [
 {
 "Type": "volume",
 "Source": "first-volume-data",
 "Target": "/container-path-1"
 },
 {
 "Type": "volume",
 "Source": "second-volume-data",
 "Target": "/container-path-2",
 "ReadOnly": true
 }
 ]
2.2.使用卷和绑定挂载
我们可能还希望在挂载到主机中的特定文件夹或文件的同时使用卷。
假设我们有一个MySQL 数据库映像,我们需要运行一个初始脚本来创建一个模式或用一些数据填充它:
docker run -d \
 --name db \
 -p 3306:3306 \
 --mount source=first-volume-data,target=/var/lib/mysql \
 --mount type=bind,source=/init.sql,target=/docker-entrypoint-initdb.d/init.sql \
 mysql:latest
如果我们检查我们的容器,我们现在可以看到两种不同的挂载类型:
"Mounts": [
 {
 "Type": "volume",
 "Name": "first-volume-data",
 "Source": "/var/lib/docker/volumes/first-volume-data/_data",
 "Destination": "/var/lib/mysql",
 "Driver": "local",
 "Mode": "z",
 "RW": true,
 "Propagation": ""
 },
 {
 "Type": "bind",
 "Source": "/init.sql",
 "Destination": "/docker-entrypoint-initdb.d/init.sql",
 "Mode": "",
 "RW": true,
 "Propagation": "rprivate"
 }
 ]
2.3.使用多个绑定安装
同样,我们可以使用多个绑定挂载,例如,当我们使用本地AWS 模拟器Localstack时。
假设我们要启动一个本地S3 服务:
docker run --name localstack -d \
 -p 4563-4599:4563-4599 -p 8055:8080 \
 -e SERVICES=s3 -e DEBUG=1 -e DATA_DIR=/tmp/localstack/data \
 -v /.localstack:/var/lib/localstack -v /var/run/docker.sock:/var/run/docker.sock \
 localstack/localstack
在检查容器时,我们在主机配置中看到了多个绑定:
"Binds": [
 "/.localstack:/var/lib/localstack",
 "/var/run/docker.sock:/var/run/docker.sock"
 ]
3. 码头工人撰写
让我们看一下使用Docker Compose 进行多次挂载的更紧凑的方式。
3.1。使用多个卷
首先,让我们从两个卷开始,如我们的YAML 模板所示:
services:
 my_app:
 image: web-app:latest
 container_name: web-app
 ports:
 - "8080:8080"
 volumes:
 - first-volume-data:/container-path-1
 - second-volume-data:/container-path-2:ro
 volumes:
 first-volume-data:
 driver: local
 second-volume-data:
 driver: local
一旦我们定义了我们之前创建的卷,我们就可以在服务中以named-volume:container-path.
Long 语法也可用于Docker Compose,例如:
volumes:
 - type: volume
 source: volume-data
 target: /container-path
3.2.使用卷和绑定挂载
同样,这是使用MySQL 服务的示例:
services:
 mysql-db:
 image: mysql:latest
 environment:
 - MYSQL_ROOT_PASSWORD=password
 - MYSQL_ROOT_HOST=localhost
 ports:
 - '3306:3306'
 volumes:
 - db:/var/lib/mysql
 - ./init.sql:/docker-entrypoint-initdb.d/init.sql
 volumes:
 db:
 driver: local
3.3.使用多个绑定安装
最后,让我们将之前的Localstack 示例转换为Docker Compose:
services:
 localstack:
 privileged: true
 image: localstack/localstack:latest
 container_name: localstack
 ports:
 - '4563-4599:4563-4599'
 - '8055:8080'
 environment:
 - SERVICES=s3
 - DEBUG=1
 - DATA_DIR=/tmp/localstack/data
 volumes:
 - './.localstack:/var/lib/localstack'
 - '/var/run/docker.sock:/var/run/docker.sock'
4。结论
在本文中,我们了解了如何使用Docker 创建多个挂载。
我们已经看到了绑定挂载和命名卷的一些组合。我们还看到了使用Docker 命令行和Docker Compose 的用例。

 
							 
										
										 
										
										 
										
										
										 
										
										 
										
										 
										
										
0 评论