Bài này mình xin trình bày không cụ thể về cách sử dụng laravel project với docker dùng docker-compose.

1. Yêu cầu.

  • Bạn phải biết dùng cơ bản về docker, docker-compose.
  • Bạn phải cài đặt docker trên máy trước.
  • Muốn cho một project web PHP như laravel chạy được thì bạn phải có các thứ sau: PHP, hệ cơ sở dữ liệu như mysql, máy chủ web như apache hoặc nginx (bài này dùng nginx), đối với laravel thì phải cần thêm composer(là tool để quản lý các thư viện php). Nếu bạn từng cài đặt LAMP trước đây thì LAMP là viết tắt của 4 thứ phải cài đặt đó linux, apache, mysql và php)
  • Bài này sẽ không cài đặt bất cứ gì như PHP, nginx, mysql, composer vào môi trường máy của bạn mà chúng sẽ được cài vào các container docker.
  • Để sử dụng laravel với docker, ta không xậy dựng một container chứa tất cả các thứ từ PHP, composer, nginx,... mà cần tách chúng ra như sau cho dễ quản lý về sau:
    • Container composer: Là container chứa tool composer để có thể chạy câu lệnh composer.
    • Container chứa PHP: để có thể chạy được mã nguồn.
    • Container chứa nginx: Là máy chủ web để người dùng có thể truy cập web bạn từ browser.

2. Cài đặt.

Giả sử bạn đã có source code một project laravel trên máy hoặc kéo từ github của bạn về.

Nếu bạn muốn tạo một project laravel mới từ đầu thì download laravel project từ địa chỉ https://github.com/laravel/laravel/archive/v5.3.16.tar.gz về rồi giải nén, đổi tên thành tên project bạn muốn.

2.1. Download container composer.

docker pull composer

 

Chạy câu lệnh trên để download composer image từ docker hub về.

2.2. Download thư viện liên quan của project.

Vào thư mục project của bạn và chạy câu lệnh sau để cài đặt các thư viện liên quan cho framework:

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

 

"/app" ở trên là thư mục mặc định có trong container composer.

2.3. Tạo file docker-compose.yml

File docker-compose.yml chính là file để build lên toàn hệ thống của bạn. Bạn có thể đặt file này ở đâu bạn muốn, không nhất thiết là phải ở trong project của bạn.

File docker-compose.yml sẽ có nội dung như sau:

version: '2'
services:

  # The Application - Là môi trường chạy project của bạn
  app:
    build:
      context: .
      dockerfile: app.dockerfile
    working_dir: /var/www
    volumes:
      - ./:/var/www
    environment:
      - "DB_PORT=3306"
      - "DB_HOST=database"

  # The Web Server - Là máy chủ web (ở đây là nginx)
  web:
    build:
      context: .
      dockerfile: web.dockerfile
    working_dir: /var/www
    volumes_from:
      - app
    ports:
      - 8080:80

  # The Database
  database:
    image: mysql:5.6
    volumes:
      - dbdata:/var/lib/mysql
    environment:
      - "MYSQL_DATABASE=homestead"
      - "MYSQL_USER=homestead"
      - "MYSQL_PASSWORD=secret"
      - "MYSQL_ROOT_PASSWORD=secret"
    ports:
        - "3306:3306"

File này chứa 3 phần tương đương với 3 hệ thống là môi trường chạy web của bạn "app" (là môi trường cài PHP), môi trường máy chủ web "web" (là nginx) và môi trường chạy CSDL "database" (là mysql).

Trong file trên bạn chú ý một số điểm:

  • "context: ." chính là đường dẫn tới file Dockerfile của bạn được đặt so với file docker-compose.yml, ở đây file app.dockerfile và web.dockerfile được đặt cùng thư mục với file docker-compose.yml nên để context là "." (2 file app.docker và web.docker sẽ được trình bày phía dưới).
  • "8080:80" trong phần ports nghĩa là bạn sẽ map cổng 8080 từ máy của bạn vào cổng 80 trong container tương ứng (ở đây là container tên web). Bình thường khi bạn truy cập browser một địa chỉ trang web nào đó thì nó mặc định là cổng 80 vì giao thức http có cổng mặc định là 80.

Bạn muốn truy cập web của bạn trên local thì phải truy cập vào cổng 80 của container web này, nhưng cổng 80 của container web và cổng 80 trên máy bạn là 2 cổng không liên quan tới nhau, khi bạn gõ url một trang web nào đó vào thanh địa chỉ của browser thì mặc định đang truy cập thông qua cổng 80 của máy bạn. Vì thế bạn nên map từ cổng 8080 của máy bạn vào cổng 80 của container web để từ trình duyệt khi truy cập vào địa chỉ "0.0.0.0:8080" là bạn có thể truy cập vào web chạy project của bạn(0.0.0.0 là địa chỉ IP mặc định của docker).

  • Giá trị của các environment trong database container bạn nên để là homestead và secret, còn giá trị thực sự của nó thì bạn config ở trong file .env của project ấy.

 

2.4. Tạo file app.dockerfile

Đây chính là file cấu hình cài đặt PHP:

FROM php:7.0.4-fpm

RUN apt-get update && apt-get install -y libmcrypt-dev \
    mysql-client libmagickwand-dev --no-install-recommends \
    && pecl install imagick \
    && docker-php-ext-enable imagick \
    && docker-php-ext-install mcrypt pdo_mysql

 

2.5. Tạo file web.dockerfile

Đây chính là file cấu hình cài đặt nginx:

FROM nginx:1.10

ADD vhost.conf /etc/nginx/conf.d/default.conf

 

File vhost.conf là file cấu hình cho nginx, nội dung file vhost.conf như sau:

server {
    listen 80;
    index index.php index.html;
    root /var/www/public;

    location / {
        try_files $uri /index.php?$args;
    }

    location ~ \.php$ {
        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;
    }
}

 

3. Chạy chương trình.

Sau khi làm xong các bước trên, giờ bạn chỉ cần khởi động chương trình thôi:

docker-compose up

 

Lần đầu tiên chạy sẽ mất khoảng vài phút để xây dựng các container, nhưng từ lần thứ 2 trở đi sẽ phát lên luôn thôi :).

Chú ý:

  • Khi bạn sửa đổi một file dockerfile (app.dockerfile, web.dockerfile) nào thì bạn phải chạy câu lệnh sau để build lại hệ thống:
docker-compose build

 

  • Khi đã khởi động hệ thống rồi thì bạn có thể vào trong các container để thực hiện các câu lệnh cho thoải mái. Ví dụ bạn muốn chạy câu lệnh "php artisan migrate --seed" thì có 2 cách:

Cách 1 là thực thi nó từ ngoài máy chủ mà không cần phải vào container:

docker-compose exec app php artisan migrate --seed

 

Cách 2 là vào container app và thực thi:

docker exec -it {id của container app} bash
php artisan migrate --seed

 

  • Bạn nên tạo một alias rút gọn trong file bash để thuận tiện, ví dụ bạn có thể rút gọn thành như sau:

Khai báo alias cho phần "docker-compose exec app" bằng "phpd", sau đó chạy:

phpd artisan migrate --seed

 

Nguồn tham khảo:

https://medium.com/@shakyShane/laravel-docker-part-1-setup-for-development-e3daaefaf3c