이 글에서는 Docker와 Docker Compose를 사용하여 프로젝트를 설정하고 실행하는 과정에서 발생한 문제와 그 해결 방법을 정리합니다.
특히, Dockerfile과 Docker Compose 파일에서 포트 설정 시 주의사항에 대해 다룹니다.
Docker는 컨테이너화된 애플리케이션을 개발, 배포 및 실행하기 위한 오픈 소스 플랫폼입니다. 컨테이너는 애플리케이션 코드와 모든 종속성을 포함하여 일관된 환경에서 실행될 수 있도록 해줍니다. 이를 통해 개발 환경과 운영 환경의 차이로 인한 문제를 줄일 수 있습니다.
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는 여러 컨테이너를 한 번에 정의하고 실행할 수 있도록 도와줍니다. 아래는 기본적인 예제입니다.
services:
web:
build: .
ports:
- "8000:8000"
volumes:
- .:/app
environment:
- FLASK_ENV=development
redis:
image: "redis:alpine"
Dockerfile에서 EXPOSE 지시어는 컨테이너가 수신 대기할 포트를 지정합니다.
그러나 EXPOSE는 실제로 포트를 열지는 않으며, 단지 해당 포트를 사용할 것임을 명시합니다.
실제 포트를 매핑하려면 docker run 명령어에서 -p 옵션을 사용하거나,
Docker Compose 파일에서 ports 지시어를 사용해야 합니다.
# Dockerfile에서 포트 노출
EXPOSE 8000
Docker Compose 파일에서 ports 지시어를 사용하여 호스트와 컨테이너 간의 포트를 매핑합니다.
services:
web:
build: .
ports:
- "8000:8000"
위 설정은 호스트의 포트 8000을 컨테이너의 포트 8000과 매핑합니다. Dockerfile에서 EXPOSE 8000을 지정하면 Docker Compose가 이를 인식하여 올바르게 포트를 매핑합니다.
원인: 서버 구성 시, 포트 지정이 없으면 기본 포트로 실행되며, EXPOSE로 외부에 여는 포트와 다를 수 있음
해결 방법:
Dockerfile의 EXPOSE와 Docker Compose의 ports 지시어를 일관되게 설정해야 합니다.
예를 들어,
다른 해결 방법:
서버 개발 시, 설정파일 등에 기본포트를 원하는 값으로 지정하고, 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 파일의 구성방법 등을 살펴보았습니다.