Thứ sáu, 20/12/2019 | 00:00 GMT+7

Làm việc với nhiều container bằng Docker Compose


Trong bài viết này, ta sẽ khám phá cách phân đoạn ứng dụng của bạn thành một mạng nhỏ gồm nhiều containers Docker, mỗi containers có hình ảnh riêng.

Các containers đơn đủ dễ dàng để xây dựng theo thứ bậc trong dòng lệnh, nhưng làm bất kỳ điều gì phức tạp hơn có thể nhanh chóng vượt quá tầm tay. Thay vào đó, ta sẽ sử dụng một loại file cấu hình đặc biệt mới có tên là docker-compose.yml . Cách tiếp cận khai báo này sẽ cho phép ta nhanh chóng xác định hình ảnh của ta trong mỗi containers và cài đặt mạng giữa chúng.

Trong ví dụ này, ta sẽ cài đặt một server NGINX, một server Express và ứng dụng React của ta . Mục tiêu là để client và server của ta được lưu trữ riêng biệt với NGINX quản lý bất kỳ yêu cầu nào đến containers chính xác, vì vậy mọi yêu cầu http tới /api sẽ được gửi đến containers server và mọi thứ khác cho client .

Yêu cầu

Sẽ rất hữu ích nếu bạn biết cách xây dựng hình ảnh bằng Dockerfile, bạn có thể tìm hiểu thêm ở đây , nhưng điều đó chủ yếu sẽ được giải quyết trong phần khởi động.

Cài đặt cho người mới bắt đầu

Để giúp bạn đỡ đơn điệu khi cài đặt và hoạt động ứng dụng React cơ bản và server , tôi đã thực hiện điều này bắt đầu . Bản thân ứng dụng chỉ là một đầu vào gửi một số văn bản để server ghi log , không có gì lạ mắt. Vì ta đang phân đoạn mọi thứ thành các containers riêng của chúng, client và server sẽ có các file package.json của riêng chúng với các file phụ thuộc, vì vậy hãy nhớ chạy npm install trên từng folder riêng lẻ nếu bạn muốn kiểm tra local .

Cài đặt NGINX

Server NGINX khác với các containers khác. NGINX sẽ hoạt động như bộ định tuyến giữa ứng dụng React và server , hướng các yêu cầu đến đúng containers .

Trong một file cấu hình đặc biệt, default.conf , ta sẽ sử dụng upstream để cho NGINX biết mỗi containers đang chạy cổng server nào. Lưu ý ta đang tham chiếu các tên dịch vụ mà ta đã xác định trong docker-compose.yml .

server là bộ điều khiển của ta , trong trường hợp này là server NGINX của ta . Docker chỉ cần biết nơi nó có thể tìm thấy bộ điều khiển và nơi ta muốn định tuyến lại lưu lượng truy cập tùy thuộc vào yêu cầu với proxy_pass .

default.conf
upstream client {
  server client:3000;
}

upstream server {
  server server:4000;
}

server {
  listen 80;

  location / {
    proxy_pass http://client;
  }

  location /api {
    proxy_pass http://server;
  }
}

Bây giờ ta chỉ cần docker để đặt cấu hình này ở đâu đó hữu ích hơn. Vùng chứa NGINX sẽ có file default.conf trống, vì vậy việc sao chép của ta vào vị trí của nó sẽ overrides file cũ.

server / Dockerfile
FROM nginx 
COPY ./default.conf /etc/nginx/conf.d/default.conf

Docker Soạn

docker-compos.yml
version: '3'
services:
    server:
        build: 
            dockerfile: Dockerfile
            context: ./server 
        volumes:
            - /app/node_modules 
            - ./server:/app
    nginx:
        restart: always
        build: 
          dockerfile: Dockerfile
          context: ./controller
        ports: 
          - '5000:80'
    client: 
        build: 
            dockerfile: Dockerfile
            context: ./client
        volumes:
            - /app/node_modules 
            - ./client:/app

Hãy xem xét chính xác những gì điều này đang cố gắng thực hiện:

  • service khai báo mỗi containers với cấu hình cụ thể của nó, ta có thể đặt tên theo cách ta muốn.
  • build cho biết ta muốn containers của bạn được xây dựng như thế nào, trong trường hợp này là sử dụng file nào và nó ở đâu với dockerfilecontext .
  • restart cho Docker biết phải làm gì nếu một containers bị lỗi trong thời gian chạy, trong trường hợp này, ta luôn muốn nó cố gắng khởi động lại.
  • ports remap bất kỳ cổng nào ta muốn thành cổng mặc định, giống như cờ -p khi làm việc trong terminal.
  • volumes là dữ liệu liên tục được kết nối với mỗi containers . Ta đang sao chép các phần của containers và các phần phụ thuộc của nó theo cách mà khi ta vứt bỏ containers và bắt đầu một containers mới, nó sẽ có bộ nhớ cache đó để tránh mất thời gian cài đặt lại mọi thứ.

Cuối cùng, ta có thể tạo các dịch vụ của bạn và gắn các containers của ta với nhau bằng cách sử dụng lệnh docker-compile docker-compose up và cờ --build để xây dựng các Dockerfiles của ta .

$ docker-compose up --build

Quá trình này có thể mất một lúc vì nó đang sao chép mọi thứ và chạy npm install , nhưng khi hoàn tất, bạn sẽ thấy server_1 , nginx_1client_1 chạy đồng thời.

Bớt tư tưởng

Đây có thể là một trường hợp sử dụng rất đơn giản, nhưng Docker Compose chắc chắn là một trong những công cụ chính mà bạn sẽ sử dụng với hầu hết các dự án Docker của bạn .


Tags:

Các tin liên quan

Cách sử dụng Plugin Docker cho Visual Studio Code
2019-12-12
Cách sử dụng Ansible để cài đặt và thiết lập Docker trên Ubuntu 18.04
2019-12-05
Cách tạo ứng dụng Django và Gunicorn với Docker
2019-10-25
Cách thiết lập Flask với MongoDB và Docker
2019-10-11
Cách cài đặt và sử dụng Docker trên Debian 10
2019-07-08
Cách sử dụng server Docker từ xa để tăng tốc quy trình làm việc của bạn
2019-06-25
Cách cài đặt WordPress với Docker Compose
2019-05-24
Cách di chuyển Docker compose workflow sang Kubernetes
2019-04-03
Cách tối ưu hóa image Docker cho sản xuất
2019-03-25
Giữ lại một ứng dụng Node.js để phát triển với Docker Compose
2019-03-05