پرش به مطلب اصلی

ساخت کانتینر

دستور create برای ساخت تعریف یک کانتینر استفاده می‌شود. این دستور کانتینر را اجرا نمی‌کند، فقط کانفیگ آن را آماده می‌کند که بعداً بتوان کانتینر را با دستور start اجرا کرد.


🧩 دستور کلی

k3 container create [options] <containerId> <imageName:imageTag>

آرگومان‌ها:

  • containerId: شناسه‌ی دلخواه برای کانتینر که توسط کاربر تعیین می‌شود
  • imageName:imageTag: نام و تگ ایمیجی که کانتینر از روی آن ساخته می‌شود

⚙️ گزینه‌ها (Options)

🔧 گزینه‌های پیکربندی پایه‌ای

گزینهتوضیح
--console-socket <SOCK>مسیر سوکتی که انتهای ptmx ترمینال کانتینر به آن متصل می‌شود
-f, --config <FILE>مسیر فایل کانفیگ OCI جایگزین برای تنظیمات کانتینر (فقط فایل‌های OCI پذیرفته می‌شوند)
--pid-file <FILE>مسیر فایلی که شناسه‌ی فرآیند (PID) کانتینر در آن ذخیره می‌شود
--hostname <HOSTNAME>تنظیم نام میزبان (hostname) برای کانتینر
--args <string>دستور یا برنامه‌ای که به‌عنوان فرآیند اصلی کانتینر اجرا می‌شود در صورتی که داده نشود از دیفالت خود ایمیج استفاده میکند

🔐 گزینه‌های امنیتی

گزینهتوضیح
--privilegedدادن دسترسی‌های گسترده‌تر (privileged mode) به کانتینر (درحال توسعه)
--cap-add [CAP...]اضافه کردن قابلیت‌های خاص لینوکس به کانتینر (می‌تواند چند بار استفاده شود)
--cap-drop [CAP...]حذف قابلیت‌های پیش‌فرض لینوکس از کانتینر (می‌تواند چند بار استفاده شود)
--no-new-keyringاستفاده از session key قبلی (برای تنظیمات امنیتی خاص)
--no-pivotغیرفعال کردن تغییر ریشه‌ی فایل‌سیستم (pivot_root)
--no-subreaperغیرفعال کردن ساخت فرآیند subreaper (در حال حاضر نادیده گرفته می‌شود)

💾 گزینه‌های منابع سیستمی

گزینهتوضیح
--cpus <NUM>محدود کردن تعداد CPU قابل استفاده برای کانتینر
--no-sharedاستفاده از CPU‌های اختصاصی به جای CPU‌های مشترک (به صورت پیش‌فرض CPU‌های مشترک استفاده می‌شود)
--memory <SIZE>محدود کردن میزان حافظه‌ی قابل استفاده برای کانتینر
--diskLimit <NUM>محدود کردن استفاده از دیسک کانتینر (بر حسب مگابایت - به صورت پیش‌فرض از دیسک میزبان استفاده می‌کند)
--mount <mount...>تعریف نقاط mount برای کانتینر (می‌تواند چند بار استفاده شود)
-v, --volume [item...]تعریف volume برای کانتینر

🔄 گزینه‌های ریستارت

گزینهتوضیح
--restart <POLICY>سیاست ریستارت کانتینر: none, always, unless-stopped, on-failure
--restartDelay <NUM>مدت زمان تأخیر (بر حسب ثانیه) بین هر تلاش برای ریستارت کانتینر
--restartWindow <NUM>بازه‌ی زمانی (بر حسب ثانیه) برای بررسی تعداد تلاش‌های ریستارت
--maxAttempts <NUM>حداکثر تعداد تلاش برای ریستارت کانتینر

🌍 گزینه‌های شبکه

گزینهتوضیح
-n, --network <Network>اضافه کردن کانتینر به شبکه مشخص (می‌توان نام شبکه یا شناسه شبکه را استفاده کرد)
--ip <IPv4>اختصاص یک آدرس IP ثابت به کانتینر
--mac <MAC>اختصاص یک آدرس MAC خاص به کانتینر
-p, --publish [hostPort:containerPort...]نگاشت پورت‌های میزبان به پورت‌های کانتینر (می‌تواند چند بار استفاده شود)

🔤 گزینه‌های محیطی و دیگری

گزینهتوضیح
-e, --env [KEY=VALUE...]تنظیم متغیرهای محیطی (می‌تواند چند بار استفاده شود)
--debugحالت دیباگ برای ایجاد کانتینر
-h, --helpنمایش راهنمای کامل دستور

📥 مثال‌های کاربردی

مثال ۱: کانتینر ساده با متغیرهای محیطی و mount

k3 container create \
mycontainer \
alpine:latest \
--hostname myhost \
--args "tail -f /dev/null" \
-e DATABASE_URL=postgres://localhost \
-e LOG_LEVEL=debug \
--mount type=bind,source=/host/data,target=/app/data

مثال ۲: کانتینر با محدودیت منابع (CPU، حافظه، دیسک)

k3 container create \
limited-container \
ubuntu:22.04 \
--cpus 2 \
--memory 1GB \
--diskLimit 5000 \
--args "sleep 3600"

مثال ۳: کانتینر با CPU اختصاصی (بدون اشتراک)

k3 container create \
dedicated-cpu-container \
nginx:latest \
--cpus 4 \
--no-shared \
--args "nginx -g 'daemon off;'"

مثال ۴: کانتینر با تنظیمات شبکه‌ای

k3 container create \
web-container \
nginx:latest \
-n mynetwork \
--ip 192.168.1.10 \
--mac 02:42:ac:11:00:02 \
-p 8080:80 \
-p 8443:443

مثال ۵: کانتینر با سیاست ریستارت

k3 container create \
persistent-container \
alpine:latest \
--restart always \
--restartDelay 5 \
--restartWindow 60 \
--maxAttempts 5 \
--args "while true; do echo 'Running'; sleep 10; done"

مثال ۶: کانتینر با قابلیت‌های امنیتی خاص

k3 container create \
secure-container \
alpine:latest \
--cap-add NET_ADMIN \
--cap-add SYS_TIME \
--cap-drop SETUID \
--args "sleep 3600"

مثال ۷: کانتینر با تنظیمات ترکیبی (واقع‌گرایانه)

k3 container create \
app-container \
python:3.11 \
--hostname app-server \
--cpus 2 \
--no-shared \
--memory 2GB \
--diskLimit 10000 \
-e APP_ENV=production \
-e DATABASE_HOST=db.local \
-e CACHE_REDIS=redis:6379 \
-n app-network \
--ip 192.168.100.5 \
-p 5000:5000 \
--mount type=bind,source=/host/app,target=/app \
--mount type=bind,source=/host/logs,target=/var/log/app \
--restart unless-stopped \
--restartDelay 10 \
--maxAttempts 3 \
--args "python /app/main.py"

نکات مهم

  • CPU و دیسک: به صورت پیش‌فرض کانتینر می‌تواند CPU‌های مشترک استفاده کند و دیسک محدودیتی ندارد. برای اختصاصی کردن، از --no-shared استفاده کنید.

  • متغیرهای محیطی: برای جلوگیری از جایگزینی متغیرهای شل، باید از تک‌کوتیشن (single quotes) استفاده کنید:

    --args 'echo $HOME'  # $HOME داخل کانتینر چاپ می‌شود
  • Mount کردن: فرمت mount باید به‌صورت type=bind,source=<hostPath>,target=<containerPath> باشد.

  • سیاست ریستارت:

    • none: کانتینر ریستارت نمی‌شود
    • always: کانتینر همیشه ریستارت می‌شود
    • unless-stopped: کانتینر تا زمانی که توقف داده نشود، ریستارت می‌شود
    • on-failure: کانتینر فقط در صورت خطا ریستارت می‌شود
  • Config فایل: گزینه --config تنها فایل‌های OCI را می‌پذیرد.

  • قابلیت‌های لینوکس: گزینه‌های --cap-add و --cap-drop دسترسی‌های دقیق‌تری را برای کانتینر فراهم می‌کنند.


تست جامع

#!/bin/bash

echo "Starting k3 container create tests..."

echo "[1] Creating basic container"
sudo k3 container create basic-cont alpine:latest --args 'tail -f /dev/null'
echo

echo "[2] Creating container with environment variables"
sudo k3 container create env-cont alpine:latest \
-e VAR1=value1 \
-e VAR2=value2 \
--args 'sleep 60'
echo

echo "[3] Creating container with CPU and memory limits"
sudo k3 container create resource-cont alpine:latest \
--cpus 2 \
--memory 512MB \
--args 'sleep 60'
echo

echo "[4] Creating container with dedicated CPU (no-shared)"
sudo k3 container create dedicated-cont alpine:latest \
--cpus 1 \
--no-shared \
--args 'sleep 60'
echo

echo "[5] Creating container with disk limit"
sudo k3 container create disk-cont alpine:latest \
--diskLimit 1000 \
--args 'sleep 60'
echo

echo "[6] Creating container with network configuration"
sudo k3 container create net-cont alpine:latest \
-n mynetwork \
--ip 192.168.1.50 \
-p 8080:80 \
--args 'sleep 60'
echo

echo "[7] Creating container with mount points"
sudo k3 container create mount-cont alpine:latest \
--mount type=bind,source=/tmp,target=/data \
--args 'sleep 60'
echo

echo "[8] Creating container with capabilities"
sudo k3 container create cap-cont alpine:latest \
--cap-add NET_ADMIN \
--cap-drop SETUID \
--args 'sleep 60'
echo

echo "[9] Creating container with restart policy"
sudo k3 container create restart-cont alpine:latest \
--restart always \
--restartDelay 5 \
--maxAttempts 3 \
--args 'sleep 60'
echo

echo "[10] Creating complex container"
sudo k3 container create complex-cont ubuntu:22.04 \
--hostname complex-host \
--cpus 2 \
--memory 1GB \
--diskLimit 5000 \
-e APP_ENV=production \
-e DEBUG=false \
-n prod-network \
--ip 192.168.100.10 \
-p 3000:3000 \
--mount type=bind,source=/app,target=/var/app \
--restart unless-stopped \
--restartDelay 10 \
--maxAttempts 5 \
--args 'sleep 3600'
echo

echo "All container creation tests completed."

🆘 دریافت راهنما

برای مشاهده‌ی راهنمای کامل این دستور در خط فرمان:

k3 container create -h