Docker 가 보편화 되기 이전에는 개발 환경 셋팅에 정말 많은 공수가 필요 했습니다.

하지만 Docker는 애플리케이션과 그 의존성을 컨테이너로 패키징하여 독립성과 경량화 장점을 갖고 있습니다.

물론 빠른 배포, 빠른 스케일링 장점도 있지만 우선 Docker 환경에서 컨테이너를 올려보겠습니다

 

그러면 mysql 컨테이너를 만들어보겠습니다.

 

어떻게 Docker 환경에서 mysql 컨테이너를 생성할 수 있을까요?

우선 컨테이너의 생성을 위한 순서는 아래와 같습니다.

1. docker-compose.yml 파일 생성

2. Dockerfile 생성

3. docker-compose up 명령어 실행

    - 1) Dockerfile 정의 내용을 기반으로 이미지 빌드

    - 2) 이미지를 사용하여 컨테이너 생성 및 실행

4. 생성 컨테이너 확인

 

위의 순서에 맞게 하나씩 진행 해보겠습니다.

 

(그림. 프로젝트 디렉토리)

 

1. 프로젝트 최상위 디렉토리에 docker 디렉토리 및 docker-compose.yml 파일 생성 (그림. 프로젝트 디렉토리)

  • 저는 스프링 부트 프로젝트 입니다.
version: '1'

services:
  mysql:
    build:
      dockerfile: mysql/Dockerfile
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: 1234
    ports:
      - "3306:3306"
  • service:mysql:builder:dockerfile 에 Dockerfile 경로를 입력 해주세요(mysql/Dockerfile)

 

2. docker 디렉토리에 mysql 디렉토리 및 Dockerfile 생성 (그림. 프로젝트 디렉토리)

# 베이스 이미지 설정
FROM mysql:latest
  • Dockerfile 사용 예시를 공유하기 위해 베이스 이미지 설정만 추가 했습니다.

 

3. 프로젝트 docker 디렉토리 이동 및 docker 실행

docker-compose up -d
  • -d 옵션은 컨테이너를 백그라운드에서 실행하고 터미널 사용 제어권을 반환하는 역할을 합니다.

 

 

4. mysql 컨테이너 확인

docker exec -it mysql mysql -uroot -p
  • 해당 명령어 입력 후 비밀번호 입력 프롬프트가 표시됩니다. 이때 docker-compose.yml 에 설정한 비밀번호를 입력해주세요.

 

이렇게 Docker 환경에서 mysql 컨테이너 생성 예제가 완료 되었습니다.

 

 

컨테이너의 환경 설정을 docker-compose.yml 파일에 할지, Dockerfile에 할지 정확한 답은 없습니다.

만약 고민이 되신다면 아래 포스트를 참고 해주세요.

https://gabrielyj.tistory.com/225

 

컨테이너의 환경설정 docker-compose.yml 이랑 Dockerfile 중 어디가 적합하지?

Docker 컨테이너 생성 시 환경설정을 어디에 할지 고민이 될 수 있습니다.

이럴 때에는 장/단점을 따져보고 결정하는게 맞을 것 같습니다.

 

 

docker-compose.yml 환경설정

[장점]

  • docker-compose.yml 파일은 여러 컨테이너 및 서비스를 정의하고 관리하기가 편리합니다.
  • 컨테이너 간의 의존성을 쉽게 정의하고 관리할 수 있습니다.
  • 환경 설정을 외부화하여 수정 및 유지 관리가 용이합니다.

[단점]

  • 컨테이너에 대한 상세한 설정을 docker-compose.yml 파일에 직접 작성해야 합니다.
  • 복잡한 설정을 다루기에는 docker-compose.yml 파일이 적합하지 않을 수 있습니다.

 

 

Dockerfile 환경설정

[장점]

  • Dockerfile을 사용하여 컨테이너의 이미지를 빌드할 때 더 많은 제어권을 가질 수 있습니다.
  • 구체적인 설정을 Dockerfile 내에서 관리하고 변경할 수 있습니다.

[단점]

  • Dockerfile을 직접 작성하고 관리해야 하므로 일부 개발자들에게는 복잡할 수 있습니다.
  • 다른 컨테이너 서비스와의 의존성을 정의하고 관리하기가 어려울 있습니다.

 

 

그래서 어떻게 하지?

  • 일반적으로 단일 컨테이너를 실행하는 경우에는 docker-compose.yml 파일을 사용하는 것이 더 효율적일 수 있습니다.
  • 복잡한 환경에서 컨테이너 간의 복잡한 의존성이 있거나, 세부적인 커스터마이징이 필요할 경우 Dockerfile을 사용하는 것이 효율적일 수 있습니다.

Dockerfile와 docker-compose.yml 파일의 차이

도커를 생성하셨으면 이제 실제 애플리케이션을 컨테이너화 해야됩니다.

이때 사용되는 파일은 Dockerfile 과 docker-compose.yml 파일입니다.

두 파일 모두 컨테이너화를 위해 사용되는데 서로 다른 목적과 사용 사례를 갖고 있습니다.

 

Dockerfile 이란?

  • 개별 컨테이너 정의 : 단일 도커 이미지를 정의하는데 사용됩니다. 이미지는 컨테이너를 시작하는데 사용되는 템플릿입니다.
  • 컨테이너 빌드 지시사항 : 컨테이너를 빌드하기 위한 지시사항을 포함합니다. 기본 이미지, 작업 디렉토리, 파일 복사, 환경 변수 설정 등을 포함합니다.
  • 단일 서비스 정의 : 사용하면 하나의 서비스 또는 애플리케이션의 컨테이너를 정의합니다. 보통 하나의 Dockerfile은 하나의 애플리케이션을 컨테이너화하기 위해 사용됩니다.

docker-compose.yml 이란?

  • 다중 컨테이너 애플리케이션 정의 : 파일은 다중 컨테이너 애플리케이션의 전체 구성을 정의하는 데 사용됩니다. 여러 서비스 또는 컨테이너를 함께 실행하고 관리할 때 유용합니다.
  • 서비스 간 의존성 관리 : 서비스 간의 읜존성과 상호 작용을 정의합니다. 이를 통해 여러 컨테이너를 함께 시작하고 관리할 수 있습니다.
  • 환경 설정 및 네트워크 구성 : 각 서비스의 환경 변수, 포트 맵핑, 불륨 마운트, 서비스 간의 네트워크 구성 정의 등을 설정할 수 있습니다.

 

그래서 Dockerfile 이랑 docker-compose.yml 파일의 차이가 뭐야?

  • docker-compose.yml 을 통해 다중 컨테이너 애플리케이션을 정의합니다.
  • docker-compose.yml 을 통해 생성되는 컨테이너의 설정은 Dockerfile을 통해 이루어집니다.

즉, docker-compose.yml 을 통해 전체적인 애플리케이션 컨테이너를 생성하고 각 컨테이너의 세부 설정은 Dockerfile을 사용합니다.

 

 

[docker-compose.yml 파일과 각 dockerfile 경로]

docker-compose.yml 의 위치는 1depth 로써, 각 컨테이너(mysql, rabbitmq, kafka) 의 경로에 dockerfile 이 존재합니다.

1depth/
│
└── docker-compose.yml
│
├── mysql/
│   └── Dockerfile_mysql
│
├── rabbitmq/
│   └── Dockerfile_rabbitmq
│
└── kafka/
    └── Dockerfile_kafka

 

 

[docker-compose.yml 예시]

version: '3'  # Docker Compose 파일의 버전 지정

services:  # 각 서비스를 정의합니다.
  mysql:  # 서비스 이름
    image: mysql:latest  # 사용할 도커 이미지
    container_name: mysql-container  # 컨테이너 이름
    environment:  # 환경 변수 설정
      MYSQL_ROOT_PASSWORD: <password>  # MySQL 루트 비밀번호 설정
    ports:  # 포트 매핑
      - "3306:3306"  # 호스트와 컨테이너의 포트를 매핑

  rabbitmq:
    image: rabbitmq:latest
    container_name: rabbitmq-container
    ports:
      - "5672:5672"
      - "15672:15672"

  kafka:
    image: wurstmeister/kafka:latest
    container_name: kafka-container
    ports:
      - "9092:9092"

 

 

결론

  1. docker-compose.yml 을 통해 애플리케이션 컨테이너화를 합니다.
  2. 각 애플리케이션 컨테이너 경로의 dockerfile을 통해 설정을 합니다.

+ Recent posts