본문 바로가기

DevOps & Infra/Docker

[Infrastructure/Docker] 튜토리얼 살펴보기#003. 애플리케이션 업데이트하기

이전 포스트에서 예제 프로젝트를 사용하여 도커 파일을 작성하고, 이미지를 생성하였습니다. 도커 파일을 사용하여 생성한 이미지를 컨테이너에서 실행하고, 웹 브라우저에서 Node.js 애플리케이션이 정상적으로 실행되었는지 확인하였습니다.

이번 포스트에서는 예제 프로젝트를 수정하고, 애플리케이션을 업데이트하는 방법에 대해서 알아보도록 하겠습니다.

목표 : "우리의 애플리케이션에서 작업 관리 목록이 비어있을 때 안내문을 변경해달라는 요청이 들어왔습니다. 안내문을 변경하고, 애플리케이션을 업데이트 해야합니다."

소스 파일 수정

프로젝트에서 src/static/js/app.js 파일을 열고, 56번째 라인의 코드를 다음과 같이 수정합니다.

// <p className="text-center">No items yet! Add one above!</p>
<p className="text-center">You have no todo items yet! Add one above!</p>

앞으로 애플리케이션에서 작업 관리 목록이 비어있을 때 "You have no todo items yet! add one above!" 안내 텍스트를 출력합니다.

이미지 생성 및 컨테이너 시작

소스 파일을 수정하였다면, 이제 터미널에서 다음 명령문을 사용하여 이미지를 생성합니다. 명령문은 도커 파일이 위치한 경로에서 실행되어야 합니다.

$ docker build -t getting-started .

 

이어서 컨테이너를 시작합니다. 다음 명령문을 입력하고, 실행 결과를 확인합니다.

$ docker run -dp 3000:3000 getting-started
docker: Error response from daemon: driver failed programming external connectivity on endpoint modest_sanderson (fe9fbe7bac13868d04d28b208b78958c3ec3c94b446c07589e80070228e680b0): Bind for 0.0.0.0:3000 failed: port is already allocated.

튜토리얼을 잘 따라서 진행했다면, 아마 컨테이너가 정상적으로 실행되지 않았을 것입니다. 이전에 시작했던 컨테이너가 이미 3000번 포트 번호를 맵핑하고 있으므로, 중복되는 포트 번호를 호스트에 맵핑 할 수 없습니다.

이 문제를 해결하기 위해서, 이전에 시작했던 컨테이너를 중지하거나 호스트의 다른 포트에 맵핑하는 방법이 있습니다. 우리는 컨테이너를 중지하고, 새로운 컨테이너를 다시 시작하는 방식으로 진행하겠습니다.

오래된 컨테이너 교체

컨테이너를 제거하려면, 먼저 컨테이너를 중지해야 합니다. 터미널에서 다음 명령문을 따라 입력하여 컨테이너를 제거합니다.

$ docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS          PORTS                    NAMES
0e3931232c49   dd98a0f5b5d3             "docker-entrypoint.s…"   25 minutes ago   Up 25 minutes   0.0.0.0:3000->3000/tcp   tender_bose
2878508bb6d4   docker/getting-started   "/docker-entrypoint.…"   14 hours ago     Up 14 hours     0.0.0.0:80->80/tcp       jovial_banach

docker ps 명령문으로 제거하려는 컨테이너의 ID를 확인합니다. PORTS 컬럼에서 실행 중인 프로세스의 포트 번호를 확인하는 등의 방법으로 컨테이너를 찾을 수 있습니다.

$ docker stop [컨테이너 ID]
$ docker rm [컨테이너 ID]

컨테이너 ID를 사용하여 컨테이너를 중지(stop)하고, 이어서 제거(rm)합니다. docker rm 명령문에서 -f 플래그를 추가하면 컨테이너의 중지와 제거를 동시에 처리 할 수 있습니다.

docker rm -f [컨테이너 ID]

마지막으로 소스 파일을 수정하고 생성한 이미지를 사용하여 컨테이너를 다시 시작합니다. 앞서 새로운 이미지를 생성했으므로 다음 명령문을 실행하기만 하면 됩니다.

$ docker run -dp 3000:3000 getting-started

다시 웹 브라우저에 들어가서 다음 URL(http://127.0.0.1:3000/)을 입력합니다. 목표대로 안내문이 잘 수정되었는지 확인합니다.