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 .
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ũ.
FROM nginx 
COPY ./default.conf /etc/nginx/conf.d/default.conf
Docker Soạn
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:
-  servicekhai 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.
-  buildcho 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ớidockerfilevàcontext.
-  restartcho 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.
-  portsremap bất kỳ cổng nào ta muốn thành cổng mặc định, giống như cờ-pkhi làm việc trong terminal.
-  volumeslà 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_1 và client_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 .
Các tin liên quan
Cách sử dụng Plugin Docker cho Visual Studio Code2019-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
 

