Tạo một hệ thống nhỏ đa năng với Docker. Sử dụng được trong nhiều việc
Chào các bạn,
Sự ra đời của Docker đã khiến cho cuộc sống của developers đơn giản hơn một tẹo. Không chỉ vậy, cả web master, administrators và cả khối người có liên quan chắc cũng vậy. Với Việt Coding, không còn phải hì hục cài đặt Apache, PHP, MySql/MariaDB và nhiều phần mềm khác để phục vụ cho công việc lập trình web hoặc triển khai sản phẩm lên server như trước kia nữa. Có nhiều thứ phải cài đặt, cấu hình nhặng xị cả lên – nay với Docker chỉ gõ hoặc copy/paste một câu lệnh là mọi thứ đã sẵn sàng hoạt động. Rất khoẻ ! Nói theo ngôn ngữ phim là “quá nhanh quá nguy hiểm” 😀
Hôm nay Việt Coding ghi chép lại và cũng muốn chia sẻ với các bạn những image cần thiết và cách cài đặt một môi trường development hoặc production “nho nhỏ”. Gọi là “nho nhỏ” vậy thôi chứ ngoài để test hoặc development vẫn có thể triển khai production mà không gặp vấn đề gì. Có ít nhất 3 VPS của Việt Coding đang chạy trơn tru, mượt mà mấy năm nay.
1. Môi trường triển khai hệ thống, thư mục lưu trữ (storage) và domain:
- Việt Coding là fan của CentOS nên 100% môi trường production sử dụng CentOS 7. Môi trường development là macOS hoặc máy ảo cài CentOS 7.
- Thư mục chứa dữ liệu mặc định là
/home/tên_user/Dockers
Vd:/home/anhht/Dockers
. TrongDockers
sẽ có thêm các thư mục con tương ứng như làportainer, nginx, wordpress, mariadb,...
. Các thư mục này để lưu dữ liệu của từng Docker container dạng `persistent`. Tránh khi restart lại các container sẽ bị mất dữ liệu. Chi tiết có thể xem ở link này. - Domain để truy cập từ ngoài Internet vào. Chúng ta có thể sử dụng domain “xịn” (
.com, .net,...
) hoặc domain miễn phí (.ga, .co.cc, .tk,...
hoặc domain của các dịch vụ `Dynamic DNS` như No-IP, DynDNS, DuckDNS,… Việt Coding dùng domaindemo.vietcoding.com
.
2. Những image cần thiết cơ bản:
Những image cơ bản nhất để dựng nên hệ thống này.
nginx
: Quá nổi tiếng rồi không cần giới thiệu nhiều nhỉ. Dùng để làmproxy, load balancing,...
cho backend (HTTP/HTTPS).portainer
: Công cụ nền web để thao tác với Docker dễ dàng. Nếu bạn không thích dùng command line thì đây là công cụ rất phù hợp.oznu/cloudflare-ddns
: Công cụ giúp cập nhật IP động lên CloudFlare. Thích hợp dùng trong môi trường development hoặc testing/demo cho khách hàng qua Internet truy cập vào máy mình để xem tiến độ công việc. Trong môi trường production thường có IP tĩnh và domain nên không cần image này.
Ngoài những image cơ bản trên, tuỳ vào mục đích mà chúng ta có thể cần thêm các image như WordPress, MariaDB/MySql, NodeJS, Golang,...
Nếu chưa biết CloudFlare là gì, mời bạn xem bài viết Bảo mật và tăng tốc website của bạn với CloudFlare.
3. Tạo một network “ảo” trên Docker:
Mục đích tạo network này là để chúng ta có thể gán IP tĩnh cho các container như portainer
, nginx
. Tránh trường hợp khi Docker restart sẽ cấp IP khác cho các container sẽ làm sai lệch cấu hình.
# Tạo ra một network trên Docker với tên "development"; Dải IP được cấp từ 172.0.0.1 đến 255 docker network create --subnet=172.0.0.0/16 development
4. Tạo container portainer
:
docker run -d --name="portainer" \ --restart=always \ -p 9000:9000 \ -v ~/Dockers/portainer:/data \ -v /var/run/docker.sock:/var/run/docker.sock \ --net development \ --ip 172.0.0.2 \ portainer/portainer
Như có nói ở trên, `portainer` là một công cụ nền web chạy trên Docker để quản lý Docker qua GUI. Bạn có thể đọc thêm trang chủ để hiểu rõ hơn: https://portainer.io. Sau khi tạo xong container portainer
, chúng ta thử truy cập vào địa chỉ: http://IP_MÁY:9000/
để xem kết quả.
5. Tạo chứng chỉ số bảo mật (SSL certification) cho domain.
Ngày nay, các website đều nên có chứng chỉ số SSL để gia tăng bảo mật – tránh dữ liệu bị ăn cắp trên đường truyền. Nhất là đối với các trang có chức năng Login, Payment,… Do việc tạo (issue) và gia hạn (renew) SSL khá đơn giản và miễn phí với Let’s Encrypt nên Việt Coding thường dùng SSL cho… nó đẹp (ổ khoá màu xanh 🙂 )
Để không mất thời gian nói lại, mời các bạn tham khảo bài acme.sh: Shell script tự động cấp và gia hạn chứng chỉ số Let’s Encrypt để tạo SSL cho domain.
Sau khi đã có cert cho domain demo.vietcoding.com
, chúng ta tiếp tục:
6. Tạo 02 container nginx
Thường Việt Coding có thói quen tạo 02 container `nginx` đặt tên như sau:
nginx80
: dùng để chứng thực domain (verify) với Let’s Encrypt. Nhằm xin cấp chứng chỉ SSL.nginx443
: dùng để làm proxy, load balacing,… với SSL cho website hoặc back-endAPI
viết bằng Golang hay NodeJS. Hay nói nhanh là mọi thứ chường mặt ra Internet thì gắn SSL hết 🙂
Các bạn không thích dùng riêng từng container có thể gộp lại cũng được. Chỉ cần dùng chung một tập tin cấu hình của nginx thôi. Ở đây Việt Coding sử dụng 2 tập tin `nginx80.conf` và nginx443
ứng với 2 containers:
nginx80.conf
error_log /nginx/logs/main_error.log; worker_processes 1; worker_rlimit_nofile 65535; events { worker_connections 2048; } http { access_log /nginx/logs/access80.log; error_log /nginx/logs/error80.log; ############################################################ ### Default port 80 and for LetsEncrypt verification ############################################################ server { listen 80; server_name demo.vietcoding.com; location / { root /nginx/www/default/; allow all; } } }
Tạo file tên `nginx80.conf` với nội dung ở trên. Copy/Move file vào `/home/your_user/Dockers/nginx`. Sau đó chạy lênh dưới đây để tạo container `nginx80`.
docker run -d --name nginx80 \ --restart=always \ -p 80:80 \ -v ~/Dockers/nginx:/nginx \ -v ~/Dockers/nginx/nginx80.conf:/etc/nginx/nginx.conf \ --net development \ --ip 172.0.0.3 \ nginx
- `nginx443.conf`: Tạo tập tin `nginx443.conf` trong `/home/your_user/Dockers/nginx` với nội dung sau:
worker_processes 1; worker_rlimit_nofile 65535; events { worker_connections 2048; } http { access_log /nginx/logs/access443.log; error_log /nginx/logs/error443.log; map $http_upgrade $connection_upgrade { default upgrade; '' close; } ############################################################ ### demo.vietcoding.com 443 ############################################################ server { listen 443 ssl; server_name demo.vietcoding.com; access_log /nginx/logs/demo.access.log; error_log /nginx/logs/demo.error.log error; ssl_certificate /etc/letsencrypt/demo.vietcoding.com/demo.vietcoding.com.cer; ssl_certificate_key /etc/letsencrypt/demo.vietcoding.com.ga/demo.vietcoding.com.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; add_header Strict-Transport-Security "max-age=31536000; includeSubdomains"; proxy_buffering off; location / { proxy_pass http://172.0.0.20; proxy_set_header Host $host; proxy_http_version 1.1; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } } #end server }
172.0.0.20
là IP của một container nào đó (do chúng ta tạo thêm sau này) để chạy một ứng dụng web (WordPress, Joomla, phpBB, Vbulletin,…) hay một ứng dụng web / API viết bằng Golang, NodeJS, PHP, .NET Core,…)
Tiếp đến chạy lênh sau để tạo container nginx443
:
docker run -d --name="nginx443" \ --restart=always \ -p 443:443 \ -v ~/Dockers/nginx:/nginx \ -v ~/Dockers/nginx/nginx443.conf:/etc/nginx/nginx.conf \ -v /home/anhht/.acme.sh/:/etc/letsencrypt:ro \ --net development \ --ip 172.0.0.4 \ nginx
7. Tạo container ứng dụng web hoặc API:
Ở đây, tuỳ vào nhu cầu của bạn mà sẽ tạo thêm một hoặc nhiều container chạy ứng dụng web (WordPress, Joomla, phpBB, Vbulletin,…) hay một ứng dụng web / API viết bằng Golang, NodeJS, PHP, .NET Core,…) hoặc bất kỳ cái gì mà Docker có hỗ trợ 🙂
8. Kiểm tra lại thành quả:
Đến đây, thử từ một máy tính hoặc smart phone truy cập vào https://vietcoding.com
để xem có truy cập được vào web/API ở container có IP 172.0.0.20 đã tạo hay không.
0 Comments