Tạo một hệ thống nhỏ đa năng với Docker. Sử dụng được trong nhiều việc

Published by Việt Coding on

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 developmentmacOS 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. Trong Dockers 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 domain demo.vietcoding.com.

Cá nhân Việt Coding có sẵn khá nhiều domain .com, .net mua từ các đợt giảm giá. Nếu bạn quan tâm có thể chọn mua domain từ NameCheap là nhà cung cấp domain, hosting uy tín chất lượng mà Việt Coding dùng gần 10 năm nay.

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àm proxy, 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:

  1. nginx80: dùng để chứng thực domain (verify) với Let’s Encrypt. Nhằm xin cấp chứng chỉ SSL.
  2. nginx443: dùng để làm proxy, load balacing,… với SSL cho website hoặc back-end API 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.

Như vậy, Việt Coding đã cùng các bạn sử dụng Docker build một hệ thống khá là đơn giản nhưng lại hữu dụng trong rất nhiều cả trong production và development. Nếu bạn có bổ sung hay ý kiến khác, vui lòng comment vào bên dưới bài viết nhé !

Quảng cáo tài trợ


Việt Coding

Là một người đam mê lập trình, tôi vọc vạch đủ thứ liên quan đến lập trình cho thoả chí tò mò. Hiện làm chủ yếu ở mảng phát triển ứng dụng di động cho iOS và Android với React Native. Thỉnh thoảng vọc vạch mấy thứ liên quan đến Internet of Things như Smart Home. Đang nghịch mấy con Raspberry Pi và thấy nó cũng thú vị :)

0 Comments

Leave a Reply

Avatar placeholder

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax