Docker Compose! 파헤치기

노현아·2024년 4월 17일
빙글빙글고민

Docker Image, Container

Docker의 기본부터 알아야 Docker Compose를 이해할 수 있고, 이미지와 컨테이너가 뭔지 알아야 Docker를 이해할 수 있다. 개념과 사용법을 알아보자!

Docker는 애플리케이션을 배포하고 관리하기 위한 플랫폼으로, 이미지와 컨테이너는 이 플랫폼의 두 가지 핵심 개념이다.

Image

정의

이미지는 애플리케이션과 그 애플리케이션을 실행하는 데 필요한 모든 것을 포함하는 읽기 전용 템플릿이다. 여기에는 소스 코드, 라이브러리, 종속성, 도구, 설정 파일 등이 포함된다.

특징

  • 불변성: 이미지는 읽기 전용이다. 한 번 생성되면 변경할 수 없다.
  • 층(layer): 이미지는 여러 층으로 구성되어 있으며, 각 층은 변경 사항을 나타낸다. 예를 들어, 기본 운영 체제 층, 애플리케이션 설치 층, 애플리케이션 코드 층 등이 있다.
  • 생성: 이미지는 Dockerfile을 사용하여 생성된다. Dockerfile은 이미지 생성 절차를 정의하는 스크립트이다.
  • 저장 및 배포: 이미지는 Docker Hub와 같은 레지스트리(저장소)에 저장되고 배포될 수 있다.

컨테이너 (Container)

  • 정의: 컨테이너는 이미지를 실행 가능한 인스턴스로 만든 것이다. 컨테이너는 애플리케이션을 격리된 환경에서 실행하며, 필요한 모든 것을 포함하고 있어 일관된 실행 환경을 제공한다.
  • 특징:
  • 가변성: 컨테이너는 읽기-쓰기 가능하다. 실행 중에 데이터를 추가하거나 수정할 수 있다.
  • 격리: 각 컨테이너는 독립된 환경에서 실행되며, 다른 컨테이너와 격리된다. 이를 통해 애플리케이션 간의 충돌을 방지한다.
  • 수명 주기: 컨테이너는 이미지를 기반으로 생성되며, 필요에 따라 시작, 중지, 재시작, 삭제할 수 있다.
  • 상태: 컨테이너는 실행 상태, 중지 상태 등 다양한 상태를 가질 수 있다.

이미지와 컨테이너의 관계

이미지는 컨테이너를 생성하기 위한 템플릿이다. 이미지를 기반으로 여러 개의 컨테이너를 생성할 수 있다.
이미지는 불변이지만, 컨테이너는 실행 중에 변경될 수 있다. 이미지를 업데이트하려면 새로운 이미지를 생성해야 한다. 반면, 컨테이너는 실행 중에 변경 사항을 적용할 수 있다.

Dockerfile 예제

FROM openjdk:21-jdk-slim

# 작업 디렉토리를 /app으로 설정
WORKDIR /app

# 현재 디렉토리의 모든 파일을 컨테이너의 /app 디렉토리로 복사
COPY . /app

# Java 파일을 컴파일
RUN javac HelloWorld.java

이런 식으로 Dockerfile을 작성하면 원하는 명세에 따른 이미지를 생성할 수 있다.

원본 파일과 이미지의 관계

Java 프로그램으로 예를 들어 보자. A.java 파일을 컴파일하도록 Dockerfile을 적고 Docker build 명령을 해 보자. Docker는 DockerFile 명세에 따라 A.jar 파일을 B라는 이미지로 만든다. A.java 파일이 이후 수정되고 다시 빌드되어도 이미 build된 B라는 이미지에 아무 영향이 없다. 결론적으로 A.java 파일을 수정 후에는 다시 Docker build 해줘야 수정 사항이 이미지에 반영된다는 것.. 너무 당연하긴 하다.

Docker Compose?

  • Docker Compose는 하나의 Dockerfile(ex. compose.yaml)로 두 개의 container를 동시에 생성하게 해 주는 기능을 한다. 단순하지만, 여러 개의 컨테이너를 한 번에 띄우도록 해준다. compose.yaml 파일에 여러 개의 container 명세를 적고 아래 명령을 해주면 된다.
docker compose up
  • Docker Compose가 없을 때는, 기존에는 하나의 웹 애플리케이션을 구성하는 데이터베이스와 서버를 서로 다른 컨테이너에 띄우려고 할 때 어떻게 했을까? 당연히 각각의 컨테이너를 docker run ... 명령으로 개별적으로 띄워주어야 했다. 이를 한 번에 알아서 한꺼번에 실행해주는 기능을 하는 것이 Docker Compose다.

참고하기 좋은 블로그:

https://velog.io/@jmjmjmz732002/%E5%AE%8C-Github-Action-Docker-EC2-Nginx-%ED%99%9C%EC%9A%A9%ED%95%9C-Springboot-CICD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-7-Github-Actions-CICD-docker-compose

profile
성실함과 끊임없는 학습을 통해 성장하는 개발자 지망생입니다. 새로운 도전과 배움을 즐기며 더 나은 코드를 꿈꿉니다.

0개의 댓글