Appearance
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