Hi mọi người, bài viết này sẽ là cách làm một demo app với Docker để mọi người ai chưa rõ về Docker có thể rõ hơn nhé. Dành cho ai chưa biết thì mình có một bài viết tìm hiểu cơ bản về Docker mình sẽ để đường link đây: Tìm hiểu một chút cơ bản về Docker. Rồi cùng mình bước vào mục chính của bài viết này nhé! 😁😁😁
Các công nghệ sử dụng
- Docker: đương nhiên là phải có rồi, nhân vật chính mà lị. 😁
- Ruby: ngôn ngữ lập trình mình sử dụng để tạo demo app.
- Ruby on Rails: framework để viết các chương trình web của ruby.
- MySQL: DBMS mình sử dụng cho demo app
- Redis: Redis server mình sử dụng để lưu các Active Job của Rails (Nếu bạn nào đã từng sử dụng Rails của Ruby sẽ biết cái này, nếu bạn nào không biết cũng không sao, bài viết này sẽ nói chủ yếu cách chúng ta build và run một application và connect với container trong Docker ntn)
Tiến hành cài đặt
Ở đây máy tính của mình sử dụng là HDH Windows 10, nhưng mình có kết nối WSL qua Ubuntu để chạy Ruby. Lý do là chạy Ruby trên WIndows nặng vcl 😅, với lại khó config nữa. Dành cho ai chưa biết cách kết nối với WSL thì mình sẽ để các đường link dưới đây để mọi người tham khảo.
- Link cài đặt Docker Install Docker for Windows.
- Link youtube tham khảo cài WSL, Ubuntu và Terminal trên Windows của F8 Official Cài Đặt Ubuntu với WSL 1 | Install WSL
- Lưu ý là chúng ta sử dụng WSL2 để Docker Desktop có thể hỗ trợ với Ubuntu trên Windows nhé!
- Link tham khảo Install WSL (Nếu có thời gian các bạn hãy tìm hiểu về WSL và WSL2 nó khá là thú vị 😁😁😁)
- Enable WSL2 for Docker to connect Ubuntu Docker Desktop WSL 2 backend on Windows
Sau khi cài đặt mớ trên, chúng ta đã có thể chạy Ubuntu trên máy Windows của chúng ta rồi và đợi cho nó cài đặt xong chúng ta có thể set user và password cho Ubuntu nhé. Ở đây do mình đã set user và password cho nó rồi nên nó sẽ trông ntn:
Rồi tiếp theo chúng ta có thể cài một số phần mềm trong Ubuntu
- Git
- NodeJS
- RVM : cái này là để quản lý các phiên bản của Ruby nè
- MySQL
- v..v..
Nhưng mà mục tiêu bài viết này sẽ về cách sử dụng Docker nên mấy cái trên chỉ cần cài Git là đủ 😁😁😁
Clone demo app
Mình đã viết sẵn một demo app mà mình đã push nó lên trên github của mình. Các bạn có thể clone nó về để vọc vạch code hay làm gì tùy các bạn 😁😁😁. Các bạn tạo folder bất kỳ trong Ubuntu bằng cú pháp sau:
mkdir demo-docker
Sau đó truy cập vào thư mục đó: Sử dụng lệnh sau để clone demo-app về:
git clone https://github.com/quocanhute/sample_app
Sau khi clone về, truy cập thư mục sample_app và mở IDE Visual Studio Code nếu bạn đã cài sẵn trên Windows và connect WSL2 thông qua Docker Desktop với câu lệnh:
code .
Ở đây trong sample_app sẽ có 1 file gọi là Dockerfile
Ở file này chúng ta sẽ thông báo cho Docker biết nó sẽ cần các image nào để chạy app này. Với sample_app sẽ là Ruby version 3.2.2. Và các dòng dưới là để Docker biết thư mục hoặt động, các thư viện cần thiết để Rails có thể chạy như nodejs version >= 14.x, và các lệnh cài đặt cài các gói gem
Build docker image bằng lệnh:
docker build -t sample-app .
Nó sẽ build ra 1 image với tên là sample-app
Mình sẽ cho các bạn xem Structure sau:
Ở đây để chạy container chứa image sample-app. Chúng ta cần tạo cho nó 2 containers chạy MySQL database và Redis, và 3 container này đều được gói trong 1 network để nó có chung domain IP.
Vậy việc mình cần làm là tạo 1 network cho 3 thằng container này. Chúng ta chạy lệnh sau:
docker network create sample-app
Nó sẽ tạo một network với tên là sample-app
Ta sẽ tiến hành tạo container chứa MySQL và Redis trong network sample-app
Tạo container MySQL
docker run -d \ --network sample-app --network-alias mysql \ -v sample-mysql-data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=secret \ -e MYSQL_DATABASE=sample_app \ mysql:8.0
Lưu ý là câu lệnh này chạy trên cmd của Ubuntu, các bạn chạy trên Windows thì thay \
thành `
Tạo container Redis
docker run --network sample-app --network-alias redis \ -v /local-data/:/data \ redis/redis-stack:latest
Sau khi có các container chạy MySQL và Redis tiến hành chạy image sample-app thôi
docker run -p 3000:3000 --name sample-app \ --network sample-app \ -e MYSQL_HOST=mysql \ -e MYSQL_USER=root \ -e MYSQL_ROOT_PASSWORD=secret \ -e MYSQL_DATABASE=sample_app \ -e REDIS_URL=redis://redis:6379/12 \ sample-app
Mình sẽ giải thích vài thứ ở trên các câu lệnh trên.
- Đầu tiên là
--network-alias
, cái prefix này là để trong 1 network nó sẽ ánh xạ thẳng tới host IP của container đó luôn. Ví dụ container MySQL trong network sample-app là 172.22.1.52 đi. Và để nối tới container này ta phải trỏ tới địa chỉ IP trên. Nhưng trong docker network nó hỗ trợ luôn thì thay vì ta phải gọi địa chỉ IP thì chỉ gần đặt cho nó cái tên làmysql
là nó sẽ tự hiểu. - Tiếp theo là
-e SOMETHING_ENV=something
cái là để config các biến env trong sample-app thôi 😁😁😁
Chạy demo app
Sau khi run app lần đầu tiên, các bạn hãy truy cập vào địa chỉ sau http://127.0.0.1:3000/
Nhưng sẽ gặp một số lỗi, bởi vì app này được viết bằng Rails nên chúng ta cần phải chạy một số lệnh sau để nó tiến hành migrate database và seed data
rails db:migrate
rails db:seed
Chạy các lệnh này bằng cách truy cập terminal của container sample-app chúng ta chạy
Thế là xong rồi đấy, các bạn có thể vọc vạch cái app lỏ này tùy theo ý thích của các bạn thôi !!! 😁😁😁
Tổng kết
Tóm lại phía trên là quá trình mình tìm hiểu và build 1 app với Docker. Câu từ có thể hơi lủng củng nhưng mong nó có thể giúp cho các bạn nào mới hoặc đang tìm hiểu về Docker có thể nắm rõ hơn về nó. Nếu có gì thắc mắc hoặc góp ý các bạn có thể liên hệ mình qua FB Tạ QuốcAnh. Và nếu có thời gian mình sẽ viết thêm một bài viết sử dụng Docker compose để build lẹ hơn chỉ với 1 cmd. Nếu thấy bài viết bổ ích các bạn hãy upvote cho mình nha