Rails development với Docker Compose
Docker là một công cụ hữu ích khi bạn muốn xây dựng một môi trường development tương đồng với production. Với Docker Compose, Docker càng giúp ích hơn cho developer với nhu cầu tách các dependencies như MySQL, Solr hay Redis ra thành các components riêng biệt. Trong bài viết này, mình sẽ hướng dẫn các bạn các thiết lập môi trường development cho Rails app đơn giản với Docker và Docker Compose.
Cài đặt Docker và Docker Compose
Cài đặt Docker cho Ubuntu 16.04
- Update apt sources
- Thêm GPG key
- Thêm Docker repo vào source list
- Update apt package
- Cài đặt
docker-engine
- Khởi động
service
cho docker
Cài đặt Compose cho Ubuntu 16.04
- Cài đặt từ source
- Thêm quyền
executable
chodocker-compose
Phát triển Rails với Docker và Docker Compose
Setup Docker
Dockerfile
Trong thư mục Rails project, tạo Dockerfile
với nội dung:
Mình sẽ giải thích một vài command ở Dockerfile
trên:
FROM
: Chỉ định image mà sử dụng để làm base cho container. Trong trường hợp này, chúng ta sử dụng ruby 2.3.3RUN
: Chỉ định command được sử dụng khi buildENV
: Set biến môi trườngWORKDIR
: Chỉ định thư mục base. Tất cả command được gọi sau đó sẽ được thực thi bên trong thư mục này.ADD
: Copy files từ máy host vào container Mỗi command này sẽ tạo ra một cached image mà chúng ta có thể xây dựng tiếp lên trên. Để build docker image, trong thư mục chứaDockerfile
, chạy lệnh:docker build .
Compose file
Chúng ta đã xây dựng thành công một Docker image để chứa Rails, tuy nhiên chúng ta vẫn còn cần phải thiết định cho các dependencies như database hay search engine. Lúc này thì chúng ta sẽ sử dụng Docker Compose.
Trong cùng thư mục chứa Rails, tạo file docker-compose.yml
có nội dung:
Trong file Docker Compose này chúng ta đã chỉ định 2 services
sẽ chạy song song là web
và db
.
db
được chỉ định sẽ sử dụng imagepostgres:9.6.1
quaimage: postgres:9.6.1
và có thể truy xuất qua cổng5432
. Thiết định mặc định củaports
là<HOST_PORT>:<DOCKER_PORT>
.volumes
sẽ kết nối thư mục ở host vào thư mục được chỉ định trên container; ở đây chúng ta kết nối thư mục/data/postgres-9.6.1
trong Rails root vào thư mục/var/lib/postgresql/data
trong container; nhờ vậy khi có bất kì thay đổi gì trong database, data sẽ được lưu xuống host thay vì chỉ nằm trên container tránh tình trạng mất dữ liệu khi “lỡ tay” xóa container.web
sử dụngDockerfile
thông quabuild: .
và truy xuất qua cổng3000
.depends_on
sẽ chỉ định services màweb
sẽ cần và từ đó chạy services đó trước khi chạyweb
; ở đây làdb
. Chúng ta kết nối thư mục Rails vào thư mục/myapp
trong container thông quavolumes
Lúc này trong thư mục gốc của Rails, để bắt đầu build và khởi động container, bạn chạy lệnh:
Thiết lập cho database
Do chúng ta kết nối tới database trên container, nên sẽ cần chỉnh sửa file config/database.yml
:
Sau khi thiết lập kết nối với database từ Rails app, ta có thể chạy lệnh tạo và migrate database qua:
docker-compose run web rake db:create db:setup
Tương tác với container
Tương tác với console
Bạn có thể mở Rails console thông qua command: docker-compose run web rails console
Cấu trúc của command để tương tác với container là docker-compose run {CONTAINER_NAME} {COMMAND}
Một vài command hữu ích khác
- Truy cập shell của
web
:docker-compose exec -it web bash
- Kết nối với server console:
docker attach <CONTAINER_FULL_NAME>
- Khởi động lại container
web
:docker-compose restart web
- List tất cả các container đang hoạt động:
docker ps
- Ngoài ra còn nhiều command khác, bạn có thể tham khảo tại đây
Kết luận
Trên đây là một ví dụ nhỏ về việc xây dựng môi trường cho Rails app với Docker. Việc thêm vào các services khác trong cùng một application như Redis hay Solr là việc vô cùng đơn giản với Docker Compose.