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

Lượt xem
Home

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é.

Chia sẻ lên

Theo dõi trên

Logo Google new

Đánh giá

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

Hưng Nguyễn

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

Icon Quote
Icon Quote
Đăng ký nhận tin
Để không bỏ sót bất kỳ tin tức hoặc chương trình khuyến mãi từ Vietnix

Bình luận

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

Chỉ số tăng trưởng

Điểm Desktop

100 (+39)

Điểm Mobile

100 (+67)

Core Web Vitals

Passed

Lĩnh vực

Ecommerce

Chỉ số tăng trưởng

Điểm Desktop

99 (+28)

Điểm Mobile

100 (+50)

Core Web Vitals

Passed

Lĩnh vực

SEO

Chỉ số tăng trưởng

Điểm Desktop

99 (+26)

Điểm Mobile

98 (+59)

Core Web Vitals

Passed

Lĩnh vực

Ecommerce

Chỉ số tăng trưởng

Điểm Desktop

100 (+8)

Điểm Mobile

98 (+35)

Core Web Vitals

Passed

Lĩnh vực

Giáo Dục

Chỉ số tăng trưởng

Điểm Desktop

100 (+61)

Điểm Mobile

100 (+61)

Core Web Vitals

Passed

Lĩnh vực

Giáo Dục

Võ Thiên Tòng

25 Tháng 2 lúc 21:09

·

Mình muốn gửi lời cảm ơn chân thành đến Team Vietnix, anh Hưng Nguyễn, anh Vietnix Trung, em Quốc Huy đã hỗ trợ tối ưu Page Speed Insight (PSI) cho website vanvoiminhhoa.vn của mình.
Biết đến anh Hưng đã lâu nhưng chưa có duyên sử dụng dịch vụ bên anh. Tình cờ thấy được bài Post của anh về việc hỗ trợ tối ưu PSI miễn phí chỉ với vài Slot, thấy AE cmt khá nhiều nên cũng không nghĩ tới lượt mình. Hôm sau đánh liều inbox 1 phen xem sao thì may mắn được đưa vào danh sách. Vài ngày sau được Team Vietnix liên hệ và hỗ trợ.
Kết quả đạt được:
• Điểm xanh lè xanh lét
• Tốc độ tải trang nhanh hơn hẳn
• Các chỉ số cũng được cải thiện đáng kể
• Và mình tin rằng với việc PSI được cải thiện cũng thúc đẩy những thứ khác đi lên theo!
Mình thực sự hài lòng với dịch vụ của Vietnix và muốn giới thiệu đến tất cả mọi người:
• Dịch vụ Wordpress Hosting: Tốc độ nhanh, ổn định, bảo mật cao, hỗ trợ kỹ thuật 24/7. (https://vietnix.vn/wordpress-hosting/)
• Dịch vụ Business Hosting: Dung lượng lớn, phù hợp cho website có lượng truy cập cao, tích hợp nhiều tính năng cao cấp. (https://vietnix.vn/business-hosting/)
Đặc biệt, Vietnix đang có chương trình ưu đãi:
• Giảm giá 20% trọn đời khi nhập code THIENTONG_PAGESPEED tại trang thanh toán (Chu kỳ 12 tháng trở lên)
• Tặng 1 lần tối ưu điểm Page Speed Insight cho 1 website
Cám ơn Vietnix một lần nữa!
#Vietnix #Vanvoiminhhoa #Pagespeedinsight
Trước khi tối ưu
Sau khi tối ưu
Thiện Nguyễn - CEO SEO Dạo

5 Tháng 3 lúc 16:21

·

CORE WEB VITAL YẾU TỐ XẾP HẠNG TÌM KIẾM SEO
Core Web Vitals là một tập hợp các chỉ số đo lường hiệu suất của trang web từ góc độ người dùng, được Google sử dụng để đánh giá trải nghiệm người dùng trên các trang web. Các chỉ số chính bao gồm:
– Largest contentful paint (LCP): Tốc độ render của page. Mục tiêu là dưới 2,5 giây.
– First input delay (FID): Tốc độ phản hồi của website với tương tác của người dùng. Mục tiêu là dưới 100ms.
– Cumulative Layout Shift (CLS): Độ ổn định của bố cục trang. Mục tiêu là dưới 0.1.
Tất cả các chỉ số này đo lường các khía cạnh quan trọng của trải nghiệm người dùng trên trang web. Google đã công bố rằng từ tháng 5 năm 2021, các Core Web Vitals sẽ được sử dụng làm một trong các yếu tố đánh giá trong việc xếp hạng trang web trên kết quả tìm kiếm. Do đó, hiểu và cải thiện các Core Web Vitals là rất quan trọng đối với SEO.
Tóm lại, Core Web Vitals không chỉ giúp cải thiện hiệu suất và xếp hạng trang web trên công cụ tìm kiếm, mà còn cải thiện trải nghiệm của người dùng khi họ truy cập và tương tác với trang website.
P/s: mình đang có gói hỗ trợ đặc biệt cho anh em tối ưu tốc độ bên VIETNIX:
– Giảm 20% lifetime dịch vụ Hosting Business và Hosting Wordpress chu kỳ 12 tháng trở lên.
– Tặng 1 lần tối ưu điểm Page Speed Insight cho 1 website.
Anh em có nhu cầu đăng ký qua bạn Vietnix Trung này nhé và nhập mã SEODAO_PAGESPEED để được ưu đãi nhé.😁
Trước khi tối ưu
Sau khi tối ưu SEO Dạo
Icharm review

5 Tháng 3 lúc 15:43

·

[Mình vừa được hỗ trợ tối ưu page speed website]
Trước khi được tối ưu, web của mình điểm rất thấp, đặc biệt là mobile chỉ có 39. Cơ duyên thế nào lúc lướt face lại va phải chương trình tối ưu pagespeed bên Vietnix.
Sau khi được Trần Hoàng Phúc và team Vietnix hỗ trợ nhiệt tình, điểm web vọt lên 98 99 (như hình bên dưới). Dùng thử web thì thấy quá là mượt, 10 điểm cho team Vietnix.
Nói thật thì mình thật sự ấn tượng về sự nhiệt huyết, tận tâm và rất chuyên nghiệp bên Vietnix.
Anh em có nhu cầu về hosting hay có vấn đề về website như:
1. Web load chậm
2. Khách rời web vì đợi tải nội dung, hình ảnh lâu
3. Hay tất tần tật mọi thứ về website
THÌ LIÊN HỆ NGAY VIETNIX NHÉ!
Và đừng quên dùng pass “ICHARM_PAGESPEED” để được giảm 20% trọn đời hosting business và wp hosting. Quả code này còn được tặng 1 lần tối ưu pagespeed nữa nhé, ưu đãi chắc cũng phải nhất nhì thị trường luôn.
Trước khi tối ưu
Sau khi tối ưu
Hoàng Nguyễn

29 Tháng 2 lúc 17:04

·

Xin chào mọi người! Vừa rồi mình có sử dụng dịch vụ tối ưu website, tăng tốc độ tải trang pagespeed của Vietnix kết quả trên cả tuyệt vời nên mình viết bài này để chia sẻ thông tin với các bạn.
Lý do mình chọn dịch vụ tối ưu tốc độ website của Vietnix:
✅ Đội ngũ chuyên gia giàu kinh nghiệm: Đã tối ưu thành công cho hàng nghìn website trong nhiều lĩnh vực khác nhau. Các bạn nhân viên rất thân thiện, nhiệt tình và chủ động trong quá trình làm việc để cập nhật tiến độ.
✅ Quy trình chuyên nghiệp:
– Kiểm tra và phân tích: Vietnix sử dụng các công cụ tiên tiến để kiểm tra và phân tích tốc độ website của bạn.
– Xác định nguyên nhân: Vietnix xác định nguyên nhân khiến website tải chậm và đưa ra giải pháp tối ưu phù hợp.
– Tối ưu hóa website: Vietnix áp dụng các kỹ thuật tối ưu tiên tiến nhất để tăng tốc độ tải trang.
– Báo cáo kết quả: Vietnix cung cấp báo cáo chi tiết về kết quả tối ưu hóa website.
Công nghệ tiên tiến: Vietnix sử dụng các công nghệ tối ưu mới nhất như LiteSpeed, LSCache, Memcached, Redis, v.v.
✅ Cam kết kết quả: Vietnix cam kết tăng tốc độ website của bạn lên tối thiểu 90%.
✅ Giá cả cạnh tranh: Vietnix cung cấp dịch vụ tối ưu tốc độ website với mức giá cạnh tranh nhất trên thị trường.
📣 Để đăng ký sử dụng dịch vụ tối ưu tốc độ website và các dịch vụ khác như hosting, vps, domain… các bạn có thể đăng ký tại https://portal.vietnix.vn/aff.php?aff=57 hoặc Inbox cho sếp Vietnix Trung nhé.
Các bạn có thể kiểm tra tốc độ trang của mình https://lasan.edu.vn hoặc một vài trang khác đã sử dụng dịch vụ của Vietnix như sau:
https://pagespeed.web.dev/…/https…/v8beqewyt2…
https://pagespeed.web.dev/…/https…/etiohjvtl4…
https://pagespeed.web.dev/…/https…/yczuqpw6d1…
https://pagespeed.web.dev/…/https…/xf9y65kuzk…
https://pagespeed.web.dev/…/https…/fdrsms15en…
https://pagespeed.web.dev/…/https…/s7p9cgzeri…
Trước khi tối ưu
Sau khi tối ưu
Dũng cá xinh

30 Tháng 1 lúc 19:09

·

[Đỉnh]
Em có dùng hosting, vps, cloud vps, cloud server, dedicated server của rất nhiều bên từ trong nước đến nước ngoài để hosting khoảng 2,000+ domain. Mỗi bên đều có ưu nhược khác nhau, nhưng có 1 số bên đặc biệt “bá đạo”, trong đó có: Vietnix!!!!

Lần đầu tiên em được cả CEO Hưng Nguyễn lẫn Master về dev Vietnix Trung của 1 đơn vị hàng đầu liên quan đến Hosting, Server support từ A – Z (từ Zalo, Tele, đến FB và cả Phone)

Em có khá nhiều web dạng Big Data (bài, ảnh, database, data) lên đến hàng trăm Gb. Càng to thì nó càng có nhiều vấn đề về phần phản hồi ban đầu (nhược điểm cố hữu của php wordpress so với nativejs, reactjs, html, headless,…), và anh em Vietnix có nhã ý hỗ trợ xử lý phần Speed Insight này.

Kết quả thực sự kinh ngạc, từ cách trao đổi đến xử lý vấn đề, cut off những cái cần cut off, xử lý rất sâu vấn đề và gợi ý rất nhiều ý tưởng optimize hệ thống!!!! Thực sự quá hài lòng về kết quả cũng như cách tương tác của các đầu tầu bên Vietnix ^^!!!

Nhân cơ duyên được kết nối với những cao thủ của Vietnix, em xin chia sẻ và lan tỏa để nhiều anh em có cơ hội được sử dụng những dịch vụ tốt nhất với giá vô cùng hợp lý!!!!

1 – Với anh em chưa có hosting, em đặc biệt recommend sử dụng hosting bên Vietnix:
– Sử dụng mã DUNGCAXINH_PAGESPEED sẽ được giảm 20% trọn đời (lifetime luôn)
– Áp dụng các gói Hosting Business, Hosting wordpress và reg 1 năm trở lên
– Anh em chưa biết cách reg thì còm men hoặc ib để em hướng dẫn hoặc nhờ các bạn bên Vietnix support từ A – Z

2 – Anh em có hosting rồi và muốn build blog hoặc web = wordpress mà chưa có giao diện thì nhân tiện em đang có tài khoản Premium bên Envato, em sẽ tặng bất kỳ giao diện nào có trên Envato Themes (Link em để dưới còm men) ạ. Cả nhà còm hoặc ib em Themes mà mọi người “chim ưng”, em sẽ cho anh em tải về, up drive và gửi ạ!!! (Chương trình này kéo dài đến ngày 29 tết âm lịch ạ)

3 – BEST NHẤT luôn!!!! Anh em nào mua hosting dùng mã DUNGCAXINH_PAGESPEED sẽ được tối ưu 100 điểm tốc độ cho 1 web (đây là ưu đãi riêng của CEO Hưng Nguyễn dành cho bạn bè của #dungcaxinh ^^) (Giá trị nhất là cái vụ số 3 này anh chị em nhé ^^), cơ hội vàng để move về đơn vị hosting uy tín là đây ^^!!!!

Một lần nữa xin chân thành cám ơn 2 đồng chí em: Hưng Nguyễn và Vietnix Trung đã giải được một bài toán khó cho các trang WP Big data mà anh loay hoay bao lâu nay chưa tìm ra đáp án!!! Chúc Vietnix ngày càng phát triển và có một năm 2024 đại đại thắng nhé ^^ !!!!!
#SEO #Vietnix #dungcaxinh

Trước khi tối ưu
Sau khi tối ưu
Hiếu AI

2 Tháng 2 lúc 21:06

·

UY TÍN – TẬN TÂM – TỐC ĐỘ

3 từ trên là vẫn chưa đủ để nói về quy trình làm việc cực chuyên nghiệp của team Vietnix.Chuyện là mình có con website chính đang có lượt truy cập organic hàng ngày cũng tương đối (hình 1)

Vấn đề là, con site này đang nằm trên hosting dùng chung nên tốc độ load chưa nhanh, tốc độ load chưa nhanh thì trải nghiệm visitor chưa tốt, trải nghiệm visitor chưa tốt thì tỷ lệ chuyển đổi ra đơn hàng kiểu gì thì kiểu cũng sẽ bị ảnh hưởng.

Biết rõ là đang mất tiền nhưng không biết xử lý như lào, nghĩ mà cay.

Đang loay hoay thì vận may nó tới, hôm qua đang lướt phở bò thấy a Nguyễn Việt Dũng đăng bài, rảnh nên thả cái comment hóng hớt, ai ngờ ngoằng phát thấy ông Dũng tạo nhóm với Vietnix Trung luôn.

Ae Vietnix thì siêu tốc độ, lập tức lấy thông tin vào việc, không hỏi han lằng nhằng, không kỳ kèo chốt đơn dù lúc đấy cũng đang đêm muộn.
Sáng hôm sau dậy vẫn còn đang lơ ngơ mở điện thoại check tin nhắn thì đã thấy ae Vietnix báo xong việc, trong khi mình vẫn chưa biết có chuyện gì xảy ra @@.

Được cái bấm thử website thì thấy load siêu nhanh, chưa tới một giây là thông tin các thứ hiện hết. Quá phê, thả con ảnh trước sau (hình 2,3) để ace tiện đối chiếu nhé. Thế này thì mình gửi gắm nốt 15 em website còn lại cho team Vietnix thôi chứ không cần nghĩ ngợi gì nữa. 10/10.

Nên là:

  1. Anh chị em muốn có một con website tốc độ load nhanh như tốc độ trở mặt của nyc – Dùng ngay dịch vụ hosting của Vietnix
  2. Anh chị em có website rồi muốn tìm bên hosting uy tín, chuyên nghiệp hỗ trợ không quản ngày đêm – Liên hệ ngay Vietnix Trung
  3. Anh chị em quan tâm đến trải nghiệm khách hàng, từ những cái nhỏ nhất như tăng tốc độ website – Better call Vietnix Trung

Và đừng quên dùng pass “HIEUAI_PAGESPEED” để được giảm 20% trọn đời hosting business và wp hosting, quả code này còn được tặng 1 lần tối ưu pagespeed nữa nhé, ưu đãi chắc cũng phải nhất nhì thị trường luôn.
#SEO #Vietnix #hieuai

Website
Trước khi tối ưu
Sau khi tối ưu

Chỉ số tăng trưởng

Điểm Desktop

100 (+43)

Điểm Mobile

100 (+74)

Core Web Vitals

Passed

Lĩnh vực

AI