Actualmente he creado un Dockerfile y un docker-compose.yml para ejecutar mi rest-api y la base de datos usando docker-compose up .
Lo que quiero hacer ahora es agregar otro contenedor, a saber, la aplicación web (compilada con React). Estoy un poco confundido sobre cómo hacerlo, ya que comencé a aprender Docker hace 2 días.
Esta es mi estructura de carpetas actual
Al final, quiero poder ejecutar docker-compose up para activar tanto el rest-api como la web-app .
¿Necesito crear un Dockerfile separado en cada carpeta y crear un docker-compose.yml 'global' para vincular todo?
Nueva estructura de carpetas:
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'Ok, entonces hay bastantes formas de abordar esto y se basa más o menos en su preferencia.
Si desea ir con la estructura de carpetas propuesta (que está bien), puede, por ejemplo, hacerlo así:
Tenga un Dockerfile en la raíz de cada una de sus aplicaciones que construirá la aplicación específica (como ya sugirió) coloque su archivo docker-compose.yml en la carpeta principal de ambas aplicaciones (exactamente como ya lo propuso) y luego simplemente haga algunos cambios en su docker-compose.yml (solo dejé las partes esenciales. Tenga en cuenta que los enlaces ya no son necesarios: la red interna resolverá los nombres de los servicios en la dirección IP del servicio correspondiente)
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' Entonces, el context es lo que le dice a Docker que lo que está creando está en un directorio diferente y que todos los comandos ejecutados en Dockerfile serán relativos a esa carpeta.
También cambié las asignaciones de puertos, porque probablemente querrá acceder a su aplicación web a través del puerto HTTP. Tenga en cuenta que la aplicación web podrá comunicarse con el contenedor rest-api utilizando el nombre de host del node siempre que el servicio del nodo esté vinculado a 0.0.0.0:3000 (no 127.0.0.1:3000)