Giới thiệu về Docker Compose
Docker
42
White

Kaopiz Software Co., Ltd. viết ngày 25/12/2018

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ài viết này được trích dẫn từ blog nội bộ công ty KAOPIZ - カオピーズ
Bài gốc: http://kipalog.kaopiz.com/posts/yaTiQurDJ0o71gCA7dzJ8w

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Kaopiz Software Co., Ltd.

27 bài viết.
24 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
50 2
Bài viết này được trích dẫn từ blog nội bộ công ty (Link) (Link) Bài gốc: https://kipalog.kaopiz.com/posts/RegexHocroimanhuchuahoc (Ảnh) 1. Tự...
Kaopiz Software Co., Ltd. viết 10 tháng trước
50 2
White
6 0
Introduction Elasticsearch là một công cụ tìm kiếm dựa trên nền tảng Apache Lucene. Nó cung cấp một bộ máy tìm kiếm dạng phân tán, có đầy đủ công ...
Kaopiz Software Co., Ltd. viết 10 tháng trước
6 0
White
4 2
1. Tình huống: Nếu bạn đã dùng Hostgator shared web hosting, bạn sẽ thấy đây là dịch vụ web tốt, ổn định và mạnh mẽ, chi phí lại thấp, đúng như da...
Kaopiz Software Co., Ltd. viết 11 tháng trước
4 2
Bài viết liên quan
White
10 0
Một trong những trường hợp build docker image là thừa hưởng từ một image mẹ Lấy một ví dụ sau: Dockefile FROM my_repo/my_image ENTRYPOINT ech...
Lơi Rệ viết 4 năm trước
10 0
White
17 0
Công cụ này dành riêng cho những người lười muốn muốn tiết kiệm thời gian thao tác với docker bằng dòng lệnh với các lợi ích sau: + Tiết kiệm thời...
Phí Ngọc Chi viết gần 3 năm trước
17 0
White
68 17
Hôm nay có người nói với mình: "Thật ra để chạy một ứng dụng bằng docker rất đơn giản, ví dụ như node, chỉ cần vài dòng cài thêm pm2, forever rồi m...
Minh Monmen viết 5 tháng trước
68 17
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


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

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

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!