راهنمای کامل داکر والیوم‌ها

منتشر‌شده در towardsdatascience به تاریخ ۱۷ جولای ۲۰۲۱
لینک منبع The Complete Guide to Docker Volumes

داده‌های تولید شده و مورد استفاده توسط کانتینرها پس از راه‌اندازی مجدد یا حذف کانتینرها ادامه پیدا نمی‌کند. بنابراین ، می توانیم از Docker volumes و bind mounts برای مدیریت داده‌ها در محفظه‌های داکر استفاده کنیم تا این مسئله حل شود. ما می‌توانیم از آن برای باقی ماندن داده‌ها در یک ظرف یا به اشتراک گذاشتن داده‌ها بین ظروف استفاده کنیم. از این پست، شما می‌آموزید که چگونه از داکر والیوم و bind mounts در پروژه خود استفاده کنید.

برپاسازی

داکر از انواع حجم‌های زیر و bind mounts برای ادامه داده‌ها استفاده می‌کند. برای این چیدمان، من از macOS استفاده می‌کنم.

  1. حجم‌های ناشناس
  2. حجم‌های نام گذاری شده
  3. و Bind mounts

برای این پست، ما یک سرور MySQL را اجرا خواهیم کرد و برخی از دستورها را اجرا خواهیم کرد. به طور پیش‌فرض، MySQL پرونده‌های داده خود را در داخل دایرکتوری /var/lib/mysql در محفظه ذخیره می‌کند و حجم‌های داکر به ما کمک می‌کند تا این داده‌ها را حفظ کنیم.

ما سه فایل docker-Come.yml برای نمایش حجم و bind mounts داریم. برای شروع این فایل‌ها، باید از دستور زیر استفاده کنید.

docker compose up

هنگامی که ظرف ما در حال اجرا است، می‌توانیم از دستورهای زیر برای ایجاد یک جدول در داخل ظرف خود برای اهداف آزمایش استفاده کنیم.

# Access the container
docker exec -it mysql_db_1 bash# Connect to MySQL server
mysql -uroot -proot# Run MySQL commands
USE test_db;
SHOW TABLES;
CREATE TABLE users (
user_id int NOT NULL AUTO_INCREMENT,
name VARCHAR(20),
PRIMARY KEY (user_id)
);
SHOW TABLES;

۱. حجم‌های بدون نام

اگر فایل docker-Come.yml زیر را اجرا کنیم، یک حجم ناشناس ایجاد خواهد شد. اگر ظرف خود را دوباره راه‌اندازی کنیم، داده‌ها قابل‌مشاهده خواهند بود، اما نه بعد از این که ظرف را حذف کنیم. همچنین، این دستگاه توسط کانتینرهای دیگر در دسترس نیست. اگر بخواهیم به طور موقت داده‌ها را حفظ کنیم، مفید خواهد بود. این حجم‌ها در فهرست /var/lib/docker/volume میزبان محلی ایجاد می‌شوند.

version: '3.8'
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test_db
ports:
- "3306:3306"
volumes:
- /var/lib/mysql

همانطور که می‌توانیم ببینیم، لازم نیست شاخه میزبان را مشخص کنیم. ما فقط باید دایرکتوری داخل ظرف را مشخص کنیم.

اگر دستورالعمل حجم را از پرونده docker-compose.yml حذف کنیم، ظرف به طور پیش‌فرض یک حجم ناشناس ایجاد می‌کند زیرا در MySQL Dockerfile مشخص شده است. بنابراین، تصویر MySQL تضمین می‌کند که ما هنوز هم می‌توانیم به داده‌ها دسترسی داشته باشیم اگر ما هیچ اطلاعات حجمی را فراهم نکنیم.

VOLUME /var/lib/mysql

اکنون، ما یک حجم ناشناس با یک شناسه تصادفی داریم.

docker volume ls
DRIVER VOLUME NAME
local 4e679725b7179e63e8658bc157a1980f320948ab819f271fd5a44fe94c16bf23

بیایید سفارشی کننده داکر خود را بررسی کنیم.

docker inspect mysql_db_1
.
.
."Mounts": [
{
"Type": "volume",
"Name": "4e679725b7179e63e8658bc157a1980f320948ab819f271fd5a44fe94c16bf23",
"Source": "/var/lib/docker/volumes/4e679725b7179e63e8658bc157a1980f320948ab819f271fd5a44fe94c16bf23/_data",
"Destination": "/var/lib/mysql",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
.
.
.

می‌توانیم از دستور زیر برای حذف ظرف و حجم ناشناس مربوط به آن استفاده کنیم.

docker rm -v mysql_db_1

اگر حجم بی‌نام و نشان و ظرف را با هم حذف نکنیم، به یک حجم معلق تبدیل می‌شود.

docker rm mysql_db_1

ما می‌توانیم تمام حجم‌های معلق شده را با استفاده از دستورهای زیر لیست کرده و حذف کنیم.

docker volume ls -qf dangling=true
docker volume rm $(docker volume ls -qf dangling=true)

۲. حجم‌های نام گذاری شده

حجم‌های نامگذاری شده می‌توانند داده‌ها را پس از راه‌اندازی مجدد یا حذف یک ظرف ادامه دهند. همچنین، توسط کانتینرهای دیگر قابل دسترسی است. این حجم‌ها در دایرکتوری میزبان محلی /var/lib/docker/volume ایجاد می‌شوند.

version: '3.8'
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test_db
ports:
- "3306:3306"
volumes:
- db_data:/var/lib/mysqlvolumes:
db_data:

در اینجا، اولین زمینه نام منحصر به فردی از حجم روی ماشین میزبان است. بخش دوم مسیر درون ظرف است.

علاوه بر این، اگر ما ظرف را با استفاده از دستور زیر حذف کنیم، بر خلاف حجم‌های ناشناخته، همچنان حجم را خواهیم داشت.

docker rm -v mysql_db_1

۳. و Bind mounts

این Bind mounts می‌تواند داده‌ها را پس از راه‌اندازی مجدد یا حذف یک ظرف ادامه دهد. همانطور که می‌بینیم، حجم‌های نام گذاری شده و bind mounts یک‌سان هستند، به جز اینکه حجم‌های نام گذاری شده را می توان تحت یک دایرکتوری میزبان خاص یافت، و bind mounts می‌تواند هر دایرکتوری میزبان باشد.

version: '3.8'
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test_db
ports:
- "3306:3306"
volumes:
- $PWD/data:/var/lib/mysql

در اینجا ما در حال نصب یک پوشه میزبان هستیم. بخش اول مسیر در ماشین میزبان است. بخش دوم مسیر درون ظرف است.

دستورها

حال، اجازه دهید تمام دستورها موجود برای دستورالعمل حجم را لیست کنیم.

docker volume --help

Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes

ما می‌توانیم از این دستورها برای مدیریت حجم‌های ناشناس و حجم‌های نام گذاری شده استفاده کنیم.

# Creat a volume
docker volume create test-vol
# test-vol# Inspect a volume
docker inspect test-vol
# [
# {
# "CreatedAt": "2021-07-17T07:23:25Z",
# "Driver": "local",
# "Labels": {},
# "Mountpoint": "/var/lib/docker/volumes/test-vol/_data",
# "Name": "test-vol",
# "Options": {},
# "Scope": "local"
# }
# ]# List all volumes
docker volume create test-vol-2
docker volume ls
# DRIVER VOLUME NAME
# local test-vol
# local test-vol-2# Remove all volumes
docker volume prune
# WARNING! This will remove all local volumes not used by at least one container.
# Are you sure you want to continue? [y/N] y
# Deleted Volumes:
# test-vol
# test-vol-2# Remove volumes
docker volume create test-vol-3
docker volume rm test-vol-3
# test-vol-3docker volume create test-vol-4
docker volume create test-vol-5
docker volume rm test-vol-4 test-vol-5
# test-vol-4
# test-vol-5

امیدوارم درک درستی از داکر والیوم‌ها و bind mounts پیدا کرده باشید. این به شما کمک می‌کند داد‌ه‌ها را برای پروژه‌های داکر خود حفظ کنید. تبریک برای کدگذاری!

این متن با استفاده از ربات ترجمه مقاله علم داده ترجمه شده و به صورت محدود مورد بازبینی انسانی قرار گرفته است.در نتیجه می‌تواند دارای برخی اشکالات ترجمه باشد.
مقالات لینک‌شده در این متن می‌توانند به صورت رایگان با استفاده از مقاله‌خوان ترجمیار به فارسی مطالعه شوند.