Viblo Code
+2

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ị

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 [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à:

  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:


All Rights Reserved