Giới thiệu về Docker Compose

9
Ha Chi Hiếu viết gần 6 năm trước

Mở Đầu

Chắc hẳn là dev ai cũng từng nghe qua về Docker và Virtual Machine (VBox hoặc Vmware). Docker giúp cho việc xây dựng và triển khai một môi trường phát triển web, server hoặc database trở nên dễ dàng và không còn bị lệ thuộc vào một môi trường duy nhất trên máy.

Tuy nhiên việc quản lý Docker trên một hệ thống lớn với rất nhiều các containers khác nhau sẽ rất phức tạp và khả năng sinh ra nhiều lỗi. (Ví như việc phải cùng lúc liên kết Server với nhiều Database backend và các service riêng rẽ trên môi trường dev và sau đó chuyển qua staging/production)
Để khắc phục vấn đề này, Docker đã đưa ra một công cụ rất hữu ích đấy là Docker Compose.

Docker Compose giúp cho việc tạo và thiết lập các ứng dụng cần sự liên kết giữa nhiều Docker Container với nhau. Với Compose, bạn chỉ phải tạo một file YAML config, và bằng một lệnh duy nhất có thể khởi động Web Server của mình trên một container, connect đến MySQL database trên một container khác, đồng thời có một container thứ ba để chạy các backend service theo chu kỳ lập sẵn.

Giới thiệu về Docker Compose

Cài đặt Compose có thể sử dụng link từ trang chủ của Docker, Inc. dưới đây: https://docs.docker.com/compose/install/
Những tính năng chính của Compose bao gồm:

  • Thiết lập và cấu hình đa môi trường container hoàn toàn độc lập nhau trên cùng một máy chủ
  • Bảo lưu các phân vùng bộ nhớ khi container được tạo ra
  • Chỉ tạo lại container nào có config thay đổi trong khi vẫn bảo lưu dữ liệu của container
  • Cho phép định nghĩa các biến variables trong file YAML để tùy chỉnh cho các môi trường dev và product.

Để sử dụng Compose thông thường có ba bước sau:

  1. Tạo Dockerfile cho mỗi môi trường container của từng service mình muốn. Dockerfile là bắt buộc để khởi tạo container.
  2. Tạo file docker-compose.yml để định nghĩa mối liên kết giữa các containers với nhau.
  3. Chạy lệnh docker-compose up để khởi động Compose và chạy toàn bộ ứng dụng.

Để làm sáng tỏ tính ứng dụng của Docker Compose, dưới đây mình sẽ trình bày ví dụ về các lệnh cơ bản trong file docker-compose.yml và cách thức liên kết các containers với nhau

Example: Cấu trúc cơ bản của file YML trong Compose

Các lệnh trong file docker-compose.yml cũng tương tự như các lệnh mà Docker thực hiện.

Đầu tiên hãy tạo một project như sau:

composetest/
   commander/
      Dockerfile
   docker-compose.yml

Bên trong folder commander ta có một file Dockerfile như sau để khởi tạo một container chạy redis commander, đây là một service dùng để visualize redis database:

# create a nodejs container with minimum requirements
FROM node:0.12.2

# download and install redis-commander
RUN curl -L https://github.com/joeferner/redis-commander/tarball/v0.3.2 | tar zx
RUN npm install -g redis-commander

# Run this command everytime this container start up
ENTRYPOINT [ "redis-commander" ]
CMD [ "--redis-host", "redis" ]

EXPOSE 8081

Và Docker-compose.yml:

Version: ‘3’
services: 
  backend:
    image: “redis:3”
    restart: always

  frontend: 
    build: commander
    links: 
    - backend:redis  
    ports: 
    - 8081:8081 
    restart: always

File Compose trên đây xác định việc khởi tạo 2 services, backend và frontend. Backend service sử dụng public Redis image từ Docker Hub registry. Frontend service:

  • sử dụng image của redis-commander đã được đĩnh nghĩa trong folder commander
  • links với backend service bằng alias redis
  • kết nối cổng 8081 trên container với cổng 8081 của máy chủ.

Tiếp theo ta build và run app với Compose bằng lệnh:

$ docker-compose up

Compose sẽ lấy về Redis image, build và khởi tạo service đã được định nghĩa sẵn.
Nhập đường dẫn http://localhost:8081 vào trình duyệt trên máy chủ, ta sẽ thấy app đang chạy. Redis Commander chính là User Interface của Redis database backend.

Câu lệnh "docker-compose up" chính là gộp của hai lệnh sau:

docker build -t commander commander
docker run -d --name frontend -p 8081:8081 --link backend:redis commander

Như vậy, với mỗi service mới được thêm vào hoặc chỉnh sửa, ngoài việc tạo Dockerfile cho service thì chỉ cần thêm vào trong docker-compose.yml, service mới sẽ được liên kết dễ dàng với database/service hiện tại.

Để kết thúc các services đang chạy, sử dụng lệnh:

$ docker-compose stop

Và để xóa hoàn toàn container và data volume sử dụng bởi Redis container:

$ docker-compose down --volumes

Kết luận

Trên đây chỉ là một ví dụ đơn giản về sử dụng Compose thay cho gọi lệnh docker thông thường. Tuy nhiên trong một hệ thống phức tạp với nhiều services nhỏ chạy xen kẽ với nhau, việc sử dụng một file yml tập trung để quản lý những container nhỏ là điều rất cần thiết.

Bình luận


White
{{ comment.user.name }}
Hay Bỏ hay
{{ comment.like_count}}
White

Ha Chi Hiếu

33 bài viết.
0 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}

{{like_count}}

kipalog

{{ comment_count }}

Bình luận


White
{{userFollowed ? 'Following' : 'Follow'}}
33 bài viết.
0 người follow

 Đầu mục bài viết