- vừa được xem lúc

Sử dụng Docker để thiết lập môi trường lập trình cho nhiều dự án khác nhau trên cùng một thiết bị

0 0 159

Người đăng: Nguyen Xuan Tri

Theo Viblo Asia

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

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

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 _@.com 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à:

  1. Folder chứa source code mình bind /var/www/html với folder gốc nơi chứa file Dockerfiledocker-compose.yml
  2. Folder vendor chứa các package dependencies, tương tự mình bind với folder vendor của folder gốc
  3. 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

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 Dockerfiledocker-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:

Bình luận

Bài viết tương tự

- vừa được xem lúc

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

0 0 374

- vừa được xem lúc

Phân quyền đơn giản với package Laravel permission

Như các bạn đã biết, phân quyền trong một ứng dụng là một phần không thể thiếu trong việc phát triển phần mềm, dù đó là ứng dụng web hay là mobile. Vậy nên, hôm nay mình sẽ giới thiệu một package có thể giúp các bạn phân quyền nhanh và đơn giản trong một website được viết bằng PHP với framework là L

0 0 421

- vừa được xem lúc

Sử dụng Swagger để xây dựng API documentation

Giới thiệu về Swagger. RESTful API là một tiêu chuẩn dùng trong việc thiết kế API cho các ứng dụng web (thiết kế Web services) để tiện cho việc quản lý các resource.

0 0 1k

- vừa được xem lúc

So sánh Interface và Abstract trong lập trình hướng đối tượng.

Tổng quan. Interface và Abstract class là 2 khái niệm cơ bản trong lập trình OOP.

0 0 48

- vừa được xem lúc

CURL và cách sử dụng trong PHP

Giới Thiệu. CURL là bộ thư viện được sử dụng để giúp thực hiện việc chuyển dữ liệu thông qua nhiều giao thức khác nhau (như HTTP, FPT...). Với giao thức HTTP, cURL hỗ trợ việc gửi dữ liệu sử dụng tất cả các phương thức hiện có như GET, POST, PUT, DELETE... cURL cũng hỗ trợ việc chuyền dữ liệu sử dụn

0 0 77

- vừa được xem lúc

Thêm dòng dữ liệu mới (MySQL) trong Laravel

Chào các bạn, Laravel hiện đang là hot trend trong "thế giới PHP". 1. Cấu hình cơ bản ban đầu. .

0 0 38