docker-compose

  • 도커 컨테이너 간의 연결
  • 각 컨테이너의 Dockerfile을 사용하여 컨테이너를 만들어 연결한다
  • docker-compose 에서는 컨테이너를 서비스라고 한다
  • 파일명 : docker-compose.yml
version: "3"            # docker-compose 버전
services:               # 서비스 묶음
  database:             # 서비스 이름
    image: mysql:5.7        # hub에 업로드된 image 파일
    container_name: mysql   # 컨테이너 이름 설정
    restart: always
    ports:
      - "3306:3306"         # 로컬 포트:컨테이너 포트
    environment:      # -e
      - MYSQL_ROOT_PASSWORD= {패스워드}
      - MYSQL_USER= {user명}
      - MYSQL_PASSWORD= {패스워드}
      - MYSQL_DATABASE= {db명}
    volumes:          # -v
      - ./database/mysql_data:/var/lib/mysql      # 외부 디렉토리:컨테이너 디렉토리
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
  backend:
    build: 
      context: ./backend        # Dockerfile의 위치
      dockerfile: Dockerfile    # Dockerfile 명
    container_name: backend
    restart: always
    ports:
      - "8000:8000"
    volumes:
      - ./backend:/usr/local/edix-net
      - ./log/backend:/var/log/uwsgi
    command: uwsgi --ini uwsgi.ini      
  nginx:
    build:
      context: ./nginx
      dockerfile: Dockerfile
    container_name: nginx
    restart: always
    ports:
      - "80:80"
    volumes:
      - ./backend:/usr/local/edix-net
      - ./log/nginx:/var/log/nginx
  frontend:
    build: ./frontend
    volumes:
      - ./frontend:/usr/src/app  
    ports:
      - "8080:8080"

→ DB컨테이너를 먼저 만들고 백엔드 컨테이너를 만들어야 오류가 생기지 않는다
→ 위에서부터 순서대로 실행되기 때문에 DB컨테이너를 맨 위에 위치시켜야한다

  • 환경변수의 비밀번호 같은 경우 유출되면 안되기 때문에 따로 작성할 수 있다
  • docker-compose.yml과 같은 경로에 .env 파일을 생성한다
DB_ROOT_PASSWORD=rootpassword
MYSQL_USER=myuser
MYSQL_PASSWORD=password
DB_DATABASE=mypro
  • docker-compose.yml의 environment 부분은 다음과 같이 변경한다
environment:      
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
      - MYSQL_USER= ${DB_USER}
      - MYSQL_PASSWORD= ${DB_PASSWORD}
      - MYSQL_DATABASE= ${DB_DATABASE}

실행

$ docker-compose up -d --build

→ docker-compose.yml 디렉토리에서 실행해야 함.

  • .env 파일을 사용하여 환경변수를 지정할 경우에 해당 파일을 못읽어올 경우 다음 명령어를 실행해보자
    $ source .env
    
$ docker-compose up -d --build
WARNING: The DB_ROOT_PASSWORD variable is not set. Defaulting to a blank string.
WARNING: The DB_DATABASE variable is not set. Defaulting to a blank string.

$ docker-compose config
services:
  database:
    command:
    - --character-set-server=utf8mb4
    - --collation-server=utf8mb4_unicode_ci
    container_name: mysql
    environment:
      MYSQL_DATABASE: ''
      MYSQL_ROOT_PASSWORD: ''
    image: mysql:5.7
    ports:
    - published: 3306
      target: 3306
    restart: always

$ source .env
$ docker-compose up -d --build
$ docker-compose config
services:
  database:
    command:
    - --character-set-server=utf8mb4
    - --collation-server=utf8mb4_unicode_ci
    container_name: mysql
    environment:
      MYSQL_DATABASE: mypro
      MYSQL_ROOT_PASSWORD: rootpassword
    image: mysql:5.7
    ports:
    - published: 3306
      target: 3306
    restart: always