새 의사 TTY로 실행 중인 Docker 컨테이너 입력
컨테이너는 우리 애플리케이션의 버전을 실행하고 있으며 중요한 정보는 컨테이너가 실행 중일 때만 액세스할 수 있습니다. 예를 들어 컨테이너의 로그가 저장되는 위치를 알고 싶을 수 있습니다.
이를 달성하려면 이 특정 컨테이너에 대한 정보를 얻기 위해 실행 중인 컨테이너에 들어가야 합니다. 이 튜토리얼에서는 새로운 의사 TTY를 사용하여 실행 중인 도커 컨테이너에 들어가기 위해 활용할 수 있는 다양한 접근 방식을 배웁니다.
새 프로젝트 만들기
이 튜토리얼의 모든 예제에서 Nginx 애플리케이션을 사용하여 실행 중인 컨테이너에 들어가는 방법을 보여줍니다.
WebStorm IDE를 열고 파일 > 새로 만들기 > 프로젝트
를 선택하여 새 프로젝트를 만듭니다. 열린 창에서 빈 프로젝트를 선택하고 프로젝트 이름을 제목 없음
에서 docker-enter-container
로 변경하거나 원하는 이름을 사용하십시오.
마지막으로 만들기
버튼을 눌러 프로젝트를 생성합니다.
현재 폴더 아래에 index.html
이라는 파일을 만들고 다음 코드를 복사하여 파일에 붙여넣습니다.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap demo</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css"
rel="stylesheet"
integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi"
crossorigin="anonymous">
</head>
<body>
<table class="table table-dark">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">First</th>
<th scope="col">Last</th>
<th scope="col">Handle</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">1</th>
<td>Mark</td>
<td>Otto</td>
<td>@mdo</td>
</tr>
</tbody>
</table>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3"
crossorigin="anonymous"></script>
</body>
</html>
이 파일에서 부트스트랩을 사용하여 테이블을 표시하는 간단한 웹 페이지를 만들었습니다. 컨테이너를 실행할 때 반환되는 페이지입니다.
다른 정보를 표시하도록 코드를 자유롭게 변경하십시오.
이미지 정의
Dockerfile
이라는 파일을 만들고 다음 Docker 지침을 복사하여 파일에 붙여넣습니다.
FROM nginx:1.23.1-alpine
COPY . /usr/share/nginx/html
FROM
- 후속 지침을 사용하여 사용자 정의 이미지를 생성할 기본 이미지를 설정합니다. 이것은 파일의 첫 번째 명령이어야 합니다.COPY
- 현재 디렉토리의 모든 파일과 폴더를 이미지 파일 시스템으로 복사합니다. 이 경우 모든 파일과 폴더를/usr/share/nginx/html
에 복사하고 이 이미지의 요구 사항인 이 위치를 사용했습니다.
이미지 구축
컴퓨터에서 키보드 단축키 ALT+F12를 눌러 새 터미널 창을 엽니다. 그런 다음 아래 명령을 실행하여 enter-container
태그가 있는 이미지를 빌드합니다.
~/WebstormProjects/docker-enter-container$ docker build --tag enter-container:latest .
이 명령은 Dockerfile
명령어를 순차적으로 실행하며 아래와 같이 터미널 창에서 명령어가 실행되는 것을 볼 수 있습니다.
=> CACHED [1/2] FROM docker.io/library/nginx:1.23.1-alpine@sha256:b87c350e6c69e0dc7069093dcda226c4430f3836682af4f649f2af9 0.0s
=> [2/2] COPY . /usr/share/nginx/html
컨테이너 실행
동일한 터미널 창을 사용하여 enter-container-prod
라는 컨테이너를 실행하는 다음 명령을 실행합니다.
~/WebstormProjects/docker-enter-container$ docker run --name enter-container-prod -d -p 3000:80 enter-container:latest
이 명령은 컨테이너를 실행하고 호스트의 포트 3000을 노출하여 컨테이너의 포트 80을 수신합니다. 응용 프로그램을 보고 브라우저에서 localhost:3000
(http://localhost:3000/)에 대한 요청을 발행하여 index.html
페이지에 테이블을 표시합니다.
다음 섹션에서는 이 컨테이너를 사용하여 컨테이너에 들어가는 데 사용할 수 있는 다양한 접근 방식을 보여줍니다.
docker exec
명령을 사용하여 실행 중인 Docker 컨테이너 입력
실행 중인 컨테이너에서 새 명령을 실행하려면 exec
명령을 사용합니다. 이 명령은 컨테이너의 기본 프로세스가 실행 중일 때만 실행되며 컨테이너를 다시 시작할 때 다시 시작되지 않습니다.
작업 디렉토리가 WORKDIR
명령을 사용하여 지정되지 않은 경우 명령은 기본 디렉토리에서 실행됩니다. 동일한 터미널 창에서 다음 명령을 실행하여 이전 섹션에서 실행한 컨테이너로 들어갑니다.
~/WebstormProjects/docker-enter-container$ docker exec -it enter-container-prod /bin/sh
출력:
/ #
또한 Docker가 컨테이너 STDIN
에 연결된 의사 TTY를 할당하여 컨테이너에 대화형 셸을 생성하도록 지시하는 추가 플래그 -it
를 사용했습니다.
ls
명령을 실행하면 아래와 같이 컨테이너의 루트 디렉토리에 있음을 알 수 있습니다.
/ # ls
출력:
bin etc mnt run tmp
dev home opt sbin usr
docker-entrypoint.d lib proc srv var
/bin/sh
셸 명령을 sh
로 대체하여 컨테이너에서 대화형 셸을 만들 수 있습니다. 이것은 기억하기가 훨씬 쉽고 아래와 같이 사용할 수 있습니다.
~/WebstormProjects/docker-enter-container$ docker exec -it enter-container-prod sh
sh
명령 대신 bash
명령 사용
docker exec
명령을 bash
라는 sh
명령 대신 사용할 수 있습니다. 이 명령을 사용하면 컨테이너에서 대화형 셸을 만들 수도 있습니다.
bash
명령은 이전 예제에서 sh
명령을 사용한 것과 같은 방식으로 사용할 수 있습니다. CTRL+D를 사용하여 셸 세션을 종료하고 다음 명령을 실행하여 bash
명령을 사용하여 Docker 컨테이너에 들어갑니다.
~/WebstormProjects/docker-enter-container$ docker exec -it enter-container-prod /bin/bash
/bin/bash
셸 명령을 bash
로 대체하여 컨테이너에서 대화형 셸을 만들 수 있습니다. 이것은 기억하기가 훨씬 쉽고 아래와 같이 사용할 수 있습니다.
~/WebstormProjects/docker-enter-container$ docker exec -it enter-container-prod bash
shell 명령은 컨테이너에 설치된 셸에 따라 다릅니다. 일부 컨테이너에는 두 개의 셸 명령이 있는 반면 다른 컨테이너에는 하나만 있습니다.
결론
이 자습서에서는 새로운 pseudo-TTY를 사용하여 Docker 컨테이너에 들어가는 데 활용할 수 있는 다양한 접근 방식을 배웠습니다. 이 자습서에서 다루는 접근 방식에는 셸 bash
또는 sh
명령과 함께 docker exec
명령을 사용하는 것이 포함됩니다.
David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.
LinkedIn GitHub