Cách thiết lập Laravel, Nginx và MySQL với Docker Compose
Trong vài năm qua, Docker đã trở thành một giải pháp được sử dụng thường xuyên để triển khai các ứng dụng nhờ vào cách nó đơn giản hóa việc chạy và triển khai các ứng dụng trong các vùng chứa tạm thời. Ví dụ: khi sử dụng ứng dụng LEMP với PHP , Nginx , MySQL và khung Laravel , Docker có thể hợp lý hóa đáng kể quá trình cài đặt . Docker Compose đã đơn giản hóa hơn nữa quy trình phát triển bằng cách cho phép các nhà phát triển xác định cơ sở hạ tầng của họ, bao gồm các dịch vụ ứng dụng, mạng và  dung lượng , trong một file  duy nhất. Docker Compose cung cấp một giải pháp thay thế hiệu quả để chạy nhiều lệnh docker container create docker container run và docker container run lệnh docker container run .
 Trong hướng dẫn này, bạn sẽ xây dựng một ứng dụng web bằng cách sử dụng khung công tác Laravel, với Nginx làm  web server  và MySQL làm database , tất cả đều nằm trong containers  Docker. Bạn sẽ xác định toàn bộ  cấu hình  trong một file  do docker-compose , cùng với các file  cấu hình cho PHP, MySQL và Nginx.
Yêu cầu
Trước khi bắt đầu, bạn cần :
-  Một  server  Ubuntu 18.04 và một  user  không phải root có  quyền  sudo. Làm theo hướng dẫn Cài đặt server ban đầu với Ubuntu 18.04 để cài đặt điều này.
- Docker đã được cài đặt, làm theo Bước 1 và 2 của Cách cài đặt và sử dụng Docker trên Ubuntu 18.04 .
- Docker Compose đã được cài đặt, làm theo Bước 1 của Cách cài đặt Docker Compose trên Ubuntu 18.04 .
Bước 1 - Download Laravel và cài đặt các phụ thuộc
Bước đầu tiên, ta sẽ tải version mới nhất của Laravel và cài đặt các phần phụ thuộc cho dự án, bao gồm Composer , trình quản lý gói cấp ứng dụng cho PHP. Ta sẽ cài đặt các phần phụ thuộc này với Docker để tránh phải cài đặt Composer trên phạm vi global .
 Trước tiên, hãy kiểm tra xem bạn có đang ở trong folder  chính  của bạn  không và sao chép bản phát hành Laravel mới nhất vào một folder  có tên laravel-app :
- cd ~ 
- git clone https://github.com/laravel/laravel.git laravel-app 
Di chuyển vào folder  laravel-app :
- cd ~/laravel-app 
Tiếp theo, sử dụng hình ảnh trình composer của Docker để  mount  các folder  mà bạn  cần  cho dự án Laravel  của bạn  và tránh chi phí cài đặt Composer  trên phạm vi global :
- docker run --rm -v $(pwd):/app composer install 
Sử dụng cờ -v và --rm với --rm docker run sẽ tạo ra một containers  tạm thời sẽ được  mount  vào folder  hiện tại của bạn trước khi bị xóa. Thao tác này sẽ sao chép nội dung của folder  ~/ laravel-app vào containers  và cũng  đảm bảo  folder  của vendor Composer tạo bên trong containers  được sao chép vào folder  hiện tại của bạn.
Bước cuối cùng, hãy đặt quyền trên folder dự án để nó thuộc sở hữu của user không phải root của bạn:
- sudo chown -R $USER:$USER ~/laravel-app 
Điều này sẽ quan trọng khi bạn viết Dockerfile cho hình ảnh ứng dụng của bạn ở Bước 4, vì nó sẽ cho phép bạn làm việc với mã ứng dụng và chạy các quy trình trong containers của bạn với quyền là user không phải root .
Với mã ứng dụng của bạn tại chỗ, bạn có thể chuyển sang xác định các dịch vụ của bạn với Docker Compose.
Bước 2 - Tạo file docker composer
 Việc xây dựng các ứng dụng của bạn với Docker Compose giúp đơn giản hóa quá trình  cài đặt  và tạo version  cho cơ sở hạ tầng của bạn. Để  cài đặt  ứng dụng Laravel của  ta ,  ta  sẽ viết một file  docker docker-compose xác định  web server , database  và các dịch vụ ứng dụng của  ta .
Mở tập tin:
- nano ~/laravel-app/docker-compose.yml 
Trong file  docker-compose , bạn sẽ xác định ba dịch vụ: app , webserver và db . Thêm mã sau vào file , đảm bảo thay thế password  gốc cho MYSQL_ROOT_PASSWORD , được xác định là một biến môi trường trong dịch vụ db , với password  mạnh do bạn chọn:
version: '3' services:    #PHP Service   app:     build:       context: .       dockerfile: Dockerfile     image: digitalocean.com/php     container_name: app     restart: unless-stopped     tty: true     environment:       SERVICE_NAME: app       SERVICE_TAGS: dev     working_dir: /var/www     networks:       - app-network    #Nginx Service   webserver:     image: nginx:alpine     container_name: webserver     restart: unless-stopped     tty: true     ports:       - "80:80"       - "443:443"     networks:       - app-network    #MySQL Service   db:     image: mysql:5.7.22     container_name: db     restart: unless-stopped     tty: true     ports:       - "3306:3306"     environment:       MYSQL_DATABASE: laravel       MYSQL_ROOT_PASSWORD: your_mysql_root_password       SERVICE_TAGS: dev       SERVICE_NAME: mysql     networks:       - app-network  #Docker Networks networks:   app-network:     driver: bridge Các dịch vụ được định nghĩa ở đây bao gồm:
-  app: Định nghĩa dịch vụ này chứa ứng dụng Laravel và chạy Docker image tùy chỉnh,digitalocean.com/php, mà bạn sẽ xác định trong Bước 4. Nó cũng đặtworking_dirtrong containers thành/var/www.
-  webserver: Định nghĩa dịch vụ này kéo hình ảnhnginx:alpinetừ Docker và hiển thị các cổng80và443.
-  db: Định nghĩa dịch vụ này lấy hình ảnhmysql:5.7.22từ Docker và xác định một vài biến môi trường, bao gồm database có tênlaravelcho ứng dụng của bạn và password gốc cho database . Bạn có thể tự do đặt tên cho database bất cứ điều gì bạn muốn và bạn nên thay thếyour_mysql_root_passwordbằng password mạnh của bạn . Định nghĩa dịch vụ này cũng ánh xạ cổng3306trên server tới cổng3306trên container.
 Mỗi thuộc tính container_name xác định một tên cho containers , tương ứng với tên của dịch vụ. Nếu bạn không xác định thuộc tính này, Docker sẽ chỉ định tên cho mỗi containers  bằng cách kết hợp tên của một người nổi tiếng trong lịch sử và một từ ngẫu nhiên được phân tách bằng dấu gạch dưới.
 Để tạo điều kiện giao tiếp giữa các containers , các dịch vụ được kết nối với một mạng cầu nối được gọi là mạng app-network . Mạng cầu nối sử dụng một cầu nối phần mềm cho phép các  container  được kết nối với cùng một mạng cầu nối giao tiếp với nhau. Trình điều khiển cầu nối tự động cài đặt các  luật  trong  server  để các  container  trên các mạng cầu nối khác nhau không thể giao tiếp trực tiếp với nhau. Điều này tạo ra mức độ bảo mật cao hơn cho các ứng dụng,  đảm bảo  chỉ các dịch vụ liên quan mới có thể giao tiếp với nhau. Điều đó cũng  nghĩa là  bạn có thể xác định nhiều mạng và dịch vụ kết nối với các chức năng liên quan: ví dụ, các dịch vụ ứng dụng front-end có thể sử dụng mạng frontend và các dịch vụ back-end có thể sử dụng mạng backend .
Hãy xem cách thêm dung lượng và liên kết mount vào định nghĩa dịch vụ của bạn để duy trì dữ liệu ứng dụng của bạn.
Bước 3 - Dữ liệu tồn tại
Docker có các tính năng mạnh mẽ và tiện lợi để lưu trữ dữ liệu. Trong ứng dụng của ta , ta sẽ sử dụng dung lượng và các liên kết mount để duy trì database cũng như các file ứng dụng và cấu hình. Dung lượng cung cấp tính linh hoạt cho các bản backup và sự bền bỉ ngoài vòng đời của containers , trong khi các liên kết mount tạo điều kiện thay đổi mã trong quá trình phát triển, áp dụng các thay đổi đối với file server hoặc folder của bạn ngay lập tức có sẵn trong containers của bạn. Cài đặt của ta sẽ sử dụng cả hai.
 Cảnh báo: Bằng cách sử dụng liên kết  mount , bạn có thể thay đổi hệ thống file   server  lưu trữ thông qua các quy trình chạy trong containers , bao gồm tạo, sửa đổi hoặc xóa các file  hoặc folder  hệ thống quan trọng. Đây là một khả năng mạnh mẽ với các tác động bảo mật và có thể ảnh hưởng đến các quy trình không phải Docker trên hệ thống  server . Sử dụng  mount  ràng buộc cẩn thận.
 Trong file  docker-compose , xác định một ổ đĩa được gọi là dbdata theo định nghĩa dịch vụ db để duy trì database  MySQL:
... #MySQL Service db:   ...     volumes:       - dbdata:/var/lib/mysql     networks:       - app-network   ... dbdata được đặt tên vẫn tồn tại nội dung của folder  /var/lib/mysql có bên trong containers . Điều này cho phép bạn dừng và khởi động lại dịch vụ db mà không làm mất dữ liệu.
 Ở cuối file , thêm định nghĩa cho ổ đĩa dbdata :
... #Volumes volumes:   dbdata:     driver: local Với định nghĩa này, bạn có thể sử dụng dung lượng này trên các dịch vụ.
 Tiếp theo, thêm một liên kết  mount  vào dịch vụ db cho các file  cấu hình MySQL mà bạn sẽ tạo trong Bước 7:
... #MySQL Service db:   ...     volumes:       - dbdata:/var/lib/mysql       - ./mysql/my.cnf:/etc/mysql/my.cnf   ... Mount liên kết này liên kết ~/laravel-app/mysql/my.cnf với /etc/mysql/my.cnf trong containers .
 Tiếp theo, thêm các liên kết ràng buộc vào dịch vụ webserver . Sẽ có hai: một cho mã ứng dụng của bạn và một cho định nghĩa cấu hình Nginx mà bạn sẽ tạo trong Bước 6:
#Nginx Service webserver:   ...   volumes:       - ./:/var/www       - ./nginx/conf.d/:/etc/nginx/conf.d/   networks:       - app-network ~/laravel-app kết liên kết đầu tiên liên kết mã ứng dụng trong folder  ~/laravel-app folder  /var/www bên trong containers . Tệp cấu hình mà bạn sẽ thêm vào ~/laravel-app/nginx/conf.d/ cũng sẽ được gắn vào /etc/nginx/conf.d/ trong containers , cho phép bạn thêm hoặc sửa đổi nội dung của folder  cấu hình nếu cần .
 Cuối cùng, thêm các liên kết ràng buộc sau vào dịch vụ app cho mã ứng dụng và file  cấu hình:
#PHP Service app:   ...   volumes:        - ./:/var/www        - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini   networks:       - app-network Dịch vụ app đang ràng buộc-mount folder  ~/laravel-app , chứa mã ứng dụng, vào folder  /var/www trong containers . Điều này sẽ đẩy nhanh quá trình phát triển, vì bất kỳ thay đổi nào được thực hiện đối với folder  ứng dụng local  của bạn sẽ được phản ánh ngay lập tức bên trong containers . Bạn cũng đang liên kết file  cấu hình PHP  của bạn , ~/laravel-app/php/local.ini , với /usr/local/etc/php/conf.d/local.ini bên trong containers . Bạn sẽ tạo file  cấu hình PHP local  trong Bước 5.
 Tệp docker-compose của bạn bây giờ sẽ trông giống như sau:
version: '3' services:    #PHP Service   app:     build:       context: .       dockerfile: Dockerfile     image: digitalocean.com/php     container_name: app     restart: unless-stopped     tty: true     environment:       SERVICE_NAME: app       SERVICE_TAGS: dev     working_dir: /var/www     volumes:       - ./:/var/www       - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini     networks:       - app-network    #Nginx Service   webserver:     image: nginx:alpine     container_name: webserver     restart: unless-stopped     tty: true     ports:       - "80:80"       - "443:443"     volumes:       - ./:/var/www       - ./nginx/conf.d/:/etc/nginx/conf.d/     networks:       - app-network    #MySQL Service   db:     image: mysql:5.7.22     container_name: db     restart: unless-stopped     tty: true     ports:       - "3306:3306"     environment:       MYSQL_DATABASE: laravel       MYSQL_ROOT_PASSWORD: your_mysql_root_password       SERVICE_TAGS: dev       SERVICE_NAME: mysql     volumes:       - dbdata:/var/lib/mysql/       - ./mysql/my.cnf:/etc/mysql/my.cnf     networks:       - app-network  #Docker Networks networks:   app-network:     driver: bridge #Volumes volumes:   dbdata:     driver: local Lưu file và thoát khỏi editor khi bạn thực hiện xong các thay đổi.
 Với file  docker-compose của bạn được viết, bây giờ bạn có thể tạo hình ảnh tùy chỉnh cho ứng dụng  của bạn .
Bước 4 - Tạo Dockerfile
Docker cho phép bạn chỉ định môi trường bên trong các containers riêng lẻ bằng Dockerfile . Dockerfile cho phép bạn tạo hình ảnh tùy chỉnh mà bạn có thể sử dụng để cài đặt phần mềm theo yêu cầu của ứng dụng và cấu hình cài đặt dựa trên yêu cầu của bạn. Bạn có thể đẩy các hình ảnh tùy chỉnh mà bạn tạo vào Docker Hub hoặc bất kỳ cơ quan đăng ký riêng tư nào.
 Dockerfile của  ta  sẽ nằm trong folder  ~/laravel-app của  ta . Tạo file :
- nano ~/laravel-app/Dockerfile 
Dockerfile này sẽ  cài đặt  hình ảnh cơ sở và chỉ định các lệnh và hướng dẫn cần thiết để xây dựng hình ảnh ứng dụng Laravel. Thêm mã sau vào file :
FROM php:7.2-fpm  # Copy composer.lock and composer.json COPY composer.lock composer.json /var/www/  # Set working directory WORKDIR /var/www  # Install dependencies RUN apt-get update && apt-get install -y \     build-essential \     libpng-dev \     libjpeg62-turbo-dev \     libfreetype6-dev \     locales \     zip \     jpegoptim optipng pngquant gifsicle \     vim \     unzip \     git \     curl  # Clear cache RUN apt-get clean && rm -rf /var/lib/apt/lists/*  # Install extensions RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/ RUN docker-php-ext-install gd  # Install composer RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer  # Add user for laravel application RUN groupadd -g 1000 www RUN useradd -u 1000 -ms /bin/bash -g www www  # Copy existing application directory contents COPY . /var/www  # Copy existing application directory permissions COPY --chown=www:www . /var/www  # Change current user to www USER www  # Expose port 9000 and start php-fpm server EXPOSE 9000 CMD ["php-fpm"] Đầu tiên, Dockerfile tạo một hình ảnh phía trên  Docker image  php:7.2-fpm . Đây là hình ảnh dựa trên Debian đã cài đặt PHP-FPM triển khai PHP FastCGI. Tệp cũng cài đặt các gói  yêu cầu  cho Laravel: mcrypt , pdo_mysql , mbstring , và imagick với composer .
 Lệnh RUN chỉ định các lệnh để cập nhật, cài đặt và  cấu hình  cài đặt bên trong containers , bao gồm cả việc tạo  user  và  group  chuyên dụng có tên www . Lệnh WORKDIR chỉ định folder  /var/www là folder  làm việc cho ứng dụng.
 Việc tạo một  user  và  group  chuyên dụng với các quyền hạn chế sẽ giảm thiểu lỗ hổng vốn có khi chạy các containers  Docker, được chạy theo mặc định dưới quyền root . Thay vì chạy containers  này dưới dạng root ,  ta  đã tạo  user  www , người có quyền truy cập đọc / ghi vào folder  /var/www nhờ vào hướng dẫn COPY mà  ta  đang sử dụng với cờ --chown để sao chép quyền của folder  ứng dụng .
 Cuối cùng, lệnh EXPOSE hiển thị một cổng trong containers , 9000 , cho  server  php-fpm . CMD chỉ định lệnh sẽ chạy khi containers  được tạo. Ở đây, CMD chỉ định "php-fpm" , sẽ khởi động  server .
Lưu file và thoát khỏi editor khi bạn thực hiện xong các thay đổi.
Đến đây bạn có thể chuyển sang định nghĩa cấu hình PHP của bạn .
Bước 5 - Cấu hình PHP
  Đến đây bạn  đã xác định cơ sở hạ tầng  của bạn  trong file  docker-compose , bạn có thể  cấu hình  dịch vụ PHP để hoạt động như một  PHP processor  cho các yêu cầu đến từ Nginx.
 Để cấu hình PHP, bạn sẽ tạo file  local.ini bên trong folder  php . Đây là file  mà bạn đã  mount  vào /usr/local/etc/php/conf.d/local.ini bên trong containers  ở Bước 2. Tạo file  này sẽ cho phép bạn overrides  file  php.ini mặc định mà PHP đọc Khi nó bắt đầu.
 Tạo folder  php :
- mkdir ~/laravel-app/php 
Tiếp theo, mở file  local.ini :
- nano ~/laravel-app/php/local.ini 
Để trình bày cách cấu hình PHP, ta sẽ thêm đoạn mã sau để đặt giới hạn kích thước cho các file đã tải lên:
upload_max_filesize=40M post_max_size=40M Các chỉ thị upload_max_filesize và post_max_size đặt kích thước tối đa được phép cho các file  đã tải lên và trình bày cách bạn có thể đặt cấu hình php.ini từ file  local.ini  của bạn . Bạn có thể đặt bất kỳ cấu hình dành riêng cho PHP nào mà bạn muốn overrides  vào file  local.ini .
Lưu file và thoát khỏi editor .
 Với file  local.ini PHP của bạn tại chỗ, bạn có thể chuyển sang cấu hình Nginx.
Bước 6 - Cấu hình Nginx
Với dịch vụ PHP được cấu hình , bạn có thể sửa đổi dịch vụ Nginx để sử dụng PHP-FPM làm server FastCGI để cung cấp nội dung động. Server FastCGI dựa trên giao thức binary để kết nối các chương trình tương tác với web server . Để biết thêm thông tin, vui lòng tham khảo bài viết này về Hiểu và Triển khai FastCGI Proxying trong Nginx .
 Để cấu hình Nginx, bạn sẽ tạo một file  app.conf với cấu hình dịch vụ trong folder  ~/laravel-app/nginx/conf.d/ .
 Đầu tiên, tạo folder  nginx/conf.d/ :
- mkdir -p ~/laravel-app/nginx/conf.d 
Tiếp theo, tạo file  cấu hình app.conf :
- nano ~/laravel-app/nginx/conf.d/app.conf 
Thêm mã sau vào file để chỉ cấu hình Nginx của bạn:
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;     } } Khối server xác cấu hình cho web server Nginx với các lệnh sau:
-  listen: Chỉ thị này xác định cổng mà server sẽ lắng nghe các yêu cầu đến.
-  error_logvàaccess_log: Các lệnh này xác định các file để ghi log .
-  root: Chỉ thị này đặt đường dẫn folder root , tạo thành đường dẫn hoàn chỉnh đến các file nào được yêu cầu trên hệ thống file local .
 Trong khối vị trí php , chỉ thị fastcgi_pass chỉ định rằng dịch vụ app đang lắng nghe trên  socket  TCP trên cổng 9000 . Điều này làm cho  server  PHP-FPM lắng nghe qua mạng thay vì trên  socket  Unix. Mặc dù  socket  Unix có một chút lợi thế về tốc độ so với  socket  TCP, nhưng nó không có giao thức mạng và do đó bỏ qua  mạng . Đối với trường hợp các  server  được đặt trên một máy,  socket  Unix có thể có ý nghĩa, nhưng trong trường hợp bạn có các dịch vụ đang chạy trên các  server  khác nhau,  socket  TCP mang lại lợi thế cho phép bạn kết nối với các dịch vụ phân tán. Bởi vì containers  app của  ta  đang chạy trên một  server  lưu trữ khác với containers  webserver của  ta , nên  socket  TCP có ý nghĩa nhất đối với cấu hình của  ta .
Lưu file và thoát khỏi editor khi bạn thực hiện xong các thay đổi.
 Nhờ  mount  liên kết mà bạn đã tạo ở Bước 2, bất kỳ thay đổi nào bạn thực hiện bên trong folder  nginx/conf.d/ sẽ được phản ánh trực tiếp bên trong containers  webserver .
Tiếp theo, hãy xem cài đặt MySQL của ta .
Bước 7 - Cấu hình MySQL
Với PHP và Nginx được cấu hình, bạn có thể cho phép MySQL hoạt động như một database cho ứng dụng của bạn.
 Để cấu hình MySQL, bạn sẽ tạo file  my.cnf trong folder  mysql . Đây là file  mà bạn đã  mount  vào /etc/mysql/my.cnf bên trong containers  ở Bước 2.  Mount  liên kết này cho phép bạn overrides  cài đặt my.cnf khi cần thiết.
 Để chứng minh cách hoạt động của điều này,  ta  sẽ thêm cài đặt vào file  my.cnf để kích hoạt log  truy vấn chung và chỉ định file  log .
 Đầu tiên, tạo folder  mysql :
- mkdir ~/laravel-app/mysql 
Tiếp theo, tạo file  my.cnf :
- nano ~/laravel-app/mysql/my.cnf 
Trong file , hãy thêm mã sau để bật log truy vấn và đặt vị trí file log :
[mysqld] general_log = 1 general_log_file = /var/lib/mysql/general.log Tệp my.cnf này kích hoạt các bản ghi, xác định cài đặt general_log là 1 để cho phép các bản ghi chung. Cài đặt general_log_file chỉ định nơi các bản ghi sẽ được lưu trữ.
Lưu file và thoát khỏi editor .
Bước tiếp theo của ta sẽ là bắt đầu các container.
Bước 8 - Sửa đổi cài đặt môi trường và chạy các containers
  Đến đây bạn  đã xác định tất cả các dịch vụ  của bạn  trong file  docker-compose và tạo file  cấu hình cho các dịch vụ này, bạn có thể bắt đầu các containers . Là một bước cuối cùng, tuy nhiên,  ta  sẽ tạo một bản sao của .env.example  file  đó Laravel bao gồm theo mặc định và đặt tên cho bản sao .env , đó là  file  Laravel hy vọng sẽ xác định môi trường của nó:
- cp .env.example .env 
 Đến đây bạn  có thể sửa đổi file  .env trên containers  app để bao gồm các chi tiết cụ thể về  cài đặt  của bạn.
 Mở file  bằng nano hoặc editor  mà bạn chọn:
- nano .env 
Tìm khối chỉ định DB_CONNECTION và cập nhật nó để phản ánh các chi tiết cụ thể về  cài đặt  của bạn. Bạn sẽ sửa đổi các trường sau:
-  DB_HOSTsẽ là containers databasedbcủa bạn.
-  DB_DATABASEsẽ là databaselaravel.
-  DB_USERNAMEsẽ là tên user bạn sẽ sử dụng cho database của bạn . Trong trường hợp này, ta sẽ sử dụnglaraveluser.
-  DB_PASSWORDsẽ là password an toàn mà bạn muốn sử dụng cho account user này.
DB_CONNECTION=mysql DB_HOST=db DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=laraveluser DB_PASSWORD=your_laravel_db_password Lưu các thay đổi và thoát khỏi editor .
 Với tất cả các dịch vụ của bạn được xác định trong file  docker-compose , bạn chỉ cần đưa ra một lệnh duy nhất để khởi động tất cả các containers , tạo các ổ đĩa,  cài đặt  và kết nối các mạng:
- docker-compose up -d 
Khi bạn chạy docker-compose up lần đầu tiên, nó sẽ  download  tất cả các  Docker image  cần thiết, có thể mất một lúc. Khi hình ảnh được  download  và lưu trữ trong máy local  của bạn, Soạn sẽ tạo containers  của bạn. Cờ -d daemonized quá trình, chạy các containers  của bạn trong nền.
Khi hoàn tất , hãy sử dụng lệnh sau để liệt kê tất cả các containers đang chạy:
- docker ps 
Bạn sẽ thấy kết quả sau với các chi tiết về app , webserver và containers  db :
OutputCONTAINER ID        NAMES               IMAGE                             STATUS              PORTS c31b7b3251e0        db                  mysql:5.7.22                      Up 2 seconds        0.0.0.0:3306->3306/tcp ed5a69704580        app                 digitalocean.com/php              Up 2 seconds        9000/tcp 5ce4ee31d7c0        webserver           nginx:alpine                      Up 2 seconds        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp CONTAINER ID trong  kết quả  này là số nhận dạng duy nhất cho mỗi containers , trong khi NAMES liệt kê tên dịch vụ được liên kết với mỗi containers . Bạn có thể sử dụng cả hai số nhận dạng này để truy cập các containers . IMAGE xác định tên hình ảnh cho mỗi containers , trong khi STATUS cung cấp thông tin về trạng thái của containers : cho dù nó đang chạy, khởi động lại hay đã dừng.
 Bây giờ  ta  sẽ sử dụng docker-compose exec để  cài đặt  các phím ứng dụng cho các ứng dụng Laravel. Lệnh thực thi docker-compose exec cho phép bạn chạy các lệnh cụ thể trong containers .
 Lệnh sau sẽ tạo một khóa và sao chép nó vào file  .env của bạn,  đảm bảo  các phiên  user  và dữ liệu được mã hóa của bạn vẫn an toàn:
- docker-compose exec app php artisan key:generate 
Đến đây bạn có cài đặt môi trường cần thiết để chạy ứng dụng của bạn . Để lưu vào bộ nhớ cache các cài đặt này vào một file , điều này sẽ tăng tốc độ tải ứng dụng của bạn, hãy chạy:
- docker-compose exec app php artisan config:cache 
Cài đặt cấu hình của bạn sẽ được tải vào /var/www/bootstrap/cache/config.php trên containers .
 Bước cuối cùng, hãy truy cập http:// your_server_ip trong trình duyệt. Bạn sẽ thấy trang chủ sau cho ứng dụng Laravel  của bạn : 
 Với các containers  của bạn đang chạy và thông tin cấu hình của  bạn có , bạn có thể chuyển sang  cấu hình  thông tin  user   của bạn  cho database  laravel trên containers  db .
Bước 9 - Tạo user cho MySQL
Cài đặt MySQL mặc định chỉ tạo account quản trị gốc , có các quyền không giới hạn trên server database . Nói chung, tốt hơn hết là bạn nên tránh sử dụng account quản trị gốc khi tương tác với database . Thay vào đó, hãy tạo một user database chuyên dụng cho database Laravel của ứng dụng của ta .
 Để tạo  user  mới, hãy thực thi một bash shell tương tác trên containers  db bằng docker-compose exec :
- docker-compose exec db bash 
Bên trong containers , đăng nhập vào account quản trị gốc MySQL:
- mysql -u root -p 
Bạn sẽ  được yêu cầu  nhập password  mà bạn đã đặt cho account  gốc MySQL trong khi cài đặt trong file  docker-compose của bạn.
 Bắt đầu bằng cách kiểm tra database  có tên laravel , bạn đã xác định database  này trong laravel docker-compose . Chạy lệnh show databases để kiểm tra các database  hiện có:
- show databases; 
Bạn sẽ thấy database  laravel được liệt kê trong  kết quả :
Output+--------------------+ | Database           | +--------------------+ | information_schema | | laravel            | | mysql              | | performance_schema | | sys                | +--------------------+ 5 rows in set (0.00 sec) Tiếp theo, tạo account   user  sẽ được phép truy cập database  này. Tên  user  của  ta  sẽ là laraveluser , mặc dù bạn có thể thay thế tên này bằng tên khác nếu muốn. Chỉ cần  đảm bảo  tên  user  và password  của bạn ở đây  trùng với  các chi tiết bạn đã đặt trong file  .env  của bạn  ở bước trước:
- GRANT ALL ON laravel.* TO 'laraveluser'@'%' IDENTIFIED BY 'your_laravel_db_password'; 
Xóa các quyền để thông báo cho server MySQL về những thay đổi:
- FLUSH PRIVILEGES; 
Thoát MySQL:
- EXIT; 
Cuối cùng, thoát khỏi containers :
- exit 
Bạn đã cấu hình account user cho database ứng dụng Laravel của bạn và sẵn sàng di chuyển dữ liệu và làm việc với console Tinker.
Bước 10 - Di chuyển dữ liệu và làm việc với console Tinker
 Khi ứng dụng của bạn đang chạy, bạn có thể di chuyển dữ liệu  của bạn  và thử nghiệm với lệnh tinker , lệnh này sẽ khởi chạy console  PsySH với Laravel được tải sẵn. PsySH là một console  dành cho nhà phát triển thời gian chạy và trình gỡ lỗi tương tác cho PHP và Tinker là một REPL dành riêng cho Laravel. Sử dụng lệnh tinker sẽ cho phép bạn tương tác với ứng dụng Laravel  của bạn  từ dòng lệnh trong một  shell  tương tác.
 Đầu tiên, hãy kiểm tra kết nối với MySQL bằng cách chạy lệnh artisan migrate Laravel, lệnh này tạo bảng migrations trong database  từ bên trong containers :
- docker-compose exec app php artisan migrate 
Lệnh này sẽ di chuyển các bảng Laravel mặc định. Kết quả xác nhận việc di chuyển sẽ trông giống như sau:
Output Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated:  2014_10_12_000000_create_users_table Migrating: 2014_10_12_100000_create_password_resets_table Migrated:  2014_10_12_100000_create_password_resets_table Khi quá trình di chuyển hoàn tất, bạn có thể chạy một truy vấn để kiểm tra xem bạn có được kết nối đúng cách với database  hay không bằng cách sử dụng lệnh tinker :
- docker-compose exec app php artisan tinker 
Kiểm tra kết nối MySQL bằng cách lấy dữ liệu bạn vừa di chuyển:
- \DB::table('migrations')->get(); 
Bạn sẽ thấy kết quả giống như sau:
Output=> Illuminate\Support\Collection {#2856      all: [        {#2862          +"id": 1,          +"migration": "2014_10_12_000000_create_users_table",          +"batch": 1,        },        {#2865          +"id": 2,          +"migration": "2014_10_12_100000_create_password_resets_table",          +"batch": 1,        },      ],    } Bạn có thể sử dụng tinker để tương tác với database   của bạn  và thử nghiệm với các dịch vụ và mô hình.
Với ứng dụng Laravel của bạn tại chỗ, bạn đã sẵn sàng để phát triển và thử nghiệm thêm.
Kết luận
Đến đây bạn có một ứng dụng LEMP đang chạy trên server của bạn , mà bạn đã thử nghiệm bằng cách truy cập trang chào mừng Laravel và tạo di chuyển database MySQL.
Key cho sự đơn giản của cài đặt này là Docker Compose, cho phép bạn tạo một group các containers Docker, được xác định trong một file duy nhất, bằng một lệnh duy nhất. Nếu bạn muốn tìm hiểu thêm về cách thực hiện CI với Docker Compose, hãy xem Cách cấu hình Môi trường kiểm tra tích hợp liên tục với Docker và Docker Compose trên Ubuntu 16.04 . Nếu bạn muốn hợp lý hóa quy trình triển khai ứng dụng Laravel của bạn thì Cách tự động triển khai ứng dụng Laravel với Trình triển khai trên Ubuntu 16.04 sẽ là một tài nguyên phù hợp.
Các tin liên quan
Cách cài đặt Nginx trên CentOS 82020-03-03
Cách thiết lập Django với Postgres, Nginx và Gunicorn trên Debian 10
2019-07-25
Cách tạo chứng chỉ SSL tự ký cho Nginx trên Debian 10
2019-07-15
Cách bảo mật Nginx bằng Let's Encrypt trên Debian 10
2019-07-11
Cách cài đặt Nginx trên Debian 10
2019-07-10
Cách cài đặt và bảo mật phpMyAdmin bằng Nginx trên server Debian 9
2019-06-13
Cách cài đặt và bảo mật phpMyAdmin với Nginx trên server Ubuntu 18.04
2019-04-18
Cách bảo mật một ứng dụng Node.js được chứa đựng bằng Nginx, Let's Encrypt và Docker Compose
2019-01-04
Cách cài đặt Nginx trên FreeBSD 11.2
2018-11-15
Cách bảo mật Nginx bằng NAXSI trên Ubuntu 16.04
2018-11-09
 

