Dựng 1 image môi trường docker microservice cho project
This post hasn't been updated for 6 years
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.
Cấu trúc hệ thống
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.
Setup workspace
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 "\n" | 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}
}
}
Kết luận
Để 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.
All Rights Reserved