Skip to content

Docker Compose Multi-Container Management

서로 다른 컨테이너 연결

  • Application 컨테이너와 DB 컨테이너 각각 실행 후 연결
    • DB 컨테이너 실행할 때 —name 컨테이너 네이밍
    • Application 컨테이너 실행할 때 —link DB 컨테이너

코드 변경이 실시간으로 반영되게 하기

(문제) 도커 이미지가 만들어지는 시점에 컨테이너 밖의 소스 코드가 컨테이너 속에 추가 되므로 개발간 소스 코드 변경에 영향을 받지 않음

  • 위 문제를 해결하기 위해 격리된 컨테이너에 통로를 만든다.
    • 수정할 소스 코드의 디렉토리를 Application 또는 Database 컨테이너 내부의 소스 코드와 연결
    • —volume

위 2가지를 적용하려고 할 때 불편한 점들

  • 장황한 옵션
  • Application 컨테이너와 Database 컨테이너의 실행 순서

을 해결하기 위해 나온게 도커 컴포즈

  • docker-compose.yml 파일로 컨테이너 실행에 필요한 옵션 및 실행 순서와 의존성 관리할 수 있음

docker-compose.yml

  • version (legacy)
  • services → 실행하려는 컨테이너들을 정의
  • image → 컨테이너에서 사용할 도커 이미지
  • volumes (상대경로 이용 가능) →컨테이너 내 디렉토리와 마운트할 디렉토리 지정
  • environment → 환경변수 설정
  • build → docker build
    • context → docker build 명령어를 실행할 디렉토리 경로
    • dockerfile → 도커 이미지를 빌드하는데 사용할 Dockerfile 지정
  • pots → docker run -p 와 동일
  • command → docker run으로 앱 컨테이너 실행시 마지막에 적었던 명령어 부분

— link는? → docker-compose.yml에 있는 서비스들은 별도로 지정하지 않을 경우 하나의 네트워크에 속함

데이터베이스 데이터용 볼륨 추가

  • services와 같은 layer에 volumes 추가
    • volume은 도커가 관리하는 가상 디스크로 이걸 지우지 않는한 남아 있기에 해당 선언 이후 사용할 서비스 선언부 안에 volumes 항목을 넣고 mount

Application 서버가 DB를 못 찾는 현상

(문제) 일반적으로 첫 실행시 발생하는 문제로 DB 서비스가 실행된 후 초기화되기 전에(대략 5초 ~ 10초) Application 서비스가 실행되기 때문

  • wait-for-it.sh 셸 스크립트 사용해서 문제 해결 가능 → https://github.com/vishnubob/wait-for-it
    • 특정 서버의 특정 포트로 접근할 수 있을 때까지 기다려주는 스크립트
    • 해당 스크립트를 도커 이미지 안에 넣고, 이미지 실행 명령 앞에 붙여주면 됩니다.

docker-compose 명령어

  • up -d
    • 서비스를 띄울 네트워크 설정
    • 필요한 볼륨 생성 (혹은 이미지 존재하는 볼륨과 연결)
    • 필요한 이미지 풀 (pull)
    • 필요한 이미지 빌드(build)
    • 서비스 의존성에 따라 서비스 실행
    • -d → 백그라운드에서 시행
    • —force-recreate → 컨테이너를 지우고 새로 만든다.
    • —build: 서비스 시작 전 이미지를 새로 만든다.
  • ps → 현재 환경에서 실행 중인 각 서비스의 상태를 보여줌
  • stop, start → 서비스를 멈추거나 멈춰있는 서비스를 시작
  • down → 서비스를 지움
    • —volume → volume 까지 삭제
  • exec → 실행중인 컨테이너에서 명령어를 실행
  • logs → 서비스의 로그 확인
    • -f → 로그가 쌓일때마다 계속 출력

docker-compose 단축 명령어 등록 예시

  • 아래의 내용을 /.bashrc나 /.zshrc에 추가
bash
alias dco='docker-compose'
alias dcb='docker-compose build'
alias dce='docker-compose exec'
alias dcps='docker-compose ps'
alias dcr='docker-compose run'
alias dcup='docker-compose up'
alias dcdn='docker-compose down'
alias dcl='docker-compose logs'
alias dclf='docker-compose logs -f'

docker-compose.yml 수정 하면 up 하세요

  • docker-compose.yml 파일 수정시 이를 서비스에 적용하려면 멈추고, 지우고 시작할 필요 없이 up 명령만 실행해도 달라진 부분이 있는 경우 알아서 컨테이너 재생성하고 서비스 재시작 해줍니다.

(if) 컨테이너 재생성하지 않으면 —force-create 옵션 붙이고 docker-compose 실행 하세요

Dockerfile-dev 파일 수정 하면 up 하세요

  • Dockerfile-dev 파일 수정시 build 사용해 도커 이미지를 새로 만들어야 하는데 up 명령어에 —build 옵션을 넣으면 알아서 이미지를 새로 만들고 재시작 해줍니다.

참고문헌

: https://www.44bits.io/ko/post/almost-perfect-development-environment-with-docker-and-docker-compose

IronTrain Tech Blog