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.