4. 이미지 빌드 및 로컬 실행 단계

목표
더보기
- Dockerfile로 서버 이미지를 빌드할 수 있다
- 빌드된 이미지를 컨테이너로 실행할 수 있다
- 서버 컨테이너가 Running 상태로 유지되는 이유를 설명할 수 있다
- 포트 매핑(-p)의 역할을 이해한다
- docker logs로 서버 상태를 확인할 수 있다
1. 이미지 빌드 개요
더보기
이미지 빌드란 무엇인가?
- Dockerfile에 정의된 규칙을 기반으로
실행 가능한 서버 실행 환경을 하나의 이미지로 생성하는 과정- 서버 코드
- 실행 환경
- 라이브러리
- 실행 명령(CMD)
2. 이미지 빌드 기본 구조
더보기


이미지 빌드 과정
- FROM 이미지 다운로드(필요 시)
- WORKDIR 설정
- 서버 코드 COPY
- 라이브러리 설치(RUN)
- 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>
- 컨테이너 삭제 ≠ 이미지 삭제
- 이미지는 그대로 남아 재실행 가능