첫 번째 서비스 실행

DockerBeginner
지금 연습하기

소개

현대 소프트웨어 개발에서 컨테이너는 애플리케이션을 패키징하고 배포하는 일반적인 방법이 되었습니다. 컨테이너는 완전한 가상 머신이 아닙니다. 호스트 커널을 공유하지만, 자체 파일 시스템 뷰와 네트워크 설정을 사용하는 격리된 프로세스 환경에서 애플리케이션을 실행합니다.

이 실습에서는 실제 애플리케이션인 Nginx 웹 서버를 실행하며 Docker 를 처음 사용해 봅니다. 많은 컨테이너는 한 번 실행하고 끝나는 명령이 아닙니다. 장시간 실행되는 서비스로 동작하므로 수명 주기를 이해해야 합니다.

이는 hello-world 예제와 중요한 차이점입니다. 시작한 뒤 메시지를 출력하고 종료되는 컨테이너와 달리, 이제는 주 프로세스가 실행되는 동안 계속 유지되는 서비스 컨테이너를 다룹니다.

다음 작업을 수행하는 방법을 배웁니다.

  • 백그라운드 (분리 모드) 에서 컨테이너를 시작합니다.
  • 실행 중인 컨테이너의 상태를 확인합니다.
  • 작업을 마친 컨테이너를 중지합니다.
  • 시스템 리소스를 확보하기 위해 컨테이너를 삭제합니다.

이 실습을 마치면 Docker 컨테이너의 전체 수명 주기인 생성, 실행, 중지, 삭제를 이해하게 됩니다.

백그라운드에서 웹 서버 실행

이 단계에서는 Nginx 웹 서버를 실행합니다.

터미널에서 명령을 실행하면 일반적으로 명령이 끝날 때까지 화면을 차지합니다. 하지만 웹 서버와 같은 서비스는 계속 실행되어야 하므로, 다른 작업을 위해 터미널을 계속 사용할 수 있도록 백그라운드에서 실행하는 것이 좋습니다. Docker 에서는 이를 "분리 모드 (detached mode)"라고 합니다.

-d 플래그를 사용하면 컨테이너가 분리 모드로 실행됩니다. 또한 --name 플래그를 사용해 기억하기 쉬운 특정 이름을 컨테이너에 지정합니다.

분리 모드는 컨테이너가 수행하는 작업을 바꾸지 않습니다. 터미널이 컨테이너에 연결되는 방식을 바꿉니다. 서비스는 계속 실행되지만 셸 프롬프트는 즉시 다시 표시됩니다.

다음 명령을 실행해 my-nginx라는 이름의 Nginx 컨테이너를 시작합니다.

docker run --name my-nginx -d nginx

명령 분석:

  • docker run: 새 컨테이너를 생성하고 시작하는 명령입니다.
  • --name my-nginx: 컨테이너에 my-nginx라는 이름을 지정합니다. 이 옵션을 생략하면 Docker 가 happy_hopper와 같은 임의의 이름을 지정합니다.
  • -d: 컨테이너를 분리 모드 (백그라운드) 로 실행합니다.
  • nginx: 사용할 이미지입니다. Docker 는 먼저 로컬에서 이미지를 찾고, 없으면 Docker Hub 에서 다운로드합니다.

출력 결과:

터미널에 긴 문자열이 표시됩니다. 이것은 컨테이너 ID입니다. 명령 프롬프트가 즉시 다시 표시되면 컨테이너가 백그라운드에서 실행 중이라는 뜻입니다.

컨테이너 ID 는 Docker 내부에서 사용하는 식별자이고, 컨테이너 이름은 사람이 사용하기 쉬운 레이블입니다. 일반적인 작업에서는 긴 ID 보다 이름을 사용하는 편이 더 편리합니다.

컨테이너 상태 확인

컨테이너를 실행했으므로 예상대로 실행 중인지 확인해야 합니다. docker ps 명령은 현재 활성 상태인 모든 컨테이너를 나열합니다.

다음 명령을 실행합니다.

docker ps

다음과 비슷한 출력이 표시됩니다.

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS      NAMES
a1b2c3d4e5f6   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 10 seconds   80/tcp     my-nginx

출력 이해하기:

  • CONTAINER ID: 이 컨테이너의 고유 ID 입니다. 앞에서 본 긴 문자열을 줄여 표시한 값입니다.
  • IMAGE: 실행 중인 이미지입니다 (nginx).
  • STATUS: Up은 컨테이너가 정상적으로 실행 중임을 나타냅니다.
  • NAMES: 지정한 컨테이너 이름입니다 (my-nginx).

이 항목이 표시되면 웹 서버가 백그라운드에서 정상적으로 실행 중인 것입니다.

docker ps 출력은 Docker 운영 작업에서 주로 확인하는 정보 중 하나입니다. 현재 활성 상태인 컨테이너, 컨테이너가 생성된 이미지, 실행된 시간을 확인할 수 있습니다.

서비스 중지

서비스 사용을 마쳤거나 서비스를 다시 구성해야 할 때는 실행 중인 컨테이너를 중지해야 합니다.

docker stop 명령은 컨테이너에 종료 신호를 보내 정상적으로 종료하도록 합니다. 컨테이너 ID 또는 이름을 사용해 컨테이너를 지정할 수 있습니다. 컨테이너 이름을 my-nginx로 지정했으므로 여기서는 이름을 사용합니다.

정상적인 중지가 중요한 이유는 많은 서비스가 파일을 닫고, 포트를 해제하고, 처리 중인 작업을 마무리할 시간이 필요하기 때문입니다. 컨테이너 중지는 단순히 "전원을 끄는" 작업이 아니라 주 프로세스에 정상적으로 종료하도록 요청하는 작업입니다.

다음 명령을 실행합니다.

docker stop my-nginx

명령이 전달되었음을 확인하기 위해 터미널에 my-nginx가 표시됩니다.

중지되었는지 확인합니다.

docker ps를 다시 실행합니다. 목록이 비어 있거나 my-nginx가 목록에 표시되지 않아야 합니다.

컨테이너가 중지되었지만 아직 존재하는지 확인하려면 -a(all) 플래그를 사용합니다.

docker ps -a

이제 상태가 Exited인 my-nginx가 목록에 표시됩니다.

리소스 정리

컨테이너를 중지해도 컨테이너가 삭제되지는 않습니다. 컨테이너는 디스크에 남아 로그와 설정을 보존합니다. 나중에 docker start로 다시 시작하려는 경우 유용합니다.

기억해야 할 또 하나의 수명 주기 구분은 생성/실행, 중지, 삭제가 서로 별도의 작업이라는 점입니다. Docker 는 컨테이너를 삭제하기 전에 검사하거나 다시 시작할 수 있도록 이러한 상태를 분리해 관리합니다.

하지만 컨테이너 사용을 완전히 마쳤다면 시스템을 깔끔하게 유지하기 위해 컨테이너를 삭제해야 합니다. docker rm 명령은 중지된 컨테이너를 삭제합니다.

다음 명령을 실행해 my-nginx를 삭제합니다.

docker rm my-nginx

삭제가 완료되었음을 확인하기 위해 터미널에 my-nginx가 표시됩니다.

최종 확인:

docker ps -a를 마지막으로 한 번 실행합니다. 이제 컨테이너가 완전히 사라진 것을 확인할 수 있습니다.

참고: 일반적으로 실행 중인 컨테이너는 docker rm으로 삭제할 수 없습니다. 먼저 컨테이너를 중지해야 합니다 (이 실습에서 수행한 방법). 또는 -f(force) 플래그를 사용할 수 있지만, 정상적으로 중지하는 방법이 권장됩니다.

요약

이 실습에서는 Docker 컨테이너의 전체 수명 주기를 성공적으로 관리했습니다. 다음 작업을 수행하는 방법을 배웠습니다.

  • docker run -d를 사용해 백그라운드 서비스를 실행합니다.
  • docker ps를 사용해 활성 컨테이너의 상태를 확인합니다.
  • docker stop을 사용해 서비스를 정상적으로 중지합니다.
  • docker rm을 사용해 중지된 컨테이너를 삭제하고 리소스를 확보합니다.

이 네 가지 명령은 Docker 사용자가 일상적으로 가장 많이 사용하는 명령입니다. 이제 실행 중인 컨테이너와 더 깊이 상호 작용하는 방법을 살펴볼 준비가 되었습니다.