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 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.
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...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
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.
5 bài học sâu sắc
Mỗi sản phẩm đi kèm với những câu chuyện. Thành công của người khác là nguồn cảm hứng cho nhiều người theo sau. 5 bài học rút ra được đã thay đổi con người tôi mãi mãi. Còn bạn? Hãy bấm vào ngay!
Đăng ký nhận thông báo bài viết mới
Xin chào, tôi tên là Hoài - một anh Dev kể chuyện bằng cách viết ✍️ và làm sản phẩm 🚀. Với nhiều năm kinh nghiệm lập trình, tôi đã đóng góp một phần công sức cho nhiều sản phẩm mang lại giá trị cho người dùng tại nơi đang làm việc, cũng như cho chính bản thân. Sở thích của tôi là đọc, viết, nghiên cứu... Tôi tạo ra trang Blog này với sứ mệnh mang đến những bài viết chất lượng cho độc giả của 2coffee.dev.Hãy theo dõi tôi qua các kênh LinkedIn, Facebook, Instagram, Telegram.
Bình luận (0)