1. 기본개념
가. Docker Compose
•
도커 기반의 다중 컨테이너 앱을 정의하고 실행하기 위한 도구
나. Docker Compose 기본 작성법
•
YAML(ain't markup language): 데이터 저장 및 전송 응용프로그램에 사용되는 포맷임. 유사 포맷으로 XML, json이 많이 사용됨. 앞의 포맷보다 사람이 더 읽기 쉽다는 장점이 있음.
•
build의 경로는 Docker file의 위치를 가리킴
•
yarm 파일은 띄어쓰기가 중요함
다. Docker Compose 실행
•
docker-compose up
→ 이미지가 없을 때, 이미지를 빌드하고 컨테이너 시작
•
docker-compose up —build
→ 이미지가 존재여부 관계 없이 이미지 빌드 및 컨테이너 시작
→ 이미 이미지가 존재한 상태에서 소스 코드 변경 시 위의 —build 옵션을 추가
•
docker-compose down
→ 도커 컴포즈로 작동시킨 모든 컨테이너 한번에 중단
→ docker-compose.yml 파일이 있는 dir에서 해당 명령어 실행 가능
•
docker-compose up -d —build
→ d는 detached 모드로, 앱을 백그라운드에서 실행 → 앱의 output이 출력되지 않음.
→ 해당 앱을 백그라운드에서 실행시키므로 하나의 터미널로 여러 앱을 동시 구동 가능
→ 위의 명령에 -d를 생략하면 서버 구동에 따라 다른 터미널을 사용해야 함
•
docker-compose -f <docker file> up --build
→ compose file 지정하여 빌드
라. Node.js 환경에서 Redis 활용
1.
redis server 작동
→ 컨테이너 내 작동
2.
reids module 다운
→ package.json에 dependancy로 redis 명시
3.
redis client 생성
→ redis module에서 제공하는 코드 createClient 사용
→ redis 기본 port 6379
→ redis host 설정 시, docker 환경이 아니라면 "https://redis-server.com" 입력
→ docker 환경이라면 docker-compose.yml 파일에 명시한 컨테이너 이름으로 redis host 값 입력
마. Docker Conatiners 간 통신 시 발생하는 에러
•
레디스 서버가 있는 컨테이너와 레디스 클아이언트 및 노드 앱이 있는 컨테이너는 분리되어 있으므로 네트워크 설정을 해야만 클라이언트에서 서버로 접근 가능
→ Docker compose 작성하여 다중 컨테이너 앱을 사용할 수 있음
바. 컨테이너 간 통신
2. Tutorial
가. Get Started with Compose
1) Dockerfile 작성
•
Docker file 목적: Docker Image를 빌드하는 것입니다. 참고로 Docker Image에는 어플리케이션 구동에 필요한 환경이 설정되어 있습니다.
2) docker-compose 작성
•
web app(flask)과 redis를 독립된 환경에서 구동
•
web app은 Dockerfile을 참고하여 빌드
•
외부에서 8000번 포트로 들어오는 트래픽은 5000번 포트로 전달
→ 5000번 포트는 flask의 기본지정 포트임
3) bind mounts
•
volumes에는 두 가지 타입(bind mounts & volume)이 존재함
→ bind mounts: 호스트 머신의 file or directory를 참조함
→ volume: file or directory를 container로 옮겨서 docker에서 직접 관리함
•
bind mounts의 경우 개발환경에서 컨테이너를 중단시키지 않고 소스코드의 변경사항이 어플리케이션에 반영되는 것을 즉시 확인하기 위함
→ source 키는 호스트 머신에서 mount할 경로를 가리킴
→ target 키는 컨테이너에서 source와 연결할 경로를 가리킴
4) 환경변수 주입
•
docker compose 상에서도 환경설정 지정 가능
•
웹앱의 개발, 배포 환경 등을 구분 가능
5) docker-compose 실행 명령
•
docker-compose up -d
→ background 실행
→ d: detached mode
•
docker-compose ps
→ 현재 동작 중인 서비스 확인
→ ps: present services
•
docker-compose run
→ one-off command 실행
→ ex) docker-compose run web env:web service의 env 종류 확인
•
docker-compose down vs docker-compose stop
→ stop: docker 현재 서비스 종료
→ down: stop & remove containers, networks, images, and volumes
나. Get Started with Django & Compose
1) Run MySQL with Compose
•
docker-compose 작성
•
컨테이너의 mysql이 정상동작하는 지 확인
→ container의 도커 설정에서 inbound port 확인 후 client 프로그램으로 테스트 가능
→ 또는 현재 동작 중인 도커 프로세스 확인(docker ps) 후 cotainer id를 기준으로 cmd로 mysql 접속하여 테스트 가능 참고: MySQL 초기 설정(feat. Docker)
2) Run Django with MySQL
•
Django 프로젝트 생성은 공식 튜토리얼(Django, Postgre) 참고
•
만약 docker compose 내 환경변수로 주입한 계정 정보로 로그인이 안되면 bind mount 된 디렉토리를 제거하고 재빌드해볼 것
•
django app 실행 명령
→ runserver 명령 시 반드시 0.0.0.0:8000를 붙여야 함
docker exec -it django /bin/bash
python manage.py migrate
python manage.py runserver 0.0.0.0:8000
Shell
복사
•
env_file 활용하여 환경변수 관리하기
→ docker-compose config 명령으로 환경변수가 의도한대로 주입되는지 확인 필요
→ 환경변수가 의도대로 주입이 안됐다면 터미널 창을 내려서 현재환경에 환경변수가 업데이트되도록 한다
→ 코드 참고
Reference
•
django, postgre setting, https://docs.docker.com/samples/django/
•
m1에서 mysql docker 설치 이슈, https://velog.io/@max9106/Docker-M1-Mac에서-docker-mysql-설치하기
•
•
django, mysql, celery setting, https://soshace.com/dockerizing-django-with-postgres-redis-and-celery/