Giới thiệu
Trước đây khi tham gia một buổi chia sẻ kiến thức về Docker thì có một bạn đặt câu hỏi mình thấy khá là thú vị, đó là nếu trong trường hợp bạn đang tham gia hai dự án khác nhau, mỗi dự án lại yêu cầu một phiên bản PHP khác nhau thì có thể áp dụng Docker vào được hay không.
Ở bài viết này mình sẽ hướng dẫn cách sử dụng Docker để giải quyết câu hỏi được đặt ra ở trên.
Mình sẽ không đi sâu vào các khái niệm được sử dụng trong bài viết cũng như cách cài đặt Docker cụ thể, mà chỉ đưa ra những cài đặt cơ bản để có thể áp dụng Docker vào các dự án bạn đang tham gia.
Yêu cầu
- Mình sẽ sử dụng Ubuntu nhưng bạn có thể dùng bất cứ hệ điều hành nào Docker hỗ trợ
- Docker: https://docs.docker.com/engine/install/ubuntu/#install-using-the-convenience-script
- Docker Compose: https://docs.docker.com/compose/install/#install-compose
Cài đặt
Ở đây mình sẽ sử dụng hai project có sẵn trên mạng với yêu cầu về dependencies khác nhau dùng làm mẫu.
Project 1
- Github: https://github.com/geshan/laravel-unit-test-example
- PHP 5.6.40
Apache Virtual Hosts
Tạo một file tên là 000-default.conf
ở folder gốc với nội dung như sau:
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot /var/www/html/public
<Directory /var/www/html/public>
AllowOverride All
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Dockerfile
Tạo một file tên là Dockerfile
ở folder gốc và paste các đoạn sau vào:
FROM php:5.6.40-apache
Cú pháp FROM
dùng để chỉ định phiên bản PHP cần dùng, và sẽ được pull từ Dockerhub.
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
Sau đó chúng ta cần cài những extension cần thiết cho project của chúng ta, tùy vào độ phức tạp của dự án mà bạn có thể chỉnh sửa thêm ở phần này.
RUN a2enmod rewrite
Tiếp theo thì chúng ta sẽ bật những modules của Apache cần thiết cho project.
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
Vì project mình dùng làm mẫu khá là đơn giản nên chỉ cần thêm một bước cuối cùng đó chính là cài đặt Composer vào.
Bạn còn có thể cài đặt thêm Node.js và npm để compile các assest nhưng ở đây mình không cần nên mình sẽ bỏ qua.
docker-compose.yml
Bạn có thể dùng thẳng command docker run
nhưng mình lại ưu tiên sử dụng Docker Compose hơn vì chỉ cần setup một lần là bạn có thể sử dụng nhiều lần mà không cần phải nhớ và gõ lại command.
version: '3'
services:
php_564:
container_name: php_564
build:
context: .
dockerfile: Dockerfile
ports:
- 564:80
volumes:
- .:/var/www/html
- ./vendor:/var/www/html/vendor
- ./000-default.conf:/etc/apache2/sites-available/000-default.conf
Ở đây mình sử dụng compose file version 3. Mình chỉ cần một service duy nhất đó chính là PHP / Apache, và sẽ sử dụng image được build từ file Dockerfile
ở trên.
Vì để tránh port 80 đang dùng thì mình bind lại port thành 564.
Việc tiếp theo đó chính là bind các volume cho container. Dữ liệu của container sẽ được chứa ở các volume này, cụ thể là:
- Folder chứa source code mình bind
/var/www/html
với folder gốc nơi chứa fileDockerfile
vàdocker-compose.yml
- Folder
vendor
chứa các package dependencies, tương tự mình bind với foldervendor
của folder gốc - Bind file virtual host của Apache với file custom của mình
Command
Sau khi đã có đủ các file: 000-default.conf
, Dockerfile
, và docker-compose.yml
thì hãy chạy lệnh sau ở folder gốc:
docker-compose up -d
Tiếp theo chúng ta cần cài đặt các package cần thiết cho project:
docker exec php_564 composer install
Cuối cùng truy cập localhost:564
và bạn đã có một project chạy thành công với phiên bản PHP là 5.6.40.
Project 2
- Github: https://github.com/yemiwebby/laravel-api-testing
- PHP 7.2.5
Project 2 này cũng rất đơn giản nên nội dung các file sẽ gần như tương tự với project 1.
Dockerfile
FROM php:7.2.5-apache
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
RUN a2enmod rewrite
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
docker-compose.yml
version: '3'
services:
php_725:
container_name: php_725
build:
context: .
dockerfile: Dockerfile
ports:
- 725:80
volumes:
- .:/var/www/html
- ./vendor:/var/www/html/vendor
- ./000-default.conf:/etc/apache2/sites-available/000-default.conf
Command
docker-compose up -d
docker exec php_564 composer install
Cuối cùng truy cập localhost:725
và bạn đã có một project chạy thành công với phiên bản PHP là 7.2.5.
Tổng kết
Mặc dù bài viết của mình nhìn khá là đơn giản, tuy nhiên khi áp dụng vào một dự án thực sự thì sẽ cần rất nhiều thứ, khi đó nội dung của hai file Dockerfile
và docker-compose.yml
sẽ thay đổi rất nhiều.
Ví dụ bạn có thể sẽ cần thêm PHP extension, Apache module, hoặc Node.js / npm để compile asset,... Hoặc bạn có thể sẽ cần thêm các service như MySQL, Redis,... Khi đấy thì bạn cần phải tìm hiểu thêm về Docker và Docker Compose để phục vụ cho công việc của mình.
Bài viết của mình đến đây là hết, hi vọng nó sẽ đem lại một chút kiến thức có ích cho bạn.
Tham khảo: