Docker 컨테이너 내부에서 무슨 일이 일어나고 있는지 확인해야 할 때가 있을까요? 컨테이너는 동일성을 유지해야 합니다: 문제가 발생하면 새로운 컨테이너를 배포하세요. 하지만 현실은 항상 간단하지 않습니다. 문제를 식별하려면 컨테이너 내에서 명령을 실행해야 할 때가 있습니다. 이때 docker exec
명령이 도움이 될 수 있습니다.
이 문서에서는 docker exec
명령을 사용하여 실행 중인 Docker 컨테이너에서 명령을 실행하는 방법을 알려드립니다.
사전 준비
이 문서의 예제를 따라하려면 다음 사항을 준수해야 합니다.
- Windows, Linux 또는 macOS에서 작동하는 Docker Desktop의 최신 버전. 이 튜토리얼은 Windows 10에서 실행되는 v3.1.0을 사용합니다.
NGINX 컨테이너 시작
Docker exec
은 컨테이너 내에서 명령을 실행합니다. 하지만 그 전에 명령을 실행할 컨테이너가 필요합니다. Docker 이미지를 다운로드하고 데모 컨테이너를 생성하는 것부터 시작해봅시다.
- 새 디렉토리를 생성하세요. 이 튜토리얼에서는 C:\gitrepos\test를 사용합니다.
2. 파일을 생성하십시오. 이름은 dockerfile (확장자 없음)이며, 다음 코드를 포함하고 있습니다. 이 Dockerfile은 컨테이너를 생성하는 데 필요한 단계를 정의합니다.
3. 그 다음으로, 동일한 디렉토리에 index.html이라는 이름의 파일을 만들어 다음 코드를 포함하십시오. 이 HTML 파일은 컨테이너가 시작되면 Hello World 메시지를 표시합니다.
4. 이제 Nginx Docker 컨테이너를 만들어보겠습니다. Dockerfile이 현재 작업 디렉토리에 있기 때문에 Docker 엔진이 그곳을 찾도록 .
로 지정하십시오. 또한 미래에 쉽게 참조할 수 있도록 t
매개변수를 사용하여 컨테이너에 my-nginx
태그를 지정하십시오.

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

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

Docker Exec를 사용한 명령 실행
도커 컨테이너에서 명령을 실행할 때 대화식으로 명령을 실행해야 할 수도 있습니다. 대화식으로 명령을 실행하는 것은 명령을 입력하고 피드백을 받은 다음 다른 명령을 입력하는 것을 의미합니다. 대화식 명령은 세션을 점유하고 다른 작업을 할 수 없게 만듭니다.
그러나 이미 컨테이너로 보낼 명령을 미리 알고 있고 백그라운드에서 명령을 실행하려는 경우에는 어떻게 해야 할까요? 그런 경우에는 비대화식 명령을 실행할 수 있습니다. 비대화식 명령을 사용하면 Docker에 명령을 보낼 수 있고 즉시 콘솔의 제어를 반환합니다.
컨테이너 이름 및 ID 찾기
이제 컨테이너를 빌드했으므로 컨테이너 내에서 명령을 실행할 수 있습니다. 명령을 실행하기 전에 NGINX 컨테이너의 이름 또는 ID를 찾으세요. 이름 또는 ID 중 하나가 Docker 명령에서 작동합니다. 그것을 기억하는 것은 이름보다 더 어려울 수 있습니다!
실행 중인 컨테이너 정보를 표시하려면 다음 정보를 출력하기 위해 Docker ps
명령을 실행하세요.

고유한 ID인 e17e4b6be01a
또는 임의로 생성된 이름 mystifying_chandrasekhar
중 하나를 클립보드에 복사하여 나중에 사용하세요.
Docker Exec를 사용하여 비대화식 명령 실행
비대화식 명령을 실행하는 예로, 아래 명령을 복사하여 /var/log 디렉토리에 있는 파일 목록을 ls -l
명령으로 반환합니다. 컨테이너 이름인 mystifying_chandrasekhar
이후의 모든 것을 Docker exec
명령에 전달하세요.

도커 명령어로 콘솔 출력 피하기
대규모 작업은 사용자에게 즉시 쉘 제어를 반환하여 콘솔을 차지하지 않게 합니다. 분리된 d
옵션으로 콘솔 출력을 포기하세요. 아래 명령은 컨테이너 내에서 touch
명령을 사용하여 파일 /tmp/execWorks를 생성하며 콘솔에 출력을 표시하지 않습니다.
도커 Exec로 대화형 명령 실행하기
지금까지 도커 컨테이너에서 비대화형 명령을 실행하는 방법을 배웠습니다. 그러나 컨테이너를 문제 해결해야 할 때(예: 컨테이너에 대화형 명령을 발행해야 할 때), 명령을 대화형으로 실행해야 할 수 있습니다. 그런 경우 명령을 대화형으로 실행해야 합니다.
docker exec
를 사용하여 대화형으로 명령을 실행하려면 두 가지 옵션이 필요합니다. i
옵션은 STDIN을 열어 컨테이너로 명령을 보낼 수 있게 하고, t
옵션은 명령을 입력할 수 있는 가상 터미널(pseudo-TTY (PTY)) 통신 채널을 할당합니다.
다음 명령을 복사하여 실행 중인 도커 컨테이너에 대한 대화형 명령 프롬프트를 엽니다. 셸은 Bourne (sh) 셸로 변경되며 프롬프트가 / #
로 표시됩니다.

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

특정 디렉토리에서 대화형 프롬프트를 열려면 Docker에게 지정된 디렉토리에서 셸을 시작하도록 알려주는
w
옵션에 경로를 전달하십시오.
실행 중인 컨테이너에 환경 변수 전달
많은 프로그램은 시작할 때 환경 변수를 설정하는 데 사용됩니다. 예를 들어, 대부분의 Java 애플리케이션은 Java 경로로 설정된 JAVA_HOME
환경 변수가 필요합니다.
e
옵션을 사용하여 세션에 환경 변수를 전달할 수 있습니다. 예를 들어 실행 중인 컨테이너에 MYVAR
라는 환경 변수를 채워 넣어야 할 수도 있습니다. 이를 위해 아래에 표시된 대로 e
옵션을 사용하고 MYVAR="<some value>"
와 같은 키/값 쌍을 제공하십시오.

파일로 환경 변수 전달
많은 환경 변수나 공유 구성이 있는 경우 해당 변수를 파일에 저장하는 것이 더 쉬울 수 있습니다. 파일을 Docker에 상대 경로나 절대 경로로 전달하고 --env-file
옵션을 사용하십시오. 이 기술은 종종 컨테이너에 안전한 자격 증명을 제공하는 데 사용됩니다. 버전 관리에 자격 증명을 커밋하지 않도록 주의하십시오!
env-vars.txt
라는 텍스트 파일을 만들어 전달할 환경 변수와 그 값들을 입력하십시오. 이 파일의 이름은 원하는 대로 지정할 수 있으며 .txt
파일 확장자가 필요하지 않습니다.

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

다른 사용자로 실행 중인 컨테이너와 상호 작용하기
운영 환경에서 응용 프로그램은 종종 특정 사용자로 실행되어 그들의 액세스를 제한합니다. 운영 환경에서 응용 프로그램을 특정 사용자로 실행하는 경우 명령을 테스트하는 동안도 그렇게해야 합니다.
이 예에서 Docker 컨테이너는 nginx
사용자로 실행됩니다. Docker에게 컨테이너를 nginx
계정으로 시작하도록 지시하려면 w
옵션에 사용자를 전달하십시오. 컨테이너 내에서 실행된 whoami
명령은 실제로 nginx
사용자가 사용된다는 것을 확인합니다.

nginx
user.다음 단계
docker exec
명령을 사용하여 실행 중인 컨테이너 내에서 명령을 실행하는 방법을 배웠습니다. 실행 중인 컨테이너에 들어가고 조사하는 데 exec
명령을 활용하면 Docker 컨테이너를 문제 해결하기 위한 강력한 새 도구가 생깁니다.
이제 배운 내용을 한 걸음 더 나아가서 단일 파일을 복사하는 대신 Git 버전 관리를 사용하여 정적 웹 사이트를 컨테이너로 가져오는 것을 시도해보세요. Git이 처음이라면, 비주얼 스튜디오 코드와 Git를 위한 초보자 가이드 기사가 시작하기에 좋은 자리입니다.