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.

4. Tạo container 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.confnginx443 ứng với 2 containers:

  • nginx80.conf

 

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.

 

  • nginx443.conf: Tạo tập tin nginx443.conf trong /home/your_user/Dockers/nginx với nội dung sau:

 

  • 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:

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ợ

Đăng ký nhận bài mới qua email

Nhập email của bạn vào đây để nhận được thông báo khi có bài viết mới. Hoàn toàn MIỄN PHÍ !!!


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

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