Docker, docker-compose , PORT

Jindolph·2024년 8월 1일

Docker 및 Docker Compose를 사용한 프로젝트 설정 및 포트 트러블슈팅

이 글에서는 Docker와 Docker Compose를 사용하여 프로젝트를 설정하고 실행하는 과정에서 발생한 문제와 그 해결 방법을 정리합니다.
특히, Dockerfile과 Docker Compose 파일에서 포트 설정 시 주의사항에 대해 다룹니다.

Docker 기본 개념 소개

Docker란?

Docker는 컨테이너화된 애플리케이션을 개발, 배포 및 실행하기 위한 오픈 소스 플랫폼입니다. 컨테이너는 애플리케이션 코드와 모든 종속성을 포함하여 일관된 환경에서 실행될 수 있도록 해줍니다. 이를 통해 개발 환경과 운영 환경의 차이로 인한 문제를 줄일 수 있습니다.

Docker의 주요 구성 요소

  1. Docker 이미지: 실행할 애플리케이션과 그 환경을 포함한 읽기 전용 템플릿입니다.
  2. Docker 컨테이너: 이미지를 실행한 상태로, 애플리케이션과 그 종속성을 포함한 격리된 프로세스입니다.
  3. Dockerfile: 이미지를 빌드하기 위한 설정 파일입니다.
  4. Docker Compose: 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하기 위한 도구입니다.

Dockerfile 및 Docker Compose 파일 작성 방법

Dockerfile 작성법

Dockerfile은 이미지를 빌드하기 위한 설정 파일로, 각 명령은 계층을 생성합니다. 아래는 기본적인 예제입니다.

# 베이스 이미지 설정
FROM python:3.8

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

# 필요한 파일 복사 및 종속성 설치
COPY requirements.txt .
RUN pip install -r requirements.txt

# 애플리케이션 코드 복사
COPY . .

# 포트 설정
EXPOSE 8000

# 컨테이너 시작 시 실행할 명령어
CMD ["python", "app.py"]

Docker Compose 파일 작성법

Docker Compose는 여러 컨테이너를 한 번에 정의하고 실행할 수 있도록 도와줍니다. 아래는 기본적인 예제입니다.

services:
  web:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - .:/app
    environment:
      - FLASK_ENV=development
  redis:
    image: "redis:alpine"

Dockerfile에서 EXPOSE로 포트 사용 시 주의사항

Dockerfile에서 EXPOSE 지시어는 컨테이너가 수신 대기할 포트를 지정합니다.
그러나 EXPOSE는 실제로 포트를 열지는 않으며, 단지 해당 포트를 사용할 것임을 명시합니다.
실제 포트를 매핑하려면 docker run 명령어에서 -p 옵션을 사용하거나,
Docker Compose 파일에서 ports 지시어를 사용해야 합니다.

# Dockerfile에서 포트 노출
EXPOSE 8000

올바른 Docker Compose 및 Dockerfile 포트 설정 방법

Docker Compose 파일에서 ports 지시어를 사용하여 호스트와 컨테이너 간의 포트를 매핑합니다.

Docker Compose 파일 예제

services:
  web:
    build: .
    ports:
      - "8000:8000"

위 설정은 호스트의 포트 8000을 컨테이너의 포트 8000과 매핑합니다. Dockerfile에서 EXPOSE 8000을 지정하면 Docker Compose가 이를 인식하여 올바르게 포트를 매핑합니다.

트러블슈팅 사례

문제: Dockerfile과 Docker Compose에서 포트 설정 불일치

원인: 서버 구성 시, 포트 지정이 없으면 기본 포트로 실행되며, EXPOSE로 외부에 여는 포트와 다를 수 있음

해결 방법:
Dockerfile의 EXPOSE와 Docker Compose의 ports 지시어를 일관되게 설정해야 합니다.
예를 들어,

  • Dockerfile에서는 서버에서 기본으로 사용되는 포트를 EXPOSE로 지정.
  • Docker Compose에서 원하는 host 포트와 컨테이너 EXPOSE 포트를 매핑.

다른 해결 방법:
서버 개발 시, 설정파일 등에 기본포트를 원하는 값으로 지정하고, EXPOSE로 외부 개방 포트를 이 값에 맞춘다. 이후, docker-compose.yml 파일에서도 포트매핑.

예제

# Dockerfile

# node-express server(기본 포트 3000)
FROM node:14
WORKDIR /app
...
EXPOSE 3000
CMD ["npm", "start"]


# Dockerfile

# java-spring server(기본 포트 8080)
FROM openjdk:11
WORKDIR /app
...
#올바른 사용 -> EXPOSE 8080
EXPOSE 8001
CMD ["./mvnw", "spring-boot:run"]


# Dockerfile

# python-django server(기본 포트 8000)
FROM python:3.8
WORKDIR /app
...
EXPOSE 8002
CMD ["sh", "-c", "python manage.py runserver 0.0.0.0:8002"]
# docker-compose.yml
services:
  node-service:
    ...
    ports:
      - "3000:3000"
    ...
  java-service:
    ...
    ports:
      #올바른 사용 -> "8001:8080"
      - "8001:8001"
    ...
  python-service:
    ...
    ports:
      - "8002:8002"
    ...

결론

MSA를 로컬 시스템 환경에서 구현해보기 위해, Docker와 docker-compose는 굉장히 유용하고 강력한 도구입니다. 하지만, 이 도구들을 사용하여 프로젝트를 설정하는 과정에서 발생할 수 있는 포트 구성 문제와 주의점이 있습니다. 이번에는 올바른 포트 설정과 Dockerfile 및 Docker Compose 파일의 구성방법 등을 살펴보았습니다.

profile
Hello World!

0개의 댓글