Cách cài đặt và thiết lập Laravel với Docker Compose trên Ubuntu 20.04
Để chứa một ứng dụng đề cập đến quá trình điều chỉnh một ứng dụng và các thành phần của nó để có thể chạy nó trong môi trường nhẹ được gọi là vùng chứa . Những môi trường như vậy được tách biệt và sử dụng một lần, và có thể được tận dụng để phát triển, thử nghiệm và triển khai các ứng dụng vào production .Trong hướng dẫn này, ta sẽ sử dụng Docker Compose để chứa một ứng dụng Laravel để phát triển. Khi bạn hoàn thành, bạn sẽ có một ứng dụng Laravel demo chạy trên ba containers dịch vụ riêng biệt:
-  Một dịch vụ appchạy PHP7.4-FPM;
-  Một dịch vụ dbchạy MySQL 5.7;
-  Một dịch vụ nginxsửappdịch vụappđể phân tích cú pháp mã PHP trước khi cung cấp ứng dụng Laravel cho user cuối cùng.
 Để cho phép quá trình phát triển được tổ chức hợp lý và tạo điều kiện gỡ lỗi ứng dụng,  ta  sẽ giữ cho các file  ứng dụng được đồng bộ hóa bằng cách sử dụng  dung lượng  chia sẻ.  Ta  cũng sẽ xem cách sử dụng các lệnh thực thi của docker-compose exec để chạy Composer và Artisan trên containers  app .
Yêu cầu
- Truy cập vào máy local hoặc server phát triển Ubuntu 20.04 với quyền là user không phải root với các quyền sudo. Nếu bạn đang sử dụng server từ xa, bạn nên cài đặt firewall đang hoạt động. Để cài đặt những điều này, vui lòng tham khảo Hướng dẫn cài đặt server ban đầu cho Ubuntu 20.04 của ta .
- Docker được cài đặt trên server của bạn, làm theo các Bước 1 và 2 của Cách cài đặt và sử dụng Docker trên Ubuntu 20.04 .
- Docker Compose được cài đặt trên server của bạn, làm theo Bước 1 của Cách cài đặt và sử dụng Docker Compose trên Ubuntu 20.04 .
Bước 1 - Lấy ứng dụng Demo
 Để bắt đầu,  ta  sẽ tìm nạp ứng dụng Laravel demo từ kho Github của nó.  Ta  quan tâm đến nhánh tutorial-01 , chứa ứng dụng Laravel cơ bản mà  ta  đã tạo trong hướng dẫn đầu tiên của loạt bài này .
 Để lấy mã ứng dụng tương thích với hướng dẫn này, hãy  download  tutorial-1.0.1 phát hành tutorial-1.0.1 vào folder  chính của bạn với:
- cd ~ 
- curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-1.0.1.zip -o travellist.zip 
 Ta   cần  lệnh unzip để  extract  mã ứng dụng. Trong trường hợp bạn chưa cài đặt gói này trước đây, hãy làm như vậy ngay bây giờ với:
- sudo apt update 
- sudo apt install unzip 
Bây giờ, hãy extract nội dung của ứng dụng và đổi tên folder đã extract để truy cập dễ dàng hơn:
- unzip travellist.zip 
- mv travellist-laravel-demo-tutorial-1.0.1 travellist-demo 
Điều hướng đến danh sách du lịch travellist-demo folder  travellist-demo :
- cd travellist-demo 
Trong bước tiếp theo,  ta  sẽ tạo file  cấu hình .env để  cài đặt  ứng dụng.
 Bước 2 -  Cài đặt  file  .env của ứng dụng
 Các file  cấu hình Laravel nằm trong một folder  được gọi là config , bên trong folder  root  của ứng dụng. Ngoài ra, file  .env được sử dụng để  cài đặt  cấu hình phụ thuộc vào môi trường , chẳng hạn như thông tin xác thực và bất kỳ thông tin nào có thể khác nhau giữa các lần triển khai. Tệp này không  có trong  kiểm soát sửa đổi.
 Cảnh báo : Tệp cấu hình môi trường chứa thông tin nhạy cảm về  server  của bạn, bao gồm thông tin đăng nhập database  và khóa bảo mật. Vì lý do đó, bạn không nên chia sẻ công khai file  này.
 Các giá trị có trong file  .env sẽ được ưu tiên hơn các giá trị được đặt trong file  cấu hình thông thường nằm tại folder  config . Mỗi cài đặt trên môi trường mới yêu cầu file  môi trường được điều chỉnh để xác định những thứ như cài đặt kết nối database , tùy chọn gỡ lỗi, URL ứng dụng, trong số các mục khác có thể thay đổi tùy thuộc vào môi trường ứng dụng đang chạy.
 Bây giờ  ta  sẽ tạo một file  .env mới để tùy chỉnh các tùy chọn cấu hình cho môi trường phát triển mà  ta  đang  cài đặt . Laravel đi kèm với một file  .env ví dụ mà  ta  có thể sao chép để tạo file  của riêng mình:
- cp .env.example .env 
Mở file  này bằng nano hoặc editor  mà bạn chọn:
- nano .env 
Dòng điện .env  file  từ travellist ứng dụng demo chứa các tùy chọn để sử dụng một database  MySQL  local , với 127.0.0.1 như  server  database .  Ta  cần cập nhật biến DB_HOST để nó trỏ đến dịch vụ database  mà  ta  sẽ tạo trong môi trường Docker  của bạn . Trong hướng dẫn này,  ta  sẽ gọi dịch vụ database  của  ta  là db . Hãy tiếp tục và thay thế giá trị được liệt kê của DB_HOST bằng tên dịch vụ database :
APP_NAME=Travellist APP_ENV=dev APP_KEY= APP_DEBUG=true APP_URL=http://localhost:8000  LOG_CHANNEL=stack  DB_CONNECTION=mysql DB_HOST=db DB_PORT=3306 DB_DATABASE=travellist DB_USERNAME=travellist_user DB_PASSWORD=password ... Vui lòng thay đổi tên database , tên  user  và password , nếu bạn muốn. Các biến này sẽ được tận dụng trong bước sau, nơi  ta  sẽ  cài đặt  file  docker-compose.yml để  cấu hình  các dịch vụ của  ta .
 Lưu file  khi bạn chỉnh sửa xong. Nếu bạn đã sử dụng nano ,  bạn có thể thực hiện bằng cách  nhấn Ctrl+x , sau đó nhấn Y và Enter để xác nhận.
Bước 3 - Cài đặt Dockerfile của ứng dụng
Mặc dù cả hai dịch vụ MySQL và Nginx của ta sẽ dựa trên hình ảnh mặc định thu được từ Docker Hub , ta vẫn cần xây dựng hình ảnh tùy chỉnh cho containers ứng dụng. Ta sẽ tạo một Dockerfile mới cho điều đó.
 Hình ảnh travellist của  ta  sẽ dựa trên php:7.4-fpm hình ảnh chính thức PHP từ Docker Hub. Trên môi trường PHP-FPM cơ bản đó,  ta  sẽ cài đặt một vài module  PHP bổ sung và công cụ quản lý phụ thuộc của Trình soạn thảo .
  Ta  cũng sẽ tạo một  user  hệ thống mới; điều này là cần thiết để thực hiện các lệnh của artisan và composer trong khi phát triển ứng dụng. Cài đặt uid  đảm bảo   user  bên trong containers  có cùng uid với  user  hệ thống của bạn trên  server  của bạn, nơi bạn đang chạy Docker. Bằng cách này,  các file   nào được tạo bởi các lệnh này đều được sao chép trong  server  lưu trữ với các quyền chính xác. Điều này cũng  nghĩa là   bạn có thể  sử dụng trình soạn thảo mã mà bạn chọn trong  server  để phát triển ứng dụng đang chạy bên trong các containers .
Tạo một Dockerfile mới với:
- nano Dockerfile 
Sao chép các nội dung sau vào Docker file :
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 /usr/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  Đừng quên lưu file khi bạn hoàn tất.
 Dockerfile của  ta  bắt đầu bằng cách xác định hình ảnh cơ sở mà  ta  đang sử dụng: php:7.4-fpm .
 Sau khi cài đặt gói hệ thống và phần mở rộng PHP,  ta  cài đặt Composer bằng cách sao chép các composer thực thi từ mới nhất của nó hình ảnh chính thức để hình ảnh ứng dụng của  ta .
 Một  user  hệ thống mới sau đó được tạo và  cài đặt  bằng cách sử dụng các đối số user và uid đã được khai báo ở phần đầu của Dockerfile. Các giá trị này sẽ được Docker Compose đưa vào tại thời điểm xây dựng.
 Cuối cùng,  ta  đặt dir làm việc mặc định là /var/www và thay đổi thành  user  mới được tạo. Điều này sẽ  đảm bảo  bạn đang kết nối  với quyền  là  regular user  và bạn đang ở đúng folder  khi chạy các lệnh của trình composer và artisan trên containers  ứng dụng.
Bước 4 - Cài đặt cấu hình Nginx và file kết xuất database
Khi tạo môi trường phát triển với Docker Compose, thông thường cần phải chia sẻ các file cấu hình hoặc khởi tạo với các containers dịch vụ, để cài đặt hoặc khởi động các dịch vụ đó. Thực tiễn này tạo điều kiện thuận lợi cho việc thay đổi file cấu hình để tinh chỉnh môi trường của bạn trong khi bạn đang phát triển ứng dụng.
Bây giờ ta sẽ cài đặt một folder với các file sẽ được sử dụng để cấu hình và khởi tạo containers dịch vụ của ta .
 Để  cài đặt  Nginx,  ta  sẽ chia sẻ file  travellist.conf sẽ  cấu hình  cách ứng dụng được phân phối. Tạo folder  docker-compose/nginx với:
- mkdir -p docker-compose/nginx 
Mở một file  mới có tên travellist.conf trong folder  đó:
- nano docker-compose/nginx/travellist.conf 
Sao chép cấu hình Nginx sau vào file đó:
 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;     } } Tệp này sẽ cấu hình Nginx để lắng nghe trên cổng 80 và sử dụng index.php làm trang index  mặc định. Nó sẽ đặt root  tài liệu thành /var/www/public , sau đó  cấu hình  Nginx để sử app dịch vụ app trên cổng 9000 để xử lý các file  *.php .
Lưu file khi bạn chỉnh sửa xong.
Để cài đặt database MySQL, ta sẽ chia sẻ một kết xuất database sẽ được nhập khi containers được khởi tạo. Đây là một tính năng được cung cấp bởi hình ảnh MySQL 5.7 mà ta sẽ sử dụng trên containers đó.
 Tạo một folder  mới cho các file  khởi tạo MySQL của bạn bên trong folder  docker-compose :
- mkdir docker-compose/mysql 
Mở file  .sql mới:
- nano docker-compose/mysql/init_db.sql 
Kết xuất MySQL sau đây dựa trên database  mà  ta  đã  cài đặt  trong hướng dẫn Laravel về LEMP của  ta . Nó sẽ tạo một bảng mới có tên các places . Sau đó, nó sẽ điền vào bảng một tập hợp các vị trí mẫu.
Thêm mã sau vào file :
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: id , name và visited . Trường visited là một lá cờ được sử dụng để xác định các địa điểm vẫn phải đến . Hãy thay đổi địa điểm mẫu hoặc bao gồm những địa điểm mới.  Lưu file   khi bạn hoàn tất.
Ta đã hoàn tất việc cài đặt Dockerfile của ứng dụng và các file cấu hình dịch vụ. Tiếp theo, ta sẽ cài đặt Docker Compose để sử dụng các file này khi tạo dịch vụ của ta .
Bước 5 - Tạo môi trường nhiều containers với Docker Compose
Docker Compose cho phép bạn tạo môi trường nhiều containers cho các ứng dụng chạy trên Docker. Nó sử dụng các định nghĩa dịch vụ để xây dựng các môi trường hoàn toàn có thể tùy chỉnh với nhiều containers có thể chia sẻ mạng và data volumes . Điều này cho phép tích hợp liền mạch giữa các thành phần ứng dụng.
 Để  cài đặt  các định nghĩa dịch vụ của  ta ,  ta  sẽ tạo một file  mới có tên là docker-compose.yml . Thông thường, file  này nằm ở folder  root  của folder  ứng dụng và nó xác định môi trường được chứa trong containers  của bạn, bao gồm các hình ảnh cơ sở mà bạn sẽ sử dụng để tạo containers   của bạn  và cách các dịch vụ của bạn sẽ tương tác.
  Ta  sẽ xác định ba dịch vụ khác nhau trong file  docker-compose.yml : app , db và nginx .
 Các app dịch vụ này sẽ xây dựng một hình ảnh gọi là travellist , dựa trên Dockerfile  ta  đã tạo trước đó. Vùng chứa được dịch vụ này xác định sẽ chạy một  server  php-fpm để phân tích cú pháp mã PHP và gửi kết quả trở lại dịch vụ nginx , dịch vụ này sẽ chạy trên một containers  riêng biệt. Dịch vụ mysql định nghĩa một containers  đang chạy  server  MySQL 5.7. Các dịch vụ của  ta  sẽ chia sẻ một mạng lưới cầu nối có tên là travellist .
 Các file  ứng dụng sẽ được đồng bộ hóa trên cả app và dịch vụ nginx thông qua  mount  ràng buộc . Các liên kết liên kết hữu ích trong môi trường phát triển vì chúng cho phép đồng bộ hai chiều hiệu quả giữa  server  và containers .
 Tạo file  docker-compose.yml ở folder  root  của folder  ứng dụng:
- nano docker-compose.yml 
Tệp docker-compose.yml điển hình bắt đầu bằng định nghĩa version , theo sau là nút services , theo đó tất cả các dịch vụ được định nghĩa. Mạng được chia sẻ thường được xác định ở cuối file  đó.
 Để bắt đầu, hãy sao chép mã soạn sẵn này vào file  docker-compose.yml của bạn:
version: "3.7" services:   networks:   travellist:     driver: bridge Bây giờ  ta  sẽ chỉnh sửa nút services để bao gồm các services app , db và nginx .
 Dịch vụ app
 Dịch vụ app sẽ  cài đặt  một containers  có tên là travellist-app . Nó xây dựng một  Docker image  mới dựa trên một Dockerfile nằm trong đường dẫn giống như docker-compose.yml  file . Những hình ảnh mới sẽ được lưu tại  local  dưới cái tên travellist .
 Mặc dù root  tài liệu đang được phân phát dưới dạng ứng dụng nằm trong containers  nginx ,  ta  cũng cần các file  ứng dụng ở đâu đó bên trong containers  app , vì vậy  ta  có thể thực thi  các việc  dòng lệnh bằng công cụ Laravel Artisan.
 Sao chép định nghĩa dịch vụ sau trong nút services của bạn, bên 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ác cài đặt này thực hiện như sau:
-  build: Cấu hình này yêu cầu Docker Compose xây dựng hình ảnh local cho dịch vụapp, sử dụng đường dẫn (ngữ cảnh) và Dockerfile được chỉ định để biết hướng dẫn. Các đối sốuservàuidđược đưa vào Dockerfile để tùy chỉnh các lệnh tạo của user tại thời điểm xây dựng.
-  image: Tên sẽ được sử dụng cho hình ảnh đang được xây dựng.
-  container_name: Cài đặt tên containers cho dịch vụ này.
-  restart: Luôn khởi động lại, trừ khi dịch vụ bị dừng.
-  working_dir: Đặt folder mặc định cho dịch vụ này là/var/www.
-  volumes: Tạo một volume chia sẻ sẽ đồng bộ hóa nội dung từ folder hiện tại sang/var/wwwbên trong containers . Lưu ý đây không phải là root tài liệu của bạn, vì nó sẽ nằm trong containersnginx.
-  networks: Bộ lên dịch vụ này sử dụng một mạng lưới têntravellist.
 Dịch vụ db
 Dịch vụ db sử dụng hình ảnh MySQL 5.7 được tạo sẵn từ Docker Hub. Bởi vì Docker Soạn tự động tải .env file biến nằm trong folder  giống như docker-compose.yml  file ,  ta  có thể có được các  cài đặt  database  của  ta  từ Laravel .env  file   ta  tạo ra trong một bước trước.
 Bao gồm định nghĩa dịch vụ sau trong nút services của bạn, ngay sau dịch vụ app :
  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 Các cài đặt này thực hiện như sau:
-  image: Xác định Docker image sẽ được sử dụng cho containers này. Trong trường hợp này, ta đang sử dụng hình ảnh MySQL 5.7 từ Docker Hub.
-  container_name: Cài đặt tên containers cho dịch vụ này:travellist-db.
-  restart: Luôn khởi động lại dịch vụ này, trừ khi nó bị dừng rõ ràng.
-  environment: Xác định các biến môi trường trong containers mới. Ta đang sử dụng các giá trị thu được từ file.envđể cài đặt dịch vụ MySQL của bạn , dịch vụ này sẽ tự động tạo database và user mới dựa trên các biến môi trường được cung cấp.
-  volumes: Tạo một volume để chia sẻ kết xuất database.sqlsẽ được sử dụng để khởi tạo database ứng dụng. Hình ảnh MySQL sẽ tự động nhập các file.sqlđược đặt trong folder/docker-entrypoint-initdb.dbên trong containers .
-  networks: Bộ lên dịch vụ này sử dụng một mạng lưới têntravellist.
 Dịch vụ nginx
 Dịch vụ nginx sử dụng hình ảnh Nginx dựng sẵn trên đỉnh Alpine , một bản phân phối Linux nhẹ. Nó tạo một containers  có tên là travellist-nginx và nó sử dụng định nghĩa ports để tạo chuyển hướng từ cổng 8000 trên hệ thống  server  sang cổng 80 bên trong containers .
 Bao gồm định nghĩa dịch vụ sau trong nút services của bạn, ngay sau dịch vụ db :
  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ác cài đặt này thực hiện như sau:
-  image: Xác định Docker image sẽ được sử dụng cho containers này. Trong trường hợp này, ta đang sử dụng hình ảnh Alpine Nginx 1.17.
-  container_name: Cài đặt tên containers cho dịch vụ này: travellist-nginx .
-  restart: Luôn khởi động lại dịch vụ này, trừ khi nó bị dừng rõ ràng.
-  ports: Cài đặt chuyển hướng cổng sẽ cho phép truy cập bên ngoài qua cổng8000tới web server đang chạy trên cổng80bên trong containers .
-  volumes: Tạo hai tập dùng chung. Cái đầu tiên sẽ đồng bộ hóa nội dung từ folder hiện tại sang/var/wwwbên trong containers . Bằng cách này, khi bạn áp dụng các thay đổi local đối với file ứng dụng, chúng sẽ nhanh chóng được phản ánh trong ứng dụng đang được cung cấp bởi Nginx bên trong containers . Tập thứ hai sẽ đảm bảo file cấu hình Nginx của ta , nằm tạidocker-compose/nginx/travellist.conf, được sao chép vào folder cấu hình Nginx của containers .
-  networks: Bộ lên dịch vụ này sử dụng một mạng lưới têntravellist.
 Đã hoàn thành file  docker-compose.yml
 Đây là cách file  docker-compose.yml đã hoàn thành của  ta  trông giống 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 Đảm bảo rằng bạn lưu file khi hoàn tất.
Bước 6 - Chạy ứng dụng với Docker Compose
 Bây giờ,  ta  sẽ sử dụng các lệnh do docker-compose để xây dựng hình ảnh ứng dụng và chạy các dịch vụ mà  ta  đã chỉ định trong  cài đặt   của bạn .
 Xây dựng hình ảnh app bằng lệnh sau:
- docker-compose build app 
Lệnh này có thể mất vài phút để hoàn thành. Bạn sẽ thấy kết quả tương tự như sau:
OutputBuilding 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  ---> 497fbf904605 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  ---> e499f74896e3 Step 8/11 : RUN useradd -G www-data,root -u $uid -d /home/$user $user  ---> Running in 232ef9c7dbd1 Removing intermediate container 232ef9c7dbd1  ---> 870fa3220ffa Step 9/11 : RUN mkdir -p /home/$user/.composer &&     chown -R $user:$user /home/$user  ---> Running in 7ca8c0cb7f09 Removing intermediate container 7ca8c0cb7f09  ---> 3d2ef9519a8e 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  Khi quá trình xây dựng hoàn tất, bạn có thể chạy môi trường ở chế độ nền với:
- docker-compose up -d 
OutputCreating travellist-db    ... done Creating travellist-app   ... done Creating travellist-nginx ... done Điều này sẽ chạy các containers của bạn trong nền. Để hiển thị thông tin về trạng thái của các dịch vụ đang hoạt động của bạn, hãy chạy:
- docker-compose ps 
Bạn sẽ thấy kết quả như thế này:
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 hiện đã được  cài đặt  và đang chạy, nhưng  ta  vẫn cần thực hiện một vài lệnh để hoàn tất việc  cài đặt  ứng dụng. Bạn có thể sử dụng lệnh docker-compose exec thực thi các lệnh trong containers  dịch vụ, chẳng hạn như ls -l để hiển thị thông tin chi tiết về các file  trong folder  ứng dụng:
- docker-compose exec app ls -l 
Outputtotal 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 Bây giờ  ta  sẽ chạy composer install để cài đặt các phụ thuộc ứng dụng:
- docker-compose exec app composer install 
Bạn sẽ thấy kết quả như thế này:
OutputLoading 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. Điều cuối cùng  ta  cần làm trước khi kiểm tra ứng dụng là tạo một khóa ứng dụng duy nhất bằng công cụ dòng lệnh Laravel artisan công. Khóa này được sử dụng để mã hóa phiên  user  và dữ liệu nhạy cảm khác:
- docker-compose exec app php artisan key:generate 
OutputApplication key set successfully. Bây giờ hãy truy cập trình duyệt của bạn và truy cập domain hoặc địa chỉ IP của server của bạn trên cổng 8000:
http://server_domain_or_IP:8000 Lưu ý : Trong trường hợp bạn đang chạy bản trình diễn này trên máy local   của bạn , hãy sử dụng http://localhost:8000 để truy cập ứng dụng từ trình duyệt của bạn.
Bạn sẽ thấy một trang như thế này:
 Bạn có thể sử dụng lệnh logs để kiểm tra log  được tạo bởi các dịch vụ của bạn:
- 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" Nếu bạn muốn tạm dừng môi trường Docker Compose của bạn trong khi vẫn giữ trạng thái của tất cả các dịch vụ của nó, hãy chạy:
- docker-compose pause 
OutputPausing travellist-db    ... done Pausing travellist-nginx ... done Pausing travellist-app   ... done Sau đó, bạn có thể tiếp tục các dịch vụ của bạn với:
- docker-compose unpause 
OutputUnpausing travellist-app   ... done Unpausing travellist-nginx ... done Unpausing travellist-db    ... done Để tắt môi trường Docker Compose của bạn và xóa tất cả các containers , mạng và dung lượng của nó, hãy chạy:
- docker-compose down 
OutputStopping 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 Để biết tổng quan về tất cả các lệnh Docker Compose, vui lòng kiểm tra tham chiếu dòng lệnh Docker Compose .
Kết luận
Trong hướng dẫn này, ta đã cài đặt môi trường Docker với ba containers bằng Docker Compose để xác định cơ sở hạ tầng của ta trong một file YAML.
Từ thời điểm này, bạn có thể làm việc trên ứng dụng Laravel của bạn mà không cần cài đặt và cài đặt web server local để phát triển và thử nghiệm. Hơn nữa, bạn sẽ làm việc với môi trường dùng một lần có thể dễ dàng sao chép và phân phối, điều này có thể hữu ích trong khi phát triển ứng dụng của bạn và cả khi hướng tới môi trường production .
Các tin liên quan
Cách cài đặt và sử dụng Docker trên Ubuntu 20.042020-06-09
Cách cài đặt và sử dụng Docker Compose trên Ubuntu 20.04
2020-06-05
Cách chia sẻ dữ liệu giữa các container Docker
2020-05-21
Cách sử dụng Traefik 1.7.21 làm Reverse Proxy cho Docker Containers trên CentOS 7
2020-05-12
Cách cài đặt Drupal với Docker Compose
2020-04-25
Cách xây dựng và triển khai ứng dụng Flask bằng Docker trên Ubuntu 18.04
2020-04-05
Como Conteinerizar um aplicativo Laravel para desenvolvimento com o Docker Compose em Ubuntu 18.04
2020-02-20
Cách tạo ứng dụng Node.js với Docker [Quickstart]
2020-02-06
Cách cài đặt Docker Compose trên Debian 10
2020-01-30
Cách chứa một ứng dụng Laravel để phát triển với Docker Compose trên Ubuntu 18.04
2020-01-23
 

