실행 중인 컨테이너에서 docker container exec 명령 사용 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 실행 중인 Docker 컨테이너 내에서 docker container exec 명령을 효과적으로 사용하는 방법을 배우게 됩니다. 먼저 실행을 위해 컨테이너를 시작한 다음, 실행 중인 컨테이너에서 단일 명령을 실행하는 방법과 더 복잡한 상호 작용을 위해 대화형 셸을 시작하는 방법을 살펴보겠습니다.

또한, 이 랩에서는 exec 프로세스에 대한 환경 변수를 설정하고 작업 디렉토리를 지정하여 실행 환경을 사용자 정의하는 방법을 다룹니다. 이를 통해 실행 중인 컨테이너를 관리하고 상호 작용하는 기술을 습득할 수 있습니다.

실행을 위한 컨테이너 시작

이 단계에서는 Docker 컨테이너를 시작하고 그 안에서 명령을 실행하는 방법을 배우게 됩니다. Docker 컨테이너는 애플리케이션과 해당 종속성을 캡슐화하는 가볍고, 이식 가능하며, 자급자족하는 단위입니다.

먼저, Docker Hub 에서 ubuntu 이미지를 가져오겠습니다. 이 이미지는 최소한의 Ubuntu 운영 체제 환경을 포함하고 있습니다.

docker pull ubuntu:latest

이미지가 다운로드되고 있음을 나타내는 출력을 볼 수 있습니다. 다운로드가 완료되면 이 이미지를 기반으로 컨테이너를 시작하고 간단한 명령을 실행할 수 있습니다. echo 명령을 사용하여 메시지를 출력하겠습니다.

docker run ubuntu:latest echo "Hello from Docker container!"

이 명령을 자세히 살펴보겠습니다.

  • docker run: 이것은 새 컨테이너를 생성하고 시작하는 명령입니다.
  • ubuntu:latest: 이것은 컨테이너에 사용할 이미지를 지정합니다. ubuntu는 이미지 이름이고, latest는 가장 최근 버전을 나타내는 태그입니다.
  • echo "Hello from Docker container!": 이것은 컨테이너 내부에서 실행될 명령입니다.

터미널에 Hello from Docker container! 출력이 표시되어야 합니다. 이는 컨테이너가 시작되었고 명령이 성공적으로 실행되었음을 확인합니다.

실행 중인 컨테이너에서 명령어 실행

이전 단계에서는 컨테이너를 시작하고 실행된 후 종료되는 명령을 실행했습니다. 이 단계에서는 이미 실행 중인 컨테이너 내부에서 명령을 실행하는 방법을 배우겠습니다. 이는 실행 중인 컨테이너의 상태를 검사하거나 관리 작업을 수행하는 데 유용합니다.

먼저, 계속 실행될 컨테이너를 시작해 보겠습니다. 다시 ubuntu 이미지를 사용하고 sleep infinity와 같이 컨테이너를 활성 상태로 유지하는 명령을 실행합니다.

docker run -d ubuntu:latest sleep infinity

사용된 옵션을 살펴보겠습니다.

  • -d: 이 옵션은 컨테이너를 분리 모드 (detached mode) 로 실행합니다. 즉, 백그라운드에서 실행되며 터미널을 차단하지 않습니다.
  • sleep infinity: 컨테이너 내부의 이 명령은 무한정 sleep 상태로 유지하여 컨테이너를 계속 실행 상태로 유지합니다.

이제 실행 중인 컨테이너의 컨테이너 ID 를 얻어보겠습니다. docker ps 명령을 사용하여 실행 중인 컨테이너를 나열할 수 있습니다.

docker ps

다음과 유사한 출력을 볼 수 있으며, 실행 중인 컨테이너가 표시됩니다.

CONTAINER ID   IMAGE          COMMAND           CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu:latest   "sleep infinity"   About a minute ago   Up About a minute             <container_name>

출력에서 CONTAINER ID를 복사합니다. 이제 docker exec 명령을 사용하여 이 실행 중인 컨테이너 내부에서 명령을 실행할 수 있습니다. <container_id>를 실제로 복사한 ID 로 바꿉니다.

docker exec / < container_id > ls

이 명령은 지정된 컨테이너 내부에서 ls /를 실행하여 컨테이너 파일 시스템 내의 루트 디렉토리의 내용을 나열합니다. Linux 시스템에서 볼 수 있는 것과 유사한 디렉토리 및 파일 목록이 표시됩니다.

이는 컨테이너를 중지하거나 다시 시작하지 않고 실행 중인 컨테이너에서 명령을 실행하는 방법을 보여줍니다.

실행 중인 컨테이너에서 대화형 쉘 실행

이전 단계에서는 실행 중인 컨테이너에서 단일 명령을 실행했습니다. 종종 문제를 디버깅하거나 파일 시스템을 탐색하기 위해 실행 중인 컨테이너와 더 광범위하게 상호 작용해야 할 수 있습니다. 이 단계에서는 실행 중인 컨테이너 내부에서 대화형 셸 세션을 여는 방법을 배우게 됩니다.

이전 단계에서 시작한 ubuntu 컨테이너를 계속 사용합니다. 컨테이너가 실행 중이지 않은 경우 이전 단계의 명령을 사용하여 다시 시작할 수 있습니다.

docker run -d ubuntu:latest sleep infinity

docker ps를 사용하여 실행 중인 ubuntu 컨테이너의 컨테이너 ID 를 가져옵니다.

docker ps

이제 -it 옵션과 함께 docker exec 명령을 사용하여 컨테이너 내부에서 대화형 터미널 세션을 엽니다. <container_id>를 실행 중인 컨테이너의 실제 ID 로 바꿉니다.

docker exec -it < container_id > bash

새로운 옵션을 살펴보겠습니다.

  • -i: 이 옵션은 연결되지 않은 경우에도 STDIN을 열어 둡니다. 이는 대화형 세션에 필요합니다.
  • -t: 이 옵션은 셸 세션에 필요한 pseudo-TTY 를 할당합니다.
  • bash: 이는 컨테이너 내부에서 실행할 명령이며, 이 경우 Bash 셸입니다.

이 명령을 실행한 후 터미널 프롬프트가 변경되어 현재 컨테이너의 Bash 셸 내부에 있음을 나타냅니다. 이제 컨테이너의 환경 내에서 명령을 실행할 수 있습니다. 예를 들어, 현재 디렉토리의 파일을 나열해 보십시오.

ls

이제 컨테이너의 파일 시스템 및 환경과 직접 상호 작용하고 있습니다. 컨테이너의 셸을 종료하고 호스트 머신의 터미널로 돌아가려면 exit를 입력하기만 하면 됩니다.

exit

이제 원래 터미널 세션으로 돌아가야 합니다. 이 대화형 셸 액세스는 컨테이너를 디버깅하고 관리하는 강력한 도구입니다.

exec 프로세스에 대한 환경 변수 설정

이 단계에서는 docker exec를 사용하여 실행되는 명령에 특정 환경 변수를 설정하는 방법을 배우게 됩니다. 이를 통해 컨테이너의 환경을 영구적으로 수정하지 않고 컨테이너 내부에서 실행되는 프로세스에 구성 또는 기타 정보를 전달할 수 있습니다.

이전 단계에서 실행 중인 ubuntu 컨테이너를 계속 사용합니다. 실행 중이지 않은 경우 다음 명령으로 시작합니다.

docker run -d ubuntu:latest sleep infinity

docker ps를 사용하여 실행 중인 ubuntu 컨테이너의 컨테이너 ID 를 가져옵니다.

docker ps

이제 컨테이너 내부에서 명령을 실행하고 해당 특정 실행에 대한 환경 변수를 설정해 보겠습니다. printenv 명령을 사용하여 환경 변수를 표시합니다. <container_id>를 컨테이너의 ID 로 바꿉니다.

docker exec -e MY_VARIABLE="Hello from LabEx" MY_VARIABLE < container_id > printenv

새로운 옵션을 살펴보겠습니다.

  • -e MY_VARIABLE="Hello from LabEx": 이 옵션은 실행되는 printenv 명령에 대해 값 "Hello from LabEx"를 가진 MY_VARIABLE이라는 환경 변수를 설정합니다.

터미널에 Hello from LabEx가 출력되는 것을 볼 수 있습니다. 이는 환경 변수가 printenv 프로세스에 대해 성공적으로 설정되었음을 확인합니다.

이 환경 변수가 exec 프로세스에 대해서만 설정되고 컨테이너의 주 프로세스에는 설정되지 않음을 보여주기 위해 -e 옵션 없이 printenv MY_VARIABLE을 다시 실행해 보겠습니다.

docker exec MY_VARIABLE < container_id > printenv

이번에는 출력이 없거나, 변수가 설정되지 않았음을 나타내는 오류가 표시될 수 있습니다. 이는 환경 변수가 -e 플래그로 실행된 명령에만 사용 가능했음을 보여줍니다.

docker exec -e를 사용하여 환경 변수를 설정하는 것은 컨테이너 내부에서 실행되는 프로세스에 동적 구성을 전달하는 편리한 방법입니다.

exec 프로세스에 대한 작업 디렉토리 설정

이 마지막 단계에서는 docker exec를 사용하여 실행되는 명령에 대한 작업 디렉토리를 설정하는 방법을 배우게 됩니다. 기본적으로 docker exec는 컨테이너의 구성된 작업 디렉토리 (대개 /) 에서 명령을 실행합니다. -w 옵션을 사용하여 이를 재정의할 수 있습니다.

실행 중인 ubuntu 컨테이너를 계속 사용합니다. 실행 중이지 않은 경우 다음 명령으로 시작합니다.

docker run -d ubuntu:latest sleep infinity

docker ps를 사용하여 실행 중인 ubuntu 컨테이너의 컨테이너 ID 를 가져옵니다.

docker ps

이제 컨테이너 내부에서 현재 작업 디렉토리를 출력하는 명령을 실행해 보겠습니다. pwd 명령을 사용합니다. <container_id>를 컨테이너의 ID 로 바꿉니다.

docker exec < container_id > pwd

ubuntu 이미지의 기본 작업 디렉토리인 /가 출력되는 것을 볼 수 있습니다.

이제 pwd 명령을 다시 실행하지만, 이번에는 -w 옵션을 사용하여 작업 디렉토리를 /tmp로 설정합니다.

docker exec -w /tmp < container_id > pwd

새로운 옵션을 살펴보겠습니다.

  • -w /tmp: 이 옵션은 pwd 명령에 대한 작업 디렉토리를 컨테이너 내부의 /tmp로 설정합니다.

이제 /tmp가 출력되는 것을 볼 수 있습니다. 이는 docker exec로 실행된 명령에 대해 다른 작업 디렉토리를 지정할 수 있음을 보여줍니다. 이는 컨테이너 내의 특정 위치에 있는 파일에서 작동하는 명령을 실행해야 할 때 유용합니다.

이것으로 Docker 컨테이너에서 명령을 실행하는 랩을 마칩니다. 컨테이너를 실행하기 위해 시작하고, 실행 중인 컨테이너에서 명령을 실행하고, 대화형 셸 세션을 열고, 환경 변수를 설정하고, exec 프로세스에 대한 작업 디렉토리를 설정하는 방법을 배웠습니다.

요약

이 랩에서는 docker run을 사용하여 Docker 컨테이너를 시작하고 그 안에서 명령을 실행하는 방법을 배웠습니다. 그런 다음, 활성 컨테이너를 검사하거나 관리하는 데 필수적인 docker container exec 명령을 사용하여 이미 실행 중인 컨테이너 내부에서 명령을 실행하는 것으로 진행했습니다.

또한 실행된 프로세스에 대한 환경 변수를 설정하고 작업 디렉토리를 지정하는 등 docker container exec의 고급 기능을 탐구하여 실행 중인 컨테이너와 상호 작용할 때 더 큰 제어력과 유연성을 제공했습니다.