Docker Exec: Docker에서 명령 실행하는 데 사용하는 명령


Docker 컨테이너 내부에서 무슨 일이 일어나고 있는지 확인해야 할 때가 있을까요? 컨테이너는 동일성을 유지해야 합니다: 문제가 발생하면 새로운 컨테이너를 배포하세요. 하지만 현실은 항상 간단하지 않습니다. 문제를 식별하려면 컨테이너 내에서 명령을 실행해야 할 때가 있습니다. 이때 docker exec 명령이 도움이 될 수 있습니다.

이 문서에서는 docker exec 명령을 사용하여 실행 중인 Docker 컨테이너에서 명령을 실행하는 방법을 알려드립니다.

사전 준비

이 문서의 예제를 따라하려면 다음 사항을 준수해야 합니다.

  • Windows, Linux 또는 macOS에서 작동하는 Docker Desktop의 최신 버전. 이 튜토리얼은 Windows 10에서 실행되는 v3.1.0을 사용합니다.

NGINX 컨테이너 시작

Docker exec은 컨테이너 내에서 명령을 실행합니다. 하지만 그 전에 명령을 실행할 컨테이너가 필요합니다. Docker 이미지를 다운로드하고 데모 컨테이너를 생성하는 것부터 시작해봅시다.

  1. 새 디렉토리를 생성하세요. 이 튜토리얼에서는 C:\gitrepos\test를 사용합니다.

2. 파일을 생성하십시오. 이름은 dockerfile (확장자 없음)이며, 다음 코드를 포함하고 있습니다. 이 Dockerfile은 컨테이너를 생성하는 데 필요한 단계를 정의합니다.

FROM nginx:alpine
 COPY index.html /usr/share/nginx/html/index.html

3. 그 다음으로, 동일한 디렉토리에 index.html이라는 이름의 파일을 만들어 다음 코드를 포함하십시오. 이 HTML 파일은 컨테이너가 시작되면 Hello World 메시지를 표시합니다.

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <meta http-equiv="X-UA-Compatible" content="ie=edge"> 
    <title>Hello World - Nginx Docker</title> 
    <style> 
       h1{ font-weight:lighter; font-family: Arial, Helvetica, sans-serif; 
       } 
    </style> 
    </head> 
    <body> 
       <h1> 
          Hello World 
       </h1> 

    </body> 
    </html>

4. 이제 Nginx Docker 컨테이너를 만들어보겠습니다. Dockerfile이 현재 작업 디렉토리에 있기 때문에 Docker 엔진이 그곳을 찾도록 .로 지정하십시오. 또한 미래에 쉽게 참조할 수 있도록 t 매개변수를 사용하여 컨테이너에 my-nginx 태그를 지정하십시오.

docker build -t my-nginx .
Creating a Docker container with the build command.

5. 이제 컨테이너가 빌드되었으므로 Docker run 명령을 사용하여 컨테이너를 시작하십시오.

# rm - Docker에 컨테이너를 정지한 후 삭제하도록 지시 
# d - 명령이 실행된 후 명령 줄 제어를 반환 
# p - 내부 컨테이너 포트 80을 외부 포트 80에 매핑 docker run --rm -d -p 80:80 my-nginx
Start the container with the Docker run command.

6. 마지막으로 웹 브라우저를 열고 http://localhost/로 이동하여 다음을 확인하십시오.

Output of the running NGINX container.

Docker Exec를 사용한 명령 실행

도커 컨테이너에서 명령을 실행할 때 대화식으로 명령을 실행해야 할 수도 있습니다. 대화식으로 명령을 실행하는 것은 명령을 입력하고 피드백을 받은 다음 다른 명령을 입력하는 것을 의미합니다. 대화식 명령은 세션을 점유하고 다른 작업을 할 수 없게 만듭니다.

그러나 이미 컨테이너로 보낼 명령을 미리 알고 있고 백그라운드에서 명령을 실행하려는 경우에는 어떻게 해야 할까요? 그런 경우에는 비대화식 명령을 실행할 수 있습니다. 비대화식 명령을 사용하면 Docker에 명령을 보낼 수 있고 즉시 콘솔의 제어를 반환합니다.

컨테이너 이름 및 ID 찾기

이제 컨테이너를 빌드했으므로 컨테이너 내에서 명령을 실행할 수 있습니다. 명령을 실행하기 전에 NGINX 컨테이너의 이름 또는 ID를 찾으세요. 이름 또는 ID 중 하나가 Docker 명령에서 작동합니다. 그것을 기억하는 것은 이름보다 더 어려울 수 있습니다!

실행 중인 컨테이너 정보를 표시하려면 다음 정보를 출력하기 위해 Docker ps 명령을 실행하세요.

docker ps
Displaying running Docker containers.

고유한 ID인 e17e4b6be01a 또는 임의로 생성된 이름 mystifying_chandrasekhar 중 하나를 클립보드에 복사하여 나중에 사용하세요.

Docker Exec를 사용하여 비대화식 명령 실행

비대화식 명령을 실행하는 예로, 아래 명령을 복사하여 /var/log 디렉토리에 있는 파일 목록을 ls -l 명령으로 반환합니다. 컨테이너 이름인 mystifying_chandrasekhar 이후의 모든 것을 Docker exec 명령에 전달하세요.

docker exec mystifying_chandrasekhar ls -l /var/log
Executing a directory listing within the NGINX container.

도커 명령어로 콘솔 출력 피하기

대규모 작업은 사용자에게 즉시 쉘 제어를 반환하여 콘솔을 차지하지 않게 합니다. 분리된 d 옵션으로 콘솔 출력을 포기하세요. 아래 명령은 컨테이너 내에서 touch 명령을 사용하여 파일 /tmp/execWorks를 생성하며 콘솔에 출력을 표시하지 않습니다.

docker exec -d mystifying_chandrasekhar touch /tmp/execWorks

도커 Exec로 대화형 명령 실행하기

지금까지 도커 컨테이너에서 비대화형 명령을 실행하는 방법을 배웠습니다. 그러나 컨테이너를 문제 해결해야 할 때(예: 컨테이너에 대화형 명령을 발행해야 할 때), 명령을 대화형으로 실행해야 할 수 있습니다. 그런 경우 명령을 대화형으로 실행해야 합니다.

docker exec를 사용하여 대화형으로 명령을 실행하려면 두 가지 옵션이 필요합니다. i 옵션은 STDIN을 열어 컨테이너로 명령을 보낼 수 있게 하고, t 옵션은 명령을 입력할 수 있는 가상 터미널(pseudo-TTY (PTY)) 통신 채널을 할당합니다.

다음 명령을 복사하여 실행 중인 도커 컨테이너에 대한 대화형 명령 프롬프트를 엽니다. 셸은 Bourne (sh) 셸로 변경되며 프롬프트가 / #로 표시됩니다.

docker exec -it mystifying_chandrasekhar sh
Running an interactive Docker shell.

셸에 들어간 후 컨테이너 내에서 파일 목록을 나열하는 명령을 실행합니다. 마지막으로 exit 명령을 실행하여 대화형 셸을 종료합니다.

ls -l /var/log
exit
Open an interactive command prompt to the container.

특정 디렉토리에서 대화형 프롬프트를 열려면 Docker에게 지정된 디렉토리에서 셸을 시작하도록 알려주는 w 옵션에 경로를 전달하십시오.

실행 중인 컨테이너에 환경 변수 전달

많은 프로그램은 시작할 때 환경 변수를 설정하는 데 사용됩니다. 예를 들어, 대부분의 Java 애플리케이션은 Java 경로로 설정된 JAVA_HOME 환경 변수가 필요합니다.

e 옵션을 사용하여 세션에 환경 변수를 전달할 수 있습니다. 예를 들어 실행 중인 컨테이너에 MYVAR라는 환경 변수를 채워 넣어야 할 수도 있습니다. 이를 위해 아래에 표시된 대로 e 옵션을 사용하고 MYVAR="<some value>"와 같은 키/값 쌍을 제공하십시오.

docker exec -it -e MYVAR="hello" mystifying_chandrasekhar sh
echo $MYVAR
Pass environment variables

파일로 환경 변수 전달

많은 환경 변수나 공유 구성이 있는 경우 해당 변수를 파일에 저장하는 것이 더 쉬울 수 있습니다. 파일을 Docker에 상대 경로나 절대 경로로 전달하고 --env-file 옵션을 사용하십시오. 이 기술은 종종 컨테이너에 안전한 자격 증명을 제공하는 데 사용됩니다. 버전 관리에 자격 증명을 커밋하지 않도록 주의하십시오!

env-vars.txt라는 텍스트 파일을 만들어 전달할 환경 변수와 그 값들을 입력하십시오. 이 파일의 이름은 원하는 대로 지정할 수 있으며 .txt 파일 확장자가 필요하지 않습니다.

Text file with environmental variables defined.

env-file 옵션을 사용하여 Docker에 환경 변수를 전달하십시오. 아래 스크린샷에서와 같이 변수가 사용 가능한지 echo 명령으로 확인하십시오.

# env-vars.txt 파일을 전달하고 대화형 프롬프트를 엽니다
docker exec -it --env-file env-vars.txt mystifying_chandrasekhar sh
# Docker 컨테이너에서 환경 변수가 사용 가능한지 확인합니다
echo $MYVAR
echo $FOO
echo $SOMETHING
Passing a environmental variables file to Docker and verifying the environment variables exist in the container.

다른 사용자로 실행 중인 컨테이너와 상호 작용하기

운영 환경에서 응용 프로그램은 종종 특정 사용자로 실행되어 그들의 액세스를 제한합니다. 운영 환경에서 응용 프로그램을 특정 사용자로 실행하는 경우 명령을 테스트하는 동안도 그렇게해야 합니다.

이 예에서 Docker 컨테이너는 nginx 사용자로 실행됩니다. Docker에게 컨테이너를 nginx 계정으로 시작하도록 지시하려면 w 옵션에 사용자를 전달하십시오. 컨테이너 내에서 실행된 whoami 명령은 실제로 nginx 사용자가 사용된다는 것을 확인합니다.

docker exec -it -u nginx mystifying_chandrasekhar sh
whoami
Running the container as the nginx user.

다음 단계

docker exec 명령을 사용하여 실행 중인 컨테이너 내에서 명령을 실행하는 방법을 배웠습니다. 실행 중인 컨테이너에 들어가고 조사하는 데 exec 명령을 활용하면 Docker 컨테이너를 문제 해결하기 위한 강력한 새 도구가 생깁니다.

이제 배운 내용을 한 걸음 더 나아가서 단일 파일을 복사하는 대신 Git 버전 관리를 사용하여 정적 웹 사이트를 컨테이너로 가져오는 것을 시도해보세요. Git이 처음이라면, 비주얼 스튜디오 코드와 Git를 위한 초보자 가이드 기사가 시작하기에 좋은 자리입니다.

Source:
https://adamtheautomator.com/docker-exec/