前情提要: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