مدتی میشه که من در لابراتوار خانگیام روی استقرار کانتینرهای DevOps کار میکنم و تصمیم گرفتم که لیستی از پرکاربرد ترین کانتینر ها را با شما به اشتراک بگذارم. در ادامه میخوام ده تا از کانتینر های برتر DevOps را که به عنوان بلوکهای ساختهشده مستقل برای DevOps مدرن عمل میکنند را مورد بررسی قرار دهیم و ببینیم که این کانتینر ها چی هستند و چگونه استفاده میشوند. در نظر داشته باشید که انتخاب این لیست صرفاً بر اساس نظر شخصی من است. ابتدا بیایید بررسی کنیم که دقیقاً DevOps چیست.
فهرست محتوا
DevOps چیست؟
DevOps یک اصطلاح است که چند سال اخیر به وجود آمده و فرآیندهای توسعه و عملیات را ترکیب میکند. این فرآیند تیمهای توسعه و عملیات IT را به صورت خودکار یکپارچه میکند. این روش به کاهش چشمگیر توسعه و تحویل ویژگیها، رفع باگها و بهروزرسانیهای نرم افزار کمک میکند.
مبنای DevOps
هستی DevOpsدر همکاری نهفته است. تیمهای DevOps به نزدیکی با تیمهای توسعه و زیرساخت (در برخی سازمانها این تیمها ممکن است یکسان باشند) کار میکنند. این همکاری منجر به فرآیندهای کاری کارآمدتر و قابل اعتماد میشود که به توسعه و استقرار نرمافزار سریعتر منجر میشود.
چرا کانتینرها اهمیت دارند؟
کانتینرها یکی از تکنولوژیهای اصلی هستند که DevOps بر پایه آن بنا شده است. کانتینرها یک برنامه و وابستگیها، فایلهای پیکربندی و غیره را در یک بسته اجرایی جمع آوری میکنند که یکنواختی را در میان چندین محیط فراهم میکند، از لپتاپ توسعهدهنده تا محیط آزمایشی و سپس به محیط تولید.
این امر باعث میشود که برنامهها بدون توجه به اینکه کجا اجرا میشوند، همیشه یکسان اجرا میشوند. به جای اینکه Image های یک سیستمعامل کامل باشند، مانند آنچه در یک ماشین مجازی نصب شده است، آنها Image برنامه هستند.
کانتینرها بسیار سریعتر و کوچکتر از ماشینهای مجازی هستند. ماشینهای مجازی به دلیل اندازه آنها نسبت به کانتینرها، باب پسند CI/CD نیستند. از این رو، کانتینرها به عنوان یک بخش اساسی از CI/CD بهتر عمل میکنند.
تعامل با سیستمعامل
برنامههای کانتینری روی یک سیستمعامل اجرا میشوند، اغلب درون ماشینهای مجازی. هسته سیستمعامل به چندین کانتینر اجازه میدهد تا در همان سیستمعامل اجرا شوند در حالی که فرآیندهای ایزوله دارند و در محیطهای مختلف به خوبی کار میکنند.
Kubernetes چیست؟
این پست بیشتر روی کانتینرهای Docker تمرکز دارد. با این حال، Kubernetes استاندارد غیررسمی در مدیریت و ارکستریشن برنامههای کانتینری در محیط DevOps است. Kubernetes به حل بسیاری از چالشها هنگام اجرای چندین کانتینر و مقیاس پذیری در محیط کسبوکار کمک میکند.
یک ارکستراتور کانتینر، کانتینرها را درون پادها سازماندهی میکند که هرکدام مسئول اجرا یک یا چند برنامه هستند و این فرآیندهای تحویل و یکپارچهسازی (CI/CD) را تقویت میکند.
ویژگیهایی مانند توازن بار خودکار، مکانیزمهای خود-درمانی و بازگشت به حالت پیشین، به تیمهای DevOps امکان مدیریت و نظارت بیشتر بر برنامههای خود را با استفاده از منابع کمتر میدهد. این یکپارچگی با کانتینرها و جریان کار خودکار آن باعث میشود که Kubernetes یک ابزار عالی در DevOps باشد.
لیست برترین کانتینرهای DevOps
خب، بهتر است به اصل مطلب بپردازیم و به سراغ کانتینرها برویم! ده کانتینر مد نظر من شامل موارد زیر میگردد. برای هر یک از آنها یک فایل Docker-compose هم قرارداده شده که به سادگی بتوانید آنها را در آزمایشگاه خود اجرا کنید.
- Gitlab
- Jenkins
- Harbor
- Hashicorp Vault
- ArgoCD
- Sonarqube
- Prometheus
- Grafana
- Traefik
- Nginx Proxy Manage
۱. GitLab: هاب توسعه مشارکتی
GitLab یک مخزن کد است که قابلیتهای بسیار فراهم میکند. همچنین یک پلتفرم کامل برای DevOps کانتینری است که برای استقرار کانتینرها و همکاری بین تیمهای DevOps استفاده میشود. من ترجیح میدهم از GitLab در محیط لابراتوار خانگی خود و محیطهای تولیدی که با آنها کار کردهام، استفاده کنم زیرا بسیار شناخته شده و سریع به دست میآید. البته Azure DevOps هم استفاده خاص خودش را دارد که در جایی دیگر به آن میپردازم.
ویژگیها
- CI/CD یکپارچه برای استقرار سریع کانتینر
- ابزارهای همکاری اساسی برای تیمهای DevOps
- قابلیت یکپارچه سازی Kubernetes که ارکستریشن کانتینرها کمک کننده است
- دانلود GitLab
کد Docker Compose:
version: '3.8'
services:
gitlab:
image: gitlab/gitlab-ee:latest
hostname: 'gitlab.mydomain.com'
restart: always
volumes:
- '~/homelabservices/gitlab/data:/var/opt/gitlab'
- '~/homelabservices/gitlab/config:/etc/gitlab'
- '~/homelabservices/gitlab/logs:/var/log/gitlab'
container_name: gitlab
در نظر داشته باشید که فایل بالا صرفا برای استفاده آزمایشگاهی توصیه میشود و اگر میخواهید از GitLab به عنوان ابزار تیمی خود استفاده کنید، پیشنهاد میکنم که از روش های موجود در مستندات GitLab استفاده کنید.
۲. Jenkins: قدرت ادامه یکپارچه
Jenkins یک راهحل CI/CD بسیار معتبر در DevOps است که در تخصص ادامه و ساخت کانتینرها متخصص است. این ابزار دارای تعداد زیادی افزونه است و امکان یکپارچه سازی با ابزارهای زیادی را دارد که قابلیتهای آن را گسترش میدهد و توسط بسیاری از سازمانها در سراسر جهان استفاده میشود. همچنین، برای استفاده بسیاری از افراد در لابراتوار خانگی محبوب است.
ویژگیها
- ساخت و تست خودکار برای برنامههای کانتینری
- تسهیل ادامه در محیط کانتینر
- پشتیبانی از چندین کانتینر با یک اکوسیستم بزرگ افزونه
- دانلود Jenkins
کد Docker Compose:
version: '3.8'
services:
jenkins:
image: jenkins/jenkins:lts
privileged: true
user: root
ports:
- ۸۰۸۰:۸۰۸۰
- ۵۰۰۰۰:۵۰۰۰۰
container_name: jenkins
volumes:
- /home/jenkins_compose/jenkins_configuration:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
۳. Harbor: انبار امن کانتینرها
Harbor یک Registry امن کانتینر است که برای مدیریت و امن کردن Image های کانتینر حیاتی است. همانطور که میدانید Docker Hub تنها یک مخزن خصوصی رایگان در اختیار شما قرار میدهد و سایر مخازن شما در دسترس عموم خواهد بود. با Harbor میتوانید تعداد نامحدودی از Image ها و Artifact های خود را به صورت محلی (Local) نگهداری کنید.
ویژگیها
- اجرای کنترل دسترسی بر اساس نقش برای Image ها
- نگهداری تصاویر بر اساس سیاستهای مصوب شما
- اسکن تصاویر کانتینر برای آسیبپذیریها
- دانلود Harbor Registry
کد Docker Compose:
curl -LO https://raw.githubusercontent.com/bitnami/containers/main/bitnami/harbor-portal/docker-compose.yml
curl -L https://github.com/bitnami/containers/archive/main.tar.gz | tar xz --strip=2 containers-main/bitnami/harbor-portal && cp -RL harbor-portal/config . && rm -rf harbor-portal
docker-compose up
۴. HashiCorp Vault: نگهبان رمزها
HashiCorp Vault یک کانتینر DevOps حیاتی برای مدیریت رمزها درون یک Environment کانتینری است. این یک راه عالی برای ذخیره رمزهایی است که در کد DevOps شما فراخوانده میشوند، بنابراین نیازی به کدگذاری سخت (Hard code کردن) در Pipeline ها، فایلهای پیکربندی و غیره ندارد.
ویژگیها
- تولید رمزهای پویا برای کانتینرها
- رمزگذاری داده برای کانتینرها در حال انتقال و در استراحت
- دسترسی موقت به رمزها
- داکر هاب Docker Hub
کد Docker Compose:
version: '3.6'
services:
vault:
image: vault:latest
container_name: vault
restart: on-failure:10
ports:
- "۸۲۰۱:۸۲۰۱"
environment:
VAULT_ADDR: 'https://0.0.0.0:8201'
cap_add:
- IPC_LOCK
volumes:
- vault-volume:/data
healthcheck:
retries: 5
command: ./workflow-vault.sh
networks:
- sk_cloud
۵. ArgoCD: استاد CD در Kubernetes
ArgoCD یک ابزار مستقرسازی کانتینری برای Kubernetes است. این به تیمهای DevOps این امکان را میدهد تا به راحتی و بدون هیچ گونه دخل و تصرفی کانفیگهای مختلفی را مدیریت کنند. ArgoCD از دید DevOps باعث سهولت استقرار در Kubernetes میشود.
ویژگیها
- استقرار و مدیریت یکپارچه کانفیگهای Kubernetes
- مشاهده ورژنهای مختلف برنامهها و محیطها
- ادغام با CI/CD و ابزارهای مختلف دیگر
- دانلود ArgoCD اینجا
کد Docker Compose:
version: '2'
services:
argo-cd:
image: docker.io/bitnami/argo-cd:2
۶. SonarQube: نظارت بر کیفیت کد
SonarQube یک ابزار نظارت بر کیفیت کد است که به تیمهای DevOps کمک میکند تا کد خود را تحلیل کرده و از جنبههای مختلف مانند تشخیص باگها، آسیب پذیری های کد و جلوگیری از بدهی فنی اطلاعات کسب کنند. این ابزار اطلاعات مفصلی از جمله امتیاز کد، پوشش کد، اطلاعات پیچیدگی کد و غیره فراهم میکند.
ویژگیها
- تحلیل جزییات از جمله امتیاز کد و پوشش کد
- اطلاعات مفصل از جمله تشخیص باگها و آسیب پذیری کد
- پشتیبانی از چندین زبان برنامهنویسی
- داکر هاب SonarQube
کد Docker Compose:
se code:
version: "3"
services:
sonarqube:
image: sonarqube:community
hostname: sonarqube
container_name: sonarqube
depends_on:
- db
environment:
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: sonar
volumes:
- sonarqube_data:/opt/sonarqube/data
- sonarqube_extensions:/opt/sonarqube/extensions
- sonarqube_logs:/opt/sonarqube/logs
ports:
- "۹۰۰۰:۹۰۰۰"
db:
image: postgres:13
hostname: postgresql
container_name: postgresql
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
POSTGRES_DB: sonar
volumes:
- postgresql:/var/lib/postgresql
- postgresql_data:/var/lib/postgresql/data
volumes:
sonarqube_data:
sonarqube_extensions:
sonarqube_logs:
postgresql:
postgresql_data:
۷. Prometheus: نگهبان کانتینرها
Prometheus یک سیستم نظارت و هشدار برای سیستمهای کانتینری است. این ابزار به تیمهای DevOps این امکان را میدهد تا به سرعت اطلاعات عملکرد کانتینرها و سیستمها را مانیتور کنند. این دادهها به تصمیمگیریهای مهم مربوط به مقیاسپذیری و بهینهسازی عملکرد کمک میکنند.
ویژگیها
- نظارت بر کانتینرها و محیطهای کانتینری
- اندازهگیری عملکرد برنامهها و سیستمها
- ایجاد هشدارها بر اساس شرایط تعریف شده
- دانلود Prometheus
کد Docker Compose:
version: '3.8'
volumes:
prometheus_data: {}
grafana_data: {}
services:
prometheus:
image: prom/prometheus
restart: always
volumes:
- ./prometheus:/etc/prometheus/
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/usr/share/prometheus/console_libraries'
- '--web.console.templates=/usr/share/prometheus/consoles'
ports:
- ۹۰۹۰:۹۰۹۰
۸. Grafana: متخصص تجسم داده
Grafana یک ابزار تجسم داده برای داشبوردها و گزارشات است که با Prometheus سازگار است. این به تیمهای DevOps این امکان را میدهد تا اطلاعات نظارتی را به وسیله گرافها، نمودارها و داشبوردهای تخصصی بصریسازی کنند. این ابزار مفید برای ارائه دید گستردهتری از عملکرد برنامهها و سیستمها است.
ویژگیها
- تجسم دادههای مانیتورینگ بر اساس Prometheus و سایر منابع
- ایجاد داشبوردهای تخصصی با گرافها و نمودارها
- ایجاد هشدارها و اعلانها بر اساس شرایط تعریف شده
- دانلود Grafana
کد Docker Compose:
version: "3.8"
services:
grafana:
image: grafana/grafana-enterprise
container_name: grafana
restart: unless-stopped
ports:
- '۳۰۰۰:۳۰۰۰'
۹. Traefik: مسیریاب ترافیک
Traefik به طور کارآمد ترافیک را در بین چندین کانتینر توزیع میکند و امکان کشف خودکار سرویس و میانبر برای اصلاح درخواستها و پاسخها را فراهم میکند. همچنین، این قابلیت را دارد که گواهینامههای SSL برای کانتینرهای شما مدیریت کند و از آنها برای اتوماسیون گواهینامهها و تجدید نظرها استفاده کند.
ویژگیها
- کشف خودکار سرویس در محیطهای کانتینری
- پشتیبانی از میانبرها و تغییرات پویا در درخواستها و پاسخها
- داشبورد واسط کاربری شفاف برای نظارت
- داکر هاب Traefik
کد Docker Compose:
version: '3.3'
services:
traefik2:
image: traefik:latest
restart: always
command:
- "--log.level=DEBUG"
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=true"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--entrypoints.web.http.redirections.entryPoint.to=websecure"
- "--entrypoints.web.http.redirections.entryPoint.scheme=https"
ports:
- ۸۰:۸۰
- ۴۴۳:۴۴۳
networks:
- traefik
volumes:
- /var/run/docker.sock:/var/run/docker.sock
container_name: traefik
۱۰. Nginx Proxy Manager: استاد پروکسی
Nginx Proxy Manager به سادگی مدیریت هاستهای پروکسی را در کانتینرها فراهم میکند و مدیریت آسان پروتکلهای HTTP و HTTPS را فراهم میکند. همچنین، قابلیت مدیریت گواهینامههای Let’s Encrypt و تجدید نظرهای آنها را دارد.
ویژگیها
- مدیریت ساده پروکسی در محیطهای کانتینری
- پشتیبانی از پروتکلهای HTTP و HTTPS
- ارائه پشتیبانی از اتصال امن به وسیله گواهینامههای SSL
- داکر هاب Nginx Proxy Manager
کد Docker Compose:
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: always
networks:
- nginxproxy
ports:
# These ports are in format <host-port>:<container-port>
- '۸۰:۸۰' # Public HTTP Port
- '۴۴۳:۴۴۳' # Public HTTPS Port
- '۸۱:۸۱' # Admin Web Port
# Add any other Stream port you want to expose
# - '۲۱:۲۱' # FTP
environment:
# Mysql/Maria connection parameters:
DB_MYSQL_HOST: "db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "npm"
DB_MYSQL_NAME: "npm"
# Uncomment this if IPv6 is not enabled on your host
# DISABLE_IPV6: 'true'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
depends_on:
- db
db:
image: 'jc21/mariadb-aria:latest'
restart: always
networks:
- nginxproxy
environment:
MYSQL_ROOT_PASSWORD: 'npm'
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: 'npm'
volumes:
- ./mysql:/var/lib/mysql
سوالات متداول
چگونه کانتینرسازی به فرآیند توسعه نرمافزار کمک میکند؟
کانتینرها برنامهها را به تصاویری (Image) تبدیل میکنند که شامل وابستگیها و تنظیمات لازم در یک بسته اجرایی واحد میشوند. این رویکرد باعث ایجاد یکسانی در محیطهای مختلف میشود. این روش توسعه، استقرار و مقیاسپذیری برنامهها را سادهتر میکند و به تیمها امکان مدیریت و استقرار کانتینرها در مراحل مختلف چرخه توسعه را فراهم میکند.
چه ملاحظات امنیتی در DevOps مهم هستند؟
در DevOps، امنیت به طور متداول به عنوان DevSecOps اشاره میشود. این موضوع شامل پیادهسازی رویکردهای امنیتی از مراحل ابتدایی چرخه توسعه است. این رویکرد به تشخیص و کاهش مسائل امنیتی زودهنگام کمک میکند، اطمینان حاصل میکند که کانتینرهای مستقر شده امن هستند و محیط محاسباتی از تهدیدات ممکن محافظت میشود.
نقش سیستم عامل در کانتینرها چیست؟
سیستمعاملها برای استقرار کانتینرها بسیار حیاتی هستند، زیرا کانتینرها بر روی آنها اجرا میشوند، به طور معمول در داخل ماشینهای مجازی. هسته سیستمعامل اجازه میدهد تا چندین کانتینر فرآینههای مجزا را اجرا کنند و در عین حال از همان سیستمعامل استفاده کنند. این تنظیم اجازه میدهد تا چندین کانتینر را بر روی یک ماشین مجازی مستقر کرد و از منابع سختافزاری به صورت کارآمد استفاده کرد، همچنین اطمینان حاصل شود که برنامهها به یکنواختی در محیطهای مختلف اجرا میشوند.
چرا ارکستریشن کانتینرها اهمیت دارد؟
مدیریت و کنترل کانتینرها یکی از جوانترین و مؤثرترین تکنولوژیهای مدرن در محیطهای توسعه و اجرای نرمافزار است. این تکنولوژی به اجرای هماهنگ و مدیریت کارکرد کانتینرها در یک برنامه یا سیستم کمک میکند. مدیریت کانتینرها به تنهایی میتواند پیچیده شود، اما یک ارکستریشن (orchestration)، تسهیلاتی برای مدیریت و کنترل گستردهتر و پیچیدهتر ارائه میدهد.
ارکستریشن کانتینرها کارهای متعددی را انجام میدهد و همین امر آنها را تبدیل به یکی از اصولیترین عناصر در ایجاد و اجرای برنامهها میکند. به طور کلی، ارکستریشن کانتینرها به توسعه و مدیریت نرمافزارها در محیطهای ابری و محلی (Local) کمک میکند و به شرکتها این امکان را میدهد تا برنامههای خود را به صورت بهتر، قابل اعتمادتر، و با کارایی بالاتر اجرا کنند.
آیا DevOps به پلتفرمهای سختافزاری خاصی وابسته است؟
خیر، اصول DevOps میتوانند بر روی پلتفرمهای سختافزاری مختلف اجرا شوند. کانتینرها به برنامهها امکان میدهند که در هر محیط محاسباتی که از یک زمینه اجرای کانتینر پشتیبانی میکند، اجرا شوند. با این قابلیت، تیمهای DevOps میتوانند برنامهها را در چندین پلتفرم سختافزاری اجرا و مستقر کنند، از لپتاپ توسعهدهنده تا زیرساخت مبتنی بر ابر.
چگونه کانتینرها از CI/CD پشتیبانی میکنند؟
کانتینرها با فراهم کردن یک محیط یکنواخت و قابل تکرار برای ساخت، آزمایش و استقرار برنامهها، از CI/CD پشتیبانی میکنند. آنها برنامه و وابستگیهای آن را در خود شامل میشوند، به این معنا که برنامه بهراحتی میتواند از طریق CI/CD حرکت کند و نگران عدم یکنواختی بین مراحل مختلف چرخه توسعه نباشد. آنها همچنین به مراتب کوچکتر از ماشینهای مجازی هستند که آنها را بسیار CI/CDپسند میکند.
جمعبندی
دنیای DevOps بر پایه فناوریهای کانتینرسازی ساخته شده است. چندین کانتینر DevOps ویژگیها و قابلیتهای اساسی مورد نیاز برای این تکنولوژی را فراهم میکنند. مهندسان DevOps میتوانند از این راهحلهای کانتینرسازی با هم استفاده کنند تا CI/CD های کارآمد، کدهای بهینهسازی شده و چرخههای توسعه مفهومی را داشته باشند.
آخرین دیدگاهها