# Отримання доступу до оболонки запущеного контейнера

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

---

<!-- overview -->

Ця сторінка показує, як використовувати `kubectl exec` для отримання доступу до оболонки запущеного контейнера.

## Перш ніж ви розпочнете

<p>Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою <a href="https://minikube.sigs.k8s.io/docs/tutorials/multi_node/">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 -->

## Отримання доступу до оболонки контейнера {#getting-a-shell-to-a-container}

У цьому завданні ви створите Pod, який має один контейнер. Контейнер виконує образ nginx. Ось файл конфігурації для Podʼа:


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/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><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>

Створіть 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 {#writing-to-root-page-for-nginx}

Знову перегляньте файл конфігурації вашого Podʼа. Pod має том `emptyDir`, і контейнер монтує цей том в `/usr/share/nginx/html`.

У своїй оболонці створіть файл `index.html` у теці `/usr/share/nginx/html`:

```shell
# Виконайте це всередині контейнера
echo 'Hello shell demo' > /usr/share/nginx/html/index.html
```

У своїй оболонці надішліть GET-запит до сервера nginx:

```shell
# Виконайте це в оболонці всередині вашого контейнера
apt-get update
apt-get install curl
curl http://localhost/
```

Результат покаже текст, який ви написали в файл `index.html`:

```none
Hello shell demo
```

Коли ви закінчите з вашою оболонкою, введіть `exit`.

```shell
exit # Щоб вийти з оболонки в контейнері
```

## Виконання окремих команд в контейнері {#running-individual-commands-in-a-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 -->

## Відкриття оболонки, коли в Podʼі є більше одного контейнера {#opening-a-shell-when-a-pod-has-more-than-one-container}

Якщо в Podʼі є більше одного контейнера, використовуйте `--container` або `-c` для зазначення контейнера в команді `kubectl exec`. Наприклад, припустимо, у вас є Pod на імʼя my-pod, і в 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)
