Series về Docker trong thực thành & sản xuất - Docker compose để khởi động nhiều services

Series về Docker trong thực thành & sản xuất - Docker compose để khởi động nhiều services

Tin ngắn hàng ngày dành cho bạn
  • Trong đợt khảo sát chừng 1 năm trước, mình có hỏi mọi người là có sẵn sàng bỏ tiền ra để mua gói cao cấp không, thì có đến 35% số người trả lời chắc nịch là "Không", 65% còn lại nằm trong nhóm có khả năng sẽ mua.

    Nếu bạn thường xuyên ghé vào blog thì nhiều khả năng đã thấy bài viết mới nhất màu vàng ngay đầu trang chủ. Khi bấm vào nó hiện ra một nút yêu cầu mở khoá để đọc bài viết. Điều đó có ý nghĩa gì? Đúng vậy, mình đang chuẩn bị cho quá trình bán gói cao cấp.

    Thời điểm mình đăng bài viết đó cách đây gần 9 ngày. Theo thống kê, số lượng người bấm vào để đọc là 20 lượt. Nếu so sánh nó với bài viết có nhiều lượt xem nhất cùng thời điểm là 60, còn số lượng truy cập vào trang chủ là 122. Tức là cứ mỗi 6 lượt ra trang chủ thì có một lượt bấm vào bài viết cao cấp.

    Quyết định bán gói cao cấp không phải bộc phát, đó là cả một quá trình. Hơn nữa là sự quan tâm của bạn đọc, những người thường xuyên ghé thăm trang web. Các bạn là những người biết rõ nhất lợi ích mà trang web mang lại và đóng góp một phần công sức vào sự phát triển. Còn mình thì vẫn luôn luôn nỗ lực để mang lại trải nghiệm tốt nhất cho độc giả của 2coffee.dev.

    Tại sao lại bán gói cao cấp? Mà bán thì ai mua? Sao không cứ mãi mãi phát triển như bây giờ đi? Được rồi, đó là những câu hỏi mà tôi tin rằng bất kỳ ai đọc đến đây đều phải thắc mắc.

    Việc bán gói cao cấp đánh dấu một sự phát triển mới của 2coffee.dev, cả cho mình và cả cho độc giả. Tại sao? Nếu mình vẫn tiếp tục ở vòng lặp đọc - viết - rồi lại đọc - viết thì đó là một vòng an toàn, chẳng có sự đổi mới, thậm chí còn giới hạn óc sáng tạo. Một tính năng mới, tham gia vào một lĩnh vực mới giúp phá vỡ vòng lặp này và đưa bản thân vào những thách thức mới hơn. Nếu thất bại, đó là một bài học đáng giá. Ngược lại, đó là nguồn động lực to lớn mà tin rằng không chỉ dành riêng cho mình. Độc giả giờ đây sẽ có thêm lựa chọn mới, trải nghiệm mới mà trước nay chưa hề có.

    Mình không sợ thất bại, ngược lại dám nghĩ dám làm và bài học rút ra mới là điều đáng trân quý.

    » Xem thêm
  • openai/codex là một dự án mã nguồn mở mới nhất của OpenAI, ngay sau khi họ công bố hai mô hình mới nhất là o3 và o4 mini. Nghe nói cả o3 và o4 mini này rất thích hợp làm Agent nên tung ra codex như một dạng Agent nhỏ nhẹ chạy ngay trong Terminal luôn.

    Về tính ứng dụng, vì nó là Agent nên nó có thể đọc/thêm/sửa/xoá nội dung tệp của bạn luôn. Ví dụ.

    codex "explain this codebase to me"

    Hoặc tích hợp vào pipe line của CI/CD.

    - name: Update changelog via Codex run: | npm install -g @openai/codex export OPENAI_API_KEY="${{ secrets.OPENAI_KEY }}" codex -a auto-edit --quiet "update CHANGELOG for next release"

     À quên mất, phải dùng API của OpenAI nha 😆

    » Xem thêm
  • Có thể nhiều người chưa biết, OpenAI đã mở trang học viện riêng để giúp người dùng học tập và khai thác được tối đa sức mạnh các mô hình ngôn ngữ của họ.

    OpenAI Academy

    » Xem thêm

Vấn đề

docker run chỉ cho phép khởi động một container, điều này gây ra một hạn chế là khi quy mô ứng dụng của bạn cần phải khởi động nhiều container một lúc thì sẽ gây khó khăn và phức tạp, chưa kể là có thể có sai sót trong quá trình thực hiện đơn lẻ. Hãy tưởng tượng stack của bạn gồm có n image thì bạn phải chạy docker run n lần sao?

Docker compose được sinh ra để giải quyết vấn đề này. Nó là sẽ lưu trữ tập hợp các lệnh hướng dẫn cách run các container trong một file .yml/.yaml (docker-compose.yml). Sau đó chỉ cần dùng một lệnh duy nhất để khởi động tất cả.

Docker compose

Docker compose trước kia là một plugin nhưng gần đây nó đã được tích hợp luôn vào docker cho windows & macos, tuy nhiên trên linux thì vẫn chưa có. Nếu dùng linux, bạn cần phải cài đặt thêm docker compose.

Tham khảo thêm các cách cài đặt docker compose tại link Docker Compose Install.

Đối với người dùng linux chỉ cần dùng lệnh:

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# Kiểm tra phiên bản
$ docker-compose --version
docker-compose version 1.29.2, build 1110ad01

Để bắt đầu, giả sử bạn cần khởi động 2 service: node.js api & mysql server, hãy tạo một file docker-compose.yml.

version: "3.9"
services:
  node:
    image: my-node-app
    environment:
      - MYSQL_HOST: mysql
      - MYSQL_USER: hoaitx
      - MYSQL_PASSWORD: password
    ports:
      - "3000:3000"
    networks:
      - my_app
    depends_on:
      - mysql

  mysql:
    image: mysql
    environment:
      - MYSQL_USER=hoaitx
      - MYSQL_PASSWORD=password
    networks:
      - my_app
    volumes:
      - ./data:/var/lib/mysql

networks:
  my_app:

Sau đó sử dụng lệnh docker-compose để khởi động.

$ docker-compose up -d

Để xem danh sách các service đang chạy:

$ docker-compose ps

Note: các lệnh docker-compose ở trên được thực hiện ở thư mục đang chứa file docker-compose.yml.

Cũng giống như Dockerfile, file yml của docker compose cũng có một tập các lệnh. Docker compose vẫn đang liên tục bổ sung thêm các lệnh mới ở các version sau của docker, chính vì thế bạn nên kiểm tra kỹ version đang sử dụng trong file yml với version của docker trước khi sử dụng chúng.

Thành phần

Một file yml thường có version & services, version để báo cho docker biết bạn sử dụng version nào, còn service là nơi để liệt kê ra những dịch vụ sẽ được chạy. Ngoài ra nó còn có networks chứa những mạng (network) được sử dụng trong này.

Ví dụ dưới đây là một file yml version 3.9 để chạy cùng lúc node.js và mysql:

version: "3.9"
services:
  node:
    image: my-node-app
    environment:
      - MYSQL_HOST: mysql
      - MYSQL_USER: hoaitx
      - MYSQL_PASSWORD: password
    ports:
      - "3000:3000"
    networks:
      - my_app
    depends_on:
      - mysql

  mysql:
    image: mysql
    environment:
      - MYSQL_USER=hoaitx
      - MYSQL_PASSWORD=password
    networks:
      - my_app
    volumes:
      - ./data:/var/lib/mysql

networks:
  my_app:

Tips: yml là một file sử dụng các ký tự space để lùi dòng, ví thế bạn cần phải thận trọng trong việc xây dựng file này. Một dòng bị sai cũng có thể khiến docker-compose không thể chạy được.

  • version là version của file yml.
  • services chứa các dịch vụ sẽ được chạy.
  • networks chứa các thiết lập về mạng sẽ dùng.

Với mỗi service chúng ta sẽ có tên, tên này vừa là tên của service cũng là domain để các service gọi lẫn nhau, như trong ví dụ trên node sẽ gọi sang mysql bằng chính cái tên mysql luôn (MYSQL_HOST: mysql).

  • image là tên của image sẽ được dùng trong container.
  • environment là phần thiết lập biến môi trường.
  • ports thiết lập việc ánh xạ các cổng từ trong container ra ngoài máy chủ.
  • volumes thiết lập thư mục được mount từ máy chủ vào docker container.
  • networks khai báo tất cả các networks mà container được phép join vào.
  • depends_on để thiết lập việc phụ thuộc lẫn nhau giữa các service, tức là service chỉ được khởi tạo khi service kia đã chạy.

Ngoài những lệnh trên thì docker-compose cũng hỗ trợ rất nhiều lệnh khác nữa, tôi không thể liệt kê ra hết ở đây mọi người có thể tìm thấy tài liệu tại đây.

Tôi xin phép điểm qua một số lệnh nổi bật nữa:

  • build sẽ thay thế image, bình thường bạn sẽ cần có một image xác định để khởi chạy được container (service) thông qua lệnh docker build. Nếu dùng build bạn sẽ không cần phải build ra image trước nữa mà docker-compose sẽ build mỗi khi khởi chạy. Xem chi tiết tại Compose File v3 | #build.
  • deploy là một lệnh khá hay tuy nhiên nó chỉ khả dụng khi bạn sử dụng docker swarm, nhìn chung deploy là nơi tập hợp các quy tắc chỉ dẫn service của bạn sẽ được chạy như thế nào. Ví dụ như cấu hình số lượng các bản replicas, cấu hình chạy trên node xác định, tự động restart lại service nếu bị break down...
  • Ngoài ra còn rất nhiều lệnh nữa mà bạn có thể xem thêm ở Compose File v3

Compose CLI

Nắm bắt được các lệnh docker-compose sẽ giúp bạn triển khai được ứng dụng một cách dễ dàng. Tôi xin liệt kê một số lệnh cơ bản dưới đây:

Để xem hướng dẫn:

$ docker-compose --help

Kiểm tra phiên bản docker compose:

$ docker-compose --version
docker-compose version 1.29.2, build 1110ad01

Để deploy, tại thư mục có chứa file .yml:

$ docker-compose up -d

Để cập nhật các thay đổi từ .yml, chạy lại lệnh deploy nó sẽ kiểm tra các thay đổi và tự biết cập nhật những gì.

Xem danh sách các service:

$ docker-compose ps

Kiểm tra logs từ các service:

$ docker-compose logs

Huỷ bỏ:

$ docker-compose down

Tổng kết

Docker compose cho phép chúng ta chạy nhiều services (container) cùng lúc. Nó lưu trữ các lệnh hướng dẫn trong một file .yml/.yaml mà chúng ta thường hay thấy là docker-compose.yml.

Docker compose phù hợp với các dự án nhỏ mà không cần scale ra các node. Để có thể scale docker cung cấp một chế độ gọi là swarm. Bài viết sau tôi sẽ nói rõ hơn về docker swarm.

Cao cấp
Hello

Bí mật ngăn xếp của Blog

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (0)

Nội dung bình luận...