CodeGym /Các khóa học /Docker SELF /Tạo docker-compose.yml

Tạo docker-compose.yml

Docker SELF
Mức độ , Bài học
Có sẵn

3.1 Tệp compose.yaml

Tệp compose.yaml (hoặc một trong các phiên bản khác như: docker-compose.yaml, docker-compose.yml, compose.yml) — là tệp cấu hình chính được Docker Compose sử dụng để định nghĩa và quản lý các ứng dụng đa container. Tệp này mô tả các container (services) nào cần được chạy, cách chúng tương tác với nhau và tài nguyên nào cần thiết cho chúng.

Để đồng nhất trong bài giảng này, mình sẽ sử dụng phiên bản compose.yaml, vì nó được khuyến nghị cho các phiên bản Docker Compose hiện đại.

Cấu trúc của tệp compose.yaml

Tệp compose.yaml bao gồm một số phần, mỗi phần mô tả các khía cạnh khác nhau về cấu hình ứng dụng. Các phần chính bao gồm:

  1. version: chỉ định phiên bản của tệp Compose (ví dụ: '3.9').
  2. services: mô tả các container (services), các thiết lập và phụ thuộc của chúng.
  3. volumes: định nghĩa các volume để lưu trữ dữ liệu giữa các container và host.
  4. networks: cấu hình các mạng, qua đó các services giao tiếp với nhau.

3.2 Các directive chính

1. version

Directive version xác định phiên bản cú pháp Docker Compose được sử dụng trong file compose.yaml. Tại thời điểm viết bài, phiên bản hiện tại nhất là phiên bản 3, cụ thể là các bản cập nhật như 3.8 và 3.9.

Yaml

version: '3.9'

2. services

Phần services xác định các container mà Compose cần tạo và chạy. Mỗi service là một container riêng biệt với cấu hình cụ thể.

Ví dụ:

Yaml

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db

Trong ví dụ này, có hai service được định nghĩa: webdb. Service web sử dụng image nginx:latest và mở cổng 80. Service db sử dụng image mongo:latest và gắn volume để lưu trữ dữ liệu.

3. volumes

Phần volumes được sử dụng để định nghĩa các volume, có thể được gắn vào container để lưu trữ dữ liệu. Điều này hữu ích để bảo toàn dữ liệu khi các container được khởi động lại.

Ví dụ:

Yaml

volumes:
  mongo-data:

4. networks

Phần networks cho phép định nghĩa mạng tùy chỉnh mà các container sẽ hoạt động trên đó. Điều này đảm bảo sự cô lập và cấu hình kết nối mạng. Nếu không chỉ định mạng, Docker Compose sẽ tạo một mạng mặc định và tất cả các service sẽ kết nối với nó.

Ví dụ:

Yaml

networks:
  front-end:
  back-end:

3.3 Chỉ thị để cấu hình services

Các chỉ thị chính để cấu hình services:

1. image

Chỉ thị image chỉ định image sẽ được sử dụng để tạo container.

Ví dụ:

Yaml

services:
  web:
    image: nginx:latest

2. build

Chỉ thị build được sử dụng để chỉ định đường dẫn đến Dockerfile, cái sẽ được dùng để build image.

Ví dụ:

Yaml

services:
  app:
    build: ./app

3. ports

Chỉ thị ports xác định các port cần mở và liên kết từ host machine đến container.

Ví dụ:

Yaml

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

4. volumes

Chỉ thị volumes gắn volume vào container, cho phép lưu dữ liệu giữa các lần khởi động lại container.

Ví dụ:

Yaml

services:
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db

5. environment

Chỉ thị environment đặt biến môi trường cho container.

Ví dụ:

Yaml

services:
  app:
    image: myapp:latest
    environment:
      - NODE_ENV=production
      - API_KEY=1234567890

6. depends_on

Chỉ thị depends_on chỉ ra service này phụ thuộc vào các service khác và phải được chạy sau chúng.

Quan trọng! Khi khởi động service của bạn, bạn không có 100% đảm bảo rằng tất cả các service cần thiết để nó hoạt động đã hoàn toàn sẵn sàng. Chúng sẽ được khởi chạy — đúng, nhưng hoạt động tiếp theo không được đảm bảo. Vấn đề này được giải quyết bằng health-check, nhưng điều này sẽ được nói sau.

Ví dụ:

Yaml

services:
  web:
    image: nginx:latest
    depends_on:
      - db
  db:
    image: mongo:latest

7. command

Chỉ thị command cho phép ghi đè lệnh được thực thi khi container chạy.

Ví dụ:

Yaml

services:
  app:
    image: myapp:latest
    command: python app.py

8. networks

Chỉ thị networks kết nối service với một hoặc nhiều mạng.

Ví dụ:

Yaml

services:
  web:
    image: nginx:latest
    networks:
      - front-end
  db:
    image: mongo:latest
    networks:
      - back-end

3.4 Ví dụ đầy đủ

Ví dụ file hoàn chỉnh compose.yaml

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - app
    networks:
      - front-end
        
  app:
    build: ./app
    volumes:
      - ./app:/usr/src/app
    environment:
      - NODE_ENV=production
    networks:
      - front-end
      - back-end
        
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db
    networks:
      - back-end
        
volumes:
  mongo-data:
        
networks:
  front-end:
  back-end:

Trong ví dụ này:

  • Định nghĩa ba service: web, appdb.
  • web sử dụng image Nginx, gắn file cấu hình và phụ thuộc vào service app.
  • app được build từ Dockerfile local, gắn mã nguồn ứng dụng và sử dụng các biến môi trường.
  • db sử dụng image MongoDB và gắn volume để lưu trữ dữ liệu.
  • Tạo hai volume và hai network để cách biệt và quản lý sự tương tác giữa các service.

Lưu ý: một volume là mongo-data, còn lại là thư mục được mount từ máy host (ví dụ: ./app).

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION