node.js - 使用 docker-compose 一次运行多个 Docker 容器
问题描述
问题
目前我已经创建了一个Dockerfile
和一个docker-compose.yml
来运行我的rest-api和数据库使用docker-compose up
。
我现在要做的是添加另一个容器,即 Web 应用程序(使用 React 构建)。我对如何做到这一点有点困惑,因为我两天前才开始学习 Docker。
文件夹结构
这是我当前的文件夹结构
- 文件夹: rest-api (NodeJS)
- Dockerfile
- dockercompose.yml
问题
最后,我希望能够同时运行docker-compose up
.rest-api
和web-app
.
我是否需要Dockerfile
在每个文件夹中创建一个单独的文件夹并创建一个“全局”docker-compose.yml
来将所有内容链接在一起?
新文件夹结构:
- dockercompose.yml
- 文件夹: rest-api (NodeJS)
- Dockerfile
- 文件夹:网络应用程序(反应)
- 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"]
码头工人-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'
解决方案
好的 - 所以有很多方法可以解决这个问题,它或多或少取决于您的偏好。
如果您想使用建议的文件夹结构(这很好),您可以例如这样做:
在每个应用程序的根目录中都有一个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 容器通信
推荐阅读
- javascript - 将 () 中的任何字母变为小写所有其他字母大写
- reactjs - 如何为 axios 请求设置操作名称(在反应应用程序中)?
- flutter - Flutter如何制作像UI一样的表格
- reactjs - 用未确定的斜杠反应路由动态网址
- javascript - 制作电影票应用程序时将 Nodelist.length 设为零
- jquery - jQuery 适用于 Chrome,但不适用于 Safari
- php - PHP 面向对象编程 - 何时使用公共、私有或受保护
- vuejs2 - 如何正确更新 VueJs .env 文件
- c - 使用 strtok 进行 C 程序段错误
- python - 我可以在 selenium 中暂停滚动功能,抓取当前数据,然后稍后在脚本中继续滚动吗?