DEV-STUDY/Infra

도커 이미지 실행하기

HwangJerry 2023. 7. 22. 11:10

앞서 docker build ./ 명령어를 이용하여 Dockerfile을 이미지로 생성해봤는데요. 이번에는 그 이미지를 실행해 보도록 하겠습니다.

 

실행시에 아웃풋을 보기 위해선 it 옵션을 활용해야 합니다.

docker run -it <이미지 아이디/이름>

 

위와 같이 이미지 아이디로도 실행이 가능하지만, 우리는 이미지 아이디를 매번 기억하고 있기 어렵기 때문에 이미지 빌드를 할 때에도 이름을 설정해주곤 합니다. 따라서 아래와 같이 보통 실행합니다.

 

여기서 이미지 아이디를 이용하여 실행하려고 할 때에는 이미지 아이디를 한 글자도 빠짐없이 전부 기입하지 않고 일부만 해 주어도 도커가 인식만 가능하다면 자동으로 사용자의 의도에 맞는 이미지 아이디를 찾아서 실행시켜 줍니다.

 

그런데,

위 과정까지만 하면 분명 실행되는 것처럼 나오는데, 정작 브라우저로 localhost:8080 과 같이 접근할 때 접근이 되지 않는 것을 알 수 있습니다.

 

이미지 단순 실행시 localhost:포트번호로 접근이 되지 않는 이유

우리가 알기로는 이 또한 로컬 환경에서 결국 jar 파일을 실행한 것이므로, 브라우저를 통해 localhost:포트번호 로 접근하면 서버에 접근이 되어야하는데, 접근이 되지 않는 것을 볼 수 있습니다.

어찌된 일인지 한번 같이 확인해봅시다.

 

포트 포워딩

우리는 도커파일을 작성할 때, 로컬에 있는 파일들을 컨테이너에 복사해주어서 이미지를 빌드했던 경험이 있습다. 이것과 비슷하게 네트워크도 로컬 네트워크에 있던 것을 컨테이너 내부에 있는 네트워크와 연결을 시켜주어야 합니다. 컨테이너 내에서는 jar파일을 빌드할 때 제가 설정한 포트번호(ex. 8081)로 실행되고 있지만, 이는 우리가 컨테이너에 접속하는 포트를 설정한 게 아니기 때문에, 컨테이너에 접속하는 포트와 컨테이너 내의 어플리케이션 프로세스가 돌고 있는 포트를 연결해주어야 합니다. 이는 네트워크 개념 중 포트포워딩에 해당합니다.

 

이를 위한 명령어는 docker run -p <요청할 포트번호>:<컨테이너 내부 어플리케이션 포트번호> <이미지 아이디/이름> 입니다.

 

저는 우리 브라우저에서 5000번으로 접속하면 도커 컨테이너 내부에 제가 설정한 8081 포트에 실행되는 자바 어플리케이션으로 포워딩되게끔 실행하고 접속해 보겠습니다.

위처럼 스프링 어플리케이션이 아주 잘 동작하는 것을 확인할 수 있었고, 정해진 경로로 접근하면 "hello"가 반환되게 설정해 두었는데, 아래와 같이 잘 동작하는 것을 확인할 수 있었습니다.

만약 docker run을 실행할 때 위처럼 컨테이너 터미널에 잔여하지 않고, 로컬 터미널에 머무르고 싶다면 -d 옵션을 적용해주면 됩니다.

 

  • docker run -d -p <로컬에서 접속할 포트번호>:<컨테이너 내에 어플리케이션이 실행되는 포트번호>

위 명령어 중 -d 옵션은 컨테이너를 실행한 뒤에 바로 그 터미널을 빠져나오게 하는 옵션입니다. 따라서 우리가 docker로 jar 파일을 실행할 때 -d 옵션이 없으면 도커 컨테이너 내부의 터미널에서 spring framework가 실행되는 로그를 확인할 수 있었는데, 그 터미널에 남아있지 않고 바로 나오게 되는 걸 볼 수 있습니다.

-> 이는 백그라운드 실행이라고 이해해도 그 현상이 동일하기 때문에 무방할 것 같습니다.