+4

Demo Rails app + MySQL + Redis với Docker

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

  1. Docker: đương nhiên là phải có rồi, nhân vật chính mà lị. 😁
  2. Ruby: ngôn ngữ lập trình mình sử dụng để tạo demo app.
  3. Ruby on Rails: framework để viết các chương trình web của ruby.
  4. MySQL: DBMS mình sử dụng cho demo app
  5. 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.

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:

image.png 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
  • 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 đó: image.png 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 image.png

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

image.png

Ở đâ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.
  • Cái thứ hai là -v /path/, -v đây có nghĩa là volume, để mount data từ các container db lại để hạn chế mất dữ liệ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

image.png

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 ❤️

Tài liệu tham khảo

https://docs.docker.com/

https://rubyonrails.org/


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí