在 Docker 容器上掛載多個卷
一、概述
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 的用例。
與往常一樣,我們可以在 GitHub 上找到工作代碼示例。