Laravel + Docker + Gitlab. من أين نبدأ

عادة ما كنت أفعل ذلك دائمًا بدون عامل ميناء واعتقدت أن عامل الميناء مطلوب فقط للمشاريع الكبيرة في الشركات الكبيرة. ولكن في أحد الأيام رأيت كيف يعمل عامل الرصيف جنبًا إلى جنب مع gitlab الخاص بصديق وأدركت أنه لا يزال يتعين علي دراسته. ومع ذلك ، كما يحدث عادة ، لم أجد مقالًا واحدًا مناسبًا - فقد كان إما معقدًا جدًا أو غير مكتمل ، أو يعني ضمنيًا أنك تعرف جميعًا بمفرده. كان علي أن أبحث عن مصادر مختلفة لفترة طويلة ، وأجمعها كلها وفي النهاية تمكنت من إنشاء مشروع بسيط و CI / CD لذلك.

يمكن تقسيم جميع الأعمال إلى ثلاثة أجزاء: على الجهاز المحلي ، على Hitlab وعلى الخادم.

لذا ، من أجل تنفيذ المشروع ، نحتاج إلى حساب gitlab وخادم بعيد مع ظاهرية KVM أو XEN.

الجزء 1. الجهاز المحلي


على الجهاز المحلي ، تحتاج إلى تثبيت عامل الميناء.

تعليق
. Docker Linux ( Ubuntu, ), Windows MacOS. macos , Windows . - , linux . - , . VirtualBox. Ubuntu

للتثبيت على بيئة Linux ، يجب تشغيل الأوامر التالية.

حذف الحاويات القديمة:

sudo apt-get remove docker docker-engine docker.io containerd runc

تحديث apt:

sudo apt-get update

قم بتثبيت الحزم التالية بحيث يمكنك تنزيل عامل الميناء من المستودع عبر https:

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

إضافة مفتاح عامل إرساء GPG رسمي:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

تأكد من صحة الطباعة:

sudo apt-key fingerprint 0EBFCD88

إجابة:

pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]

تنزيل نسخة مستقرة:

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

تحديث apt مرة أخرى:

sudo apt-get update

قم بتثبيت أحدث محرك إرساء:

sudo apt-get install docker-ce docker-ce-cli containerd.io

التحقق من عملية عامل الميناء:

sudo docker run hello-world

إذا كان كل شيء صحيحًا ، فسيبدأ تنزيل صورة Hello World.

تعليمات كاملة في الوثائق الرسمية لعمال الرصيف .

نحتاج أيضًا إلى تثبيت Docker-compose. التعليمات الرسمية هنا .

لتثبيته ، قم بتنفيذ الأوامر في الطرفية.

التنزيل من المستودع:

sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

إضافة حق ممارسة:

sudo chmod +x /usr/local/bin/docker-compose

التحقق من الإصدار:

sudo docker-compose --version

قمنا بتثبيت عامل الميناء ، والآن من الضروري جمع الصورة. للقيام بذلك ، استخدمت المقالة من الموقع الرقمي: www.digitalocean.com/community/tutorials/how-to-set-up-laravel-nginx-and-mysql-with-docker-compose-ru . سيكون هناك طبع من هذه المقالة.

تنزيل Laravel وتثبيت التبعيات

في الخطوة الأولى ، نقوم بتنزيل أحدث إصدار من Laravel وتثبيت تبعيات المشروع ، بما في ذلك Composer ، مدير حزم PHP على مستوى التطبيق. سنقوم بتثبيت هذه التبعيات باستخدام Docker حتى لا نقوم بإجراء تثبيت عالمي لـ Composer.

انتقل إلى دليل منزلك واستنسخ أحدث إصدار من Laravel في دليل يسمى laravel-app:

cd ~
git clone https://github.com/laravel/laravel.git laravel-app

انتقل إلى دليل تطبيق laravel:

cd ~/laravel-app

ثم قم بتثبيت صورة الملحن من Docker في الدلائل التي تحتاجها لمشروع Laravel الخاص بك لتجنب الحمل الزائد لتثبيت Composer عالميًا:

docker run --rm -v $(pwd):/app composer install

تنشئ علامتا -v و --rm للأمر docker حاوية افتراضية ترتبط بالدليل الحالي حتى يتم حذفها. سيتم نسخ محتويات دليل التطبيق ~ / laravel إلى الحاوية ، وسيتم نسخ محتويات الملحن التي تم إنشاؤها داخل حاوية مجلد البائع إلى الدليل الحالي.

في الختام ، قم بتعيين مستوى الأذونات في دليل المشروع بحيث يكون مملوكًا للمستخدم بدون امتيازات الجذر:

sudo chown -R $USER:$USER ~/laravel-app

سيكون هذا مهمًا عند كتابة ملف Dockerfile لصورة التطبيق الخاص بك ، لأنه سيسمح لك بالعمل مع رمز التطبيق وبدء العمليات في الحاوية بدون امتيازات الجذر.

الآن قمت بوضع رمز التطبيق ويمكنك المتابعة إلى تعريف الخدمات باستخدام Docker Compose.

يؤدي إنشاء Docker Compose File

Applications مع Docker Compose إلى تبسيط عملية التكوين والإصدار في البنية الأساسية الخاصة بك. لتخصيص تطبيق Laravel الخاص بنا ، سنقوم بإنشاء ملف إرساء مع تعريف خدمات خادم الويب وقاعدة البيانات والتطبيق.

افتح الملف:

nano ~/laravel-app/docker-compose.yml

يتم تحديد ثلاث خدمات في ملف إنشاء عامل الميناء: التطبيق ، خادم الويب و db. أضف التعليمات البرمجية التالية إلى الملف ، أثناء استبدال كلمة مرور الجذر لـ MYSQL_ROOT_PASSWORD ، المعرفة على أنها متغير بيئة خدمة db ، بكلمة مرور من اختيارك:

~/laravel-app/docker-compose.yml

version: '3'
services:

  #PHP Service
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: digitalocean.com/php
    container_name: app
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www
    networks:
      - app-network

  #Nginx Service
  webserver:
    image: nginx:alpine
    container_name: webserver
    restart: unless-stopped
    tty: true
    ports:
      - "80:80"
      - "443:443"
    networks:
      - app-network

  #MySQL Service
  db:
    image: mysql:5.7.22
    container_name: db
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_ROOT_PASSWORD: your_mysql_root_password
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    networks:
      - app-network

#Docker Networks
networks:
  app-network:
    driver: bridge

الخدمات التالية مدرجة هنا:

  • التطبيق: يحتوي تعريف الخدمة هذا على تطبيق Laravel ويطلق صورة Docker الشخصية ، digitalocean.com/php. كما تقوم بتعيين معلمة working_dir في الحاوية إلى / var / www.
  • خادم الويب: يأخذ تعريف الخدمة هذا الصورة nginx: alpine من Docker ويفتح المنفذين 80 و 443.
  • db: يقوم تعريف الخدمة هذا باسترداد الصورة mysql: 5.7.22 من Docker وتحديد متغيرات البيئة الجديدة ، بما في ذلك قاعدة بيانات laravel لتطبيقك وكلمة مرور الجذر لقاعدة البيانات. يمكنك استخدام أي اسم قاعدة بيانات تريده ، يجب عليك أيضًا استبدال your_mysql_root_password بكلمة المرور القوية الخاصة بك. يعيّن تعريف الخدمة هذا أيضًا منفذ المضيف 3306 إلى منفذ الحاوية 3306.

تحدد كل خاصية اسم حاوية اسم حاوية مطابق لاسم الخدمة. إذا لم تحدد هذه الخاصية ، ستعطي Docker أسماء كل حاوية تتكون من اسم شخص تاريخي وكلمة عشوائية ، مفصولة بشرطة سفلية.

لتبسيط التفاعل بين الحاويات ، تتصل الخدمات بالشبكة المتصلة التي تسمى شبكة التطبيق. تستخدم شبكة الاتصال جسراً برمجياً يسمح للحاويات المتصلة بهذه الشبكة بالتواصل مع بعضها البعض. يقوم برنامج تشغيل الجسر تلقائيًا بتعيين قواعد المضيف حتى لا تتمكن الحاويات الموجودة على شبكات الاتصال المختلفة من الاتصال مباشرة ببعضها البعض. يؤدي ذلك إلى تحسين أمان التطبيق لأنه يمكن فقط للخدمات ذات الصلة التواصل مع بعضها البعض. هذا يعني أيضًا أنه يمكنك تحديد شبكات وخدمات مختلفة تتصل بالوظائف ذات الصلة: على سبيل المثال ، يمكن لخدمات تطبيقات العميل استخدام شبكة الواجهة الأمامية ، ويمكن لخدمات الخادم استخدام شبكة الواجهة الخلفية.

الآن ، دعنا نرى كيفية إضافة وحدات التخزين وربط الصور المثبتة لتعريفات الخدمة لحفظ بيانات التطبيق بشكل دائم.

التخزين المستمر للبيانات

Docker لديه وسائل قوية ومريحة لتخزين البيانات المستمر. في تطبيقنا ، سنستخدم مجلدات وصور محملة لحفظ ملفات قاعدة البيانات وتطبيقاتها وتكويناتها بشكل دائم. توفر الأحجام مرونة النسخ الاحتياطي والاحتفاظ عند إنهاء دورة حياة الحاوية ، وتسهل الصور القابلة للتركيب القابلة للتثبيت تعديل التعليمات البرمجية أثناء التطوير من خلال عكس التغييرات على الفور لملفات المضيف أو الدلائل في الحاويات. نستخدم كلا الخيارين.

تحذير!
, , . , Docker . .

حدد وحدة التخزين المسماة dbdata في ملف إنشاء عامل إرساء في تعريف خدمة db للاستمرار في قاعدة بيانات MySQL:

~/laravel-app/docker-compose.yml

...
#MySQL Service
db:
  ...
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - app-network
  ...

يتم استخدام وحدة تخزين باسم dbdata لحفظ محتويات المجلد / var / lib / mysql داخل الحاوية بشكل دائم. هذا يسمح لك بإيقاف وإعادة تشغيل خدمة db دون فقدان البيانات.
أضف تعريف وحدة تخزين dbdata في نهاية الملف:

~/laravel-app/docker-compose.yml

...
#Volumes
volumes:
  dbdata:
    driver: local

باستخدام هذا التعريف ، يمكنك استخدام هذا الحجم لخدمات مختلفة.

ثم قم بإضافة ربط صورة التحميل إلى خدمة db لملفات تكوين MySQL:

~/laravel-app/docker-compose.yml

...
#MySQL Service
db:
  ...
    volumes:
      - dbdata:/var/lib/mysql
      - ./mysql/my.cnf:/etc/mysql/my.cnf
  ...

تربط هذه الصورة المحملة ملف ~ / laravel-app / mysql / my.cnf بدليل /etc/mysql/my.cnf في الحاوية.

ثم قم بإضافة الصور المحملة إلى خدمة خادم الويب. سيكون هناك اثنان: واحد لرمز التطبيق ، والآخر لتحديد تكوين Nginx

~/laravel-app/docker-compose.yml

#Nginx Service
webserver:
  ...
  volumes:
      - ./:/var/www
      - ./nginx/conf.d/:/etc/nginx/conf.d/
  networks:
      - app-network

تربط الصورة المحملة الأولى رمز التطبيق في دليل ~ / laravel-app بدليل / var / www داخل الحاوية. يتم أيضًا تثبيت ملف التكوين ، المُضاف إلى ~ / laravel-app / nginx / conf.d / ، في /etc/nginx/conf.d/ في الحاوية ، مما يسمح لك بإضافة محتويات دليل التكوين وتغييرها حسب الحاجة.

في الختام ، أضف التركيبات التالية للصور المركبة إلى خدمة التطبيق لرمز التطبيق وملفات التكوين:

~/laravel-app/docker-compose.yml

#PHP Service
app:
  ...
  volumes:
       - ./:/var/www
       - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
  networks:
      - app-network

تقوم خدمة التطبيق بربط الصورة التي تم تحميلها لمجلد ~ / laravel-app ، والذي يحتوي على رمز التطبيق ، بالمجلد / var / www. سيؤدي ذلك إلى تسريع عملية التطوير ، نظرًا لأن أي تغييرات في دليل التطبيق المحلي ستنعكس على الفور في الحاوية. يمكنك أيضًا ربط ملف تكوين PHP ~ / laravel-app / php / local.ini بالملف /usr/local/etc/php/conf.d/local.ini في الحاوية. ستقوم فيما بعد بإنشاء ملف تهيئة PHP محلي.

سيبدو ملف إنشاء عامل إرساء على النحو التالي:

~/laravel-app/docker-compose.yml

version: '3'
services:

  #PHP Service
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: digitalocean.com/php
    container_name: app
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www
    volumes:
      - ./:/var/www
      - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
    networks:
      - app-network

  #Nginx Service
  webserver:
    image: nginx:alpine
    container_name: webserver
    restart: unless-stopped
    tty: true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./:/var/www
      - ./nginx/conf.d/:/etc/nginx/conf.d/
    networks:
      - app-network

  #MySQL Service
  db:
    image: mysql:5.7.22
    container_name: db
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_ROOT_PASSWORD: your_mysql_root_password
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    volumes:
      - dbdata:/var/lib/mysql/
      - ./mysql/my.cnf:/etc/mysql/my.cnf
    networks:
      - app-network

#Docker Networks
networks:
  app-network:
    driver: bridge
#Volumes
volumes:
  dbdata:
    driver: local

إنشاء Dockerfile

يسمح لك Docker بتعريف البيئة داخل حاويات فردية باستخدام ملف Dockerfile. يتيح لك Dockerfile إنشاء صور مخصصة. والتي يمكن استخدامها لتثبيت برنامج التطبيق المطلوب وتغيير الإعدادات كما هو مطلوب. يمكنك نقل الصور التي تم إنشاؤها إلى Docker Hub أو أي سجل خاص.

سيكون ملف Dockerfile موجودًا في دليل التطبيق ~ / laravel. قم بإنشاء ملف:

nano ~/laravel-app/Dockerfile

سيحدد ملف Dockerfile هذا الصورة الأساسية والأوامر والتعليمات اللازمة لبناء صورة تطبيق Laravel. أضف الكود التالي إلى الملف:

~/laravel-app/php/Dockerfile

FROM php:7.2-fpm

# Copy composer.lock and composer.json
COPY composer.lock composer.json /var/www/

# Set working directory
WORKDIR /var/www

# Install dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    mysql-client \
    libpng-dev \
    libjpeg62-turbo-dev \
    libfreetype6-dev \
    locales \
    zip \
    jpegoptim optipng pngquant gifsicle \
    vim \
    unzip \
    git \
    curl

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install extensions
RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/
RUN docker-php-ext-install gd

# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Add user for laravel application
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www

# Copy existing application directory contents
COPY . /var/www

# Copy existing application directory permissions
COPY --chown=www:www . /var/www

# Change current user to www
USER www

# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]

أولاً ، يُنشئ ملف Dockerfile الصورة أعلى php: 7.2-fpm صورة Docker. هذه صورة مبنية على نسخة مثبتة من PHP FastCGI PHP-FPM. يقوم هذا الملف أيضًا بتثبيت الحزم المطلوبة لـ Laravel: mcrypt و pdo_mysql و mbstring و imagick مع الملحن.

يحدد توجيه RUN أوامر تحديث وتثبيت وتكوين المعلمات داخل الحاوية ، بما في ذلك مستخدم مخصص ومجموعة تسمى www. تعين عبارة WORKDIR الدليل / var / www كدليل عمل للتطبيق.

يؤدي إنشاء مستخدم منفصل ومجموعة ذات حقوق وصول محدودة إلى تقليل الضعف عند تشغيل حاويات Docker ، والتي يتم تشغيلها افتراضيًا بامتيازات الجذر. بدلاً من تشغيل هذه الحاوية بامتيازات الجذر ، قمنا بإنشاء مستخدم www لديه أذونات القراءة والكتابة للمجلد / var / www باستخدام الأمر COPY مع علامة --chown لنسخ أذونات مجلد التطبيق.

يفتح الأمر EXPOSE المنفذ 9000 في الحاوية لخادم php-fpm. يشير CMD إلى الأمر الذي يجب تشغيله بعد إنشاء الحاوية. هنا ، يشير CMD إلى الأمر php-fpm الذي يبدأ تشغيل الخادم.

عند الانتهاء من إجراء التغييرات ، احفظ الملف وأغلق المحرر.

الآن يمكنك الانتقال إلى تحديد تكوين PHP الخاص بك.

إعداد PHP

لقد حددت البنية التحتية في ملف إنشاء عامل إرساء ، ويمكنك الآن تكوين خدمة PHP لتكون بمثابة معالج PHP لطلبات Nginx الواردة.

لتكوين PHP ، ستقوم بإنشاء ملف local.ini في مجلد php. هذا هو الملف الذي قمت بربطه بالملف /usr/local/etc/php/conf.d/local.ini في الحاوية أعلاه. سيسمح لك إنشاء هذا الملف بتجاهل ملف php.ini الافتراضي الذي يقرأه PHP عند بدء التشغيل.

إنشاء دليل php:

mkdir ~/laravel-app/php

ثم افتح ملف local.ini:

nano ~/laravel-app/php/local.ini

لتوضيح إعداد PHP ، سنضيف الكود التالي لتعيين حدود حجم تحميل الملف:

~/laravel-app/php/local.ini

upload_max_filesize=40M
post_max_size=40M

يعيِّن الأمران upload_max_filesize و post_max_size الحجم الأقصى المسموح به للملفات التي يتم تحميلها ويوضحان كيفية تعيين تكوينات php.ini من ملف local.ini. يمكنك إدراج أي معلمة تكوين PHP التي تريد تجاهلها في ملف local.ini.

تكوين Nginx

عند تكوين خدمة PHP ، يمكنك تعديل خدمة Nginx لاستخدام PHP-FPM كخادم FastCGI لخدمة المحتوى الديناميكي. يعتمد خادم FastCGI على بروتوكول ثنائي لتفاعل البرامج التفاعلية مع خادم الويب. يمكن العثور على معلومات إضافية في مقالة "فهم وتنفيذ FastCGI Proxies في Nginx".
لتهيئة Nginx ، ستنشئ ملف app.conf بتهيئة الخدمات في المجلد ~ / laravel-app / nginx / conf.d /.

قم أولاً بإنشاء الدليل nginx / conf.d /:

mkdir -p ~/laravel-app/nginx/conf.d

ثم قم بإنشاء ملف التكوين app.conf:

nano ~/laravel-app/nginx/conf.d/app.conf

أضف التعليمات البرمجية التالية إلى الملف لتكوين Nginx:

~/laravel-app/nginx/conf.d/app.conf

server {
    listen 80;
    index index.php index.html;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/public;
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
}

يقوم قالب الخادم بتكوين خادم الويب Nginx باستخدام التوجيهات التالية:

  • استماع: يحدد هذا التوجيه المنفذ الذي يستمع إليه الخادم للطلبات الواردة.
  • error_log و access_log: تحدد هذه التوجيهات ملفات التسجيل.
  • root: يحدد هذا التوجيه المسار إلى المجلد الجذر ، مشكلاً المسار الكامل لأي ملف مطلوب في نظام الملفات المحلي.

في كتلة موقع php ، يشير التوجيه fastcgi_pass إلى أن خدمة التطبيق تستمع على مقبس TCP على المنفذ 9000. مع ذلك ، يستمع خادم PHP-FPM على الشبكة ، وليس على مقبس Unix. على الرغم من أن مقبس Unix يوفر ميزة سرعة طفيفة على مقبس TCP ، إلا أنه لا يحتوي على بروتوكول شبكة ويتخطى مكدس الشبكة. في الحالات التي يوجد فيها المضيفون على نفس النظام ، قد يكون استخدام مقبس Unix منطقيًا ، ولكن إذا كانت الخدمات تعمل على مضيفين مختلفين ، فإن مقبس TCP يوفر ميزة من خلال السماح لك بالاتصال بالخدمات الموزعة. نظرًا لأن حاويات التطبيق وخادم الويب تعمل على مضيفين مختلفين ، فمن الأفضل استخدام مقبس TCP في التكوين الخاص بنا.

عند الانتهاء من إجراء التغييرات ، احفظ الملف وأغلق المحرر.

بفضل الربط الذي تم إنشاؤه سابقًا ، تنعكس أي تغييرات في مجلد nginx / conf.d / مباشرة في حاوية خادم الويب.

الآن دعونا نلقي نظرة على معلمات MySQL.

إعداد MySQL

بعد إعداد PHP و Nginx ، يمكنك تنشيط MySQL كقاعدة بيانات لتطبيقك.

لتكوين MySQL ، تحتاج إلى إنشاء ملف my.cnf في مجلد mysql. هذا هو الملف الذي أرفقته بملف /etc/mysql/my.cnf داخل الحاوية أثناء خطوة تكوين قاعدة البيانات. يتيح لك تثبيت الصورة المُركبة تجاهل أي خيارات my.cnf ، إذا لزم الأمر.

لتوضيح كيفية عمل ذلك ، سنضيف إعدادات إلى my.cnf تتضمن سجل الطلبات العام وتعيين ملف السجل.

إنشاء دليل الخلية:

mkdir ~/laravel-app/mysql

قم بإنشاء ملف my.cnf:

nano ~/laravel-app/mysql/my.cnf

قم بإضافة التعليمات البرمجية التالية إلى الملف لتنشيط سجل الاستعلام وتعيين موقع ملف السجل:

~/laravel-app/mysql/my.cnf

[mysqld]
general_log = 1
general_log_file = /var/lib/mysql/general.log

يدعم ملف my.cnf السجلات عن طريق تعيين معلمة general_log على 1 ، مما يمكّن السجلات العامة. تحدد المعلمة general_log_file مكان تخزين السجلات.

بدء الحاويات وتغيير إعدادات البيئة

حددت جميع الخدمات في ملف إنشاء عامل الميناء وقمت بإنشاء ملفات التكوين لهذه الخدمات. الآن يمكنك تشغيل الحاويات. في الختام ، سنقوم بإنشاء نسخة من ملف .env.example الذي يشتمل عليه Laravel افتراضيًا وتسميته .env ، نظرًا لأن Laravel يستخدم مثل هذا الملف لتحديد البيئة:

cp .env.example .env

بعد بدء الحاويات ، سنقوم بتكوين معلمات تثبيت محددة في هذا الملف.

الآن يتم تحديد جميع خدماتك في ملف إنشاء عامل الإرساء ، وتحتاج فقط إلى تشغيل أمر واحد لبدء تشغيل جميع الحاويات وإنشاء وحدات تخزين وتكوين وتوصيل الشبكات:

docker-compose up -d

في المرة الأولى التي تقوم فيها بتشغيل Docker-compose ، سيتم تنزيل جميع صور Docker الضرورية ، الأمر الذي قد يستغرق بعض الوقت. بعد تنزيل الصور وحفظها على الكمبيوتر المحلي ، سيقوم Compose بإنشاء حاوياتك. يحول العلم -d العملية إلى برنامج خفي حيث تظل الحاويات تعمل في الخلفية.

بعد اكتمال العملية ، استخدم الأمر التالي لسرد جميع الحاويات قيد التشغيل:
docker ps


سترى النتائج التالية مع البيانات الموجودة على التطبيق وخادم الويب وحاويات قاعدة البيانات:

Output
CONTAINER ID        NAMES               IMAGE                             STATUS              PORTS
c31b7b3251e0        db                  mysql:5.7.22                      Up 2 seconds        0.0.0.0:3306->3306/tcp
ed5a69704580        app                 digitalocean.com/php              Up 2 seconds        9000/tcp
5ce4ee31d7c0        webserver           nginx:alpine                      Up 2 seconds        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp

في هذه النتائج ، يكون معرف CONTAINER عبارة عن معرف فريد لكل حاوية ، ويسرد NAMES أسماء الخدمات لكل حاوية. يمكنك استخدام كلا المعرفين للوصول إلى الحاويات. تحدد IMAGE اسم الصورة لكل حاوية ، وتوفر STATUS معلومات حول حالة الحاوية: تم البدء أو إعادة التشغيل أو التوقف.

يمكنك الآن تعديل ملف .env في حاوية التطبيق لإضافة معلمات محددة إلى نظامك.

افتح الملف باستخدام ex docker-compose ، والذي يسمح لك بتشغيل أوامر محددة في الحاويات. في هذه الحالة ، تفتح الملف لتحريره:

docker-compose exec app nano .env

حدد موقع الكتلة التي تحدد DB_CONNECTION وقم بتحديثه ليعكس إعداد النظام الخاص بك. ستقوم بتغيير الحقول التالية:

  1. DB_HOST ستكون حاوية قاعدة بيانات قاعدة البيانات الخاصة بك.
  2. ستكون DB_DATABASE قاعدة بيانات Laravel.
  3. DB_USERNAME سيكون اسم المستخدم لقاعدة البيانات الخاصة بك. في هذه الحالة ، سوف نستخدم laraveluser.
  4. DB_PASSWORD ستكون محمية بكلمة مرور لحساب المستخدم هذا.

/var/www/.env

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laraveluser
DB_PASSWORD=your_laravel_db_password

من الضروري أيضًا تصحيح نفس المتغيرات في ملف env.example ، حيث سيتم استخدامه لاحقًا عند النشر إلى الخادم.

ثم قم بتكوين مفتاح التطبيق الخاص بـ Laravel باستخدام مفتاح php artisan: توليد الأمر. سيقوم هذا الأمر بإنشاء مفتاح ونسخه إلى ملف .env ، والذي سيحمي جلسات المستخدم والبيانات المشفرة:

docker-compose exec app php artisan key:generate

الآن لديك جميع إعدادات البيئة اللازمة لتشغيل التطبيق. للتخزين المؤقت لهذه الإعدادات في ملف يسرع تحميل التطبيق ، قم بتشغيل الأمر:

docker-compose exec app php artisan config:cache

سيتم تحميل إعدادات التكوين في ملف /var/www/bootstrap/cache/config.php في الحاوية.

أخيرًا ، افتح موقع localhost في متصفحك . تفتح الصفحة الرئيسية لتطبيق Laravel.

إنشاء مستخدم MySQL

عند تثبيت MySQL ، يتم افتراضيًا إنشاء حساب جذر إداري بامتيازات غير محدودة للوصول إلى خادم قاعدة البيانات. عادة ، عند العمل مع قاعدة بيانات ، من الأفضل تجنب استخدام حساب جذر إداري. بدلاً من ذلك ، سننشئ مستخدم قاعدة بيانات خاص لقاعدة بيانات Laravel الخاصة بتطبيقنا.
لإنشاء مستخدم جديد ، ابدأ تشغيل shell bash Interactive في حاوية db باستخدام الأمر docker-compose exec:

docker-compose exec db bash

داخل الحاوية ، قم بتسجيل الدخول إلى حساب MySQL الجذر الإداري:

mysql -u root -p

ستتم مطالبتك بإدخال كلمة المرور المحددة لحساب MySQL الجذر عند تثبيته في ملف إنشاء عامل الميناء.

أولاً ، تحقق من قاعدة بيانات laravel المحددة في ملف إنشاء عامل الميناء.
قم بتشغيل الأمر show databases للتحقق من قواعد البيانات الموجودة:

show databases;

في النتائج يجب أن ترى قاعدة بيانات laravel:

Output
+--------------------+
| Database           |
+--------------------+
| information_schema |
| laravel            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

ثم قم بإنشاء حساب مستخدم يسمح له بالوصول إلى قاعدة البيانات هذه.
نستخدم اسم مستخدم laraveluser ، ولكن يمكنك استبداله بأي اسم مفضل. فقط تأكد من تطابق اسم المستخدم وكلمة المرور مع تلك الموجودة في ملف .env في الخطوة السابقة:

GRANT ALL ON laravel.* TO 'laraveluser'@'%' IDENTIFIED BY 'your_laravel_db_password';

تحديث الامتيازات لإعلام خادم MySQL بالتغييرات:

FLUSH PRIVILEGES;

إغلاق MySQL:

EXIT;

اخرج من الحاوية:

exit

يمكنك الآن إجراء الترحيل لاختبار قاعدة البيانات:

docker-compose exec app php artisan migrate

نتائج تأكيد الترحيل هي كما يلي:

Output

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table

الجزء 2. Gitlab


في Hitlab ، تحتاج إلى إنشاء مشروع جديد.

الآن نحن بحاجة إلى حفظ المشروع في مستودع Hitlab. للقيام بذلك ، قم باستدعاء الأوامر التالية من مجلد المشروع على الجهاز المحلي:

git init
git remote add origin git@gitlab.com:<>/<>  
git remote add origin https://gitlab.com/<>/<>      SSH
git add .
git commit -m "Initial commit"
git push -u origin master

يجب أن يظهر المشروع في نظرة عامة على المشروع -> التفاصيل.
لجعله مناسبًا للحصول على البيئة النهائية على الفور ، نقوم بحفظ صورة عامل إرساء البيئة في سجل قائمة النتائج.

للقيام بذلك ، يجب عليك القيام بما يلي:

docker login registry.gitlab.com

ورمي الصورة على gitlab:

docker build -t registry.gitlab.com/<>/<> .
docker push registry.gitlab.com/<>/<>

سيتم وضع الصورة في Packages-> Container Registry.

لإنهاء gitlab ، نحصل على الفور على مفتاح gitlab-runner. للقيام بذلك ، انتقل إلى Setting-> CI / CD-> Runner. المفتاح في الخطوة 3 في قسم التكوين اليدوي (قم بإعداد عداء محدد يدويًا).

الجزء 3. تكوين الخادم


يجب أن يؤخذ خادم VPS مع نوع المحاكاة الافتراضية KVM أو XEN. تشترك المحاكاة الافتراضية مثل OpenVZ في جوهر النظام بين جميع المستخدمين ، لذلك ليس لديها القدرة على تغيير معلمات kernel. للاختبار ، أخذت خادم KVM مع تثبيت Docker مسبقًا. ومع ذلك ، قد لا يكون هناك عامل إرساء على الخادم. في هذه الحالة ، يجب تثبيته يدويًا. الخوارزمية هي نفسها عند التثبيت على الجهاز المحلي. من الضروري أيضًا التحقق من إصدار php. بالنسبة إلى Laravel ، تحتاج إلى 7.2 على الأقل. كان علي أيضًا تثبيت الامتداد لـ php ext-mbstring بشكل منفصل (في حالتي لـ php 7.3):

sudo apt-get update
sudo apt-get install php7.3-mbstring

بعد ذلك ، نحتاج إلى تثبيت gitlab-runner. Runner هي خدمة ستقبل الرد عبر الويب من Hitlab عند تلقي إصدار جديد ونشر كل شيء على خادمنا.

لتثبيت gitlab-runner ، عليك القيام بما يلي:

curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

بعد التنزيل ، قم بتعيين إذن للتنفيذ:

sudo chmod +x /usr/local/bin/gitlab-runner

بعد ذلك ، قم بإنشاء مستخدم gitlab-runner وتشغيل خدمة gitlab runner:

sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start

سجل عداء. للقيام بذلك ، نحتاج إلى الرمز المميز من الجزء 2 من هذه المقالة:

sudo gitlab-runner register

وردا على ذلك ، سوف يطلبون منك عنوان Hitlab الخاص بك.

حدد gitlab.com :

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
https://gitlab.com

بعد ذلك ، تحتاج إلى إدخال الرمز المميز. أدخل الرمز المميز من الجزء 2.

Please enter the gitlab-ci token for this runner
xxx

بعد ذلك ، حدد وصفًا وعلامات مفصولة بفواصل. ثم يُعرض علينا اختيار منفذ. هنا تحتاج إلى تحديد غلاف:


Please enter the executor:
shell

كما أفهمها ، المنفذ هو بيئة يتم فيها تنفيذ التعليمات البرمجية من ملف .gitlab-ci.yml. هناك باش ، ssh ، عامل ميناء ، متوازيات ، virtualbox و kubernets للاختيار من بينها. توصي الوثائق أنه إذا كنت لا تعرف ما يجب استخدامه ، استخدم bash. هذا هو خيار عالمي يعمل على سطر الأوامر على الخادم الخاص بك.

ثم نحتاج إلى إضافة مستخدم gitlab-runner إلى مجموعة مستخدمي docker.

sudo usermod -aG docker gitlab-runner

لتجنب أخطاء الوصول ، أضف إلى sudoers

sudo nano /etc/sudoers

خط

gitlab-runner ALL=(ALL) NOPASSWD: ALL

يمكننا الآن إنشاء ملف .gitlab-ci.yml. من الضروري تنفيذ ما يسمى خط الأنابيب: سلسلة من الأوامر لنشر المشروع.

للقيام بذلك ، انتقل إلى مستودع المشروع في قائمة النتائج وانقر فوق إنشاء ملف جديد. سيقدم Gitlab نفسه قوالب ملفات ، من بينها يجب عليك تحديد .gitlab-ci.yml. بعد إنشاء ملف في gitlab ، يمكنك تحديد قالب لمحتويات الملف. اخترت الرافيل وقمت بإعادة بنائه قليلاً لنفسي:


# This file is a template, and might need editing before it works on your project.
# Official framework image. Look for the different tagged releases at:
# https://hub.docker.com/r/library/php
# .    ,        
image: registry.gitlab.com/<>/<>:latest

# Pick zero or more services to be used on all builds.
# Only needed when using a docker container to run your tests in.
# Check out: http://docs.gitlab.com/ce/ci/docker/using_docker_images.html#what-is-a-service
services:
  - mysql:latest
#    
variables:
  MYSQL_DATABASE: laravel
  MYSQL_ROOT_PASSWORD: ***********

# This folder is cached between builds
# ,      
# http://docs.gitlab.com/ce/ci/yaml/README.html#cache
cache:
  paths:
    - vendor/
    - node_modules/

# This is a basic example for a gem or script which doesn't use
# services such as redis or postgres
#     
before_script:
  #   
  - sudo apt-get update -yqq
  #    nodejs
  - sudo apt-get install gnupg -yqq
  #  Node   12
  - curl -sL https://deb.nodesource.com/setup_12.x | sudo bash -
  #  
  - sudo apt-get install git nodejs libcurl4-gnutls-dev libicu-dev libmcrypt-dev libvpx-dev libjpeg-dev libpng-dev libxpm-dev zlib1g-dev libfreetype6-dev libxml2-dev libexpat1-dev libbz2-dev libgmp3-dev libldap2-dev unixodbc-dev libpq-dev libsqlite3-dev libaspell-dev libsnmp-dev libpcre3-dev libtidy-dev -yqq
  #  composer
  - curl -sS https://getcomposer.org/installer | php
  - php composer.phar install
  - composer install
  #   Node
  - npm install
  # Copy over testing configuration.
  # Don't forget to set the database config in .env.testing correctly
  - DB_HOST=mysql
  - DB_DATABASE=laravel
  - DB_USERNAME=root
  - DB_PASSWORD=*********
  #  .env.example    .env
  - cp .env.example .env
  #  npm build
  - npm run dev
  #       laravel
  - php artisan key:generate
  - php artisan config:cache
  - php artisan route:clear
  - php artisan config:clear
  - php artisan cache:clear
  #  .
  - docker-compose exec app php artisan migrate
  #   
  #- docker-compose exec app php artisan db:seed

#
test:
  script:
    #  
    - php vendor/bin/phpunit --coverage-text --colors=never
    #  npm
    - npm test

#       
deploying:
  stage: deploy
  script:
    - echo "Deployed"
    - docker-compose stop
    - docker-compose up -d

بعد تنفيذ خط الأنابيب بنجاح (CI / CD-> Pipelines) على عنوان IP الخاص بخادمك ، يجب أن ترى صفحة Laravel الخاصة بك.

لتهيئة CI / CD ، استخدمت تعليمات من Sean Bradley:


و medium.com/@sean_bradley/auto-devops-with-gitlab-ci-and-docker-compose-f931233f080f

All Articles