Docker 컨테이너 실행 모드 완벽 가이드: Attached vs Detached

GoGoComputer·2024년 9월 27일

docker kubernetes study

목록 보기
5/7

Docker는 컨테이너와 이미지를 관리하는 데 사용되는 강력한 도구입니다. 하지만 Docker 명령어로 할 수 있는 일은 그것보다 훨씬 더 많습니다. 이번에는 Docker에서 컨테이너를 실행하고 관리하는 다양한 방법에 대해 자세히 알아보겠습니다.

Docker 컨테이너 실행 모드: Attached vs Detached

Docker에서 컨테이너를 실행할 때 두 가지 주요 모드가 있습니다:

  1. Attached 모드: 컨테이너의 표준 입력(stdin), 표준 출력(stdout), 표준 오류(stderr)에 현재 터미널이 직접 연결됩니다. 이는 컨테이너 내부에서 발생하는 모든 로그나 출력이 터미널에 직접 표시된다는 것을 의미합니다.

  2. Detached 모드: 컨테이너는 백그라운드에서 실행되며 터미널은 즉시 다음 명령을 입력할 수 있는 상태가 됩니다. 이 모드에서는 컨테이너의 출력이 터미널에 표시되지 않습니다.

기본 동작

  • docker run: 기본적으로 Attached 모드로 컨테이너를 실행합니다. 이는 컨테이너가 실행되는 동안 터미널이 해당 프로세스에 "붙어" 있다는 것을 의미합니다.
  • docker start: 기본적으로 Detached 모드로 중지된 컨테이너를 다시 시작합니다. 터미널은 컨테이너를 시작한 후 즉시 다음 명령을 받을 준비가 됩니다.

Attached 모드의 예

터미널에서 다음 명령을 실행해 보겠습니다:

docker run -p 8000:3000 my_image
  • 여기서 -p 8000:3000은 로컬 머신의 포트 8000을 컨테이너의 포트 3000에 매핑합니다.
  • my_image는 실행하려는 Docker 이미지를 의미합니다.
  • 이 명령을 실행하면 터미널은 컨테이너의 출력과 로그를 직접 표시하게 됩니다.
  • 컨테이너 내부에서 어떤 이벤트(예: 새로운 목표 설정)가 발생하면 해당 내용이 터미널에 즉시 표시됩니다.

하지만 이 모드에서는 터미널이 해당 프로세스에 묶여 있으므로 다른 명령을 입력하거나 실행할 수 없습니다. 컨테이너를 중지하려면 Ctrl + C를 눌러야 합니다.

Detached 모드의 예

이번에는 Detached 모드로 컨테이너를 실행해 보겠습니다:

docker run -d -p 8000:3000 my_image
  • -d 플래그를 추가하여 컨테이너를 Detached 모드로 실행합니다.
  • 이 경우 컨테이너는 백그라운드에서 실행되며 터미널은 즉시 다음 명령을 입력할 수 있는 상태가 됩니다.
  • 하지만 컨테이너의 출력이나 로그는 터미널에 표시되지 않습니다.

Detached 모드의 장점은 다음과 같습니다:

  • 여러 컨테이너를 동시에 실행하고 관리할 수 있습니다.
  • 터미널을 차단하지 않으므로 다른 작업을 계속할 수 있습니다.

실행 중인 컨테이너 확인

컨테이너가 실행 중인지 확인하려면 다음 명령을 사용합니다:

docker ps

이 명령은 현재 실행 중인 모든 컨테이너의 목록을 표시합니다.

컨테이너 로그 확인

Detached 모드로 실행된 컨테이너의 로그를 보고 싶다면 docker logs 명령을 사용합니다.

  1. 컨테이너 ID 또는 이름 확인:

    docker ps

    이 명령을 통해 컨테이너의 ID와 이름을 확인할 수 있습니다.

  2. 로그 확인:

    docker logs [컨테이너_ID_또는_이름]

    예:

    docker logs eloquent_brown

    이 명령은 해당 컨테이너에서 발생한 모든 이전 로그를 표시합니다.

  3. 실시간 로그 확인:

    로그를 실시간으로 모니터링하려면 -f (follow) 옵션을 사용합니다.

    docker logs -f [컨테이너_ID_또는_이름]

    이 명령은 컨테이너에서 생성되는 새로운 로그를 지속적으로 표시합니다.

실행 중인 컨테이너에 다시 연결하기

이미 실행 중인 컨테이너에 다시 연결하여 직접 상호 작용하고 싶다면 docker attach 명령을 사용합니다.

docker attach [컨테이너_ID_또는_이름]
  • 이 명령을 실행하면 해당 컨테이너의 표준 입력, 출력, 오류에 다시 연결됩니다.
  • 이제 컨테이너에서 발생하는 모든 출력이 터미널에 직접 표시됩니다.
  • 컨테이너 내부에서 상호 작용이 필요한 경우 유용합니다.

컨테이너 중지 및 재시작

컨테이너 중지

컨테이너를 중지하려면 다음 명령을 사용합니다:

docker stop [컨테이너_ID_또는_이름]

컨테이너가 정상적으로 중지되기까지 몇 초가 걸릴 수 있습니다.

컨테이너 재시작

중지된 컨테이너를 다시 시작하려면 docker start 명령을 사용합니다.

docker start [컨테이너_ID_또는_이름]
  • 기본적으로 docker start는 Detached 모드로 컨테이너를 시작합니다.

  • 컨테이너를 Attached 모드로 시작하고 싶다면 -a 옵션을 추가합니다:

    docker start -a [컨테이너_ID_또는_이름]

    이렇게 하면 컨테이너의 출력이 터미널에 직접 표시되며, 컨테이너와 직접 상호 작용할 수 있습니다.

포트 충돌 해결

이미 특정 포트를 사용 중인 컨테이너가 있는 경우 동일한 포트를 다른 컨테이너에서 사용할 수 없습니다. 이 문제를 해결하려면 다른 로컬 포트에 컨테이너를 바인딩하면 됩니다.

예를 들어, 첫 번째 컨테이너가 포트 3000을 사용 중이라면, 두 번째 컨테이너는 다음과 같이 다른 포트를 사용합니다:

docker run -d -p 8000:3000 my_image
  • 이 명령은 로컬 머신의 포트 8000을 컨테이너의 포트 3000에 매핑합니다.
  • 이제 브라우저에서 localhost:8000으로 접근하여 두 번째 컨테이너에 접속할 수 있습니다.

정리

  • Attached 모드: 컨테이너의 출력과 로그를 실시간으로 보고 직접 상호 작용할 수 있습니다. 하지만 터미널이 해당 프로세스에 묶여 다른 작업을 할 수 없습니다.
  • Detached 모드: 컨테이너는 백그라운드에서 실행되며 터미널은 즉시 다음 명령을 입력할 수 있습니다. 그러나 컨테이너의 출력은 기본적으로 볼 수 없습니다.
  • docker logs: Detached 모드로 실행된 컨테이너의 로그를 확인할 때 사용합니다. -f 옵션으로 실시간 로그를 모니터링할 수 있습니다.
  • docker attach: 실행 중인 컨테이너에 다시 연결하여 직접 상호 작용할 수 있습니다.
  • docker stop/start: 컨테이너를 중지하고 다시 시작할 때 사용합니다. docker start-a 옵션을 사용하여 Attached 모드로 시작할 수 있습니다.

Docker에서 컨테이너를 효과적으로 관리하려면 이러한 개념과 명령어를 이해하는 것이 중요합니다. 이를 통해 컨테이너의 실행 모드를 적절히 선택하고 필요에 따라 컨테이너와 상호 작용할 수 있습니다.

추가 팁

  • 컨테이너 이름 지정: 컨테이너를 생성할 때 --name 옵션을 사용하여 알아보기 쉬운 이름을 지정할 수 있습니다.

    docker run -d -p 8000:3000 --name my_container my_image
  • 컨테이너 삭제: 더 이상 필요하지 않은 컨테이너를 삭제하려면 다음 명령을 사용합니다:

    docker rm [컨테이너_ID_또는_이름]

    실행 중인 컨테이너를 삭제하려면 먼저 중지해야 합니다.

  • 이미지 목록 확인:

    docker images

    이 명령은 로컬에 저장된 모든 Docker 이미지를 표시합니다.

  • 이미지 삭제:

    docker rmi [이미지_ID_또는_이름]

    더 이상 필요하지 않은 이미지를 삭제하여 디스크 공간을 확보할 수 있습니다.

마무리

Docker는 개발자와 시스템 관리자에게 유연하고 강력한 환경을 제공합니다. 컨테이너의 실행 모드와 관리 방법을 잘 이해하면 애플리케이션의 배포와 테스트를 더욱 효율적으로 수행할 수 있습니다. 이 가이드를 통해 Docker의 기본 개념과 명령어를 익히고, 실제 환경에서 적용해 보시기 바랍니다.

profile
IT를 좋아합니다.

0개의 댓글