前情提要:202502071521 docker 前后端分离带数据库的三容器应用
在项目根目录创建 docker-compose.yaml
并先设置版本 也就是 compose
特性的版本,不同版本有着不同的特性:
version: "3.8"
我们有三个容器,故需要创建三个 service
:
services:
mongodb:
backend:
frontend:
mongodb
首先是 mongodb:
services:
mongodb:
image: 'mongo'
volumes:
- data:/data/db
env_file:
- ./env/mongo.env # . 代表当前 compose 文件所在位置
#environment:
# MONGO_INITDB_ROOT_USERNAME:max
# MONGO_INITDB_ROOT_PASSWORD:secrect
# - MONGO_INITDB_ROOT_USERNAME=max
# 这里可以用 env_file 或者直接写,:代表是一个yaml对象,而 - 就只是一个键值对
若在与service同级下创建 volumes,则该 volumes 可以被所有容器使用,也即named volumes:
service:
...
volumes:
data: # 这里不能使用 - data:.. 因为只是声明
backend
对于后端,有自己的 dockerfile 文件,因此需要先指定路径:
services:
backend:
build: ./backend
第二种形式是当你 dockerfile 名字跟默认的不同时,需要指定容器上下文以及dockerfile的名字:
services:
backend:
build:
context: ./backend
dockerfile: Dockerfile-dev
之后是端口,volumes(记得在公共命名volume声明),还有env:
services:
backend:
build: ./backend
ports:
- '80:80'
volumes:
- logs:/app/logs
- ./backend:/app
- /app/node_modules
env-file:
- ./env/backend.env
depends_on:
- mongodb # 确保 backend 运行在 mongodb 之后
frontend
类似后端,设置构建目录指定dockerfile,配置端口volume:
services:
frontend:
build: ./frontend
ports:
- '7749:3000'
volumes:
- ./frontend/src:/app/src
而在 原docker run 命令中还有 -it
参数,因为 react 要接受 stdin 输入流并保持 tty,故也需要设置:
services:
frontend:
...
stdin_open: true
tty: true