Docker Compose

alt text

Docker command for build multi container

---------------------
Create Network
---------------------

docker network create goals-net

---------------------
Run MongoDB Container
---------------------

docker run --name mongodb \
  -e MONGO_INITDB_ROOT_USERNAME=max \
  -e MONGO_INITDB_ROOT_PASSWORD=secret \
  -v data:/data/db \
  --rm \
  -d \
  --network goals-net \
  mongo

---------------------
Build Node API Image - Backend
---------------------

docker build -t goals-node .

---------------------
Run Node API Container
---------------------

docker run --name goals-backend \
  -e MONGODB_USERNAME=max \
  -e MONGODB_PASSWORD=secret \
  -v logs:/app/logs \
  -v /Users/maximilianschwarzmuller/development/teaching/udemy/docker-complete/backend:/app \
  -v /app/node_modules \
  --rm \
  -d \
  --network goals-net \
  -p 80:80 \
  goals-node

---------------------
Build React SPA Image - Frontend
---------------------

docker build -t goals-react .

---------------------
Run React SPA Container
---------------------

docker run --name goals-frontend \
  -v /Users/maximilianschwarzmuller/development/teaching/udemy/docker-complete/frontend/src:/app/src \
  --rm \
  -d \
  -p 3000:3000 \
  -it \
  goals-react

---------------------
Stop all Containers
---------------------

docker stop mongodb goals-backend goals-frontend


docker-compose file .yaml

version: "3.8"
services:
  mongodb:
    image: 'mongo'
    volumes: 
      - data:/data/db
    # environment: 
    #   MONGO_INITDB_ROOT_USERNAME: max
    #   MONGO_INITDB_ROOT_PASSWORD: secret
      # - MONGO_INITDB_ROOT_USERNAME=max
    env_file: 
      - ./env/mongo.env
  backend:
    build: ./backend
    # build:
    #   context: ./backend
    #   dockerfile: Dockerfile
    #   args:
    #     some-arg: 1
    ports:
      - '80:80'
    volumes: 
      - logs:/app/logs
      - ./backend:/app
      - /app/node_modules
    env_file: 
      - ./env/backend.env
    depends_on:
      - mongodb
  frontend:
    build: ./frontend
    ports: 
      - '3000:3000'
    volumes: 
      - ./frontend/src:/app/src
    stdin_open: true
    tty: true
    depends_on: 
      - backend

volumes: 
  data:
  logs:


Detail

  • version: của docker compose, ảnh hưởng đến syntax, features dùng trong docker compose. Find here

  • syntax: yaml, cách 2 space

  • Service: gồm các container, ở đây là 3 container sẽ được tạo ra

  • image: "abc" => có thể là image trên registry hoặc đc tạo ra ở local

  • volumes:

    • logs:/app/logs: named volume
    • ./backend:/app: bind mount
    • /app/node_modules: unnamed volume
  • environment: lưu các biến môi trường

    • MONGO_INITDB_ROOT_USERNAME: max
    • MONGO_INITDB_ROOT_PASSWORD: secret
    • '- MONGO_INITDB_ROOT_USERNAME=max
  • env_file: file content sẽ có syntax như sau: MONGODB_USERNAME=max

    • '- ./env/backend.env
  • network: có thể thêm network như này, cơ mà docker-compose đã tự tạo network riêng cho các service mà nó tạo ra

    • '- abc-net
  • depends_on: nó sẽ đợi container khác được khởi động trước

  • volumes: này đứng cùng hàng với service, là để các named volume có thể chia sẽ với nhau giữa các services

    • data:
    • logs:
  • Với -it bên docker run thì sẽ chuyển thành:

    • stdin_open: true
    • tty: true
  • build: ./frontend : trỏ đến path chứa Dockerfile, có thể config sâu hơn

  • ports:

    • '- '3000:3000'

command

  • docker-compose up:
    • khởi tạo image, run container
    • option -d, như docker command run
    • option build => build image mà k run container
  • docker-compose down: stop & delete everything which are created by docker-compose