NỘI DUNG

Hosting tốc độ cao Vietnix - tốc độ tải trang trung bình dưới 1 giây
VPS siêu tốc Vietnix - trải nghiệm mượt mà, ổn định
12/05/2023
Lượt xem

Hướng dẫn sử dụng Docker Compose để cài đặt Laravel đối với phiên bản Ubuntu 20.04

12/05/2023
28 phút đọc
Lượt xem

Đánh giá

5/5 - (74 bình chọn)

Docker Compose là một công cụ hỗ trợ định nghĩa và chạy multi-container trên các ứng dụng dùng Docker. Nếu bạn đang cần thực hiện cài đặt và set up Laravel trên phiên bản Ubuntu 20.04, thì có thể tham khảo và thao tác theo hướng dẫn mà Vietnix sẽ giới thiệu trong nội dung bài viết về cách cài đặt Laravel với Docker Compose trên Ubuntu 20.04 dưới đây. Cùng theo dõi nhé.

Tổng quan

Containerize” có nghĩa là tích hợp, đưa ứng dụng vào chạy trong một môi trường tinh gọn (được gọi là container). Trong phạm vi bài viết này, bạn sẽ được hướng dẫn cách sử dụng công cụ Docker Compose để “containerize” một ứng dụng được phát triển bằng Laravel.

Yêu cầu để cài đặt Laravel với Docker Compose trên Ubuntu 20.04

Một máy chủ sử dụng phiên bản Ubuntu 20.04 với một tài khoản người dùng được cấp đủ các quyền root. Trong trường hợp bạn đang tương tác với một remote server, một lời khuyên được đưa ra đó là hãy cài đặt cấu hình tường lửa.

Máy chủ được cài đặt cả Docker và Docker Compose.

Cần chuẩn bị 3 môi trường container tách biệt chạy 3 service khác nhau để thực hiện khởi chạy ứng dụng Laravel của chúng ta:

  • Một app service chạy PHP7.4-FPM.
  • Một db service chạy MySQL 5.7.
  • Một nginx service sử dụng app service để đọc mã code PHP trước khi ứng dụng Laravel tương tác với người dùng cuối.
Framework phát triển ứng dụng web Laravel
Framework phát triển ứng dụng web Laravel

Bước 1 – Chuẩn bị ứng dụng làm Demo

Bạn sẽ bắt đầu từ việc tải về từ Github một ứng dụng được viết bằng Laravel để làm demo. Bạn sẽ chọn nhánh tutorial-01. Để có được mã nguồn của ứng dụng nói trên, sử dụng lệnh dưới đây để tải đoạn code thuộc nhánh tutorial-1.0.1 tới thư mục home trên server của bạn:

cd ~
curl -L https://github.com/do-community/travellist-lavarel-demo/archive/tutorial-1.0.1.zip -o travellist.zip

Bạn cần sử dụng lệnh unzip để giải nén file vừa mới tải về, trong trường hợp gói này chưa được cài trên máy bạn, hãy sử dụng lệnh:

sudo apt update
sudo apt install unzip

Lúc này đây, bạn sẽ thực hiện giải nén file mã nguồn và đặt lại tên cho thư mục mới có được sau khi giải nén để dễ dàng hơn cho việc truy cập:

unzip travellist.zip
mv travellist-lavarel-demo-tutorial-1.0.1 travellist-demo

Di chuyển tới thư mục travellist-demo:

cd travellist-demo

Ở bước tiếp theo, bạn sẽ tạo thêm một file .env để thực hiện các set up cơ bản cho ứng dụng.

Bước 2 – Chuẩn bị file .env

Các file cấu hình của ứng dụng Laravel này sẽ được lưu trong trong thư mục tên config thuộc thư mục root. Bên cạnh đó, file .env được dùng để cài đặt các thông tin thiết lập của môi trường chạy ứng dụng, chẳng hạn như các nội dung về xác thực và các thông tin thay đổi giữa những lần triển khai (deploy).

Lưu ý: File môi trường (.env) chứa các thông tin riêng tư, bao gồm các xác thực liên quan đến cơ sở dữ liệu và các khoá bảo mật. Vì vậy bạn không nên chia sẻ file này công khai.

Nội dung chứa bên trong file .env được ưu tiên hơn so với nội dung các file trong thư mục config. Mỗi phiên cài đặt trên môi trường mới luôn yêu cầu một file môi trường để lưu các thông tin quan trọng và không thể thay đổi được như: thiết lập kết nối database, các tuỳ chọn debug, đường dẫn URL của ứng dụng.

Bạn sẽ tạo một file .env để tuỳ biến được các tuỳ chọn cấu hình đối với môi trường chạy ứng dụng bạn đang set up. Laravel đã tạo sẵn một file, bạn hoàn toàn có thể copy nội dung file này bằng câu lệnh:

cp .env.example .env

Mở file này bằng nano:

nano .env

File .env trong thư mục travellist chứa thông tin về các cài đặt dùng để kết nối tới MySQL database, với địa chỉ ip là: 127.0.0.1. Bạn cần cập nhật biến DB_HOST để lưu đường dẫn trỏ tới database service được tạo trong môi trường Docker. Trong bài viết này, database service sẽ được gọi tắt là db, hãy thay giá trị hiện tại được lưu trong biến DB_HOST với tên của database service:

APP_NAME=Travellist
APP_ENV=dev
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost:8000

LOG_CHANNEL=stack
DB_HOST=db
DB_PORT=3306
DB_DATABASE=travellist
DB_USERNAME=travellist_user
DB_PASSWORD=password
...

Bạn có thể tùy ý thay đổi các trường database name, username và password. Đây là các biến sẽ được sử dụng ở bước tiếp theo để bạn cấu hình cho ứng dụng của mình thông qua file docker-compose.yml.

Hãy nhớ lưu file lại sau khi thao tác. Đối với nano, gõ Ctrl+X, rồi nhắn phím YEnter để xác nhận thay đổi.

Bước 3 – Chuẩn bị Dockerfile

Tuy cả 2 service MySQL và Nginx đều được dựng lên từ các file images mặc định từ Docker Hub, bạn vẫn cần phải tự tạo một image cho container bằng cách tạo một Dockerfile.

Image travellist sẽ được tạo dựa trên image PHP bản official: php:7.4-fpm từ Docker Hub. Đối với môi trường PHP-FPM, bạn sẽ cài đặt thêm một vài modules phụ và công cụ quản lý dependency Composer.

Bạn cũng sẽ cần tạo thêm một tài khoản mới để sử dụng các câu lệnh artisancomposer trong quá trình phát triển ứng dụng. Tuỳ chọn uid giúp đảm bảo tài khoản user trong container có cùng mã uid đối với tài khoản user trên hệ thống của máy host đang chạy Docker.

Theo đó, bất kỳ file nào được tạo từ câu lệnh này cũng đều được sao lưu tới máy host và sẽ được cấp các quyền cần thiết. Điều này đồng nghĩa với việc bạn có thể sử dụng các trình soạn thảo văn bản trên máy host của mình để thực hiện phát triển các ứng dụng chạy trên các containers.

Tạo Dockerfile bằng lệnh:

nano Dockerfile

Lưu nội dung dưới đây vào Dockerfile:

FROM php:7.4-fpm

# Arguments defined in docker-compose.yml
ARG user
ARG uid

#Install system dependencies
RUN apt-get update && apt-get install -y \
    git \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip

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

# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd

# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /user/bin/composer

# Create system user to run Composer and Artisan Commands
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
    chown -R $user:$user /home/$user

# Set working directory
WORKDIR /var/www
USER $user

Hãy nhớ lưu file lại sau khi thao tác xong.

Bạn sẽ sử dụng image: php:7.4-fpm để thực hiện chạy Dockerfile

Sau khi đã cài đặt xong các gói thư viện hệ thống và các PHP extensions, bạn cài đặt Composer bằng cách copy câu lệnh composer từ bản official image tới image của chúng ta.

Một tài khoản user mới sau đó sẽ được tạo ra dựa vào các thông tin lưu ở mục useruid đã được khai báo đầu Dockerfile. Các giá trị này sẽ được thay đổi bởi Docker Compose trong quá trình build image.

Cuối cùng hãy chọn /var/www làm thư mục mặc định và chuyển sang tài khoản user vừa mới tạo. Thao tác này nhằm làm đảm bảo rằng bạn đang truy cập vào tài khoản user và bạn đang ở đúng thư mục khi bạn chạy câu lệnh composerartisan.

Bước 4 – Chuẩn bị thiết lập Nginx và Database Dump Files

Khi sử dụng Docker Compose để tạo môi trường cho ứng dụng, điều cần thiết chính là thực hiện chia sẻ các file thiết lập giữa các service containers để các services này hoạt động hiệu quả hơn. Thao tác giúp dễ dàng thay đổi các file cấu hình nhằm tinh chỉnh lại, đảm bảo môi trường được vận hành tốt nhất có thể trong quá trình phát triển ứng dụng.

Bạn sẽ set up một thư mục lưu các file được dùng để thực hiện cấu hình và thiết lập các service containers.

Để thực hiện set up Nginx, bạn thực hiện chia sẻ file travellist.conf(file này dùng để lưu thông tin cấu hình quy định cách ứng dụng được vận hành). Tạo một thư mục docker-compose/nginx bằng lệnh:

mkdir -p docker-compose/nginx

Mở một file mới tên travellist.conf trong thư mục vừa mới khởi tạo:

nano docker-compose/nginx/travellist.conf

Copy cấu hình Nginx vào file này:


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;
    }
}

File này sẽ cấu hình Nginx để thực hiện tiếp nhận các request từ cổng 80 và sử dụng index.php làm giao diện trang chủ mặc định. Thư mục /var/www/public sẽ trở thành thư mục cao nhất (document root) và Nginx sẽ chạy app service tại cổng 9000 để thực thi các file đuôi php(*.php).

Lưu rồi thoát file sau khi đã thực hiện xong.

Để chuẩn bị MySQL database, bạn sẽ chia sẻ file database dump, file này sẽ được gọi đến khi container được khởi tạo. Tính năng này có được hỗ trợ trong MySQL 5.7 image.

Tạo một thư mục mới cho các file khởi tạo MySQL bên trong thư mục docker-compose:

mkdir docker-compose/mysql

Mở một file .sql mới:

nano docker-compose/mysql/init_db.sql

File MySQL dump dùng để tạo một bảng mới tên là places. Tiếp đến là tự động thêm tên các địa điểm được lưu trong file dump vào bảng places.

Thêm nội dung dưới đây vào file init_db:

DROP TABLE IF EXISTS `places`;

CREATE TABLE `places` (
   `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
   `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
   `visited` tinyint(1) NOT NULL DEFAULT '0',
   PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `places` (name, visited) VALUES ('Berlin',0),('Budapest',0),('Cincinnati',1),('Denver',0),('Helsinki',0),('Lisbon',0),('Moscow',1),('Nairobi',0),('Oslo',1),('Rio',0),('Tokyo',0);

Bảng places chứa ba trường thông tin, bao gồm: id, name, và visited. Trường visited dùng để xác định địa điểm chuẩn bị tới. Bạn hoàn toàn có thể tuỳ ý thay đổi thông tin các địa điểm sẵn có trong database hoặc thêm địa điểm mới. Lưu ý rằng hãy lưu và thoát file sau khi hoàn tất các thao tác.

Lúc này bạn đã hoàn thành chuẩn bị các Dockerfile và file cấu hình các services. Bước tiếp theo là chuẩn bị Docker Compose để sử dụng những file này trong quá trình tạo các services.

Để đảm bảo quá trình cài đặt, cấu hình các ứng dụng và file diễn ra thuận lợi, không gặp trở ngại nào thì bạn cần đến một máy chủ có khả năng mở rộng linh hoạt và quản trị toàn quyền. Một trong những lựa chọn tốt nhất hiện nay đó chính là VPS Vietnix. VPS Vietnix được thiết kế nhằm đáp ứng nhu cầu của các doanh nghiệp hoặc cá nhân có nhu cầu lưu trữ và vận hành website, ứng dụng trên mạng.

VPS Vietnix sở hữu nhiều ưu điểm nổi bật. Đầu tiên là đa dạng gói dịch vụ. Bạn có thể lựa chọn giữa các gói dịch vụ VPS Giá Rẻ, VPS Phổ Thông, VPS Cao Cấp, VPS NVMe, và VPS GPU tùy thuộc vào nhu cầu của mình.

Ngoài ra, VPS Vietnix còn có khả năng mở rộng linh hoạt, giúp bạn dễ dàng tăng dung lượng lưu trữ, băng thông và tài nguyên khác khi có nhu cầu. Hơn nữa, việc quản trị VPS Vietnix rất đơn giản và dễ dàng. Bạn hoàn toàn có thể tự quản trị và kiểm soát các hoạt động của máy chủ một cách đơn giản thông qua giao diện điều khiển. Liên hệ để được trải nghiệm dịch vụ ngay hôm nay.

Bước 5 – Tạo một môi trường Multi-Container bằng Docker Compose

Docker Compose cho phép bạn tạo các môi trường multi-container cho các ứng dụng chạy trong môi trường Docker bằng cách lưu thông tin các service để xây dựng môi trường đáp ứng đầy đủ tính hiệu chỉnh. Việc này cho phép các container có thể chia sẻ dung lượng data và kết nối mạng.

Bạn sẽ tạo một file mới tên docker-compose.yml. Thông thường, file này sẽ được lưu tại ví trí cao nhất trong cây thư mục của ứng dụng, file này định nghĩa các thông tin bao gồm: các base images được sử dụng để build containers, và quy định cách các service tương tác với nhau.

File docker-compose.yml của bạn sẽ lưu thông tin về 3 services: app, db, và nginx.

Bạn thấy app service sẽ thực hiện build một image đặt tên là travellist, dựa vào Dockerfile vừa mới khởi tạo. Container của service này sẽ chạy một php-fpm server để đọc đoạn mã PHP và gửi tới nginx service (sẽ được chạy ở một container khác hoàn toàn tách biệt). Và mysql service sẽ sử dụng một container chạy phiên bản MySQL 5.7 server. Các services của bạn sẽ chia sẻ một “bridge network” tên travellist.

Các file ứng dụng sẽ được đồng bộ hoá trên cả app service và nginx service thông qua “bind mounts“. Bind mounts đóng vai trò rất hữu ích trong phát triển môi trường vì cho phép đồng bộ hoá giữa máy host và các containers.

Tạo file docker-compose.yml ở vị trí root trong thư mục ứng dụng:

nano docker-compose.yml

Một file docker-compose.yml thường được bắt đầu với phần xác định phiên bản, tiếp theo sau đó là trường services bao gồm thông tin các services tồn tại trong ứng dụng của chúng ta. Chia sẻ mạng cũng thường được xác định ở phần cuối file.

Bạn sẽ bắt đầu với việc copy đoạn code dưới đây vào file docker-compose.yml:

version: "3.7"
services:

networks:
  travellist:
    driver: bridge

Tiếp theo, bạn sẽ thêm các định nghĩa của các app service, db service và nginx service vào trường services

app Service

app service sẽ có một container gọi là travellist-app. Một Docker image sẽ được build dựa vào Dockerfile được lưu tại cùng một thư mục với file docker-compose.yml. Image mới sẽ được lưu với tên travellist.

Mặc dù thư mục ứng dụng nằm trong nginx container, tuy nhiên bạn vẫn cần một vài các file ứng dụng được lưu trong app container để có thể thực thi các lệnh bằng công cụ Laravel Artisan.

Copy nội dung dưới đây vào mục services trong file docker-compose.yml:

app:
  build:
     args:
       user: sammy
       uid: 1000
     context: ./
     dockerfile: Dockerfile
  image: travellist
  container_name: travellist-app
  restart: unless-stopped
  working_dir: /var/www/
  volumes:
    - ./:/var/www
  networks:
    - travellist
  

Cụ thể như sau:

  • build: Mục này sẽ hướng dẫn Docker Compose build image cho app service với đường dẫn trong mục context và Dockerfile. Tham số useruid được thêm vào trong Dockerfile để tạo sự tuỳ chỉnh cho các câu lệnh khởi tạo của user trong quá trình build image.
  • image: Dùng để lưu tên của image được tạo.
  • container_name: Dùng để lưu tên của container.
  • restart: Luôn khởi động lại, trừ trường hợp service ngưng chạy(stopped).
  • working_dir: Thư mục mặc định của service này là /var/www.
  • volumes: Tạo một vùng nhớ để đồng bộ hoá nội dung từ thư mục hiện tại đến thư mục /var/www bên trong container. Lưu ý rằng đây không phải thư mục ở vị trí cao nhất(thư mục này nằm trong nginx container).
  • networks: Service này sử dụng bridge network tên travellist.

db Service

Bạn có db service sử dụng MySQL 5.7 image có sẵn trong Docker Hub. Do Docker Compose sẽ tự động load các file .env nằm trong cùng một thư mục với file docker-compose.yml, bạn ngay lập tức có được phần thông tin cài đặt database từ file .env đã được tạo trước đó.

Lưu nội dung dưới đây trong mục services, ngay dưới phần app service:

db:
  image: mysql:5.7
  container_name: travellist-db
  restart: unless-stopped
  environment:
    MYSQL_DATABASE: ${DB_DATABASE}
    MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
    MYSQL_PASSWORD: ${DB_PASSWORD}
    MYSQL_USER: ${DB_USERNAME}
    SERVICE_TAGS: dev
    SERVICE_NAME: mysql
    volumes:
      - ./docker-compose/mysql:/docker-entrypoint-initdb.d
    networks:
      - travellist
    
  • image: Bạn sẽ sử dụng MySQL 5.7 image tải về từ Docker Hub làm image cho container này.
  • container_name: Tên container của service này: travellist-db.
  • restart: Luôn luôn khởi động lại service này, trừ trường hợp buộc phải ngưng chạy (stopped).
  • environment: Định nghĩa các biến môi trường trong container. Bạn sẽ sử dụng các biến từ file .env đã có sẵn cho MySQL service, một database và tài khoản user mới sẽ được tạo dựa vào các biến môi trường này.
  • volumes: Tạo một vùng nhớ để lưu file dump .sql nhằm thiết lập database cho ứng dụng. MySQL image sẽ tự động thêm các file .sql trong thư mục /docker-entrypoint-initdb.d được lưu trong container.
  • networks: Service này sử dụng bridge network tên travellist.

nginx Service

Bạn có nginx service sử dụng Nginx image chạy trên Alpine – một phiên bản Linux. Đây cũng là một image có sẵn. Một container tên travellist-nginx sẽ được khởi tạo, và thông tin trong mục ports có nghĩa là điều hướng các request từ cổng 8000 trên máy host tới cổng 80 trong container.

Thêm nội dung dưới đây vào mục services:

nginx:
  image: nginx:1.17-alpine
  container_name: travellist-nginx
  restart: unless-stopped
  ports:
    - 8000:80
  volumes:
    - ./:/var/www
    - ./docker-compose/nginx:/etc/nginx/conf.d
  networks:
    - travellist

Cụ thể như sau:

  • image: Chứa thông tin về Docker image sẽ được sử dụng trong container, trong trường hợp này là Alpine Nginx 1.17 image.
  • container_name: Tên container: travellist-nginx.
  • restart: Luôn khởi động lại service này, trừ trường hợp ngưng chạy.
  • ports: Thực hiện điều hướng các kết nối từ ngoài cổng 8000 của máy host tới cổng 80 của web server chạy bên trong container.
  • volumes: Tạo hai vùng nhớ. Một vùng nhớ sẽ đồng bộ hoá nội dung các file từ thư mục hiện tại đến thư mục /var/www bên trong container. Bằng cách này, bất cứ thay đổi nào đối với file trên máy host đều làm thay đổi các file ứng dụng trong Nginx container. Vùng nhớ còn lại dùng để đảm bảo rằng file cấu hình Nginx (/docker-compose/nginx/travellist.conf) đã được copy tới thư mục cấu hình Nginx trong container.
  • networks: Service này sử dụng bridge network tên: travellist.

Hoàn thiện file docker-compose.yml

Sau khi đã hoàn thiện xong các bước trên, file docker-compose.yml sẽ có nội dung như sau:

version: "3.7"
services:
  app:
    build:
      args:
        user: sammy
        uid: 1000
      context: ./
      Dockerfile: Dockerfile
    image: travellist
    container_name: travellist-app
    restart: unless-stopped
    working_dir: /var/www/
    volumes:
      - ./:/var/www
    networks:
      - travellist
  db:
    image: mysql:5.7
    container_name: travellist-db
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_USER: ${DB_USERNAME}
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    volumes:
      - ./docker-compose/mysql:/docker-entrypoint-initdb.d
    networks:
      - travellist
  nginx:
    image: nginx:alpine
    container_name: travellist-nginx
    restart: unless-stopped
    ports:
      - 8000:80
    volumes:
      - ./:/var/www
      - ./docker-compose/nginx:/etc/nginx/conf.d
    networks:
      - travellist
  networks:
    travellist:
      driver: bridge
    

Lưu ý lưu file sau khi đã hoàn tất các bước chỉnh sửa.

Bước 6 – Tiến hành chạy ứng dụng bằng Docker Compose

Bạn sẽ dùng lệnh docker-compose để build image cho ứng dụng và chạy các service đã được chuẩn bị từ trước.

Build app image bằng câu lệnh:

docker-compose build app

Sẽ mất vài phút cho tới khi câu lệnh này được hoàn thành. Dưới đây là output nhận được:

Output
Buidling app
Step 1/11 : FROM php:7.4-fpm
 ---> fa37bd6db22a
Step 2/11 : ARG user
 ---> Running in f71eb33b7459
Removing intermediate container f71eb33b7459
 ---> 533c30216f34
Step 3/11 : ARG uid
 ---> Running in 60d2d2a84cda
Removing intermediate container 60d2d2a84cda
Step 4/11 : RUN apt-get update && apt-get install -y      git     curl      libpng-dev     libonig-dev     ...
Step 7/11 : COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
Step 8/11 : RUN useradd -G www-data,root -u $uuid -d /home/$user $user
 ---> Running in 232ef9c7dbd1
Removing intermediate container 232ef9c7dbd1
 ---> 870fa322ffa
Step 9/11 : RUN mkdir -p /home/$user/.composer &&      chown -R $user:$user /home/$user
 ---> Running in 7ca8c0cb7f09
Step 10/11 : WORKDIR /var/www
 ---> Running in 4a964f91edfa
Removing intermediate container 4a964f91edfa
 ---> 00ada639da21
Step 11/11 : USER $user
 ---> Running in 9f8e874fede9
Removing intermediate container 9f8e874fede9
 ---> fe176ff4702b

Successfully built fe176ff4702b
Successfully tagged travellist:latest

Sau khi thực hiện xong, bạn có thể chạy môi trường với chế độ chạy ngầm bằng câu lệnh:

docker-compose up -d
Output
Creating travellist-db    ... done
Creating travellist-app   ... done
Creating travellist-nginx ... done

Lúc này các containers sẽ được chạy ngầm. Để hiển thị thông tin về trạng thái các services đang hoạt động, chạy lệnh:

docker-compose ps

Bạn sẽ được kết quả như sau:

Output
     Name                 Command                      State               Ports
----------------------------------------------------------------------------------------
travellist-app      docker-php-entrypoint php-fpm       Up          9000/tcp
travellist-db       docker-entrypoint.sh mysqld         Up          3306/tcp, 33060/tcp
travellist-nginx    /docker-entrypoint.sh ngin ...      Up          0.0.0.0:8000->80/tcp

Môi trường của bạn lúc này đã khởi động và chạy thành công, tuy vậy vẫn cần phải thực thi một số câu lệnh để hoàn tất việc set up cho ứng dụng. Bạn có thể dùng lệnh docker-compose exec để thực thi các lệnh chạy trong các service containers, ví dụ như lệnh ls -l để nhận được các thông tin chi tiết về các file nằm trong thư mục ứng dụng:

docker-compose exec app ls -l
Output
total 260
 -rw-rw-r-- 1 sammy sammy      737 Jun 9 11:19 Dockerfile
 -rw-rw-r-- 1 sammy sammy      101 Jan 7 08:05 README.md
 drwxrwxr-x 6 sammy sammy     4096 Jan 7 08:05 app
 -rwxr-xr-x 1 sammy sammy     1686 Jan 7 08:05 artisan
 drwxrwxr-x 3 sammy sammy     4096 Jan 7 08:05 bootstrap
 -rw-rw-r-- 1 sammy sammy     1501 Jan 7 08:05 composer.json
 -rw-rw-r-- 1 sammy sammy   179071 Jan 7 08:05 composer.lock
 drwxrwxr-x 2 sammy sammy     4096 Jan 7 08:05 config
 drwxrwxr-x 5 sammy sammy     4096 Jan 7 08:05 database
 drwxrwxr-x 4 sammy sammy     4096 Jun 9 11:19 docker-compose
 -rw-rw-r-- 1 sammy sammy      965 Jun 9 11:27 docker-compose.yml
 -rw-rw-r-- 1 sammy sammy     1013 Jan 7 08:05 package.json
 -rw-rw-r-- 1 sammy sammy     1405 Jan 7 08:05 phpunit.xml
 drwxrwxr-x 2 sammy sammy     4096 Jan 7 08:05 public
 -rw-rw-r-- 1 sammy sammy      273 Jan 7 08:05 readme.md
 drwxrwxr-x 6 sammy sammy     4096 Jan 7 08:05 resources
 drwxrwxr-x 2 sammy sammy     4096 Jan 7 08:05 routes
 -rw-rw-r-- 1 sammy sammy      563 Jan 7 08:05 server.php
 drwxrwxr-x 5 sammy sammy     4096 Jan 7 08:05 storage
 drwxrwxr-x 4 sammy sammy     4096 Jan 7 08:05 tests
drwxrwxr-x 41 sammy sammy     4096 Jun 9 11:32 vendor
 -rw-rw-r-- 1 sammy sammy      538 Jan 7 08:05 webpack.mix.js

Tiếp đến là lệnh composer install để cài đặt phiên bản của ứng dụng:

docker-compose exec app composer-install

Bạn sẽ được output:

Output 
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Package operations: 85 installs, 0 updates, 0 removals
   - Installing doctrine/inflector (1.3.1): Downloading (100%)
   - Installing doctrine/lexer (1.2.0): Downloading (100%)
   - Installing dragonmantank/cron-expression (v2.3.0): Downloading (100%)
   - Installing erusev/parsedown (1.7.4): Downloading (100%)
   - Installing symfony/polyfill-ctype (v1.13.1): Downloading (100%)
   - Installing phpoption/phpoption (1.7.2): Downloading (100%)
   - Installing vlucas/phpdotenv (v3.6.0): Downloading (100%)
   - Installing symfony/css-selector (v5.0.2): Downloading (100%)
...
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.

Thao tác cuối cùng chính là tạo một key độc nhất bằng công cụ artisan Laravel. Key này dùng để mã hoá user sessions và các dữ liệu quan trọng khác.

docker-compose exec app php artisan key:generate
Output
Application key set successfully.

Truy cập vào trình duyệt và gõ tên miền hoặc địa chỉ IP của server với cổng 8000:

http://server_domain_or_IP:8000

Dùng lệnh logs để kiểm tra bản ghi của các services:

docker-compose logs nginx
Attaching to travellist-nginx
...
travellist-nginx | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
travellist-nginx | /docker-entrypoint.sh: Configuration complete; ready for start up
travellist-nginx | 192.168.0.1 - - [09/Jun/2020:11:46:34 +0000] "Get / HTTP/1.1" 200 627 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
travellist-nginx | 192.168.0.1 - - [09/Jun/2020:11:46:35 +0000] "GET / HTTP/1.1" 200 627 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"

Trong trường hợp muốn ngừng chạy Docker Compose mà vẫn giữ nguyên vẹn trạng thái của các services, dùng lệnh:

docker-compose pause
Output
Pausing travellist-nginx ... done
Pausing travellist-db    ... done
Pausing travellist-app   ... done

Tiếp tục chạy các service bằng câu lệnh:

docker-compose unpause
Output
Unpausing travellist-app   ... done
Unpausing travellist-nginx ... done
Unpausing travellist-db    ... done

Để tắt hoàn toàn môi trường chạy bằng Docker Compose, chạy câu lệnh:

docker-compose down
Output
Stopping travellist-nginx ... done
Stopping travellist-db    ... done
Stopping travellist-app   ... done
Removing travellist-nginx ... done
Removing travellist-db    ... done
Removing travellist-app   ... done
Removing network travellist-laravel-demo_travellist

Ngoài ra, bạn cũng có thể chạy ứng dụng trong một môi trường có thể sao lưu và phân phối dễ dàng, điều này rất có ích trong quá trình phát triển ứng dụng của bạn, cũng như khi chuyển sang môi trường production.

Với hơn 10 năm kinh nghiệm hoạt động, Vietnix đã phục vụ cho hơn 50.000 khách hàng gồm cá nhân, doanh nghiệp như GTV, UB Group, iVIVU, Vietnamworks,… Vietnix tự hào khi 97% khách hàng giới thiệu dịch vụ của chúng tôi cho người khác sau khi sử dụng. Chính bởi những cống hiến không ngừng này, Vietnix vinh dự đạt được giải thưởng danh giá “Thương hiệu Việt Nam xuất sắc 2022“.

Ngoài các dịch vụ VPS, Vietnix còn cung cấp nhiều giải pháp khác như hosting, tên miền, Firewall anti DDoS, email,… phục vụ cho mọi nhu cầu của khách hàng khi muốn kinh doanh trên internet. Với sứ mệnh trở thành đối tác tin cậy đồng hành cùng sự thành công của khách hàng, Vietnix luôn nỗ lực không ngừng để cải thiện và nâng cao chất lượng dịch vụ. Hãy yên tâm để Vietnix hỗ trợ bạn trên con đường kinh doanh trực tuyến trong thời đại 4.0 này.

Mọi vấn đề thắc mắc cần tư vấn, quý khách vui lòng liên hệ:

  • Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, Thành Phố Hồ Chí Minh
  • Hotline: 1800 1093 – 07 088 44444
  • Email: sales@vietnix.com.vn

Lời kết

Vietnix đã hướng dẫn bạn set up thành công một môi trường Docker gồm ba container bằng cách sử dụng Docker Compose để khai báo các thành phần trong YAML file. Bạn đã có thể làm việc với ứng dụng Laravel của mình mà không cần thực hiện thao tác cài đặt hay set up local web server trong quá trình phát triển và kiểm thử. Nếu thấy bài viết về cách cài đặt Laravel với Docker Compose trên Ubuntu 20.04 hữu ích, hãy chia sẻ nhé.

THEO DÕI VÀ CẬP NHẬT CHỦ ĐỀ BẠN QUAN TÂM

Đăng ký ngay để nhận những thông tin mới nhất từ blog của chúng tôi. Đừng bỏ lỡ cơ hội truy cập kiến thức và tin tức hàng ngày

Chọn chủ đề :

Hưng Nguyễn

Co-Founder
tại

Kết nối với mình qua

Kết nối với mình qua

Theo dõi
Thông báo của
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả bình luận

Tăng tốc độ website - Nâng tầm giá trị thương hiệu

Banner group
Tăng tốc tải trang

95 điểm

Nâng cao trải nghiệm người dùng

Tăng 8% tỷ lệ chuyển đổi

Thúc đẩy SEO, Google Ads hiệu quả

Tăng tốc ngay

SẢN PHẨM NỔI BẬT

Black Friday Hosting & VPS

Chương trình bắt đầu sau

Giảm giá 40% hosting VPS

50 coupon mỗi ngày

Gia hạn giá không đổi

NHẬN DEAL NGAY
Pattern

7 NGÀY DÙNG THỬ HOSTING

NẮM BẮT CƠ HỘI, THÀNH CÔNG DẪN LỐI

Cùng trải nghiệm dịch vụ hosting tốc độ cao được hơn 100,000 khách hàng sử dụng

Icon
ĐĂNG KÝ NHẬN TÀI LIỆU THÀNH CÔNG
Cảm ơn bạn đã đăng ký nhận tài liệu mới nhất từ Vietnix!
ĐÓNG

ĐĂNG KÝ DÙNG THỬ HOSTING

Asset

7 NGÀY MIỄN PHÍ

Asset 1

ĐĂNG KÝ DÙNG THỬ HOSTING

Asset

7 NGÀY MIỄN PHÍ

Asset 1
Icon
XÁC NHẬN ĐĂNG KÝ DÙNG THỬ THÀNH CÔNG
Cảm ơn bạn đã đăng ký thông tin thành công. Đội ngũ CSKH sẽ liên hệ trực tiếp để kích hoạt dịch vụ cho bạn nhanh nhất!
ĐÓNG