<학습 목표>
Docker의 실질적인 가치를 체험하고 설명
Dockerfile의 기본 구조와 명령어 이해
커스텀 Docker 이미지 빌드
멀티 스테이지 빌드로 이미지 최적화

DockerFile의 필요성

결론적으로 설치없이 동일한 환경에 종료시 깔끔하게 정리한다는 장점이있다. 

docker File

직접 요리하는 것과 같다. 내가 원하는 재료(라이브러리)와 조리법(설정)으로 딱 맞는 환경을 만듭니다.

 

 

Python 버전 차이 해결 

예를 들어, Python 3.10을 쓰는 팀원 A의 코드는 잘 돌아가지만, Python 3.8을 쓰는 팀원 B의 컴퓨터에서는 문법 에러(예: Walrus Operator, Match-Case 문법)가 발생할 수 있다.

 

--> Dockerfile을 사용하면 팀 전체가 동일한 베이스 이미지와 동일한 라이브러리 버전을 사용하게 되므로, 누가 실행하든 똑같은 결과를 보장한다. 

 

복잡한 설치 과정의 생략 (PostgreSQL 예시)

 

실습에서 PostgreSQL과 Adminer를 단 두 줄의 명령어로 실행했습니다. 만약 Dockerfile(이미지)이 없었다면 어떤 일이 벌어질까?

  • Docker가  없이 없을 경우
    • PostgreSQL 설치 파일을 다운로드하고 실행해야 한다. 
    • 환경 변수(Path)를 잡고, 데이터 저장 경로를 설정해야 한다.
    • pgAdmin 같은 관리 도구를 별도로 설치하고 DB와 연결 설정을 잡아야 한다. 
  • Dockerfile의 필요성:
    • Dockerfile은 이 모든 설치와 설정 과정(OS 선택, DB 설치, 초기 계정 설정 등)을 미리 정의해 둡니다.
    • 덕분에 사용자는 설치가 아니라 "이미지 실행"만 하면 즉시 DB를 사용할 수 있게 됩니다.
# 네트워크 생성 (두 컨테이너가 통신하기 위해)
docker network create db-net

# PostgreSQL 실행
docker run -d --name pg \
  --network db-net \
  -e POSTGRES_USER=admin \
  -e POSTGRES_PASSWORD=secret123 \
  -e POSTGRES_DB=testdb \
  -p 5432:5432 \
  postgres:15

# Adminer (웹 기반 DB 관리 도구) 실행
docker run -d --name adminer \
  --network db-net \
  -p 8081:8080 \
  adminer

 

 

위 명령어는 다음을 설정한 것이다. 

로그인 정보:
System: PostgreSQL
Server: pg (컨테이너 이름!)
Username: admin
Password: secret123
Database: testdb

 

# 정리
docker stop pg adminer && docker rm pg adminer
docker network rm db-net

서버 환경의 표준화 (Nginx)

# 백그라운드로 웹 서버 실행
docker run -d --name my-web -p 8080:80 nginx

 

  • 팀원 A는 Windows에 Nginx를 깔고, 팀원 B는 Mac에 깔아서 설정 파일 경로가 다를 수 있다.
  • Dockerfile의 필요성
    • Dockerfile로 빌드된 이미지는 어느 OS에서 실행하든 내부 환경(폴더 구조, 설정 파일 위치)이 동일하다 
    • 즉, 팀원 모두가 동일한 Nginx 환경에서 개발할 수 있게된다. 
# 로그 확인 (브라우저에서 접속할 때마다 로그 추가됨)
docker logs -f my-web

# 정리
docker stop my-web && docker rm my-web

3. 깔끔한 정리와 격리 (httpbin 예시)

httpbin이란?

HTTP 요청/응답을 테스트하기 위한 오픈소스 서비스입니다. GET, POST, PUT, DELETE 등 다양한 HTTP 메서드를 테스트하고, 헤더, 쿠키, 상태 코드 등을 확인할 수 있어 API 개발 시 유용 (공식: https://httpbin.org)

💡 프론트엔드 개발 시 백엔드 API가 아직 없을 때 httpbin으로 테스트!

 

실습에서 API 테스트 도구인 httpbin을 잠깐 썼다가 docker rm으로 지웠다.

  • Docker 없을 때
    • 테스트용 도구 하나를 쓰려고 설치했다가, 다 쓰고 나서 언인스톨(Uninstall)해야 합니다.
    • 삭제해도 레지스트리나 관련 파일 찌꺼기가 남을 수 있습니다.
  • Dockerfile의 필요성
    • Dockerfile로 만든 컨테이너는 실행할 때만 존재하고, 끄면 시스템에 아무런 흔적을 남기지 않고 사라진다. 
    • 개발자의 컴퓨터를 항상 깨끗한 상태로 유지할 수 있다.
docker run -d --name api-test -p 8080:80 kennethreitz/httpbin

 

확인시 다음과 같이 확인할 수 있다. 

# GET 요청 테스트
curl http://localhost:8080/get

# POST 요청 테스트
curl -X POST http://localhost:8080/post -d "name=docker&course=DE"

# JSON 응답 확인
curl http://localhost:8080/json

# 정리
docker stop api-test && docker rm api-test

 

Dockerfile 작성 

기존방식과 dockerfile방식의 차이

Dockerfile 작성 기본구조 

FROM python:3.9-slim          # 베이스 이미지 (필수, 첫 줄)

WORKDIR /app                  # 작업 디렉토리 설정 (cd와 비슷)

COPY requirements.txt .       # 파일 복사 (호스트 → 컨테이너)

RUN pip install -r requirements.txt  # 명령 실행 (이미지 빌드 시)

COPY . .                      # 나머지 파일 복사

EXPOSE 8000                   # 포트 문서화 (실제 오픈은 -p 옵션)

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

 

여기서 주요핵심 명령어는 다음과 같다 

FROM 베이스 이미지 지정 (필수) FROM python:3.9-slim
WORKDIR 작업 디렉토리 설정 WORKDIR /app
COPY 파일 복사 COPY . .
RUN 빌드 시 명령 실행 RUN pip install pytest
CMD 컨테이너 시작 시 실행 명령 CMD ["pytest", "-v"]

 

 

 

Dockerfile 작성 예시 

# 실습 디렉토리 생성
mkdir -p ~/dockerfile-practice
cd ~/dockerfile-practice

# 1. Python 애플리케이션 생성
cat << 'EOF' > app.py
def greet(name):
    return f"Hello, {name}!"

if __name__ == "__main__":
    print(greet("Docker"))
EOF

# 2. 테스트 파일 생성
cat << 'EOF' > test_app.py
from app import greet

def test_greet():
    assert greet("World") == "Hello, World!"
    assert greet("Docker") == "Hello, Docker!"
EOF

# 3. requirements.txt 생성
cat << 'EOF' > requirements.txt
pytest>=7.0.0
EOF

# 4. Dockerfile 생성
cat << 'EOF' > Dockerfile
# Python 3.9 slim 이미지를 베이스로 사용
FROM python:3.9-slim

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

# 의존성 파일 먼저 복사 (캐시 활용)
COPY requirements.txt .

# 의존성 설치
RUN pip install --no-cache-dir -r requirements.txt

# 소스 코드 복사
COPY . .

# 기본 실행 명령: 테스트 실행
CMD ["pytest", "-v"]
EOF

 

이미지 빌드 및 실행 

# 이미지 빌드 (-t: 태그/이름 지정)
# . = 현재 디렉토리
# 현재 디렉토리에 있는 Dockerfile을 찾아내어 이미지 빌드 -> my-python-app 으로 이름지정
docker build -t my-python-app .

# 빌드된 이미지 확인
docker images | grep my-python-app

# 컨테이너 실행 (테스트 실행)
docker run --rm my-python-app​

실행하면 다음과 같이 나올것이다 .

 

+ Recent posts