首页 > 解决方案 > 使用 docker-compose 一次运行多个 Docker 容器

问题描述

问题

目前我已经创建了一个Dockerfile和一个docker-compose.yml来运行我的rest-api和数据库使用docker-compose up

我现在要做的是添加另一个容器,即 Web 应用程序(使用 React 构建)。我对如何做到这一点有点困惑,因为我两天前才开始学习 Docker。

文件夹结构

这是我当前的文件夹结构

问题

最后,我希望能够同时运行docker-compose up.rest-apiweb-app.

我是否需要Dockerfile在每个文件夹中创建一个单独的文件夹并创建一个“全局”docker-compose.yml来将所有内容链接在一起?

新文件夹结构:

我当前运行rest-api和数据库的设置

Dockerfile

FROM node:13.10

# The destination of the app in the container
WORKDIR /usr/src/app

# Moves the package.json, package-loc.json and tsconfig.json to the specified workdir
COPY package*.json ./
COPY tsconfig.json ./

# Create user and postgres
ENV POSTGRES_USER root
ENV POSTGRES_PASSWORD 12345
ENV POSTGRES_DB postgres
ENV POSTGRES_URI 'postgres://postgres:12345@postgres:5432/postgres'

RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]

码头工人-compose.yml

version: '3'
services:
  node:
    container_name: rest-api
    restart: always 
    build: . 
    environment:
      PORT: 3000
    ports:
      - '80:3000'
    links:
      - postgres
  postgres:
    container_name: postgres-database
    image: postgres
    environment:
      POSTGRES_URI: 'postgres://postgres:12345@postgres-database:5432/postgres'
      POSTGRES_PASSWORD: 12345 
    ports:
      - '5432:5432'

标签: node.jsdockernginxdocker-composedockerfile

解决方案


好的 - 所以有很多方法可以解决这个问题,它或多或少取决于您的偏好。

如果您想使用建议的文件夹结构(这很好),您可以例如这样做:

在每个应用程序的根目录中都有一个Dockerfile,它将构建特定的应用程序(正如您已经建议的那样)将您的docker-compose.yml文件放在两个应用程序的父文件夹中(正如您已经建议的那样),然后对您的 docker-compose 进行一些更改.yml(我只留下了必要的部分。请注意不再需要链接 - 内部网络会将服务名称解析为相应的服务 IP 地址)

version: '3'
services:
  node:
    build:
      context: rest-api
    environment:
      PORT: 3000
    ports:
      - '3000:3000'
  web:
    image: web-app
    build:
      context: web-app
    ports:
      - 80:80
  postgres:
    image: postgres
    environment:
      POSTGRES_URI: 'postgres://postgres:12345@postgres-database:5432/postgres'
      POSTGRES_PASSWORD: 12345 
    ports:
      - '5432:5432'

所以这context就是告诉 docker 你正在构建的实际上是在不同的目录中,并且在 Dockerfile 中执行的所有命令都将与该文件夹相关

我还更改了端口映射,因为您可能希望通过 HTTP 端口访问您的 Web 应用程序。node请注意,只要节点服务绑定到 0.0.0.0:3000(不是 127.0.0.1:3000),web-app 就可以使用主机名与 rest-api 容器通信


推荐阅读