# Deploy app vote dogs và cats sử dụng nhiều Docker Containers
## Diagram của app
* 
* App bao gồm các phần sau:
* **Front End:** Được viết bằng **Python** để tạo giao diện cho người dùng vote chó và mèo
* **Redis:** Bộ nhớ cache (in-memory cache) được dùng để lưu trữ và queue vote
* **Node JS:** Web app hiển thị vote theo thời gian thực
* **Posgres:** Cơ sở dữ liệu lưu trữ bằng Docker Volume
* **.Net:** Worker Application lưu trữ votes từ Redis và lưu lại trong Database
* **Flow của app**
* Khi client thực hiện việc vote (Python), các vote sẽ được lưu vào bộ nhớ cache (Redis). Và chúng sẽ được Worker app (.Net) đọc và lưu vào Database (Postgres). Đồng thời 1 web app (Node JS) sẽ đọc dữ liệu từ Database và xuất ra kết quả của việc vote theo thời gian thực.
## Các lệnh build bằng Docker
* Source code có sẵn trong link repo: https://github.com/dockersamples/example-voting-app
* Chúng ta sẽ sử dụng Docker để install, build và chạy app.
* Các lệnh
* Chúng ta sẽ sử dụng các container như Redis container, Postgres Container.
* Login Docker: `docker login`
* 
* Download, install và chạy container Redis: `docker run -d --name=redis redis`
* 
* Download, install và chạy container Postgres: `docker run -d --name=db postgres:9.4`
* 
* Run container cho Voting Web app. Web app này sẽ expose ra ngoài bằng host computer theo port 5000 và chúng được **liên kết với Redis cache**. Ngoài ra Docker container sẽ expose app ra ngoài bằng port 80: 
* 
* Code: `docker run -d --name=vote --link redis:redis -p 5000:80 dockersamples/examplevotingapp_vote`
* Run container cho Result Web app. Web app này được **liên kết với Postgres database** theo diagram trên. Web app này sẽ expose ra ngòi bằng host computer theo port 5001. Ngoài ra Docker Container sẽ expose app ra ngoài bằng port 80: 
* Nếu gặp trường hợp Database không cho kết nối nếu không có mật khẩu, ta có thể kết nối mà không cần dùng mật khẩu bằng cách sử dụng lệnh: `docker run -d --name db -e POSTGRES_HOST_AUTH_METHOD=trust -d postgres`
* 
* Code run container: `docker run -d --name=result --link db:db -p 5001:80 dockersamples/examplevotingapp_result`
* 
* Run container cho Worker app. Worker này được liên kết với Redis để nhận data từ việc client vote. Và sau đó liên kết với Postgres để lưu trữ data. 
* 
* Code run container: `docker run -d --name=worker --link db:db --link redis:redis dockersamples/examplevotingapp_worker`
* 
* **Sau khi chạy tất cả:**
* Vote chó mèo tại: http://localhost:5000/
* Xem kết quả vote tại: http://localhost:5001/
* **Màn hình demo:**
* 
Note:
* Để sửa lỗi không kết nối được database
* ``docker run -d --name db -e POSTGRES_HOST_AUTH_METHOD=trust -d postgres``
* ``docker run -d --name result --link db:db -p 5001:80 dockersamples/examplevotingapp_result``
* Sửa lỗi không kết nối được với worker node
* ``docker run -d --name=worker --link db:db --link redis:redis dockersamples/examplevotingapp_worker``
**References**: https://mycloudtutorials.com/2021/02/deploying-micro-services-using-kubernetes-part-1/