본문 바로가기
[DevOps]/Docker

Docker - 컨테이너 내부 포트를 노출시키는 방법과 이미지 레이어 이해하기

by 팡펑퐁 2023. 6. 6.
728x90
💡 Dockerfile에서 EXPOSE 80이라고 명시하는 것은 선택 사항이며 실제로 80번 포트를 노출시키지 않는다는 것을 끝으로 지난 글을 마무리했었다. 이번에는 실제 컨테이너 내부의 포트를 외부로 노출시키는 방법과 이미지 레이어에 대해 알아보려고 한다.

 

 

도커 이미지 빌드 명령어

docker build .
docker build -t <imageName>:<Tag> .
  • "."을 입력하면 도커에게 이 명령을 실행하는 곳과 동일한 폴더에 Dockerfiler이 존재함을 알린다.
  • 아래는 커스텀 이미지 생성 시 사용한다.

 

빌드 과정

  • 빌드를 진행하면 빌드 과정이 터미널 창에 나온다.

 

 

포트 연결을 포함한 컨테이너 실행

docker run -p (로컬 머신 포트):(도커 컨테이너 내부 포트) (image 이름)
  • 이미지 이름 앞에 -p 플래그를 넣는다.
  • -p 플래그의 p는 publish를 나타낸다. 
  •  이를 통해 도커에게 연결할 로컬 포트를 알려줄 수 있다.
  • -p 플래그 다음에 나오는 콜론(:)을 기준으로 왼쪽에는 로컬 머신의 포트 번호를 입력한다.
  • 오른쪽에는 도커 컨테이너 내부에서 외부로 노출할 포트를 넣는다.

 

예를 들어,

docker run -p 3000:80 (image 이름)

은 로컬 포트 3000과 도커 컨테이너 내부 포트 80번을 연결함을 뜻한다.

 

  • 즉 로컬에서 localhost:3000번으로 접속하면 도커 내부의 80번 포트로 연결된다.

 

 

컨테이너 검색

docker ps
  • 실행중인 컨테이너를 검색한다.

 

 

컨테이너 중지

docker stop (컨테이너 이름)
  • 실행 중인 컨테이너를 중지시킨다.
  • 컨테이너 이름은 docker ps 명령어로 찾을 수 있다.

 

 

레이어 기반 아키텍처

  • 이미지를 빌드하거나 재빌드할 때 변경된 부분이 발견되면 변경된 부분의 명령과 그 이후의 모든 명령이 재스캔 된다.

 

처음 빌드 시 화면(docker build .)

 

두 번째 빌드 시 화면(docker build .)

 위 사진을 통해 도커는 기본적으로 모든 명령어에 대해 재실행했을 때 결과가 전과 동일하다는 것을 인식하고 있음을 확인할 수 있다. 이는 작업 디렉터리나 소스 코드가 전혀 변경되지 않았고, 새 파일이 추가되지도 않았으므로 명령을 다시 거칠 필요가 없다고 도커 내부적으로 추론한 것으로 보인다. 따라서 모든 명령 결과를 캐시하고 있다가 재빌드시에 명령어를 재실행할 필요가 없다고 판단하면 캐시 해놓은 결과를 사용한다. 이를 레이어 기반 아키텍처라고 한다.

 

 여기서 중요한 부분이 있다. 도커는 복사해야 할 파일을 스캔할 때 변경 사항이 없으면 캐시를 사용하지만, 파일 변경을 감지하면 그 이후의 모든 파일은 다시 복사가 된다. 이는 빌드 순서에 따라 불필요한 재빌딩이 일어날 수 있다는 이야기이며, 이미지 생성 속도가 빌드 순서에 따라 다르게 된다는 말이다. 실습에서 사용하는 Dockerfile을 다시 보자.

 

 프로그램의 종속성을 관리하는 package.json에서 무언가를 변경하지 않는 한 npm install을 다시 실행할 필요가 없어 보인다. 단순히 소스 코드에 변화를 준 상황에서는 이미지를 새로 빌드할 때 굳이 npm install까지 다시 실행할 필요가 없다는 뜻이다. 이를 고려하여 최적화의 포인트를 찾을 수 있다.

 

 기존에는 도커 파일을 제외한 모든 파일 및 폴더를 복사하고 나서 npm install을 진행했지만, 새로 최적화한 부분을 보면 npm install을 실행하기 전에 package.json 파일을 복사하고 이후에 npm install을 실행한 다음 다른 코드를 복사하는 순서로 바뀌었다. 즉, 소스 코드를 복사하기 전에 npm install 레이어를 먼저 만듦으로써 소스 코드 변경이 있을 때마다 npm install을 재실행하는 불필요한 부분을 없앴다. 

 

 소스 코드만 변경한 상태로 재빌드를 하게 되면 도커가 package.json 파일이 변경되지 않았음을 확인한다. npm install 이전 단계가 변경되지 않았기 때문에 캐시를 사용하게 되어 npm install을 다시 실행하지 않는다. 이후에 변경된 소스 코드를 감지하여 재빌딩이 일어나므로 필요한 부분만 재빌딩이 이뤄지게 되었다.

 

 이 실습은 간단하지만 꼭 필요한 최적화 방식을 쉽게 알려주며, 레이어 기반 아키텍처를 이해하는 데 좋은 예라고 생각한다.

 

 

 

참고

Udemy - Docker & Kubernetes : 실전가이드

728x90