목표

더보기
  • Dockerfile로 서버 이미지를 빌드할 수 있다
  • 빌드된 이미지를 컨테이너로 실행할 수 있다
  • 서버 컨테이너가 Running 상태로 유지되는 이유를 설명할 수 있다
  • 포트 매핑(-p)의 역할을 이해한다
  • docker logs로 서버 상태를 확인할 수 있다

 

1. 이미지 빌드 개요

더보기

이미지 빌드란 무엇인가? 

  • Dockerfile에 정의된 규칙을 기반으로
    실행 가능한 서버 실행 환경을 하나의 이미지로 생성하는 과정
    • 서버 코드
    • 실행 환경
    • 라이브러리
    • 실행 명령(CMD)
    이 모두가 하나의 이미지에 포함됩니다.

 

2. 이미지 빌드 기본 구조

더보기

이미지 빌드 과정

  1. FROM 이미지 다운로드(필요 시)
  2. WORKDIR 설정
  3. 서버 코드 COPY
  4. 라이브러리 설치(RUN)
  5. CMD 저장(실행하지 않음)

중요한 점:

CMD는 빌드 시 실행되지 않습니다.
CMD는 오직 컨테이너 실행 시에만 사용됩니다.

 

ㄴ 2.1 이미지 빌드 명령어

더보기
docker build -t chat-server .

옵션 설명

  • docker build: 이미지 생성 명령
  • -t chat-server: 이미지 이름(tag) 지정
  • . : Dockerfile 위치(현재 디렉터리)

 

ㄴ 2.2 빌드 결과 확인

더보기
docker images

이미지가 정상적으로 생성되었는지 확인합니다.

이 시점에서

  • 서버는 아직 실행되지 않음
  • 단지 실행 가능한 이미지가 준비된 상태

 

3. 컨테이너 실행(docker run)

더보기
docker run -p 8888:8888 chat-server

의미:

  • 로컬의 server.py 파일을
  • 컨테이너 내부 /app 디렉터리로 복사

중요 포인트:

  • 컨테이너는 로컬 파일을 자동으로 보지 못함
  • 반드시 COPY로 명시해야 함

 

ㄴ 3.1 docker run -p 옵션 해설(매우 중요)

더보기

(1) 개요

[1]Docker 컨테이너는 기본적으로 [2]호스트 PC와 다른 네트워크 공간에서 실행됩니다.

*즉, 컨테이너 내부에서 서버가 실행되고 있더라도, 호스트 PC나 외부에서 직접 접근할 수 없습니다.

 

이 상태에서는 다음과 같은 문제가 발생합니다.

  • 서버는 분명히 실행 중인데
  • 브라우저나 클라이언트에서 접속이 되지 않음
  • 포트가 열려 있는 것처럼 보이지만 실제로는 외부와 단절된 상태

 

 

 

 

(2) docker run -p 는 “포트 연결”을 위한 옵션이다

docker run -p 8888:8888 chat-server

-p 옵션은 호스트 포트와 컨테이너 포트를 연결(매핑) 하는 역할을 합니다.

[호스트 PC의 8888 포트]
        ↓
[컨테이너 내부의 8888 포트]
  • 사용자가 호스트 PC의 8888 포트로 접속하면
  • Docker가 그 요청을 컨테이너 내부 8888 포트로 전달
  • 컨테이너 내부 서버가 요청을 처리

 

 

 

 

(3) -p 옵션이 없으면 발생하는 현상

  • 서버는 컨테이너 내부에서 정상 실행됨
  • docker ps에서도 Running 상태로 표시됨
  • docker logs에서도 서버 시작 로그 확인 가능
  • 하지만 외부에서는 접속 불가
  • 서버는 살아 있지만
    외부와 통신할 수 없는 상태

 

 

 

(4) 왜 서버 코드가 0.0.0.0 에 바인딩되어야 하는가?

 
host = "0.0.0.0"

 

  • 모든 네트워크 인터페이스에서 접속 허용
  • Docker가 전달한 외부 요청을 정상 수신 가능

 

 

 

 

(5) 잘못된 예시

 
host = "127.0.0.1"

 

  • 컨테이너 자기 자신 내부에서만 접속 허용
  • Docker가 포트를 전달해도 서버가 요청을 받지 않음


ㄴ  3.2 포그라운드 실행 vs 백그라운드 실행

더보기

포그라운드 실행(기본)

 
docker run -p 8888:8888 chat-server
  • 터미널 점유
  • Ctrl+C → 서버 종료

 

 

 

 

백그라운드 실행(-d)

docker run -d -p 8888:8888 chat-server
  • 터미널 반환
  • 서버는 백그라운드에서 실행
  • 로그는 docker logs로 확인


ㄴ 3.3 컨테이너 중지 및 정리

더보기

컨테이너 중지

 
docker stop <컨테이너ID>

 

 

컨테이너 삭제

 
docker rm <컨테이너ID>

 

  • 컨테이너 삭제 ≠ 이미지 삭제
  • 이미지는 그대로 남아 재실행 가능