Cài đặt Magento trên docker

Magento là một ứng dụng mã nguồi mở để xây dựng các website thương mãi điện tử, sử dụng ngôn ngữ chính là PHP và mô hình MVC làm nền tảng. Với một nền tảng tương đối lớn như Magento, việc cài đặt để nó chạy thôi cũng mất khá nhiều thời gian cùng với một đống config liên quan. Chính vì vậy, bạn sẽ tự đặt ra cho mình một câu hỏi

Hmm. Có mỗi cài đặt thôi mà mất thời gian quá. Có cách nào nhanh hơn không ta?

Tada...và docker sinh ra để giúp chúng ta làm những công việc đấy. Chỉ mất thời gian config lúc ban đầu, sau đó mọi người trong team hay kể cả member mới sau này việc cài đặt project cũng dễ dàng hơn. Hơn hết, nó đảm bảo cho môi trường làm việc giữa các thành viên, giữa development và production cũng không quá khác biệt.

Download magento 2 source code

Theo documention của Magento có 3 cách để các bạn có thể có được mã nguồn của Magento 2 ở đây là bản Magento Commercer version đó là thông qua composer, git, archive

  • Sử dụng composer để tạo project:

    composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition <install-directory-name>
    
  • Sử dụng git hoặc download trực tiếp từ trang chủ về tại github hoặc magento.com

Vì trong source code lấy về đã có sẵn file .gitignore nên bạn không phải lo git add cả những file thừa

Những yêu cầu cần thiết khi cài đặt Magento 2

Về hệ điều hành, tất nhiên nó sẽ là Linux (Ubuntu, Debian, CentOs,...) theo như Docs của Magento họ không đảm bảo việc chạy Magento trên các hệ điều hành Windows hay MacOS. Thực tế trải nghiệm của mình mặc dù cài đặt được trên các hệ điều hành này nhưng tốc độ load của nó khá chậm, Linux vẫn là best choice. Hệ điều hành yêu cầu bạn phải cài đặt:

  1. PHP >= 7.3 (Tốt nhất vẫn là PHP 7.4)
  2. Webserver có thể là Apache hoặc Nginx. Magento recommend sử dụng Nginx và PHP-FPM để được hiệu năng tốt hơn. Nên chúng ta cũng sẽ dùng Nginx
  3. Database sẽ là MySQL >= 5.7
  4. Elasticsearch (>= 7.6) Từ phiên bản Magento 2.4 không còn sử dụng MySQL để thực hiện tìm kiếm nữa. Thay vào đó Magento sử dụng Elasticsearch

Xây dựng docker

Yêu cầu bài toán đã có bây giờ chúng ta bắt tay vào làm thôi.

Sử dụng docker-compose, mỗi container sẽ tương ứng với 1 phần mềm bạn phải cài đặt

version: '3.5'
services:
  nginx:
  #
  php:
    #
  mysql:
   #
  phpmyadmin:
   #
  elasticsearch:
   #

PHP FPM

Đầu tiên là container cho PHP-FPM. Do yêu cầu cần nhiều Extension nên sẽ không có image có sẵn nên chúng ta sẽ tạo mới image bằng php.Dockerfile. Ngoài việc cài các PHP Extensions, chúng ta cũng sẽ cần phải cài thêm mỗi số tools để có thể tương tác được với hệ thống Magento như bin/magento, git, vim, cron, composer

FROM php:7.4-fpm

WORKDIR /var/www/html

RUN apt-get update && apt-get install -y \
    libfreetype6-dev \
    libjpeg62-turbo-dev \
    libpng-dev \
    libicu-dev \
    libsodium-dev \
    libxml2-dev \
    libxslt-dev \
    libzip-dev \
    libmcrypt-dev \
    git vim unzip cron \
    --no-install-recommends \
    && rm -r /var/lib/apt/lists/*

RUN docker-php-ext-configure gd --with-jpeg=/usr/include \
    --with-freetype=/usr/include/freetype2 \
    && docker-php-ext-install -j$(nproc) gd

RUN docker-php-ext-configure intl \
    && docker-php-ext-install -j$(nproc) intl

RUN docker-php-ext-install -j$(nproc) \
    opcache \
    bcmath \
    mysqli \
    pdo_mysql \
    soap \
    xsl \
    zip \
    sockets \
    sodium

RUN pecl install -o xdebug-2.9.8 
RUN pecl install mcrypt-1.0.4 && docker-php-ext-enable mcrypt

# Install Composer
RUN curl https://getcomposer.org/composer-2.phar -o composer \
    && mv composer /usr/local/bin/composer && chmod 750 /usr/local/bin/composer

CMD ["php-fpm"]

Ta có server đầu tiên

php:
    build:
      context: ./docker/build
      dockerfile: php.Dockerfile
    volumes:
      - "./docker/config/php/:/usr/local/etc/php/conf.d/"
      - "./:/var/www/html"

File docker-php.ini trong folder ./config/php

memory_limit=-1
max_execution_time=360
max_file_uploads=1000
max_input_time=3600
post_max_size=1024M
max_input_vars=100000
upload_max_filesize = 1024M

Nginx

Tiếp theo là container cho web server Nginx, có nhiệm vụ giao tiếp với PHP-FPM và trả về response cho client. Với service này, để tận dụng khả năng dùng lại các image có sẵn và giảm bớt việc phải build image, nên chúng ta không cần sử dụng custom Dockerfile, ở đây chỉ cần sử dụng image nginx và thực hiện mount file config:

nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - "./docker/config/nginx/:/etc/nginx/conf.d/"
      - "./docker/logs/nginx/:/var/log/nginx/"
      - "./:/var/www/html"

File default.conf cho Nginx

upstream fastcgi_backend {
    server php:9000;
}

server {
    listen 80;
    server_name _;
    set $MAGE_ROOT /var/www/html;
    set $MAGE_DEBUG_SHOW_ARGS 1;
    include /var/www/html/nginx.conf.sample;
}

MySQL

Tương tự, chúng ta cũng có thể dùng image mysql trực tiếp và tạo user, db qua init SQL file mà không cần custom image:

mysql:
    image: mysql:8.0
    restart: always
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "false"
      MYSQL_ROOT_PASSWORD: "root"
      MYSQL_DATABASE: magento
    volumes:
      - "./docker/data/mysql/:/var/lib/mysql/"

Bạn có thể publish port 3306 để kết nối với MySQL ở host machine hoặc bạn cũng có thể sử dụng phpmyadmin

phpmyadmin:
    image: phpmyadmin/phpmyadmin
    restart: always
    ports:
      - '8080:80'
    environment:
      PMA_HOST: mysql

Bây giờ bạn đã có thể truy cập vào phpmyadmin với đường dẫn http://localhost:8080

user: root
password: root

Elasticsearch

elasticsearch:
    image: elasticsearch:7.9.3
    restart: always
    environment:
      - discovery.type=single-node
    volumes:
      - "./docker/data/elasticsearch/:/usr/share/elasticsearch/data/"

Lệnh cài đặt cho lần đầu

# Chạy lệnh trong container php fpm 
docker-compose up -d
docker-compose exec -it php bash

# Cài đặt magento 
php bin/magento setup:install \
    --base-url=http://magento.local \
    --db-host=mysql \
    --db-name=magento \
    --db-user=root \
    --db-password=root \
    --backend-frontname=admin \
    --admin-firstname=admin \
    --admin-lastname=admin \
    --admin-email=admin@example.com \
    --admin-user=admin \
    --admin-password=admin123 \
    --language=en_US \
    --currency=USD \
    --timezone=America/Chicago \
    --use-rewrites=1 \
    --elasticsearch-host=elasticsearch \
    --elasticsearch-port=9200

chmod 777 -R .

Tiếp theo, các bạn tạo một tên miền magento.local chạy trên IP 127.0.0.1 trong /etc/hosts

Vậy là xong. Bây giờ vào đường đẫn magento.local để xem kết quả.

Khắc phục lỗi xác thực khi đăng nhập trong admin

Để khắc phục sự cố này, bạn cần tắt module Magento_TwoFactorAuth bằng cách chạy lệnh

bin/magento module:disable Magento_TwoFactorAuth

Vậy là đã xong. Hy vọng các bạn sẽ cài đặt thành công. Nếu có bất kỳ thắc mắc hoặc lỗi nào liên quan vui lòng để lại bình luận nhé. Hẹn các bạn trong các bài tiếp theo của Series.