티스토리 뷰

Dockerfile과 Docker Compose는 모두 Docker 생태계의 일부이며 서버 구동과 관련이 있지만, 그 역할과 목적에는 중요한 차이점이 있습니다.

Dockerfile

정의

Dockerfile은 Docker Image를 생성하기 위한 레시피 혹은 설계도 같은 것입니다. 이 파일에는 컨테이너가 어떻게 작동해야 하는지에 대한 지시사항이 담겨 있습니다.

 

역할

Dockerfile은 운영체제, 실행할 코드, 필요한 라이브러리 및 환경 변수 설정 등을 포함하여 특정 애플리케이션을 실행하는 데 필요한 모든 것을 정의합니다.

 

사용 예시

예를 들어 Python 애플리케이션을 Docker 컨테이너에서 실행하기 위해 필요한 Python 런타임, 코드 복사, 필요한 패키지 설치 등을 Dockerfile에 명시합니다.

FROM openjdk:17

EXPOSE 8080

ARG JAR_FILE=*.jar

COPY ${JAR_FILE} coupon-consumer.jar

ENTRYPOINT ["java","-jar","coupon-consumer.jar"]

 

Dockerfile에 작성되는 명령 옵션

  • FROM: Docker Base Image (기반이 되는 이미지, <이미지 이름> : <태그> 형식으로 설정)
  • MAINTAINER: 메인테이너 정보 (작성자 정보)
  • RUN: Shell Script 또는 명령을 실행
  • CMD: 컨테이너가 실행되었을 때 명령이 실행
  • LABEL: 라벨 작성 (docker inspect 명령으로 Label을 확인할 수 있습니다.)
  • EXPOSE: 호스트와 연결할 포트 번호를 설정합니다.
  • ENV: 환경변수 설정
  • ADD: 파일 / 디렉터리 추가
  • COPY: 파일 복사
  • ENTRYPOINT: 컨테이너가 시작되었을 때 스크립트 실행
  • VOLUME: 볼륨 마운트
  • WORKDIR: "RUN", "CMD", "ENTRYPOINT" 명령이 실행될 작업 디렉터리
  • ARG: Dockerfile 내부 변수
  • ONBUILD: 다른 이미지의 Base Image로 쓰이는 경우 실행될 명령 수행
  • SHELL: Default Shell 지정

Docker-compose.yml

정의

Docker Compose는 여러 Docker 컨테이너를 정의하고 실행하기 위한 도구입니다. YAML 파일 형식으로 작성됩니다.

 

역할

Docker Compose는 여러 컨테이너가 서로 어떻게 상호 작용하는지, 네트워크와 볼륨 설정은 어떻게 되어야 하는지 등을 정의합니다. 여러 컨테이너를 동시에 관리하고 구성하는 데 적합합니다.

 

사용 예시

예를 들어, 하나의 웹 애플리케이션 서버, 데이터베이스 서버, 캐시 서버 등을 각각 다른 컨테이너로 실행하고 이들이 함께 동작하도록 Docker Compose를 사용하여 구성할 수 있습니다.

 

아래 코드를 살펴보면, coupon-api, coupon-consumer, coupon-redis, coupon-mysql 이름을 가진 4개의 컨테이너들이 정의되어 있으며, 컨테이너 마다 여러 설정 값이 지정되어 있습니다.

  • cotainer_name: 컨테이너 이름
  • image: 컨테이너 생성 시 사용할 DokcerImage
  • ports: 사용할 포트 번호
  • links: 해당 컨테이너와 연결할 다른 컨테이너
version: '3.7'
services:
  coupon-api:
    container_name: coupon-api
    image: tnalsa/coupon-api
    ports:
      - 8080:8080
    links:
      - mysql
      - redis

  coupon-consumer:
    container_name: coupon-consumer
    image: tnalsa/coupon-consumer
    ports:
      - 8081:8081
    links:
      - mysql
      - redis

  redis:
    container_name: coupon-redis
    image: redis:7.2-alpine
    command: redis-server --port 6380
    labels:
      - "name=redis"
      - "mode=standalone"
    ports:
      - 6380:6380

  mysql:
    container_name: coupon-mysql
    image: ubuntu/mysql:edge
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --explicit_defaults_for_timestamp=1
    ports:
      - 3306:3306
    environment:
      - MYSQL_DATABASE=coupon
      - MYSQL_USER=abcd
      - MYSQL_PASSWORD=1234
      - MYSQL_ROOT_PASSWORD=1234
      - TZ=UTC
    volumes:
      - ./mysql/init:/docker-entrypoint-initdb.d

 

최근에 올라온 글
Total
Today
Yesterday