안녕하세요. 이번 시간에는 도커 publish port에 대해 알아봅시다.

 


 먼저 간단한 fastapi 프로젝트를 생성해 보겠습니다. 공식 문서에는 셋팅과, 간단한 api 만드는 방법에 대해 각각 링크1링크2에서 설명하고 있어요. 이를 토대로 프로젝트를 잡아 봅시다.

 

 프로젝트 구조입니다. 루트 폴더에 Dockerfile과 .dockerignore와 requirements.txt가 있습니다. requirements.txt에는 fastapi를 셋팅하고 난 후에, pip freeze > requirements.txt를 이용해서 생성한 것입니다. 다음에 app 패키지가 있는데요. 이 안에 main.py가 있어요.

 

 main.py를 보시면, 이 코드만 있어요. 이는 root_url에 접근했을 때, "Hello fast api"를 리턴해 줍니다.

 

 다음 Dockerfile입니다. 특이 사항은 net-tools와 python3-pip를 설치했다는 점입니다. 그것 외에, 서버를 실행시킬 때, --host는 0.0.0.0으로, --port는 7777로 설정하였습니다. 이것 말고 별다른 점은 딱히 없어 보이네요. net-tools는 netstat을 쓰기 위해 설치하였습니다.

 

 .dockerignore에도 별 내용이 없습니다.

 

 

 이제 fastapi라는 이름으로 build를 해 봅시다. 루트 디렉토리에서 docker build -t fastapi .를 입력합니다.

 

 

 다음에 fastapi를 실행시킵니다. docker run -d fastapi입니다.

 


 내부로 들어가 봅시다. netstat -tnlp 명령어를 입력해 봅시다. 그러면, 7777이라는 포트로 Listen을 하고 있음을 볼 수 있어요.

 

 

 curl http://localhost:7777을 입력해 보겠습니다. 그러면, "Hello fast api" 라는 문구가 리턴됩니다.

 

 

 그런데, 컨테이너 바깥에서 접근하려고 하면, 연결할 수 없다고 뜹니다. 왜 그럴까요?

 


 문서를 보면 그 이유를 알 수 있습니다. default인 경우, docker create나 docker run으로 실행시킨 경우에, 바깥의 세상으로 통하는 port를 만들지 않는다고 되어 있어요. 이를 간략하게 도식화 하면 아래와 같습니다.

 

 

  저는 컨테이너 바깥에서 접근하려고 하고 있어요. 그런데, 바깥에서 fastapi 안으로 연결될 방법이 없어요. 따라서, 컨테이너 내부에서 fastapi 서버가 돌고 있는데도 불구하고 localhost:7777로 접근하려고 하면 접근이 되지 않습니다.

 

 

 docker run을 할 때, -p 옵션을 주면 어떨까요? docker run -d -p 3333:7777 fastapi를 입력하였습니다. 그러면 도커 내부의 7777 포트와 외부의 3333 포트가 연결되는 map을 제공합니다. -p 8080:80에 대한 예제도 밑에 표에 나와 있는데요. 컨테이너 내부의 포트 80이, 호스트의 포트 8080에 맵핑이 됩니다.

 

 이제 -p 3333:7777의 의미는 아래 그림과 같이 도식화 할 수 있습니다.

 

 여기서, host는 제 윈도우를 의미합니다. 이제 localhost:3333으로 접속해 보겠습니다.

 

 "Hello fast api"가 잘 출력됨을 확인할 수 있습니다. 결국, docker run을 할 때 -p (publish) 옵션을 주면 container 내부와 외부 (host)를 연결하는 mapping을 제공한다는 것만 알아두시면 될 듯 싶습니다.