Docker & K8S - Hangman을 Docker Image로 구성 개요
Hangman 서비스를 Docker Image로 구성
앞서 살펴본 Hangman 서비스를 Docker Image로 빌드해보자
Docker Container와 Port 번호
어떤 웹서비스를 Docker Container안에서 실행할 때 포트 번호를 오픈해야 합니다.
앞의 HANGMAN은 4000번을 Docker Container가 아닌 상태로 docker labs의 도움으로 실행했었습니다.
만일 Docker Container안에서 HANGMAN을 서비스할 때 Container 외부에서 4000번 포트로 컨테이너 내부의 HANGMAN 서비스에 접속할 수 있는지 헷갈리는 분들이 계실 수 있을까 설명을 드리겠습니다.
결과부터 말씀드리자면 Docker Container는 컴퓨터 안의 컴퓨터 역할을 하고 Container안에서 포트번호를 오픈한다 해도 외부에서 접속할 수는 없습니다.
이제 차근차근 설명해드리겠습니다.
Docker 컨테이너 내부 프로세스와 호스트 프로세스간의 통신 (1)
Docker 컨테이너로 포트 4000에 실행된 Flask app이 있다
이 app을 호스트 운영체제에서 접근하려면?
keeyong hangman % docker run keeyong/hangman
* Debug mode: off
WARNING: This is a development server. Do not use it in a
production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:4000
* Running on http://172.17.0.3:4000
Press CTRL+C to quit
keeyong/hangman이 HANGMAN 서비스를 Docker IMAGE로 만든 것이라고 생각하면 됩니다.
일단 Docker Container 상에서는 방금전의 리눅스 실습과 같이 실행은 정상적으로 진행되지만
localhost:4000이나 127.0.0.1:4000으로 내 브라우저에서 접속하려하면

위와 같이 웹 사이트를 찾을 수 없다는 에러가 납니다.
Container는 아예 별도의 공간이기 때문에 컨테이너 바깥에서는 접근할 수 없습니다.
이를 해결하기 위한 것이 포트 매핑(Port mapping)입니다.
Docker 컨테이너 내부 프로세스와 호스트 프로세스간의 통신 (2)
Docker 컨테이너 내부 프로세스가 오픈한 포트번호는 바깥 프로세스에는 안 보임
예를 들어 앞서 4000번 포트는 호스트 프로세스 브라우저에게는 안 보임

Flask App이 4000번 입구를 열어 두어도 Docker Container(바깥 사각형)이 막고 있어 의미가 없는 모습을 그림으로 표현했습니다.
Docker 컨테이너 내부 프로세스와 호스트 프로세스간의 통신 (3)
Docker 컨테이너 내부 프로세스가 오픈한 포트번호를 외부로 노출해주는 것이 포트맵핑
혹은 포트 포워딩(Port forwarding)
docker run 수행시 -p 옵션 사용
- docker run -p 4000:4000 이미지이름

docker run을 할 때 -p 옵션으로 외부의 4000번 포트를 컨테이너 내부의 4000번 포트로 매핑하겠다는 지시를 내립니다.
이제 localhost:4000으로도 좌측과 같이 Docker Container 내부의 HANGMAN 서비스에 접속이 가능합니다.
우측그림은 외부의 4000으로 내부의 4000으로 접속할 수 있는 모습을 표현한 것입니다.
포트 번호를 다른 것으로 줄 수 있습니다. 내부는 4000, 외부는 80(docker run -p 80:4000 이미지 이름)
사족으로 80은 http의 기본 port 번호 입니다.
Docker 컨테이너 내부 프로세스와 호스트 프로세스간의 통신 (4)
Docker 컨테이너를 실행할 때 포트 맵핑을 통해 호스트 운영체제 단에서 접근되는 포트를 컨테이너쪽으로 포워드해주어야함 -p 옵션
keeyong hangman % docker run -p 4000:4000 keeyong/hangman
* Debug mode: off
WARNING: This is a development server. Do not use it in a
production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:4000
* Running on http://172.17.0.3:4000
Press CTRL+C to quit
-p 옵션으로 포트 맵핑을 4000:4000으로 해주니

이제는 Container 외부의 브라우저에서도 컨테이너 내부의 HANGMAN 서비스로 접속이 가능합니다.
Docker Container의 포트와 포트맵핑(포트 포워딩)에 대한 설명을 마치고
이제는 Docker file을 만드는 것에 대해 설명드리겠습니다.
hangman web repo에 Dockerfile을 만들어야 Docker Image를 생성할 수 있습니다.
숙제: hangman repo에 Dockerfile 추가하기 (1)
앞서 1장에서 만들어본 Dockerfile에 대한 설명을 참고하여 Dockerfile 추가
FROM에 사용할 베이스 이미지로는 python:3.8-slim-buster을 사용
RUN에서는 pip3 install -r requirements.txt가 지정되어야함
다음으로 아래와 같은 이름으로 이미지를 빌드해볼 것
DockerHub어카운트ID/hangman
예) keeyong/hangman
맥 M1이라면 빌드시 --platform=linux/amd64 사용을 잊지 말것
맥 M1에서 빌드한다면 이미지가 최종적으로 실행되는 곳이 맥 M1이 아닐 가능성이 높으므로 --platform을 사용
마지막으로 이 이미지를 가지고 컨테이너를 실행할 것 (docker run)
이 때 포트 포워딩을 고려해서 실행해야함 -p 옵션으로 (4000:4000) 포트 맵핑 실시
숙제: hangman repo에 Dockerfile 추가하기 (2)
이 이미지를 labs.play-with-docker.com에서 다운로드 받아 실행해볼 것
여기서 해당 Flask app을 오픈해볼 수 있음
우리가 바로 이전 시간 실습에서 해보았던 것과 똑같이 진행하시면 됩니다.

port 4000이 오픈 되었는지는 아까의 실습과 같이 OPEN PORT 버튼으로 4000을 입력하셔서 접속하셔도 좋고 혹은
docker run -p 옵션으로 포트 포워딩을 진행하면 docker labs에서는 알아서 좌측 그림과 같이 4000번 포트를 링크로 걸어줍니다.
숙제: hangman repo에 Dockerfile 추가하기 (3)
이미지를 Docker Hub에 등록해볼 것
사실 Docker Hub에 가서 repo를 먼저 만들지 않고 바로 docker push 명령으로 만들면서 업로드 가능

숙제를 할 때 repo를 먼저 만들지 않고 docker push를 진행하라는 이유는 다음과 같습니다.
Docker Hub에서 repo를 먼저 만들고 터미널에서 docker push로 Docker Hub에 앞서 만든 repo에 내가 만든 이미지를 로딩한 것이 저번 실습과정이었죠?
사실은 미리 repo를 만들 필요가 없습니다. 내가 docker hub에 대한 접근 권한만 준다면(docker login) docker push를 진행시 내 어카운트 아래에 내가 지정한 이름의 이미지로 repo가 알아서 생성됩니다.
이번에는 이런 자동 생성을 한번 체험해보시라는 이유입니다.
숙제: hangman repo에 Dockerfile 추가하기 (4)
Dockerfile을 본인 github repo에 커밋
혹시라도 막히는 부분이 있으면 질문을 꼭 할 것!
최종적으로 본인 Docker Hub 계정에 업로드된 hangman repo 링크와 스크린샷을 keeyong@gmail.com으로 보내던지 Slack으로 DM할 것