Sự phát triển và mức độ phổ biến của Docker hiện nay khá hùng hậu và chúng ta không cần phải bàn luận. Ở đây, chúng ta cùng nhau tìm hiểu cách xây dựng môi trường lý tưởng để hoạt động một ứng dụng bất kỳ trên Laravel. Làm cách nào để sử dụng Docker như vậy? Chúng ta cần dịch vụ Nginx để bắt đầu hành trình này.
Cách cài đặt Docker-compose vào Laravel
Nếu bạn là tân binh và đang tìm hiểu thêm về Laravel, thì bạn nên tạo clone source code Laravel từ https://github.com/laravel/laravel. Chọn một phiên bản bạn thấy cần thiết và tải về. Sau đó, bạn giải nén ở https://github.com/laravel/laravel/releases. Nếu bạn cảm thấy tự tin về mức độ thành thạo dùng Laravel, thì hãy cài đặt composer và thực hiện dòng lệnh này:
composer create-project --prefer-dist laravel/laravel laravel
Giả sử các bạn đã có sẵn source code của một dự án trên Laravel (máy tính bạn) hoặc kéo về từ github thì…
PHP-FPM
Các bạn cần cài các PHP extension nhưng như vậy là chưa đủ. Các bạn nên cài thêm một số công cụ để tương tác với Laravel dễ dàng hơn. Các công cụ đó sẽ tương tác với Laravel thông qua lệnh PHP artisan – ví dụ như git, vim và cron để chạy Laravel cron hoặc composer (thì nên thêm unzip). Cách làm như sau:
Tạo một file php.Dockerfile:
Docker-compose service hoàn thiện sẽ là:
Nginx
Tiếp theo, các bạn cần tạo container cho web server Nginx. Nó có nhiệm vụ giao tiếp với PHP-FPM và trả về response cho người dùng. Với dịch vụ này, bạn có thể tái sử dụng các hình ảnh có sẵn và giảm tải dung lượng xây hình ảnh. Bạn thậm chí không cần phải dùng custom Dockerfile. Bạn chỉ cần dùng image Nginx và thực hiện mount file config là xong. Đừng quên tạo một file default.conf để chứa configurate và cho phép Nginx chạy trên các file PHP.
MySQL
Các bạn có thể dùng trực tiếp hình ảnh MySQL và tạo user, DB qua Init SQL file mà không phải custom hình ảnh. Sau khi đã hoàn thiện các phần vừa nêu, các bạn sẽ có file docker-composer.yml hoàn chỉnh.
Phpmyadmin
Phpmyadmin cũng tương tự như MySQL. Các bạn nên lưu ý phần port và các kết nối tới một port mới (chưa từng sử dụng). Bên cạnh đó, bạn cũng nên thiết lập các biến môi trường xung quanh cho Phpmyadmin. Vì chúng sẽ lấy trên dịch dụ của MySQL để Phpmyadmin có thể truy cập và quản lý các dữ liệu dễ dàng hơn.
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
ports:
- "8081:80"
environment:
- PMA_HOSTS=mysql
- PMA_PORT=3306
- PMA_USER=pocadi123
- PMA_PASSWORD=pocadi123
File hoàn chỉnh:
version:'3'
services:
nginx:
image: nginx:stable
ports:
- "8080:80"
volumes:
- ./laravel:/var/www/html
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
php:
build:
context: ./laravel
dockerfile: Dockerfile
volumes:
- ./laravel:/var/www/html
ports:
- "9000:9000"
mysql:
image: mysql:8.0.29-oracle
ports:
- "3307:3306"
volumes:
- ./mysql:/var/lib/mysql
environment:
MYSQL_DATABASE: laravel
MYSQL_USER: pocadi
MYSQL_PASSWORD: pocadi123
MYSQL_ROOT_PASSWORD: pocadi123
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
ports:
- "8081:80"
environment:
- PMA_HOSTS=mysql
- PMA_PORT=3306
- PMA_USER=pocadi123
- PMA_PASSWORD=pocadi123
Cấp quyền thực thi cho Docker-compose
Để chắc chắn bạn đã cài đặt thành công file docker-compose trên máy tính, bạn nên kiểm tra bằng lệnh docker-compose-v. Kết quả sẽ như sau:
$ chmod +x /usr/local/bin/docker-compose
Vậy là bạn đã cài đặt thành công.
Cấu trúc thư mục của một dự án
Bạn nên tạo folder để lưu file config của docker và source code. Cấu trúc thư mục thường có dạng như sau:
/*
* demo
* conf.d
* vhosts.conf
* src (thư mục lưu source code của bạn)
* Dockerfile
* docker-compose.yml
* readme.md
*/
Trong file vhosts.conf sẽ lưu nội dung config virtualhost nằm trong docker-container mà bạn sẽ tạo ra.
Bây giờ mình sẽ giải thích nội dung của từng file.
DirectoryIndex index.php index.html
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
ServerName localhost
DocumentRoot /app/public
AllowOverride All
Options -Indexes +FollowSymLinks
Order allow,deny
Allow from all
Thư mục src là thư mục lưu source code. Nó chính là tất cả những gì mà một dự án Laravel cần. Trong file Dockerfile sẽ tự động lưu những config để xây dựng hình ảnh với những thứ mà các bạn đã config trong này (Ví dụ như PHP, apache2, composer,...). Nếu bạn muốn cài thêm những hình ảnh khác và các file nào đó, thì thêm vào file này: nodejs, npm, bower,… Nội dung của Dockerfile sẽ là:
FROM ubuntu:16.04
// Install apache, PHP, and supplimentary programs. openssh-server, curl,
// and lynx-cur are for debugging the container.
RUN apt-get update && apt-get -y upgrade && apt-get -y install \
apache2 php libapache2-mod-php php-mcrypt php-mysql curl php-cli php-mbstring git unzip php-xml \
libcurl4-openssl-dev pkg-config libssl-dev libsslcommon2-dev php-pear php-dev vim
RUN curl -sS https://getcomposer.org/installer -o composer-setup.php
RUN php composer-setup.php --install-dir=/usr/local/bin --filename=composer
// Enable apache mods.
RUN a2enmod rewrite
RUN a2enmod headers
// Manually set up the apache environment variables
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid
// install nodejs, npm, bower
RUN apt-get -y install nodejs npm git
RUN npm install -g bower
RUN npm install --global gulp-cli
RUN apt-get install -y ruby-full rubygems
RUN gem install sass
RUN ln -s /usr/bin/nodejs /usr/bin/node
RUN mkdir /app
WORKDIR /app
// Expose apache.
EXPOSE 80
// Update the default apache site with the config we created.
ADD conf.d/vhosts.conf /etc/apache2/sites-enabled/000-default.conf
// By default start up apache in the foreground, override with /bin/bash for interative.
CMD systemctl restart apache2
CMD /usr/sbin/apache2ctl -D FOREGROUND
File docker-compose.yml sẽ định nghĩa các container mà các bạn sẽ cần tới. Giả sử, các bạn cần một container Web và một container cho cơ sở dữ liệu.
version: '2'
services:
web:
build: .
container_name: demo-web
volumes:
- ./src:/app
ports:
- "90:80"
links:
- serverdb
serverdb:
image: mysql:5.7
container_name: demo-serverdb
volumes:
- ./data/mysql:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=admin
ports:
- 3406:3306
Trong file ở trên có một config, đó là links. Config đó sẽ tự liên kết tới container khác trong một hệ thống docker. Ở đây, mình giả định là container serverdb. Trong file .env của một dự án, các chỉ cần khai báo DB_HOST=serverdb là hệ thống sẽ tự hiểu host database nằm ở container serverdb.
Một số lỗi thường gặp khi dùng docker-compose
Lỗi về quyền truy cập là lỗi phổ biến nhất. Để khắc phục tình trạng này, các bạn nên sử dụng câu lệnh docker ps để hệ thống hiển thị danh sách các container đang chạy hoặc docker ps –a nếu container nào đó đang bị thiếu. Đừng quên dùng câu lệnh docker logs
Cập nhật thêm được vài kiến thức mới
Bài viết hữu ích.
Hữu ích
Cảm ơn Admin. Bài viết khá hay !
OK bạn, mình sẽ sắp xếp viết một bài về Extend Validation. Cảm ơn bạn đã quan tâm nhé.