+9

Docker-Compose: Dựng môi trường cho Ứng dụng Laravel

Sức phát triển của Docker cũng như mức độ phổ cập của nó hiện nay thì chắc tôi cũng không cần phải bàn luận thêm ở đây nữa. Trong bài viết này tôi sẽ tập trung vào trình bày cách để giúp các bạn xây dựng được môi trường chạy một ứng dụng Laravel thông qua service Nginx sử dụng Docker-composer.

Để hoàn thành được bài viết này cũng không thể không nhắc tới lòng nhiệt tình su-bóp của một người anh tốt Nguyễn Văn Vượng. (bow). hehe

Trước tiên, cần chuẩn bị:

Sau đây là các bước chi tiết: 😄

Xây dựng môi trường

Hãy mở Terminal và thao tác:

    // Tạo thư mục chứa source code
    $ mkdir compose
    $ cd compose
    // Tạo một Laravel project. (Mình làm với Laravel 5.3 nhé)
    $ composer create-project --prefer-dist laravel/laravel blog

Quá trình tạo Laravel project sẽ mất một khoảng thời gian. Hãy kiên nhẫn chờ đợi nhé. ^^.

Tiếp theo,

    // Root is /compose$
    // Tạo thư mục chứa nginx config
        $ mkdir nginx_conf
    // Tạo file docker-compose.yml
        $ touch docker-compose.yml
    // Tạo file config cho nginx
        $ cd nginx_conf
        $ touch default.conf

Sau khi hoàn thành, mở file docker-compose.yml và default.conf bằng sumblime text chỉnh sửa với nội dung sau:

  • docker-compose.yml: Trong file này chúng ta sẽ tiến hành khai báo các service cần dùng
version: '2'
services:
  application:
    image: euclid1990/ubuntu-server
    volumes:
      - ./blog:/var/www/html/blog
  mariadb:
    image: mariadb
    ports:
      - "3696:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: mydb
      MYSQL_USER: guest
      MYSQL_PASSWORD: [email protected]
    volumes:
      - ./mariadb:/var/lib/mysql
  php:
    image: euclid1990/php5.6-fpm
    ports:
      - "9696:9000"
    volumes_from:
      - application
    links:
      - mariadb:mysql
  nginx:
    image: nginx
    ports:
      - "8696:80"
    links:
      - php
    volumes_from:
      - application
    volumes:
      - ./logs/nginx/:/var/log/nginx
      - ./nginx_conf:/etc/nginx/conf.d

Giải thích: Ở đây tôi đã định nghĩa ra 4 services cần thiết để chạy cho ứng dụng đó là: application, mariadb, php và nginx.

  • application service:
    • Sử dụng euclid1990/ubuntu-server image được pull về từ trang chủ của docker.hub
    • Mounts tất cả project trong thư mục /blog ở trên máy của bạn vào thư mục /var/www/html/blog trong containers. Việc này cho phép bạn sửa code mà không cần phải rebuilt lại image. (sửa code -> reload trình duyệt).
  • mariadb service:
    • Sử dụng mariadb image được pull về từ docker.hub
    • Chuyển từ cổng 3306 trên container đến cổng 3696 trên máy của bạn
    • environment khai báo các tham số
  • php service
    • volumes_from: Thực hiện tất cả các câu lệnh volumns từ container application
    • links: Liên kết php server với mariadb server
  • nginx: Không còn khái niệm nào mới để giải thích. :v

Tiếp theo là file default.conf

server {
    listen 80 default_server;

    server_name localhost;
    root /var/www/html/blog/public;

    error_log /var/www/html/error.log;
    access_log /var/www/html/access.log;

    index index.html index.php;

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

    location ~ ^/.+\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        if (!-f $document_root$fastcgi_script_name) {
            return 404;
        }
        include fastcgi_params;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        fastcgi_param REALPATHTEST $realpath_root;
        internal;
    }
}

Giải thích qua đổi chút, trong file này định nghĩa server name cho ứng dụng. Khai báo thư mục gốc của file index.php, đường dẫn của file error.log và access.log. Chú ý rằng, file index.php của laravel nằm trong /public/index.php vì vậy khi định nghĩa root hãy chỉ cụ thể vào đến puclic nhé.

Các bước chuẩn bị đã sẵn sàng. Thư mục dự án của chúng ta bây giờ sẽ có.

1.png

Tiến hành chạy:

    //Root là compose
    $ docker-compose up

1.png

Chúng ta dễ dàng nhận thấy là đầu tiên docker tiến hành start 4 service mà chúng ta đã định nghĩa trong file docker-compose.yml. Sau khi docker-compose chạy xong. Hãy truy cập vào địa chỉ: localhost:8696 và tận hưởng thành quả.

1.png

Hoho, màn hình welcome của laravel hiện ra cho chúng ta biết là đã thành công.

Bây giờ, mở thêm 1 tab Terminal nữa lên và gõ:

    $ docker ps

Lệnh này sẽ giúp bạn liệt kê tất cả các container đang chạy

1.png

Dễ dàng thấy được là đang có 4 container của chúng ta đang chạy với đầy đủ các thông số về chúng.

Migrate Database

Về cơ bản là bây giờ ứng dụng của chúng ta đã chạy được. Nhưng chưa nên vội mưng quá sớm, bởi vì Laravel còn cung cấp cho chúng ta tính năng migrate các bảng dữ liệu. Vậy câu hỏi đặt ra là bây giờ chúng ta tiến hành chạy lệnh php artisan migrate ở đâu? Và làm cách nào để xem được database chúng ta đang có?

Chắc tới đây mọi người cũng đã hiểu vì sao tôi cần định nghĩa 4 service ở trên rồi đúng không?

Database sẽ được lưu trữ trong container mariadb. Thao tác

    $ docker exec -i -t compose_mariadb_1 /bin/bash

Câu lệnh này sẽ run container compose_mariadb_1. Sau khi container đã chạy, login vào mysql bằng câu lệnh.

    mysql -uguest [email protected] mydb

1.png

Với username, password, và database được định nghĩa trong file docker_composer.yml

Để chạy migrate thì cần chạy nó trong container php.

    docker exec -i -t compose_php_1 /bin/bash

1.png

Sau khi run container, gõ:

    $ cd /html/blog
    $ php artisan migrate

Kết quả sẽ được như hình bên. Để kiểm tra lại. Hãy quay lại container mariadb. 1.png

Cần lưu ý một chút. Trong file .env cần confix các tham số này như sau:

1.png

Chú ý rằng HOST ở đây phải là địa chỉ của container chứa database của bạn nhé. Để kiểm tra địa chỉ của container đó (ở đây là compose_mariadb_1) hãy chạy

    $ docker exec -i -t compose_mariadb_1 cat /etc/hosts

Và cuối cùng em ấy cũng show ra:

1.png

Mọi thứ đã sẵn sàng cho bạn. Hãy bắt đầu vào code dự án của bạn thôi. ^^


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.