Thứ hai, 13/09/2021 | 00:00 GMT+7

Cài đặt Laravel Nginx và Mysql với Docker Compose trên Ubuntu 20.04

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 container. Ví dụ: khi bạn đang sử dụng LEMP với PHP , Nginx , MySQL và Laravel Framework, Docker có thể đơn giản hóa đáng kể quá trình thiết lập.

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 tệp 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 chứa docker và 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 framework Laravel, với Nginx làm web server và MySQL làm cơ sở dữ liệu, tất cả đều nằm trong container Docker. Bạn sẽ xác định toàn bộ cấu hình trong một docker-compose , cùng với các tệp 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 gói hỗ trợ

Bước đầu tiên, bạn sẽ nhận được phiên bản 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 gói hỗ trợ 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 thư mục 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 thư mục có tên laravel-app :

  • cd ~
  • git clone https://github.com/laravel/laravel.git laravel-app

Di chuyển vào thư mục laravel-app :

  • cd ~/laravel-app

Tiếp theo, sử dụng hình ảnh trình composer của Docker để mount các thư mục 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 container tạm thời sẽ được mount vào thư mục 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 thư mục ~/ laravel-app vào container và cũng đảm bảo thư mục của vendor Composer tạo bên trong container được sao chép vào thư mục hiện tại của bạn.

Bước cuối cùng, hãy đặt quyền trên thư mục dự án để nó thuộc sở hữu của user không phải root của bạn:

  • sudo chown -R sammy:sammy ~/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 container 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 tệp 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 phiên bản cho cơ sở hạ tầng của bạn. Để cài đặt ứng dụng Laravel của bạn, bạn sẽ viết một docker-compose xác định web server, cơ sở dữ liệu và các dịch vụ ứng dụng của bạn.

Mở tập tin:

  • nano ~/laravel-app/docker-compose.yml

Trong docker-compose , bạn sẽ xác định ba dịch vụ: app , webserverdb . Thêm mã sau vào tệp, đảm bảo thay thế MYSQL_ROOT_PASSWORD bằng mật khẩu MySQL của user gốc, được xác định là một biến môi trường trong db , với mật khẩu mạnh do bạn chọn:

~ / laravel-app / docker-compost.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: 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 container 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 cơ sở dữ liệu có tên laravel cho ứng dụng của bạn và mật khẩu gốc cho cơ sở dữ liệu. Bạn có thể tự do đặt tên cho cơ sở dữ liệu bất cứ điều gì bạn muốn và bạn nên thay thế your_mysql_root_password bằng mật khẩu 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 container, 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 container 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 container, các dịch vụ được kết nối với một mạng bridge được gọi là mạng app-network . Mạng bridge 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 bridge 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 bridge 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: frontend , và các dịch vụ back-end có thể sử dụng mạng backend

Tiếp theo, bạn sẽ xem xét cách thêm dung lượng và liên kết mount vào các đị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 - Cách 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 bạn, bạn sẽ sử dụng dung lượng và các liên kết mount để duy trì cơ sở dữ liệu cũng như các tệp ứ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 container, 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 tệp server hoặc thư mục của bạn ngay lập tức có sẵn trong container của bạn. Cài đặt của bạn sẽ sử dụng cả hai.

Cảnh báo: Bằng cách sử dụng mount liên kết, bạn có thể thay đổi hệ thống tệp server lưu trữ thông qua các quy trình đang chạy trong container, bao gồm tạo, sửa đổi hoặc xóa các tệp hoặc thư mục 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 một cách cẩn thận.

Trong docker-compose , hãy xác định một ổ đĩa được gọi là dbdata theo db để duy trì cơ sở dữ liệu MySQL:

~ / laravel-app / docker-compost.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 thư mục /var/lib/mysql có bên trong container. Đ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 tệp, 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 tệp 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 container.

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 thư mục ~/laravel-app thư mục /var/www bên trong container. 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 container, cho phép bạn thêm hoặc sửa đổi nội dung của thư mục 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à tệp 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 thư mục ~/laravel-app , chứa mã ứng dụng, vào thư mục /var/www trong container. Đ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 thư mục ứng dụng cục bộ của bạn sẽ được phản ánh ngay lập tức bên trong container. Bạn cũng đang liên kết tệp 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 container. Bạn sẽ tạo tệp cấu hình PHP cục bộ 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 tệp và thoát khỏi editor khi bạn thực hiện xong các thay đổi.

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 container 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 bạn sẽ nằm trong thư mục ~/laravel-app . Tạo tệp:

  • 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 tệp:

~ / laravel-app / php / Dockerfile
FROM php:7.4-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 \
    libzip-dev

# 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 trên cùng của Docker image php:7.4-fpm . Đây là hình ảnh dựa trên Debian có 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 container, bao gồm cả việc tạo một user và group chuyên dụng có tên www . Lệnh WORKDIR chỉ định thư mục /var/www là thư mục 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 container Docker, được chạy theo mặc định dưới quyền root . Thay vì chạy chứa này như là user root, bạn đã tạo cho người sử dụng www, ai đã đọc / ghi truy cập vào các /var/www thư mục nhờ vào COPY hướng dẫn mà bạn đang sử dụng với --chown cờ để sao chép điều khoản thư mục ứng dụng của .

Cuối cùng, EXPOSE hiển thị một cổng trong container, 9000 , cho server php-fpm CMD chỉ định lệnh sẽ chạy sau khi container được tạo. Ở đây, CMD chỉ định "php-fpm" , sẽ khởi động server.

Lưu tệp 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 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 local.ini bên trong thư mục php Đây là tệp mà bạn đã mount vào /usr/local/etc/php/conf.d/local.ini bên trong container ở Bước 2. Tạo tệp này sẽ cho phép bạn ghi đè php.ini mặc định mà PHP đọc Khi nó bắt đầu.

Tạo thư mục php

  • mkdir ~/laravel-app/php

Tiếp theo, mở tệp local.ini :

  • nano ~/laravel-app/php/local.ini

Để trình bày cách cấu hình PHP, bạn sẽ thêm đoạn mã sau để đặt giới hạn kích thước cho các tệp đã 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 tệp đã tải lên và trình bày cách bạn có thể đặt cấu hình php.ini từ tệp 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 ghi đè vào tệp local.ini .

Lưu tệp và thoát khỏi editor.

Với tệp 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 nhị phân để 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 tệp app.conf với cấu hình dịch vụ trong thư mục ~/laravel-app/nginx/conf.d/ .

Đầu tiên, tạo thư mục nginx/conf.d/ :

  • mkdir -p ~/laravel-app/nginx/conf.d

Tiếp theo, tạo tệp cấu hình app.conf :

  • nano ~/laravel-app/nginx/conf.d/app.conf

Thêm mã sau vào tệp để 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 tệp để ghi nhật ký.
  • root : Chỉ thị này đặt đường dẫn thư mục gốc, tạo thành đường dẫn hoàn chỉnh đến bất kỳ tệp nào được yêu cầu trên hệ thống tệp cục bộ.

Trong khối vị trí php fastcgi_pass chỉ định rằng 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 chứ không phải 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ụ 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. Vì vùng app của bạn đang chạy trên một server lưu trữ khác với vùng webserver của bạn, nên socket TCP có ý nghĩa nhất đối với cấu hình của bạn.

Lưu tệp 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 nginx/conf.d/ sẽ được phản ánh trực tiếp bên trong container webserver

Tiếp theo, bạn sẽ xem xét và cấu hình cài đặt MySQL của bạn.

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 cơ sở dữ liệu cho ứng dụng của bạn.

Để cấu hình MySQL, bạn sẽ tạo tệp my.cnf trong thư mục mysql Đây là tệp mà bạn đã mount vào /etc/mysql/my.cnf bên trong container ở Bước 2. Mount liên kết này cho phép bạn ghi đè my.cnf khi được yêu cầu.

Để chứng minh cách hoạt động của điều này, bạn sẽ thêm cài đặt vào my.cnf để kích hoạt nhật ký truy vấn chung và chỉ định tệp nhật ký.

Đầu tiên, tạo thư mục mysql

  • mkdir ~/laravel-app/mysql

Tiếp theo, tạo tệp my.cnf :

  • nano ~/laravel-app/mysql/my.cnf

Trong tệp, hãy thêm mã sau để bật nhật ký truy vấn và đặt vị trí tệp nhật ký:

~ / laravel-app / mysql / my.cnf
[mysqld]
general_log = 1
general_log_file = /var/lib/mysql/general.log

my.cnf này kích hoạt các bản ghi, xác định cài đặt general_log 1 để cho phép các bản ghi chung. general_log_file chỉ định nơi các bản ghi sẽ được lưu trữ.

Lưu tệp và thoát khỏi editor.

Bước tiếp theo của bạn 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 container

Đến đây bạn đã xác định tất cả các dịch vụ của bạn trong docker-compose của bạn và tạo tệp cấu hình cho các dịch vụ này, bạn có thể bắt đầu các container. Là một bước cuối cùng, tuy nhiên, bạn 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 tệp .env trên container app để bao gồm các chi tiết cụ thể về cài đặt của bạn.

Mở tệp bằng nano hoặc trình soạn thảo văn bản 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à container cơ sở dữ liệu db
  • DB_DATABASE sẽ là cơ sở dữ liệu laravel
  • DB_USERNAME sẽ là tên user bạn sẽ sử dụng cho cơ sở dữ liệu. Trong trường hợp này, bạn sẽ sử dụng laraveluser .
  • DB_PASSWORD sẽ là mật khẩu an toàn mà bạn muốn sử dụng cho tài khoản 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 docker-compose , hãy sử dụng lệnh đơn sau để khởi động tất cả các container, tạo các ổ đĩa, cài đặt và kết nối 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 cục bộ của bạn, Soạn sẽ tạo container của bạn. Cờ -d daemonized quá trình, chạy các container 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 container đ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à container 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 container, trong khi NAMES liệt kê tên dịch vụ được liên kết với mỗi container. Bạn có thể sử dụng cả hai số nhận dạng này để truy cập các container. IMAGE xác định tên hình ảnh cho mỗi container, trong khi STATUS cung cấp thông tin về trạng thái của container: cho dù nó đang chạy, khởi động lại hay đã dừng.

Đến đây bạn 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 các container.

Lệnh sau sẽ tạo một khóa và sao chép nó vào .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 tệp, đ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 container.

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 container của bạn đang chạy và thông tin cấu hình của bạn đã có sẵn, bạn có thể chuyển sang cấu hình thông tin user cho cơ sở dữ liệu laravel trên container db

Bước 9 - Tạo user cho MySQL

Cài đặt MySQL mặc định chỉ tạo tài khoản quản trị gốc , tài khoản này có các quyền không giới hạn trên server cơ sở dữ liệu. Nói chung, tốt hơn hết bạn nên tránh sử dụng tài khoản quản trị gốc khi tương tác với cơ sở dữ liệu. Thay vào đó, hãy tạo một user cơ sở dữ liệu chuyên dụng cho cơ sở dữ liệu Laravel của ứng dụng của bạn.

Để tạo user mới, hãy thực thi một shell bash tương tác trên container db docker-compose exec :

  • docker-compose exec db bash

Bên trong container, đăng nhập vào tài khoản quản trị gốc MySQL:

  • mysql -u root -p

Bạn cần nhập mật khẩu mà bạn đã đặt cho tài khoản gốc MySQL trong khi cài đặt trong tệp docker-compose của bạn.

Bắt đầu bằng cách kiểm tra cơ sở dữ liệu có tên laravel , bạn đã xác định cơ sở dữ liệu này trong laravel docker-compose . Chạy lệnh show databases để kiểm tra các cơ sở dữ liệu hiện có:

  • show databases;

Bạn sẽ thấy cơ sở dữ liệu 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 tài khoản user sẽ được phép truy cập cơ sở dữ liệu này. Tên user sẽ là laraveluser , tuy nhiên bạn có thể thay thế tên này bằng một tên khác nếu muốn. Chỉ cần đảm bảo tên user và mật khẩu của bạn ở đây trùng với các chi tiết bạn đã đặt trong .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 container:

  • exit

Bạn đã cấu hình tài khoản user cho cơ sở dữ liệu ứ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 control panel Tinker.

Bước 10 - Di chuyển dữ liệu và làm việc với control panel Tinker

Khi ứng dụng của bạn đang chạy, bạn có thể di chuyển dữ liệu và thử nghiệm với lệnh tinker , lệnh này sẽ khởi chạy control panel PsySH với Laravel được tải sẵn. PsySH là một control panel 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 cơ sở dữ liệu từ bên trong container:

  • 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 cơ sở dữ liệu 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 cơ sở dữ liệu 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, 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, ứng dụng này bạn đã thử nghiệm bằng cách truy cập trang chào mừng Laravel và tạo cơ sở dữ liệu MySQL. Chìa khóa 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 container Docker, được xác định trong một tệp duy nhất, bằng một lệnh duy nhất.


Tags:

Các tin liên quan