12/08/2018, 17:14

Dựng 1 image môi trường docker microservice cho project

Hiện nay có rất nhiều cách để build 1 môi trường cho develop phát triển dự án của mình. Docker là công cụ tuyệt vời nhất mà mình đã từng dùng qua, đơn giản, gọn nhẹ và hơn cả là với chỉ 1 file config đơn giản là bạn có thể giả lập tất cả các môi trường develop. Bài viết này mình ko giới thiệu ...

Hiện nay có rất nhiều cách để build 1 môi trường cho develop phát triển dự án của mình. Docker là công cụ tuyệt vời nhất mà mình đã từng dùng qua, đơn giản, gọn nhẹ và hơn cả là với chỉ 1 file config đơn giản là bạn có thể giả lập tất cả các môi trường develop.

Bài viết này mình ko giới thiệu nhiều về docker vì nó đã không còn xa lạ tuy nhiên mình sẽ làm 1 hướng dẫn để build 1 microservice với php và các ứng dụng khác.

Môi trường cho develop Server side chắc hẳn rồi bạn cần có web server ở đây mình sẽ sử dụng 1 web server có tên là Caddy server,

Môi trường linux chắc hẳn rồi mình sẽ setup 1 linux chạy ubuntu 16.04 và mình sẽ install php và các extension của nó lên đó.

SQL hẳn rồi, bạn có thể thích dùng mongo hay mysql tuỳ ý tuy nhiên ở đâu mình sẽ dùng mysql

có thể thêm tuỳ chọn redis nữa nếu các bạn thích cache nhiều và mạnh mẹ hơn. Chắc tạm thời chỉ cần như vậy là đủ các service đơn giản build cho 1 project rồi mình sẽ tổng hợp lại

  • Caddy Server - Web server được viết bằng Go. https://caddyserver.com/ Tích hợp sẵn Http2
  • Workspace được install ubuntu và cài đặt PHP. Nếu bạn muốn làm thêm multiple server để load balancing thì có thể nhân số lượng lên.
  • Mysql mình sẽ sử dụng 1 image official https://hub.docker.com/_/mysql/
  • Redis https://hub.docker.com/_/redis/ Cũng là 1 image official.

Về kiến trúc cơ bản cũng chỉ cần vậy thôi nếu bạn muốn cài thêm gì đó thì có thể tìm kiếm image trên docker hub hoặc tự build lấy 1 vài image cho riêng mình

Ở đây trong các image trên thì hầu như mình đều tìm các image official để dùng luôn, tuy nhiên chỉ có con workspace là mình sẽ tự build theo môi trường và ứng dụng của mình

Đầu tiên hãy tạo 1 folder với tên là environment dạng như thế này

--environment
----docker-compose.yml
----Dockerfile
----provision.sh
----README.md

Mình sử dụng core chính của ubuntu để build môi trường linux sao cho lọc bỏ tinh giản nhất

trong Dockerfile

FROM ubuntu:16.04

ADD provision.sh /provision.sh

RUN chmod +x /*.sh

RUN ./provision.sh

WORKDIR /var/www/app

Bạn có thể viết lệnh linux trực tiếp trên Dockerfile ví dụ 1 vài lệnh cơ bản như install và update package trong file Dockerfile

RUN npm install -g 

Cách này nó hữu hiệu khi bạn build lại nhiều lần và dockerfile sẽ cache để lần sau build sẽ nhanh hơn. Tuy nhiên mình thì thích cách khác. Mình hay viết 1 file scripts mục đích của mình rất đơn giản, mỗi khi muốn build 1 môi trường linux thất mình chỉ việc ném file raw file scripts đó là xong khỏi mất công cài đặt gì nữa.

trong file scripts provision.sh mình sẽ install và cấu hình mọi thứ trong đó file của mình như sau

#!/usr/bin/env bash


# Environment PHP7.2 original provisioning script
# https://github.com/dung13890

# Update Package List
apt-get update

# PPA for php
apt-add-repository ppa:ondrej/php -y

# Install PHP-CLI 7, some PHP extentions
apt-get update
apt-get install -y --force-yes 
    php7.2-cli 
    php7.2-dev 
    php7.2-common 
    php7.2-curl 
    php7.2-json 
    php7.2-soap 
    php7.2-xml 
    php7.2-mbstring 
    php7.2-mysql 
    php7.2-pgsql 
    php7.2-sqlite 
    php7.2-sqlite3 
    php7.2-zip 
    php7.2-gd 
    php7.2-xdebug 
    php7.2-bcmath 
    php7.2-intl 
    php7.2-dev 
    php7.2-fpm 
    php-pear 
    php-memcached 
    php-redis 
    php-apcu 
    libcurl4-openssl-dev 
    libedit-dev 
    libssl-dev 
    libxml2-dev 
    xz-utils 
    sqlite3 
    libsqlite3-dev 
    libmcrypt-dev 
    libreadline-dev 
    curl 
    vim 
    zip 
    unzip 
    supervisor

# Installing mcrypt on PHP 7.2
printf "
" | pecl install mcrypt-1.0.1
bash -c "echo extension=mcrypt.so > /etc/php/7.2/mods-available/mcrypt.ini"

# Set php7.2-fpm open port 9000
sed -i "s/listen =.*/listen = 0.0.0.0:9000/" /etc/php/7.2/fpm/pool.d/www.conf

# Clean up
apt-get clean && apt-get autoclean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

File scripts mình chỉ cần đơn giản php 7.2 và những extension cần thiết cho nó các bạn muốn cài thêm gì có thể install thêm. Mình có open port 9000 của php-fpm để web server có thể gọi vào thông qua port này.

Vậy chắc là đủ rồi, bây giờ mình sẽ sử dụng thêm docker-compose.yml để móc nối các instance này lại với nhau trong cùng 1 môi trường

version: "2"

services:
 application:
   image: debian
   volumes:
     - ./:/var/www/app
 application:
   build: ./
   volumes:
     - ./:/var/www/app
   links:
    - mysql
 mysql:
   restart: always
   image: mysql
   volumes:
     - ./.docker/mysql:/var/lib/mysql
   expose:
     - "3306"
   environment:
     MYSQL_DATABASE: database
     MYSQL_USER: username
     MYSQL_PASSWORD: secret
     MYSQL_ROOT_PASSWORD: root
 redis:
     restart: always
     image: redis:latest
     expose:
       - "6379"
     volumes:
       - ./.docker/redis:/data
 caddy:
   image: abiosoft/caddy
   restart: always
   volumes_from:
     - application
   ports:
     - "80:80"
     - "443:443"
   command: ["--conf", "/var/www/app/Caddyfile", "--log", "stdout"]

Chỉ cần vậy là mình đã có ngay 1 môi trường microservice với các dịch vụ bóc tách rời cho 1 project à quên với Caddy server các bạn phải config domain ảo cho nó nữa tạo 1 Caddyfile

your.domain:443 {
   tls self_signed
   root /var/www/app
   fastcgi / application:9000 php {
       index index.php
   }
   rewrite {
       to {path} {path}/ /index.php?{query}
   }
}

Để run project các bạn chỉ cần chạy $ docker-compose build. Hoặc nếu muốn share image của bạn cho mọi người dùng có thể publish nó lên Docker hub. Hi vọng bài viết sẽ giúp ích phần nào cho các bạn trên con đường develop.

0