일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 컴퓨터네트워크
- Docker
- 데이터 엔지니어링
- 데이터 파이프라인
- sql
- 데브코스
- 데이터 웨어하우스
- Django
- 정리
- http
- 가상환경
- linux
- 컴퓨터 네트워크
- 종류
- redshift
- S3
- 데이터베이스
- 자료구조
- PYTHON
- airflow.cfg
- 데이터엔지니어링
- AWS
- 파이썬
- Go
- 운영체제
- airflow
- TIL
- HADOOP
- TCP
- dockerfile
- Today
- Total
홍카나의 공부방
[Docker] Docker Compose란? + 명령어 본문
Docker Compose란?
docker-compose는 다수의 docker container로 소프트웨어가 구성되는 경우 사용할 수 있는 툴 및 환경설정 파일이다.
docker desktop의 일부로 함께 설치된다.
docker-compose.yml 혹은 docker-compose.yaml로 설정한다.
docker-compose파일로 환경을 만들어두면
개별 컨테이너를 관리하는 것보다 훨씬 생산성이 높지만, 복잡도도 높아진다는 단점이 있다.
연계하여 사용하는 명령어들은 다음과 같다.
docker-compose build
docker-compose up
docker-compose pull
docker-compose ps
docker-compose down
docker-compose start
docker-compose stop
docker-compose rm
docker-compose build . : 해당 명령어는 .yml에서 build 키로 지정된 서비스들만 빌드를 진행한다.
docker-compose pull : docker hub에서 이미지들을 읽어오려고 시도한다.
docker images : 각 개별 이미지 앞에 폴더 이름을 prefix로 붙인다.(dockerhub에서 불러온 것 제외)
docker-compose images : 컨테이너에 의해 실행되고 있는 이미지들만 보여준다.
docker-compose push : docker hub로 이미지들을 푸시한다.
docker-compose up : build -> create -> start의 과정을 모두 실행하여 컨테이너들을 구성한다.
docker-compose stop : 컨테이너를 중단하여 stop 상태로 만든다.
docker-compose rm : stop 상태인 컨테이너를 삭제한다.
docker-compose down : stop과 remove 과정을 모두 진행한다.
Docker 1.27부터 docker의 subcommand로 compose를 사용해도 된다. ( docker-compose -> docker compose )
Docker-Compose.yml의 구성
Docker-Compose는 크게
services, volumes, networks로 구성된다.
services : 프로그램을 구성하는 서비스들을 지정한다.
각 서비스는 별개의 Docker Image 지정과 Docker Container 실행으로 구성되어 있다.
즉, 각 서비스는 자신의 Dockerfile을 가지고 있어야 한다.
(그렇지 않으면, dockerhub 등에서 공식 이미지를 다운로드 하게된다.)
서비스별로 서비스 이름, 포트번호, 환경변수, 디스크 볼륨등을 지정해야 한다.
volumes : docker volume들을 지정한다.
networks : docker network들을 지정한다.
networks를 지정하지 않으면, 같은 Docker-Compose 그룹 내에서 모두 연결이 된다.
또한, default라는 이름으로 기본 네트워크가 만들어진다.
yaml 코드 예시
코드는 아래 링크에서 볼 수 있다.
https://github.com/dockersamples/example-voting-app/blob/main/docker-compose.yml
이 코드를 살펴보면,
먼저 network를 front-tier, back-tier로 구분지었다.
사용자들을 위한 프론트단의 컨테이너들의 통신은 front-tier,
로직 처리를 위한 컨테이너들의 통신은 back-tier로 구성했다.
유저가 DB에 직접 접근할 이유가 없고
DB또한 직접 front에 접근할 이유가 없기에 ( Worker가 대신한다. )
보안 및 유연성을 생각하여 네트워크를 나눈 것 같다.
또한 해당 프로젝트는 컨테이너가 중지되어도 데이터가 계속해서 저장될 필요가 있기 때문에
docker volume을 사용해야 했고, 사용했다.
그리고 컨테이너가 정상 상태인지를 확인하기 위해
depends_on : healthcheck를 서비스에 추가해주면서
올바르게 작동하고 필요한 응답을 제공하는지 확인했다.
healthy 상태가 아니라면 Docker-Compose가 해당 컨테이너를 재시작하거나, 장애로 처리할 수 있도록한다.
(healthcheck는 dockerfile에도 기술 가능한 명령어다.)
depends_on의 condition 값으로는 service_healthy를 줬지만,
추후 airflow에 적용하기 위해서 service_completed_successfully와 같은 옵션도 있다는 것을 알아두자.
worker서비스에도 build: 에 context를 지정해주면서
빌드 관련 정보를 더 많이 넘기려고 시도했다.
(context를 사용하면 더 많은 빌드 관련 정보를 넘겨줄 수 있다.)
그리고 environment를 지정해주면서 서비스가 컨테이너 안에서 실행될 때
필요한 환경변수들을 지정해줬다.
마지막으로 yaml을 기반으로 프로그램을 실행하기 위해서는
docker-compose up을 입력하면 된다!
'Data Engineering > Docker' 카테고리의 다른 글
[Docker] Image 내부의 파일 구조 확인하기 (0) | 2023.12.30 |
---|---|
[Docker] WSL (0) | 2023.10.30 |
[Docker] Docker 컨테이너 삭제 (0) | 2023.07.02 |
[Docker] Container 간의 네트워크 설정 - Docker Network 구성 방법 (0) | 2023.07.02 |
[Docker] Docker Volume (0) | 2023.06.27 |