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ụngapp
service để đọc mã code PHP trước khi ứng dụng Laravel tương tác với người dùng cuối.
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.
Xem thêm: Cách cài đặt Composer trên Ubuntu 20.04
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 Y
và Enter
để 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 artisan
và composer
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 user
và uid
đã đượ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 composer
và artisan
.
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 choapp
service với đường dẫn trong mục context và Dockerfile. Tham sốuser
vàuid
đượ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 trongnginx
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êntravellist
.
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ổng8000
của máy host tới cổng80
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é.