Thủ thuật Website

Laravel với PHP8.0 trong Vùng chứa Alpine

Khi triển khai một ứng dụng Laravel, mục tiêu là đảm bảo rằng quá trình triển khai càng nhanh càng tốt và an toàn. Một phần quan trọng của việc đạt được mục tiêu này là chọn hình ảnh Linux cơ sở phù hợp để tạo hình ảnh vùng chứa nơi ứng dụng sẽ chạy và triển khai sau này.

Alpine Linux đã chỉ ra rằng không có bản phân phối nào nhanh hơn khi làm việc với vùng chứa cho bất kỳ ngôn ngữ nào. Kể từ bản phát hành đầu tiên của Docker, sự phổ biến của bản phân phối Alpine đã phát triển và không ngừng tăng lên vì nó là một bản phân phối nhỏ, chứa và tập trung vào bảo mật.

Để có thể chạy một ứng dụng chỉ cần PHP và Composer là không đủ NGINX và Supervisor, nó cũng cần có, và đây là nơi có một chút phức tạp. Nhưng đừng lo, một Dockerfile nó sẽ được mổ xẻ, và bạn sẽ hiểu tại sao mọi thứ lại như vậy.

Nội dung

  • Dockerfile
  • Xác định cơ sở hình ảnh
  • Cài đặt phần mềm     – Cài đặt những thứ cần thiết     – Cài đặt bash     – Cài đặt PHP     – Cài đặt Composer
  • Cấu hình phần mềm     – Định cấu hình trình giám sát     – Định cấu hình PHP     – Định cấu hình NGINX
  • Xây dựng quy trình
  • Thực hiện vùng chứa

Dockerfile

Ở bên dưới, có toàn bộ Dockerfile được sử dụng cục bộ và đang được sản xuất để phục vụ ứng dụng Laravel. Lưu ý rằng nó không được tối ưu hóa để có số lượng lớp tối thiểu và đó là mục đích, vì chúng tôi sẽ lấy các phần nhỏ của tệp và hiểu từng phần làm gì.

FROM alpine:latest

WORKDIR /var/www/html/

# Essentials
RUN echo "UTC" > /etc/timezone
RUN apk add --no-cache zip unzip curl sqlite nginx supervisor

# Installing bash
RUN apk add bash
RUN sed -i 's/bin\/ash/bin\/bash/g' /etc/passwd

# Installing PHP
RUN apk add --no-cache php8 \
    php8-common \
    php8-fpm \
    php8-pdo \
    php8-opcache \
    php8-zip \
    php8-phar \
    php8-iconv \
    php8-cli \
    php8-curl \
    php8-openssl \
    php8-mbstring \
    php8-tokenizer \
    php8-fileinfo \
    php8-json \
    php8-xml \
    php8-xmlwriter \
    php8-simplexml \
    php8-dom \
    php8-pdo_mysql \
    php8-pdo_sqlite \
    php8-tokenizer \
    php8-pecl-redis

# Installing composer
RUN curl -sS https://getcomposer.org/installer -o composer-setup.php
RUN php composer-setup.php --install-dir=/usr/local/bin --filename=composer
RUN rm -rf composer-setup.php

# Configure supervisor
RUN mkdir -p /etc/supervisor.d/
COPY .docker/supervisord.ini /etc/supervisor.d/supervisord.ini

# Configure PHP
RUN mkdir -p /run/php/
RUN touch /run/php/php8.0-fpm.pid

COPY .docker/php-fpm.conf /etc/php8/php-fpm.conf
COPY .docker/php.ini-production /etc/php8/php.ini

# Configure nginx
COPY .docker/nginx.conf /etc/nginx/
COPY .docker/nginx-laravel.conf /etc/nginx/modules/

RUN mkdir -p /run/nginx/
RUN touch /run/nginx/nginx.pid

RUN ln -sf /dev/stdout /var/log/nginx/access.log
RUN ln -sf /dev/stderr /var/log/nginx/error.log

# Building process
COPY . .
RUN composer install --no-dev
RUN chown -R nobody:nobody /var/www/html/storage

EXPOSE 80
CMD ["supervisord", "-c", "/etc/supervisor.d/supervisord.ini"]

Xác định cơ sở hình ảnh

Bước đầu tiên hướng tới việc xây dựng Dockerfile là tạo chính tệp đó và xác định bản phân phối Linux và phiên bản của nó. Sau khi hoàn tất, bạn có thể bắt đầu soạn Dockerfile của mình với các hướng dẫn cần thiết để xây dựng hình ảnh vùng chứa của bạn.

FROM alpine:latest

WORKDIR /var/www/html/

Lệnh FROM đặt Hình ảnh cơ sở cho các hướng dẫn tiếp theo. Lưu ý rằng alpine: new được định nghĩa, đặt alpine làm hình ảnh Linux cơ sở. Sau tên bản phân phối, có một :  được sử dụng để chỉ định một thẻ hoặc phiên bản, vì vậy khi lệnh FROM alpine:latestđược diễn giải, nó sẽ đặt alpine ở phiên bản mới nhất làm hình ảnh cơ sở.

Trong khi hướng dẫn WORKDIR đặt thư mục làm việc cho bất kỳ lệnh RUN, CMD, ENTRYPOINT, COPY và ADD nào theo sau nó trong Dockerfile. Vì vậy, khi lệnh WORKDIR /var/www/html/  được diễn giải, mọi thực thi lệnh trong Dockerfile sẽ diễn ra thành / var / www / html / .

Cài đặt phần mềm

Bây giờ cơ sở hình ảnh vùng chứa đã được xác định, đã đến lúc bắt đầu xem xét phần mềm mà chúng ta cần cài đặt để chạy ứng dụng. Như đã đề cập, PHP, Composer, NGINX và Supervisor là các chương trình phần mềm để cài đặt, nhưng đó không phải là tất cả. Vì phần mềm này có các phụ thuộc nên chúng cũng phải được cài đặt. Đây là quá trình cài đặt được chia thành các phần được giải thích, vì vậy bạn có thể hiểu nó.

Cài đặt các yếu tố cần thiết

RUN echo "UTC" > /etc/timezone
RUN apk add --no-cache zip unzip curl sqlite nginx supervisor

Lệnh RUN đầu tiên sẽ thực hiện bất kỳ lệnh nào trong một lớp mới trên đầu hình ảnh hiện tại và cam kết kết quả. Do đó, khi RUN echo "UTC" > /etc/timezoneđược thông dịch, lệnh echo sẽ in ra chuỗi UTC thành tệp / etc / timezone . Kết quả của việc thực thi lệnh, UTC trở thành múi giờ tiêu chuẩn.

Trong hướng dẫn RUN thứ hai, một lệnh apk xuất hiện, apk là trình quản lý gói Alpine, một trình quản lý gói nổi tiếng khác là apt từ Ubuntu. Như đã nói, khi RUN apk add --no-cache zip unzip curl sqlite nginx supervisorđược xử lý, nó sẽ cài đặt các chương trình phần mềm đó trong hình ảnh cơ sở.

Cài đặt bash

RUN apk add bash
RUN sed -i 's/bin\/ash/bin\/bash/g' /etc/passwd

Lệnh RUN đầu tiên cho biết rằng bash phải được cài đặt. Hướng dẫn thứ hai đặt nó làm trình bao tiêu chuẩn bằng cách thay thế chuỗi / bin / ash bằng / bin / bash thành tệp / etc / passwd . Sự thay đổi này là do trình bao tiêu chuẩn Alpine, tro, hoạt động theo cách khác và những khác biệt này có thể cản trở bạn khi bạn hoặc nhóm của bạn cần thực thi tập lệnh trình bao trong vùng chứa.

Cài đặt PHP

RUN apk add --no-cache php8 \
    php8-common \
    php8-fpm \
    php8-pdo \
    php8-opcache \
    php8-zip \
    php8-phar \
    php8-iconv \
    php8-cli \
    php8-curl \
    php8-openssl \
    php8-mbstring \
    php8-tokenizer \
    php8-fileinfo \
    php8-json \
    php8-xml \
    php8-xmlwriter \
    php8-simplexml \
    php8-dom \
    php8-pdo_mysql \
    php8-pdo_sqlite \
    php8-tokenizer \
    php8-pecl-redis

Hướng dẫn RUN đầu tiên nói rằng PHP và tất cả các phần mở rộng được liệt kê phải được cài đặt. Như đã đề cập trước đây, Dockerfile này được sử dụng để phục vụ các ứng dụng Laravel, vì vậy các phần mở rộng PHP là tùy ý và có thể thay đổi tùy thuộc vào khuôn khổ hoặc ứng dụng bạn đang cố gắng chạy.

Cuối cùng, bạn có thể tìm thấy những gì các phần mở rộng PHP thực hiện bằng cách kiểm tra tài liệu về phần mở rộng PHP và các trang PECL của thư viện cộng đồng phần mở rộng PHP và tìm kiếm chúng.

Cài đặt trình soạn nhạc

RUN curl -sS https://getcomposer.org/installer -o composer-setup.php
RUN php composer-setup.php --install-dir=/usr/local/bin --filename=composer
RUN rm -rf composer-setup.php

Trong tệp nhị phân trình soạn nhạc hướng dẫn RUN này, composer-setup.php được tải xuống từ trang chính thức của nhà soạn nhạc. Sau đó, trong hướng dẫn thứ hai, tệp nhị phân được sử dụng để cài đặt trình soạn nhạc vào thư mục / usr / local / bin . Cuối cùng, tệp nhị phân bị xóa sau khi cài đặt trình soạn nhạc vì tệp nhị phân của anh ta không còn được sử dụng cho hệ thống nữa.

Cấu hình phần mềm

Bây giờ tất cả các phần mềm cần thiết đã được cài đặt, chúng phải được cấu hình và chặt chẽ với nhau để cung cấp ứng dụng Laravel hoạt động như mong đợi.

Định cấu hình người giám sát

RUN mkdir -p /etc/supervisor.d/
COPY .docker/supervisord.ini /etc/supervisor.d/supervisord.ini

Trong hướng dẫn RUN này, Dockerfile chỉ định rằng thư mục supervisor.d phải được tạo bên trong thư mục / etc / . Thư mục này sẽ chứa các tệp trình khởi tạo chỉ định các bộ hướng dẫn mà Người giám sát sẽ chạy khi Hệ điều hành khởi động, trong trường hợp này là khi vùng chứa khởi động, vì hai sự kiện này không thể xảy ra nếu không có nhau.

Trong hướng dẫn RUN thứ hai, tệp supervisord.ini được sao chép từ thư mục .docker cục bộ vào thư mục chứa /etc/supervisor.d/ . Như đã đề cập ở trên, tệp này chứa các hướng dẫn mà Người giám sát sẽ chạy và các hướng dẫn này là:

[supervisord]
nodaemon=true

[program:nginx]
command=nginx
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[program:php-fpm]
command=php-fpm8
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

Giải thích supervisor.ini

  • nodaemon = true

Bắt đầu Supervisor ở phía trước thay vì daemonizing.

  • command = nginx

Lệnh sẽ chạy khi Người giám sát bắt đầu.

  • stdout_logfile = / dev / stdout

Chuyển hướng tất cả đầu ra đến thiết bị đầu ra tiêu chuẩn Alpine là chính bộ chứa, cho phép chúng tôi xem nhật ký Người giám sát về việc thực thi NGINX khi chạy nhật ký docker MY_CONTAINER hoặc docker -soạn để bắt đầu ngăn xếp bộ chứa.

  • stdout_logfile_maxbytes = 0

Số byte tối đa có thể được tiêu thụ bởi stdout_logfile trước khi nó xoay, vì các tệp không được ghi, phải được hủy kích hoạt bằng cách đặt maxbyte thành 0.

  • stderr_logfile = / dev / stderr

Chuyển hướng tất cả các lỗi đến thiết bị lỗi tiêu chuẩn Alpine là chính vùng chứa, cho phép chúng tôi xem nhật ký Người giám sát về việc thực thi NGINX khi chạy các bản ghi của docker MY_CONTAINER hoặc docker -soạn để bắt đầu ngăn xếp vùng chứa.

  • stderr_logfile_maxbytes = 0

Số byte tối đa có thể được tiêu thụ bởi stderr_logfile trước khi nó xoay, vì các tệp không được ghi, phải được hủy kích hoạt bằng cách đặt maxbyte thành 0.

Định cấu hình PHP

RUN mkdir -p /run/php/
RUN touch /run/php/php8.0-fpm.pid

COPY .docker/php.ini-production /etc/php8/php.ini
COPY .docker/php-fpm.conf /etc/php8/php-fpm.conf

Trong câu lệnh RUN đầu tiên, Dockerfile chỉ định rằng thư mục php phải được tạo bên trong thư mục / run / . Thư mục này sẽ chứa các tệp .pid có chứa ID quy trình dành riêng cho phần mềm.

Câu lệnh thứ hai, tạo tệp php8.0-fpm.pid bên trong thư mục / run / php / . Bây giờ bản phân phối Alpine có một tệp để lưu trữ ID quy trình sẽ được tạo khi PHP-FPM khởi động.

Câu lệnh thứ ba sao chép tệp php.ini-production từ thư mục .docker cục bộ vào thư mục / etc / php8 / container. Tệp này chứa tất cả các cấu hình mà PHP sẽ chạy, nội dung của tệp này được sao chép từ kho lưu trữ chính thức của PHP trên GitHub .

Câu lệnh thứ tư sao chép tệp php-fpm.conf từ thư mục .docker cục bộ vào thư mục / etc / php8 / container. Tệp này chứa tất cả các cấu hình mà PHP-FPM sẽ chạy và đây là các cấu hình:

;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

; All relative paths in this configuration file are relative to PHP's install
; prefix (/usr). This prefix can be dynamically changed by using the
; '-p' argument from the command line.

;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;

[global]
; Pid file
; Note: the default prefix is /var
; Default Value: none
pid = /run/php/php8.0-fpm.pid

; Error log file
; If it's set to "syslog", log is sent to syslogd instead of being written
; in a local file.
; Note: the default prefix is /var
; Default Value: log/php-fpm.log
error_log = /proc/self/fd/2

; syslog_facility is used to specify what type of program is logging the
; message. This lets syslogd specify that messages from different facilities
; will be handled differently.
; See syslog(3) for possible values (ex daemon equiv LOG_DAEMON)
; Default Value: daemon
;syslog.facility = daemon

; syslog_ident is prepended to every message. If you have multiple FPM
; instances running on the same server, you can change the default value
; which must suit common needs.
; Default Value: php-fpm
;syslog.ident = php-fpm

; Log level
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice
;log_level = notice

; If this number of child processes exit with SIGSEGV or SIGBUS within the time
; interval set by emergency_restart_interval then FPM will restart. A value
; of '0' means 'Off'.
; Default Value: 0
;emergency_restart_threshold = 0

; Interval of time used by emergency_restart_interval to determine when
; a graceful restart will be initiated.  This can be useful to work around
; accidental corruptions in an accelerator's shared memory.
; Available Units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
;emergency_restart_interval = 0

; Time limit for child processes to wait for a reaction on signals from master.
; Available units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
;process_control_timeout = 0

; The maximum number of processes FPM will fork. This has been design to control
; the global number of processes when using dynamic PM within a lot of pools.
; Use it with caution.
; Note: A value of 0 indicates no limit
; Default Value: 0
; process.max = 128

; Specify the nice(2) priority to apply to the master process (only if set)
; The value can vary from -19 (highest priority) to 20 (lower priority)
; Note: - It will only work if the FPM master process is launched as root
;       - The pool process will inherit the master process priority
;         unless it specified otherwise
; Default Value: no set
; process.priority = -19

; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging.
; Default Value: yes
daemonize = no

; Set open file descriptor rlimit for the master process.
; Default Value: system defined value
;rlimit_files = 1024

; Set max core size rlimit for the master process.
; Possible Values: 'unlimited' or an integer greater or equal to 0
; Default Value: system defined value
;rlimit_core = 0

; Specify the event mechanism FPM will use. The following is available:
; - select     (any POSIX os)
; - poll       (any POSIX os)
; - epoll      (linux >= 2.5.44)
; - kqueue     (FreeBSD >= 4.1, OpenBSD >= 2.9, NetBSD >= 2.0)
; - /dev/poll  (Solaris >= 7)
; - port       (Solaris >= 10)
; Default Value: not set (auto detection)
;events.mechanism = epoll

; When FPM is build with systemd integration, specify the interval,
; in second, between health report notification to systemd.
; Set to 0 to disable.
; Available Units: s(econds), m(inutes), h(ours)
; Default Unit: seconds
; Default value: 10
;systemd_interval = 10

;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ;
;;;;;;;;;;;;;;;;;;;;

; Multiple pools of child processes may be started with different listening
; ports and different management options.  The name of the pool will be
; used in logs and stats. There is no limitation on the number of pools which
; FPM can handle. Your system will tell you anyway :)

; Include one or more files. If glob(3) exists, it is used to include a bunch of
; files from a glob(3) pattern. This directive can be used everywhere in the
; file.
; Relative path can also be used. They will be prefixed by:
;  - the global prefix if it's been set (-p argument)
;  - /usr otherwise
include=/etc/php8/php-fpm.d/*.conf

Lưu ý rằng php-fpm.conf không có bất kỳ cấu hình tùy chỉnh hoặc tối ưu hóa nào, vui lòng định cấu hình tệp này theo nhu cầu của bạn.

Định cấu hình NGINX

COPY .docker/nginx.conf /etc/nginx/
COPY .docker/nginx-laravel.conf /etc/nginx/modules/

RUN mkdir -p /run/nginx/
RUN touch /run/nginx/nginx.pid

RUN ln -sf /dev/stdout /var/log/nginx/access.log
RUN ln -sf /dev/stderr /var/log/nginx/error.log

Trong câu lệnh đầu tiên này, nginx.conf được sao chép từ thư mục .docker cục bộ vào thư mục   / etc / nginx / container. Tệp này chứa tất cả các cấu hình mà NGINX sẽ sử dụng để chạy trên nó và ở bên dưới, bạn có thể kiểm tra nội dung tệp:

# /etc/nginx/nginx.conf

user nobody;

# NGINX will run in the foreground
daemon off;

# Set number of worker processes automatically based on number of CPU cores.
worker_processes auto;

# Enables the use of JIT for regular expressions to speed-up their processing.
pcre_jit on;

# Configures default error logger.
error_log /var/log/nginx/error.log warn;

# Uncomment to include files with config snippets into the root context.
# NOTE: This will be enabled by default in Alpine 3.15.
# include /etc/nginx/conf.d/*.conf;

events {
    # The maximum number of simultaneous connections that can be opened by
    # a worker process.
    worker_connections 1024;
}

http {
    # Includes mapping of file name extensions to MIME types of responses
    # and defines the default type.
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # Includes files with directives to load dynamic modules.
    include /etc/nginx/modules/*.conf;

    # Name servers used to resolve names of upstream servers into addresses.
    # It's also needed when using tcpsocket and udpsocket in Lua modules.
    #resolver 1.1.1.1 1.0.0.1 2606:4700:4700::1111 2606:4700:4700::1001;

    # Don't tell nginx version to the clients. Default is 'on'.
    server_tokens off;

    # Specifies the maximum accepted body size of a client request, as
    # indicated by the request header Content-Length. If the stated content
    # length is greater than this size, then the client receives the HTTP
    # error code 413. Set to 0 to disable. Default is '1m'.
    client_max_body_size 1m;

    # Sendfile copies data between one FD and other from within the kernel,
    # which is more efficient than read() + write(). Default is off.
    sendfile on;

    # Causes nginx to attempt to send its HTTP response head in one packet,
    # instead of using partial frames. Default is 'off'.
    tcp_nopush on;


    # Enables the specified protocols. Default is TLSv1 TLSv1.1 TLSv1.2.
    # TIP: If you're not obligated to support ancient clients, remove TLSv1.1.
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

    # Path of the file with Diffie-Hellman parameters for EDH ciphers.
    # TIP: Generate with: `openssl dhparam -out /etc/ssl/nginx/dh2048.pem 2048`
    #ssl_dhparam /etc/ssl/nginx/dh2048.pem;

    # Specifies that our cipher suits should be preferred over client ciphers.
    # Default is 'off'.
    ssl_prefer_server_ciphers on;

    # Enables a shared SSL cache with size that can hold around 8000 sessions.
    # Default is 'none'.
    ssl_session_cache shared:SSL:2m;

    # Specifies a time during which a client may reuse the session parameters.
    # Default is '5m'.
    ssl_session_timeout 1h;

    # Disable TLS session tickets (they are insecure). Default is 'on'.
    ssl_session_tickets off;


    # Enable gzipping of responses.
    #gzip on;

    # Set the Vary HTTP header as defined in the RFC 2616. Default is 'off'.
    gzip_vary on;


    # Helper variable for proxying websockets.
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }


    # Specifies the main log format.
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
            '$status $body_bytes_sent "$http_referer" '
            '"$http_user_agent" "$http_x_forwarded_for"';

    # Sets the path, format, and configuration for a buffered log write.
    access_log /var/log/nginx/access.log main;


    # Includes virtual hosts configs.
    include /etc/nginx/http.d/*.conf;
}

# TIP: Uncomment if you use stream module.
#include /etc/nginx/stream.conf;

Câu lệnh thứ ba, sao chép nginx-laravel.conf từ thư mục .docker cục bộ vào thư mục / etc / nginx / modules / container. Tệp này chứa tất cả các cấu hình mà NGINX sẽ sử dụng để phân phối Laravel một cách chính xác và ở bên dưới, bạn có thể kiểm tra nội dung tệp:

server {
    listen 80;
    server_name localhost;
    root /var/www/html/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass localhost:9000;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Câu lệnh thứ tư chỉ định rằng thư mục nginx phải được tạo bên trong thư mục / run / . Như đã đề cập trong phiên cấu hình PHP-FPM, thư mục chạy chứa các tệp .pid nơi ID quy trình cho một phần mềm cụ thể được ghi.

Trong câu lệnh thứ năm, tạo tệp nginx.pid bên trong thư mục / run / nginx / . Bây giờ, bản phân phối Alpine có một tệp để lưu trữ ID quy trình sẽ được tạo khi NGINX khởi động.

Câu lệnh thứ sáu hướng dẫn rằng một liên kết tượng trưng của đầu ra tiêu chuẩn Alpine phải được tạo tại /var/log/nginx/access.log . Cấu hình này, như đã đề cập trong phần Người giám sát, là thứ cho phép chúng ta xem nhật ký NGINX từ các vùng chứa.

Cuối cùng, câu lệnh thứ bảy hướng dẫn rằng một liên kết tượng trưng của lỗi chuẩn Alpine được tạo tại /var/log/nginx/error.log . Cấu hình này, như đã đề cập trong phần Người giám sát, là thứ cho phép chúng ta xem lỗi NGINX từ các vùng chứa.

Xây dựng quy trình

Quá trình xây dựng là nơi ứng dụng được sao chép vào vùng chứa và các phần phụ thuộc của nó được cài đặt, để ứng dụng Laravel sẵn sàng được cung cấp bởi NGINX, PHP-FPM và Supervisor.

COPY . .
RUN composer install --no-dev

Tại câu lệnh COPY, tất cả các tệp và thư mục Laravel từ thư mục chứa Dockerfile, được sao chép vào thư mục làm việc được chỉ định trong lệnh WORKDIR.

Tại câu lệnh RUN, các phụ thuộc sản xuất từ ​​ứng dụng Laravel được cài đặt, làm cho ứng dụng sẵn sàng được cung cấp bởi Supervisor, NGINX và PHP-FPM.

Thực hiện vùng chứa

Bây giờ mọi thứ đã được cài đặt và định cấu hình đúng cách, chúng ta cần cho biết hình ảnh vùng chứa này sẽ bắt đầu phân phát ứng dụng như thế nào khi vùng chứa khởi động và cổng TCP sẽ sử dụng.

EXPOSE 80
CMD ["supervisord", "-c", "/etc/supervisor.d/supervisord.ini"]

Lệnh EXPOSE thông báo rằng vùng chứa lắng nghe trên các cổng mạng được chỉ định trong thời gian chạy, trong khi mục đích của lệnh CMD là cung cấp lệnh mặc định cho vùng chứa Docker đang thực thi.


Bây giờ tệp Dockerfile của bạn cuối cùng đã hoàn thành và bạn có thể xây dựng một vùng chứa từ nó bằng cách thực thi docker build -t laravel-alpine:latest . --no-cachetrong thiết bị đầu cuối của bạn.

Chúc bạn viết mã vui vẻ!

Related Articles

Trả lời

Email của bạn sẽ không được hiển thị công khai.

Back to top button