Thứ hai, 09/03/2020 | 00:00 GMT+7

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 rundocker 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 :

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--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 , webserverdb . 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:

~ / laravel-app / docker -omp.yml
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 đặt working_dir trong containers thành /var/www .
  • webserver : Định nghĩa dịch vụ này kéo hình ảnh nginx:alpine từ Docker và hiển thị các cổng 80443 .
  • db : Định nghĩa dịch vụ này lấy hình ảnh mysql:5.7.22 từ Docker và xác định một vài biến môi trường, bao gồm database có tên laravel cho ứ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_password bằng password mạnh của bạn . Định nghĩa dịch vụ này cũng ánh xạ cổng 3306 trên server tới cổng 3306 trê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:

~ / laravel-app / docker -omp.yml
... #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 :

~ / laravel-app / docker -omp.yml
... #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:

~ / laravel-app / docker -omp.yml
... #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:

~ / laravel-app / docker -omp.yml
#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:

~ / laravel-app / docker -omp.yml
#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:

~ / laravel-app / docker -omp.yml
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 :

~ / laravel-app / php / Dockerfile
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:

~ / laravel-app / php / local.ini
upload_max_filesize=40M post_max_size=40M 

Các chỉ thị upload_max_filesizepost_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:

~ / laravel-app / nginx / conf.d / app.conf
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_logaccess_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 :

~ / laravel-app / mysql / my.cnf
[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_log1 để 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_HOST sẽ là containers database db của bạn.
  • DB_DATABASE sẽ là database laravel .
  • DB_USERNAME sẽ 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ụng laraveluser .
  • DB_PASSWORD sẽ là password an toàn mà bạn muốn sử dụng cho account user này.
/var/www/.env
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 :

Output
CONTAINER 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 :

Trang chủ Laravel

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.


Tags:

Các tin trước

Cách cài đặt Nginx trên CentOS 8 2020-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