Запускать несколько Docker контейнеров одновременно, используя docker -compose - PullRequest
0 голосов
/ 28 марта 2020

Проблема

В настоящее время я создал Dockerfile и docker-compose.yml для запуска rest-api и базы данных, используя docker-compose up.

Теперь я хочу добавить еще один контейнер, а именно веб-приложение (сборка с React). Я немного запутался, как это сделать, так как я только начал изучать Docker 2 дня go.

Структура папок

Это моя текущая структура папок

  • Папка: rest-api (NodeJS)
    • Dockerfile
    • dockercompose.yml

Вопрос

В конце я хочу иметь возможность запустить docker-compose up, чтобы запустить rest-api и web-app.

Нужно ли создавать отдельный Dockerfile в каждой папке и создание «глобального» * ​​1034 *, чтобы связать все вместе?

Новая структура папок:

  • dockercompose.yml
  • Папка: rest-api (NodeJS)
    • Dockerfile
  • Папка: web-app (React)
    • Dockerfile

Моя текущая настройка для запуска 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"]

docker -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'

1 Ответ

1 голос
/ 28 марта 2020

Хорошо, так что есть несколько способов приблизиться к этому, и это в большей или меньшей степени зависит от ваших предпочтений.

Если вы хотите go с предложенной структурой папок (что хорошо ), например, вы можете сделать это следующим образом:

У каждого элемента root в каждом из ваших приложений должно быть Dockerfile, которое создаст конкретное приложение c (как вы уже предлагали), разместите ваше docker-compose.yml файл в родительской папке обоих приложений (именно так, как вы уже предлагали), а затем просто внесите некоторые изменения в docker -compose.yml (я оставил только основные части. Обратите внимание, что ссылки больше не нужны - внутренняя сеть преобразует имена служб в соответствующий IP-адрес службы выполняется в Dockerfile будет относительно этой папки

Я также изменил сопоставления портов, потому что вы, вероятно, захотите получить Ess ваше веб-приложение через порт HTTP. Обратите внимание, что веб-приложение сможет взаимодействовать с контейнером rest-api, используя имя хоста node, если служба узла привязана к 0.0.0.0:3000 (не 127.0.0.1:3000)

...