( P1 ) – Bắt đầu dự án PHP – Laravel với Docker, siêu nhanh, siêu dễ dàng
Hoàn cảnh
- Nhớ lại cái thời mới code PHP, lúc đó mình thường dành cả thanh xuân chỉ để setup môi trường có thể chạy được PHP, nào là tự cài từng thành phần trên mọi trường local, tiến bộ hơn tí thì cài WAMP rồi nhảy qua XAMPP.
- Sau một thời gian code đã rồi chuyền file lên server mới phát hiện sự khác biết giữa PHP version dưới local khác với môi trường Product. Từ đó mà Bug xuất hiện nhiều vô số kể.
- Vần đề tưởng đơn giản nhưng lại phát sinh bao việc, System Admin thì đổ thừa do code dỡm, còn mình thì hì hục kiểm tra xem nguyên nhân từ đâu, rồi lại nài nỉ System Admin update server, đỉnh điểm của mâu thuận là mình tự phải server, và hậu quả là giờ mình cũng có khá khá kiến thức về server =)). Người ta nói “Trong cái khó, ló cái khôn” là đúng.
Sự xuất hiện
-Cuối cùng ngày đó cũng đến, Docker được xuất hiện lần đầu tiền vào năm 2013 nhưng mình lại được tiếp xúc với nó vào năm 2017 khá chậm so với thế giới. Nhưng không sao dù gì thì biết đở hơn không =)).
Vậy Docker là gì?…. chi tiết các bạn có thể tham khảo 2 bài việc của mình về Docker tại đây
Trong phạm vi bài này mình chỉ giới thiểu về Docker dùng để chạy Laravel
Bắt đầu
Cấu trúc yêu câu sẽ được mô tả như hình dưới.
Bắt tay vào tạo một thử mục cho dự án mới, ở đây mình đặt tên là LaravelStarterDocker, bên trong thư mục hay tạo tập tin có tên docker-compose.yaml
docker-compose.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | <span class="token key atrule">version</span><span class="token punctuation">:</span> <span class="token string">'3'</span> <span class="token key atrule">services</span><span class="token punctuation">:</span> <span class="token key atrule">nginx</span><span class="token punctuation">:</span> <span class="token key atrule">image</span><span class="token punctuation">:</span> nginx<span class="token punctuation">:</span>1.14<span class="token punctuation">-</span>alpine <span class="token key atrule">volumes</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> ./nginx/conf.d/<span class="token punctuation">:</span>/etc/nginx/conf.d/ <span class="token punctuation">-</span> ./src/public<span class="token punctuation">:</span>/var/www/laravel/public <span class="token key atrule">ports</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> 8000<span class="token punctuation">:</span><span class="token number">80</span> <span class="token key atrule">links</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> phpfpm <span class="token key atrule">depends_on</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> phpfpm <span class="token key atrule">phpfpm</span><span class="token punctuation">:</span> <span class="token key atrule">build</span><span class="token punctuation">:</span> <span class="token key atrule">context</span><span class="token punctuation">:</span> php <span class="token key atrule">dockerfile</span><span class="token punctuation">:</span> Dockerfile <span class="token key atrule">volumes</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> ./src<span class="token punctuation">:</span>/var/www/laravel <span class="token key atrule">links</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> mysql <span class="token punctuation">-</span> mysql_test <span class="token key atrule">depends_on</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> mysql <span class="token punctuation">-</span> mysql_test <span class="token key atrule">environment</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> DB_HOST=mysql <span class="token punctuation">-</span> DB_DATABASE=sample <span class="token punctuation">-</span> DB_USERNAME=root <span class="token punctuation">-</span> DB_PASSWORD=root <span class="token punctuation">-</span> REDIS_HOST=redis <span class="token punctuation">-</span> DB_TEST_HOST=mysql_test <span class="token key atrule">mysql</span><span class="token punctuation">:</span> <span class="token key atrule">image</span><span class="token punctuation">:</span> mysql<span class="token punctuation">:</span><span class="token number">5.7</span> <span class="token key atrule">ports</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> <span class="token string">"3406:3306"</span> <span class="token key atrule">volumes</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> ./db<span class="token punctuation">:</span>/var/lib/mysql <span class="token key atrule">environment</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> MYSQL_ROOT_PASSWORD=root <span class="token punctuation">-</span> MYSQL_DATABASE=sample <span class="token key atrule">mysql_test</span><span class="token punctuation">:</span> <span class="token key atrule">image</span><span class="token punctuation">:</span> mysql<span class="token punctuation">:</span><span class="token number">5.7</span> <span class="token key atrule">ports</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> <span class="token string">"3506:3306"</span> <span class="token key atrule">volumes</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> ./db_test<span class="token punctuation">:</span>/var/lib/mysql <span class="token key atrule">environment</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> MYSQL_ROOT_PASSWORD=root <span class="token punctuation">-</span> MYSQL_DATABASE=sample <span class="token key atrule">redis</span><span class="token punctuation">:</span> <span class="token key atrule">image</span><span class="token punctuation">:</span> redis<span class="token punctuation">:</span>5.0<span class="token punctuation">-</span>alpine <span class="token key atrule">ports</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> <span class="token string">"46379:6379"</span> <span class="token key atrule">mailhog</span><span class="token punctuation">:</span> <span class="token key atrule">image</span><span class="token punctuation">:</span> mailhog/mailhog <span class="token key atrule">ports</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> 8025<span class="token punctuation">:</span><span class="token number">8025</span> <span class="token punctuation">-</span> 2525<span class="token punctuation">:</span><span class="token number">1025</span> |
Sau khi copy nội dung chung ta hay để ý dòng thứ số 6
Hãy tạo thư mục ./nginx/conf.d và tạo file default.conf để cấu hình cho phần Nginx
default.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | server <span class="token punctuation">{</span> listen 80<span class="token punctuation">;</span> server_name localhost<span class="token punctuation">;</span> charset utf-8<span class="token punctuation">;</span> root /var/www/laravel/public<span class="token punctuation">;</span> index index.php<span class="token punctuation">;</span> client_max_body_size 20M<span class="token punctuation">;</span> client_body_buffer_size 20M<span class="token punctuation">;</span> location / <span class="token punctuation">{</span> try_files <span class="token variable">$uri</span> <span class="token variable">$uri</span>/ /index.php<span class="token variable">$is_args</span><span class="token variable">$args</span><span class="token punctuation">;</span> gzip_static on<span class="token punctuation">;</span> <span class="token punctuation">}</span> location ~ .php$ <span class="token punctuation">{</span> root /var/www/laravel/public<span class="token punctuation">;</span> fastcgi_pass phpfpm:9000<span class="token punctuation">;</span> fastcgi_index index.php<span class="token punctuation">;</span> fastcgi_param SCRIPT_FILENAME <span class="token variable">$document_root</span><span class="token variable">$fastcgi_script_name</span><span class="token punctuation">;</span> include fastcgi_params<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Ở dòng thứ 17
Riêng phần này bởi vì phpfpm được build từ file Dockerfile nên chúng ta sẽ tiền hành tạo file theo đường dẫn “./php/Dockerfile”
Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | FROM php:7.3-fpm-alpine RUN apk --update add freetype-dev libjpeg-turbo-dev libpng-dev shadow libzip-dev gettext gettext-dev icu-dev <span class="token operator">&&</span> docker-php-ext-install pdo_mysql mbstring <span class="token function">zip</span> gettext intl exif <span class="token operator">&&</span> docker-php-ext-configure gd --with-gd --with-png-dir<span class="token operator">=</span>/usr/include/ --with-freetype-dir<span class="token operator">=</span>/usr/include/ --with-jpeg-dir<span class="token operator">=</span>/usr/include/ <span class="token operator">&&</span> docker-php-ext-install -j<span class="token variable"><span class="token variable">$(</span>nproc<span class="token variable">)</span></span> gd RUN apk add autoconf build-base <span class="token operator">&&</span> pecl <span class="token function">install</span> xdebug ARG PUID<span class="token operator">=</span>1000 ENV PUID <span class="token variable">${PUID}</span> ARG PGID<span class="token operator">=</span>1000 ENV PGID <span class="token variable">${PGID}</span> RUN <span class="token function">groupadd</span> -g <span class="token variable">${PGID}</span> laravel <span class="token operator">&&</span> <span class="token function">useradd</span> -u <span class="token variable">${PUID}</span> -g laravel -m laravel <span class="token operator">&&</span> <span class="token function">usermod</span> -p <span class="token string">"*"</span> laravel -s /bin/sh COPY upload.ini /usr/local/etc/php/conf.d/ <span class="token comment"># install composer</span> RUN <span class="token function">curl</span> -sS https://getcomposer.org/installer <span class="token operator">|</span> php -- --install-dir<span class="token operator">=</span>/usr/local/bin --filename<span class="token operator">=</span>composer USER laravel RUN composer global require <span class="token string">"laravel/installer"</span> <span class="token operator">&&</span> composer global require <span class="token string">"phpunit/phpunit"</span> ENV PATH <span class="token variable">$PATH</span>:/home/laravel/.composer/vendor/bin WORKDIR /var/www/laravel |
Mô tả:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | php:7.3-fpm-alpine # Cài đặt theo image với tên 7.3-fpm-alpine RUN apk --update add freetype-dev ... && pecl install xdebug # Cài đặt các thư viện cần thiết ARG PUID=1000 .. ENV PGID ${PGID} # Set biến môi trường RUN groupadd -g ${PGID} laravel && useradd -u ${PUID} -g laravel -m laravel && usermod -p "*" laravel -s /bin/sh # Tạo group & user với tên là laravel và add vào group laravel COPY upload.ini /usr/local/etc/php/conf.d/ # Phần này chúng ta sẽ copy file upload.ini ở thư mục hiện tại vào bên trong Docker, để có thể đơn giản hóa việc tùy chỉnh giới hạn upload. Tí nữa chúng ta sẽ tạo file upload.ini RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer # Tiên hành cài đặt composer USER laravel RUN composer global require "laravel/installer" && composer global require "phpunit/phpunit" ENV PATH $PATH:/home/laravel/.composer/vendor/bin # Sau khi có composer thì sẽ tiếp tục dùng composer để cài đặt laravel WORKDIR /var/www/laravel # Và cuối cùng chúng ta khai báo thư mục Docker trực tiếp làm việc. Điều này sẽ giúp chung ta lúc truy cập có thể truy cập vào được ngay thư mục cần thiết |
Hãy tạo file trong thư mục php
upload.ini
1 2 3 | upload_max_filesize <span class="token operator">=</span> 20M post_max_size <span class="token operator">=</span> 20M |
Đên đây công tác chuẩn bị nhưng thứ cần thiết đã xong. Hay thực hiện lệnh
1 2 | $ docker-compose up -d |
Nếu là lần đầu tiên chạy, chúng ta sẽ mất tầm 5 đến 10 phút để nó build mới. Hay tranh thủ thời gian quý giả của bạn lên đọc vài tin tức lá cải
Sau khi thực hiện, nếu nội dung xuất hiện thông báo như hình trên, xin chúc mừng vậy là bạn đã có một môi trường có thể chạy được Laravel
Trải nghiệm
Hãy thử truy cập địa chỉ “localhost:8000” và cũng xem kết quả đạt được.
MỘT LỖI XUẤT HIỆN
Không sao! Đừng quá lo lắng, điều đó chứng minh rằng nginx của bạn đã hoạt động tốt =)).
Hay vào thư mục public và tạo ra file php đầu tiên với tên là “index.php” và điền nội dung như hình
Thử f5 lại trình duyệt.
Vậy là chúng ta đã có thể chạy được file PHP đầu tiền
Ở phần tới. Chúng ta sẽ tiến hành setup Laravel và giới thiệu về các service đi kèm.
Source github:
https://github.com/qt91/LaravelStarterDocker