# 実行中のコンテナへのシェルを取得する

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

---

<!-- overview -->


このページは`kubectl exec`を使用して実行中のコンテナへのシェルを取得する方法を説明します。




## 始める前に


<p>Kubernetesクラスターが必要、かつそのクラスターと通信するためにkubectlコマンドラインツールが設定されている必要があります。
このチュートリアルは、コントロールプレーンのホストとして動作していない少なくとも2つのノードを持つクラスターで実行することをおすすめします。
まだクラスターがない場合、<a href="https://minikube.sigs.k8s.io/docs/tutorials/multi_node/">minikube</a>を使って作成するか、
以下のいずれかのKubernetesプレイグラウンドも使用できます:</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 -->

## コンテナへのシェルの取得

このエクササイズでは、1つのコンテナを持つPodを作成します。
コンテナはnginxのイメージを実行します。以下がそのPodの設定ファイルです:


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/ja/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="application/shell-demo.yamlをクリップボードにコピー"></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></code></pre></div></div>
</div>

Podを作成します:

```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>ダブルダッシュ(<code>--</code>)のセパレーターは、コマンドに渡す引数とkubectlの引数を分離します。</div>


シェル内で、ルートディレクトリーのファイル一覧を表示します:

```shell
# このコマンドをコンテナ内で実行します
ls /
```

シェル内で、他のコマンドを試しましょう。以下がいくつかの例です:

```shell
# これらのサンプルコマンドをコンテナ内で実行することができます
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のルートページへの書き込み

Podの設定ファイルを再度確認します。Podは`emptyDir`ボリュームを持ち、
コンテナは`/usr/share/nginx/html`ボリュームをマウントします。

シェル内で、`/usr/share/nginx/html`ディレクトリに`index.html`を作成します。

```shell
# このコマンドをコンテナ内で実行します
echo 'Hello shell demo' > /usr/share/nginx/html/index.html
```

シェル内で、nginxサーバーにGETリクエストを送信します:

```shell
# これらのコマンドをコンテナ内のシェルで実行します
apt-get update
apt-get install curl
curl http://localhost/
```

出力に`index.html`ファイルに書き込んだ文字列が表示されます:

```
Hello shell demo
```

シェルを終了する場合、`exit`を入力します。

```shell
exit # コンテナ内のシェルを終了する
```

## コンテナ内での各コマンドの実行

シェルではない通常のコマンドウインドウ内で、実行中のコンテナの環境変数の一覧を表示します:

```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 -->

## Podが1つ以上のコンテナを持つ場合にシェルを開く

Podが1つ以上のコンテナを持つ場合、`--container`か`-c`を使用して、`kubectl exec`コマンド内でコンテナを指定します。
例えば、my-podという名前のPodがあり、そのPodが _main-app_ と _helper-app_ という2つのコンテナを持つとします。
以下のコマンドは _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)について読む
