مدتی میشه که من در لابراتوار خانگی‌ام روی استقرار کانتینرهای 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 هم قرارداده شده که به سادگی بتوانید آنها را در آزمایشگاه خود اجرا کنید.

  1. Gitlab
  2. Jenkins
  3. Harbor
  4. Hashicorp Vault
  5. ArgoCD
  6. Sonarqube
  7. Prometheus
  8. Grafana
  9. Traefik
  10. 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 می‌شود.

اهمیت argo cd در devops و kubernetes

ویژگی‌ها

  • استقرار و مدیریت یکپارچه کانفیگ‌های Kubernetes
  • مشاهده ورژن‌های مختلف برنامه‌ها و محیط‌ها
  • ادغام با CI/CD و ابزارهای مختلف دیگر
  • دانلود ArgoCD اینجا

کد Docker Compose:

version: '2'

services:
  argo-cd:
    image: docker.io/bitnami/argo-cd:2

۶. SonarQube: نظارت بر کیفیت کد

SonarQube یک ابزار نظارت بر کیفیت کد است که به تیم‌های DevOps کمک می‌کند تا کد خود را تحلیل کرده و از جنبه‌های مختلف مانند تشخیص باگ‌ها، آسیب پذیری های کد و جلوگیری از بدهی فنی اطلاعات کسب کنند. این ابزار اطلاعات مفصلی از جمله امتیاز کد، پوشش کد، اطلاعات پیچیدگی کد و غیره فراهم می‌کند.

بهبود کد با سونارکیوب در 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 این امکان را می‌دهد تا به سرعت اطلاعات عملکرد کانتینرها و سیستم‌ها را مانیتور کنند. این داده‌ها به تصمیم‌گیری‌های مهم مربوط به مقیاس‌پذیری و بهینه‌سازی عملکرد کمک می‌کنند.

نقش پرومته در 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 این امکان را می‌دهد تا اطلاعات نظارتی را به وسیله گراف‌ها، نمودارها و داشبوردهای تخصصی بصری‌سازی کنند. این ابزار مفید برای ارائه دید گسترده‌تری از عملکرد برنامه‌ها و سیستم‌ها است.

استفاده از گرافانا در devops

ویژگی‌ها

  • تجسم داده‌های مانیتورینگ بر اساس Prometheus و سایر منابع
  • ایجاد داشبوردهای تخصصی با گراف‌ها و نمودارها
  • ایجاد هشدارها و اعلان‌ها بر اساس شرایط تعریف شده
  • دانلود Grafana

کد Docker Compose:

version: "3.8"
services:
  grafana:
    image: grafana/grafana-enterprise
    container_name: grafana
    restart: unless-stopped
    ports:
     - '۳۰۰۰:۳۰۰۰'

۹. Traefik: مسیریاب ترافیک

Traefik به طور کارآمد ترافیک را در بین چندین کانتینر توزیع می‌کند و امکان کشف خودکار سرویس و میانبر برای اصلاح درخواست‌ها و پاسخ‌ها را فراهم می‌کند. همچنین، این قابلیت را دارد که گواهینامه‌های SSL برای کانتینرهای شما مدیریت کند و از آنها برای اتوماسیون گواهینامه‌ها و تجدید نظرها استفاده کند.

ترافیک در devops

ویژگی‌ها

  • کشف خودکار سرویس در محیط‌های کانتینری
  • پشتیبانی از میانبرها و تغییرات پویا در درخواست‌ها و پاسخ‌ها
  • داشبورد واسط کاربری شفاف برای نظارت
  • داکر هاب 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 و تجدید نظرهای آنها را دارد.

تصویر nginx proxy manager دواپس

ویژگی‌ها

  • مدیریت ساده پروکسی در محیط‌های کانتینری
  • پشتیبانی از پروتکل‌های 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 های کارآمد، کدهای بهینه‌سازی شده و چرخه‌های توسعه مفهومی را داشته باشند.