CodeGym /Các khóa học /Docker SELF /Gắn kết volumes và mạng

Gắn kết volumes và mạng

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

7.1 Gắn kết volumes

Gắn kết volumes và mạng trong Docker Compose cho phép tạo ra các ứng dụng đa container linh hoạt và hiệu quả. Volumes được sử dụng để lưu trữ dữ liệu cần được duy trì bên ngoài container, trong khi mạng (networks) đảm bảo sự tương tác giữa các container. Trong bài giảng này, bọn mình sẽ tìm hiểu chi tiết cách sử dụng volumes và mạng trong Docker Compose nha.

Volumes trong Docker cho phép lưu trữ dữ liệu bên ngoài container, đảm bảo chúng vẫn có sẵn ngay cả khi container bị dừng hoặc xóa. Điều này đặc biệt hữu ích để lưu trữ dữ liệu cơ sở dữ liệu, tệp nhật ký, và dữ liệu cần tính lâu dài khác.

Các loại volumes:

  • Volumes được đặt tên (Named Volumes): được Docker quản lý và lưu trong một thư mục đặc biệt trên máy chủ host.
  • Volumes được gắn kết (Bind Mounts): được gắn kết vào container từ thư mục cụ thể trên máy chủ host.

Định nghĩa volumes trong Docker Compose

Ví dụ volumes được đặt tên

Trong ví dụ này, một volume được đặt tên là postgres-data được gắn kết vào thư mục /var/lib/postgresql/data bên trong container db.

Yaml

version: '3.8'

services:
  db:
    image: postgres:latest
    volumes:
      - postgres-data:/var/lib/postgresql/data

volumes:
  postgres-data:

Ví dụ volumes được gắn kết

Trong ví dụ này, thư mục cục bộ và tệp nginx.conf cũng như html được gắn kết vào container web dưới dạng volumes được gắn kết.

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./html:/usr/share/nginx/html
<

7.2 Gắn kết mạng

Mạng trong Docker Compose cho phép các containers tương tác với nhau. Mỗi container có thể được kết nối với một hoặc nhiều mạng, đảm bảo sự cách ly và quản lý lưu lượng.

Các loại mạng:

  • Mạng cầu (Bridge): mặc định, containers được kết nối với mạng cầu, cho phép chúng tương tác trên cùng một host.
  • Mạng overlay: được sử dụng để kết nối các containers chạy trên các host khác nhau trong cluster Docker Swarm.
  • Plugins mạng (Network Plugins): cho phép sử dụng các driver mạng bên thứ ba để tạo cấu hình phức tạp hơn.

Ví dụ tạo và sử dụng mạng người dùng

Trong ví dụ này, hai mạng người dùng front-endback-end được tạo. Dịch vụ app được kết nối với cả hai mạng, dịch vụ web chỉ với front-end, và dịch vụ db chỉ với back-end.

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    networks:
      - front-end

  app:
    image: myapp:latest
    networks:
      - front-end
      - back-end

  db:
    image: postgres:latest
    networks:
      - back-end

networks:
  front-end:
  back-end:

Lời khuyên thực tế:

  1. Sử dụng volumes có tên: volumes có tên được quản lý bởi Docker và mang lại sự đơn giản trong việc sử dụng và quản lý dữ liệu. Volumes có tên có thể được kết nối đồng thời với nhiều dịch vụ. Ví dụ, dịch vụ backend ghi log, còn dịch vụ giám sát thì phân tích chúng và thông báo nếu phát hiện lỗi cấp độ error.
  2. Phân tách mạng: sử dụng nhiều mạng cho phép cách ly các phần khác nhau của ứng dụng và kiểm soát sự tương tác của chúng.
  3. Lưu trữ các file cấu hình: sử dụng volumes gắn kết để liên kết các file cấu hình, điều này cho phép dễ dàng thay đổi cấu hình mà không cần rebuild lại images.
  4. Bảo mật mạng: giới hạn quyền truy cập vào mạng để chỉ các container cần thiết có thể tương tác với nhau, tăng cường bảo mật cho ứng dụng.

7.3 Ví dụ sử dụng volumes và networks

Ví dụ sử dụng volumes và networks trong Docker Compose:

Ví dụ 1: Ứng dụng với web server và cơ sở dữ liệu

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./html:/usr/share/nginx/html
    networks:
      - webnet

  db:
    image: postgres:latest
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - webnet

volumes:
  db-data:

networks:
  webnet:

Trong ví dụ này:

  • Web server nginx và cơ sở dữ liệu PostgreSQL được kết nối vào cùng một mạng webnet, cho phép chúng giao tiếp với nhau. Nếu chỉ có một mạng, không cần chỉ định - sẽ tự động tạo mạng mặc định.
  • Dữ liệu cơ sở dữ liệu được lưu trữ trong một volume có tên là db-data, đảm bảo dữ liệu được giữ lại khi khởi động lại containers.

Ví dụ 2: Ứng dụng đa tầng

Yaml

version: '3.8'

services:
  frontend:
    image: myfrontend:latest
    networks:
      - front-tier
      - back-tier

  backend:
    image: mybackend:latest
    networks:
      - back-tier
    volumes:
      - backend-data:/var/lib/backend

  database:
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - back-tier

volumes:
  backend-data:
  db-data:

networks:
  front-tier:
  back-tier:

Trong ví dụ này:

  • Tạo hai mạng: front-tierback-tier.
  • Service frontend được kết nối vào cả hai mạng, điều này cho phép nó giao tiếp với cả backend và client bên ngoài.
  • Các service backenddatabase chỉ được kết nối với mạng back-tier để đảm bảo cô lập và giao tiếp của chúng với nhau.
  • Dữ liệu của các service backenddatabase được lưu trong các volumes riêng biệt là backend-datadb-data.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION