# 동작중인 컨테이너의 셸에 접근하기

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->

이 페이지는 동작중인 컨테이너에 접근하기 위해 `kubectl exec`을 사용하는
방법에 대해 설명한다.




## 시작하기 전에


<p>쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와
통신할 수 있도록 설정되어 있어야 한다. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 적어도 2개 포함된 클러스터에서 실행하는 것을 추천한다. 만약, 아직 클러스터를 가지고
있지 않다면,
<a href="/ko/docs/tasks/tools/#minikube">minikube</a>를 사용해서 생성하거나
다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있다.</p>
<ul>
<li><a href="https://labs.iximiuz.com/playgrounds?category=kubernetes&filter=all">iximiuz Labs</a></li>
<li><a href="https://killercoda.com/playgrounds/scenario/kubernetes">Killercoda</a></li>
<li><a href="https://kodekloud.com/public-playgrounds">KodeKloud</a></li>
</ul>





<!-- steps -->

## 컨테이너의 셸에 접근하기

이 예시에서는 하나의 컨테이너를 가진 파드를 생성할 것이다. 이 컨테이너는
nginx 이미지를 실행한다. 해당 파드에 대한 설정 파일은 다음과 같다.

















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/ko/examples/application/shell-demo.yaml" download="application/shell-demo.yaml"><code>application/shell-demo.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('application-shell-demo-yaml')" title="Copy application/shell-demo.yaml to clipboard"></img></div>
    <div class="includecode" id="application-shell-demo-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Pod</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">shell-demo</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">shared-data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">emptyDir</span><span class="p">:</span><span class="w"> </span>{}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">containers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumeMounts</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">shared-data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">mountPath</span><span class="p">:</span><span class="w"> </span><span class="l">/usr/share/nginx/html</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">hostNetwork</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">dnsPolicy</span><span class="p">:</span><span class="w"> </span><span class="l">Default</span><span class="w">
</span></span></span></code></pre></div></div>
</div>

파드를 생성한다.

```shell
kubectl apply -f https://k8s.io/examples/application/shell-demo.yaml
```

다음을 통해 컨테이너가 동작하고 있는지 확인할 수 있다.

```shell
kubectl get pod shell-demo
```

동작중인 컨테이너의 셸에 접근한다.

```shell
kubectl exec --stdin --tty shell-demo -- /bin/bash
```


<div class="alert alert-info" role="note"><h4 class="alert-heading">참고:</h4>kubectl 명령어 인자와 사용하고자 하는 명령어의 인자를 구분하기 위해서는 이중 대시(<code>--</code>)를 사용할 수 있다.</div>


셸에 접근해서 다음처럼 루트 디렉토리를 확인해 볼 수 있다.

```shell
# Run this inside the container
ls /
```

접근한 셸에서 다른 명령어도 한번 실행해 보아라. 다음은 실행해 볼
명령의 예시이다.

```shell
# You can run these example commands inside the container
ls /
cat /proc/mounts
cat /proc/1/maps
apt-get update
apt-get install -y tcpdump
tcpdump
apt-get install -y lsof
lsof
apt-get install -y procps
ps aux
ps aux | grep nginx
```

## nginx의 최상단 페이지 작성하기

앞에서 생성한 파드에 대한 설정을 살펴보아라. 파드에는
`emptyDir` 볼륨이 사용되었고, 이 컨테이너는 해당 볼륨을
`/usr/share/nginx/html` 경로에 마운트하였다.

접근한 셸 환경에서 `/usr/share/nginx/html` 디렉터리에 `index.html` 파일을
생성해 보아라.

```shell
# Run this inside the container
echo 'Hello shell demo' > /usr/share/nginx/html/index.html
```

셸 환경에서 nginx 서버에 GET 요청을 시도해보면 다음과 같다.

```shell
# Run this in the shell inside your container
apt-get update
apt-get install curl
curl http://localhost/
```

출력 결과는 여러분이 `index.html` 파일에 작성한 텍스트를 출력할 것이다.

```
Hello shell demo
```

셸 사용이 모두 끝났다면 `exit`을 입력해 종료하라.

```shell
exit # To quit the shell in the container
```

## 컨테이너에서 개별 명령어 실행하기

셸이 아닌 일반적인 커맨드 환경에서 다음처럼 동작중인 컨테이너의
환경 변수를 출력할 수 있다.

```shell
kubectl exec shell-demo env
```

다른 명령어도 한번 실행해 보아라. 다음은 실행해 볼 명령의 예시이다.

```shell
kubectl exec shell-demo -- ps aux
kubectl exec shell-demo -- ls /
kubectl exec shell-demo -- cat /proc/1/mounts
```



<!-- discussion -->

## 파드에 한 개 이상의 컨테이너가 있을 경우 셸에 접근하기

만일 파드에 한 개 이상의 컨테이너가 있을 경우, `kubectl exec` 명령어에
`--container` 혹은 `-c` 옵션을 사용해서 컨테이너를 지정하라. 예를 들어,
여러분이 my-pod라는 이름의 파드가 있다고 가정해 보자. 이 파드에는 _main-app_ 과 
_helper-app_ 이라는 이름의 두 컨테이너가 있다. 다음 명령어는 _main-app_ 
컨테이너에 대한 셸에 접근할 것이다.

```shell
kubectl exec -i -t my-pod --container main-app -- /bin/bash
```


<div class="alert alert-info" role="note"><h4 class="alert-heading">참고:</h4>축약형 옵션인 <code>-i</code> 와 <code>-t</code> 는 각각 <code>--stdin</code> 와 <code>--tty</code> 옵션에 대응된다.</div>



## 다음 내용


* [kubectl exec](/docs/reference/generated/kubectl/kubectl-commands/#exec)를 참고한다.
