Cách Sử Dụng Docker-compose Cho Một Dự Án Trên Laravel

Cách Sử Dụng Docker-compose Cho Một Dự Án Trên Laravel
Docker-compose là một công cụ để tạo sự kết nối các container lại với nhau. Khi có mạng lưới container, dự án của các bạn chạy trên Laravel sẽ trơn tru.

Sự phát triển và mức độ phổ biến của Docker hiện nay khá hùng hậu và chúng ta không cần phải bàn luận. Ở đây, chúng ta cùng nhau tìm hiểu cách xây dựng môi trường lý tưởng để hoạt động một ứng dụng bất kỳ trên Laravel. Làm cách nào để sử dụng Docker như vậy? Chúng ta cần dịch vụ Nginx để bắt đầu hành trình này. 

 

Cách cài đặt Docker-compose vào Laravel 

 

Nếu bạn là tân binh và đang tìm hiểu thêm về Laravel, thì bạn nên tạo clone source code Laravel từ https://github.com/laravel/laravel. Chọn một phiên bản bạn thấy cần thiết và tải về. Sau đó, bạn giải nén ở https://github.com/laravel/laravel/releases. Nếu bạn cảm thấy tự tin về mức độ thành thạo dùng Laravel, thì hãy cài đặt composer và thực hiện dòng lệnh này:

composer create-project --prefer-dist laravel/laravel laravel

 

Giả sử các bạn đã có sẵn source code của một dự án trên Laravel (máy tính bạn) hoặc kéo về từ github thì…

 

PHP-FPM

 

Các bạn cần cài các PHP extension nhưng như vậy là chưa đủ. Các bạn nên cài thêm một số công cụ để tương tác với Laravel dễ dàng hơn. Các công cụ đó sẽ tương tác với Laravel thông qua lệnh PHP artisan – ví dụ như git, vim và cron để chạy Laravel cron hoặc composer (thì nên thêm unzip). Cách làm như sau:

 

Tạo một file php.Dockerfile:

 

 

Docker-compose service hoàn thiện sẽ là: 

 

 

Nginx

 

Tiếp theo, các bạn cần tạo container cho web server Nginx. Nó có nhiệm vụ giao tiếp với PHP-FPM và trả về response cho người dùng. Với dịch vụ này, bạn có thể tái sử dụng các hình ảnh có sẵn và giảm tải dung lượng xây hình ảnh. Bạn thậm chí không cần phải dùng custom Dockerfile. Bạn chỉ cần dùng image Nginx và thực hiện mount file config là xong. Đừng quên tạo một file default.conf để chứa configurate và cho phép Nginx chạy trên các file PHP. 

 

 

 

MySQL

 

Các bạn có thể dùng trực tiếp hình ảnh MySQL và tạo user, DB qua Init SQL file mà không phải custom hình ảnh. Sau khi đã hoàn thiện các phần vừa nêu, các bạn sẽ có file docker-composer.yml hoàn chỉnh. 

 

 

 

 

Phpmyadmin

 

Phpmyadmin cũng tương tự như MySQL. Các bạn nên lưu ý phần port và các kết nối tới một port mới (chưa từng sử dụng). Bên cạnh đó, bạn cũng nên thiết lập các biến môi trường xung quanh cho Phpmyadmin. Vì chúng sẽ lấy trên dịch dụ của MySQL để Phpmyadmin có thể truy cập và quản lý các dữ liệu dễ dàng hơn. 

 

phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    ports:
        - "8081:80"
    environment:
        - PMA_HOSTS=mysql
        - PMA_PORT=3306
        - PMA_USER=pocadi123
        - PMA_PASSWORD=pocadi123

 

File hoàn chỉnh:

 

version:'3'
services:
        nginx:
        image: nginx:stable
        ports:
            - "8080:80"
        volumes:
            - ./laravel:/var/www/html
            - ./nginx/default.conf:/etc/nginx/conf.d/default.conf

    php:
        build:
            context: ./laravel
            dockerfile: Dockerfile
        volumes:
            - ./laravel:/var/www/html
        ports:
            - "9000:9000"

    mysql:
        image: mysql:8.0.29-oracle
        ports:
            - "3307:3306"
        volumes:
            - ./mysql:/var/lib/mysql
        environment:
            MYSQL_DATABASE: laravel
            MYSQL_USER: pocadi
            MYSQL_PASSWORD: pocadi123
            MYSQL_ROOT_PASSWORD: pocadi123

    phpmyadmin:
        image: phpmyadmin/phpmyadmin:latest
        ports:
            - "8081:80"
        environment:
            - PMA_HOSTS=mysql
            - PMA_PORT=3306
            - PMA_USER=pocadi123
            - PMA_PASSWORD=pocadi123

 

Cấp quyền thực thi cho Docker-compose

 

Để chắc chắn bạn đã cài đặt thành công file docker-compose trên máy tính, bạn nên kiểm tra bằng lệnh docker-compose-v. Kết quả sẽ như sau:

 

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

 

Vậy là bạn đã cài đặt thành công. 

 

Cấu trúc thư mục của một dự án

 

Bạn nên tạo folder để lưu file config của docker và source code. Cấu trúc thư mục thường có dạng như sau: 

 

/*
 * demo 
 * conf.d
 * vhosts.conf
 * src (thư mục lưu source code của bạn)
 * Dockerfile
 * docker-compose.yml 
 * readme.md  
 */

 

Trong file vhosts.conf sẽ lưu nội dung config virtualhost nằm trong docker-container mà bạn sẽ tạo ra.

 

Bây giờ mình sẽ giải thích nội dung của từng file.

 

DirectoryIndex index.php index.html


    Options -Indexes +FollowSymLinks
    AllowOverride All
    Require all granted


    ServerName localhost
    DocumentRoot /app/public
    
        AllowOverride All
        Options -Indexes +FollowSymLinks
        Order allow,deny
        Allow from all
    

 

Thư mục src là thư mục lưu source code. Nó chính là tất cả những gì mà một dự án Laravel cần. Trong file Dockerfile sẽ tự động lưu những config để xây dựng hình ảnh với những thứ mà các bạn đã config trong này (Ví dụ như PHP, apache2, composer,...). Nếu bạn muốn cài thêm những hình ảnh khác và các file nào đó, thì thêm vào file này: nodejs, npm, bower,… Nội dung của Dockerfile sẽ là:

 

FROM ubuntu:16.04

// Install apache, PHP, and supplimentary programs. openssh-server, curl, 

// and lynx-cur are for debugging the container.

RUN apt-get update && apt-get -y upgrade && apt-get -y install \

 apache2 php libapache2-mod-php php-mcrypt php-mysql curl php-cli php-mbstring git unzip php-xml \

 libcurl4-openssl-dev pkg-config libssl-dev libsslcommon2-dev php-pear php-dev vim

RUN curl -sS https://getcomposer.org/installer -o composer-setup.php

RUN php composer-setup.php --install-dir=/usr/local/bin --filename=composer

// Enable apache mods.

RUN a2enmod rewrite

RUN a2enmod headers

// Manually set up the apache environment variables

ENV APACHE_RUN_USER www-data

ENV APACHE_RUN_GROUP www-data

ENV APACHE_LOG_DIR /var/log/apache2

ENV APACHE_LOCK_DIR /var/lock/apache2

ENV APACHE_PID_FILE /var/run/apache2.pid

// install nodejs, npm, bower

RUN apt-get -y install nodejs npm git

RUN npm install -g bower

RUN npm install --global gulp-cli

RUN apt-get install -y ruby-full rubygems

RUN gem install sass

RUN ln -s /usr/bin/nodejs /usr/bin/node

RUN mkdir /app

WORKDIR /app

// Expose apache.

EXPOSE 80

// Update the default apache site with the config we created.

ADD conf.d/vhosts.conf /etc/apache2/sites-enabled/000-default.conf

// By default start up apache in the foreground, override with /bin/bash for interative.

CMD systemctl restart apache2

CMD /usr/sbin/apache2ctl -D FOREGROUND

 

File docker-compose.yml sẽ định nghĩa các container mà các bạn sẽ cần tới. Giả sử, các bạn cần một container Web và một container cho cơ sở dữ liệu.

 

version: '2'

services:

  web:

    build: .

    container_name: demo-web

    volumes:

      - ./src:/app

    ports:

      - "90:80"

    links:

      - serverdb

  serverdb:

    image: mysql:5.7

    container_name: demo-serverdb

    volumes:

      - ./data/mysql:/var/lib/mysql

    environment:

      - MYSQL_ROOT_PASSWORD=admin

    ports:

      - 3406:3306

 

Trong file ở trên có một config, đó là links. Config đó sẽ tự liên kết tới container khác trong một hệ thống docker. Ở đây, mình giả định là container serverdb. Trong file .env của một dự án, các chỉ cần khai báo DB_HOST=serverdb là hệ thống sẽ tự hiểu host database nằm ở container serverdb. 

 

Một số lỗi thường gặp khi dùng docker-compose

 

Lỗi về quyền truy cập là lỗi phổ biến nhất. Để khắc phục tình trạng này, các bạn nên sử dụng câu lệnh docker ps để hệ thống hiển thị danh sách các container đang chạy hoặc docker ps –a nếu container nào đó đang bị thiếu. Đừng quên dùng câu lệnh docker logs để hiển thị lỗi của container và debug. Ngoài ra, để tạo file (model hoặc controller) khi sử dụng command trong một dự án Laravel, các bạn nên cho thực hiện dòng lệnh bên ngoài container. Điều này sẽ giúp các bạn tránh các rắc rối lớn về bản quyền về lâu dài. 

Hồ Hữu Hiền

Mình là developer nên đôi khi viết bài không hay lắm mong các bạn thông cảm. Nếu muốn biết thêm thông tin về mình thì vui lòng vào website này để biết. https://huuhienqt.dev/

Bình luận (0)