출처 : https://docs.docker.com/get-started/02_our_app/
Node.js 예제를 활용하여 도커를 시작해보자. JavaScript에 대한 사전 지식이 없더라도 크게 문제가 없을 것이다. 우선 아래의 링크에서 도커 공식문서가 제공하는 github repository를 clone하고 인텔리제이로 열어보자.
docker / getting-started
https://github.com/docker/getting-started
이 예제를 컨테이너 안에서 실행하기 위해서는 우선 도커 이미지가 필요하다. 도커 이미지를 빌드하기 위해서는 Dockerfile이라는 파일이 필요하다. Docker 파일은 텍스트 기반의 이미지 빌드 스크립트이다.
그렇다면 package.json 파일과 같은 경로에 Dockerfile이라는 파일을 하나 만들고 아래와 같이 입력해보자.
이와 같이 Dockerfile을 만들었다면 이미지를 만들기 위해 PowerShell을 키고 Dockerfile이 있는 경로로 이동해보자.
docker build -t getting-started .
명령어를 입력하면 도커 이미지가 빌드된다.
도커 이미지가 빌드되면서 많은 레이어가 다운로드된다. 이는 FROM node:12-alpine
스크립트를 명시했기 때문에 해당 이미지를 다운로드 받았기 때문이다. 그리고 CMD ["node", "src/index.js"]
스크립트는 컨테이너에서 이미지를 실행할 때 실행할 기본 명령어를 명시한 부분이다.
빌드 명령어에서 -t 는 태그 플래그이며 이미지를 찾을 태그를 명시하는 플래그이다. 명령의 끝의 .
는 현재 위치에서 Dockerfile을 찾으면 된다는 의미이다.
그럼 이제는 컨테이너를 실행시켜볼 차례이다. docker run -dp 3000:3000 getting-started
명령어를 입력해보자. 참고로 -d 플래그는 백그라운드에서 실행시키는 플래그이고, -p 플래그는 포트번호를 명시하는 플래그이다.
위와 같이 컨테이너가 실행된 것을 확인했다면, http://localhost:3000 으로 이동하면 실행된 어플리케이션을 확인할 수도 있다.
이렇게 컨테이너에서 동작하는 어플리케이션에 대해 변경사항이 발생했다고 생각해보자. 그렇다면 어떻게 해야할까?
우선 변경사항을 코드에 그대로 적용하고 바로 이미지를 빌드하면 된다. docker build -t getting-started .
명령어를 활용하자.
이미지를 빌드하고 나니 getting-started라는 이미지를 그대로 생성했고, 원래 빌드되어있던 이미지의 이름이 없어졌다.
그리고 docker run -dp 3000:3000 getting-started
명령어로 바로 컨테이너를 실행시키면 에러가 발생한다.
내용을 간략하게 해석해보자면 3000번 포트가 이미 할당되어 있기에 바인딩 에러가 발생했다는 뜻이다. 그렇다면 두 가지 방법이 있을 것 같다. 첫 번째는 다른 포트를 할당받아서 어플리케이션을 구동하는 방법이고 두 번째는 기존의 컨테이너를 삭제하는 방법이다.
docker run -dp 4000:3000 getting-started
명령어를 입력한다. 여기서 -p 플래그 뒤의 포트 바인딩 argument는 [호스트 포트] : [컨테이너 내부 포트]이다. 즉, 4000:3000은 호스트 4000포트에 컨테이너 내부의 3000포트를 바인딩한다는 뜻이다.
이렇게 어플리케이션을 실행시키면 3000포트, 4000포트 둘 다 어플리케이션이 떠있는 것을 확인할 수 있다.
4000포트에는 변경사항이 적용된 것도 확인할 수 있다.
우선 구동 중인 컨테이너들을 확인하고 삭제할 컨테이너를 찾아야 할 것이다. docker ps
명령어로 구동 중인 컨테이너 리스트를 조회해보자.
각 컨테이너마다 가지고 있는 아이디로 컨테이너를 삭제할 수 있다. 우선 컨테이너 실행을 멈추어야 삭제가 가능하다. docker stop [container_id]
명령어로 실행을 멈출 수 있다. 이 때 컨테이너 아이디는 모두 다 입력할 필요는 없고 앞자리만 일부 입력해도 알아서 컨테이너를 찾아준다.
그리고 멈춘 컨테이너를 docker rm [container_id]
명령어로 삭제한다.
그렇다면 이제 변경 사항이 적용된 어플리케이션을 다시 run 해보자. 명령어는 docker run -dp 3000:3000 getting-started
이다.
내가 원하는 3000번 포트에 변경사항이 적용된 어플리케이션이 제대로 동작하는 것을 확인할 수 있다!