Как мне попасть в контейнер Docker?

Я начинаю работать с Docker. Я использую базовое изображение WordPress и docker-compose.

Я пытаюсь ssh в один из контейнеров для проверки файлов / каталогов, которые были созданы во время начальной сборки. Я пытался бежать docker-compose run containername ls -la, но это ничего не делал. Даже если бы это было так, я бы предпочел иметь консоль, где я могу пересечь структуру каталогов, а не запускать одну команду. Как правильно поступить с Докером?

20 ответов


docker attach позволит вам подключиться к контейнеру Docker, но это не то же самое, что ssh. Если в вашем контейнере работает веб-сервер, например,docker attach вероятно, соединит вас с стандартный вывод процесса веб-сервера. Это не обязательно даст вам оболочку.

на - это, наверное, то, что вы ищете; это позволит вам запускать произвольные команды внутри существующего контейнера. Для пример:

docker exec -it <mycontainer> bash

конечно, любая выполняемая вами команда должна существовать в файловой системе контейнера.

В приведенной выше команде <mycontainer> - имя или идентификатор целевого контейнера. Не имеет значения, используете ли вы docker compose, просто запустите docker ps и используйте либо ID (шестнадцатеричную строку, отображаемую в первом столбце), либо имя (отображаемое в последнем столбце). Е. Г., дано:

$ docker ps
d2d4a89aaee9        larsks/mini-httpd   "mini_httpd -d /cont   7 days ago          Up 7 days                               web                 

я могу запустить:

$ docker exec -it web ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
18: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:3/64 scope link 
       valid_lft forever preferred_lft forever

I можно сделать то же самое, запустив:

$ docker exec -it d2d4a89aaee9 ip addr

аналогично, я мог бы запустить оболочку в контейнере;

$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$

чтобы врезаться в работающий контейнер, введите следующее:

docker exec -t -i container_name /bin/bash

допустим, по причинам, которые являются вашими собственными, вы действительно хотите использовать SSH. Это займет несколько шагов, но это можно сделать. Вот команды, которые вы будете запускать внутри контейнера, чтобы настроить его...

apt-get update
apt-get install openssh-server

mkdir /var/run/sshd
chmod 0755 /var/run/sshd
/usr/sbin/sshd

useradd --create-home --shell /bin/bash --groups sudo username ## includes 'sudo'
passwd username ## Enter a password

apt-get install x11-apps ## X11 demo applications (optional)
ifconfig | awk '/inet addr/{print substr(,6)}' ## Display IP address (optional)

теперь вы даже можете запускать графические приложения (если они установлены в контейнере), используя пересылку X11 клиенту SSH:

ssh -X username@IPADDRESS
xeyes ## run an X11 demo app in the client

вот некоторые связанные ресурсы:


обратите внимание: этот ответ продвигает инструмент, который я написал.

Я создал контейнерный SSH-сервер, который вы можете "придерживаться" любого запущенного контейнера. Таким образом, вы можете создавать композиции с каждым контейнером. Единственное требование заключается в том, что контейнер имеет Баш.

в следующем примере запустится SSH-сервер, подключенный к контейнеру с именем "my-container".

docker run -d -p 2222:22 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e CONTAINER=my-container -e AUTH_MECHANISM=noAuth \
  jeroenpeeters/docker-ssh

ssh localhost -p 2222

при подключении к этой службе SSH (с вашим SSH-клиентом выбор) сеанс Bash будет запущен в контейнере с именем "my-container".

дополнительные указатели и документации см.: https://github.com/jeroenpeeters/docker-ssh


SSH в контейнер Docker с помощью этой команды:

sudo docker exec -i -t (container ID) bash

Если вы здесь ищете Docker Compose-specific ответ, как я, он обеспечивает простой способ без необходимости искать сгенерированный идентификатор контейнера.

docker-compose exec принимает имя службы в соответствии с вашим .

поэтому, чтобы получить оболочку Bash для вашего "веб-сервиса", вы можете сделать:

$ docker-compose exec web bash

Если вы используете Docker в Windows и хотите получить доступ оболочки к контейнеру, используйте следующее:

winpty docker exec -it <container_id> sh

скорее всего, у вас уже есть Git Bash установлен. если вы этого не сделаете, обязательно установите его.


для подключения к cmd в контейнере Windows используйте

docker exec -it d8c25fde2769 cmd

здесь d8c25fde2769 - это идентификатор контейнера.


docker exec определенно будет решением. Простой способ работы с заданным Вами вопросом-это установка каталога внутри Docker в каталог локальной системы.

чтобы вы могли мгновенно просматривать изменения в локальном пути.

docker run -v /Users/<path>:/<container path> 

использование:

docker attach <container name/id here>

другой способ, хотя и есть опасность для него, это использовать attach, а если Ctrl + C чтобы выйти из сеанса, вы также остановите контейнер. Если вы просто хотите увидеть, что происходит, используйте docker logs -f.

:~$ docker attach --help
Usage:  docker attach [OPTIONS] CONTAINER

Attach to a running container

Options:
      --detach-keys string   Override the key sequence for detaching a container
      --help                 Print usage
      --no-stdin             Do not attach STDIN
      --sig-proxy            Proxy all received signals to the process (default true)

в некоторых случаях ваше изображение может быть альпийским. В этом случае он бросит:

OCI runtime exec failed: exec failed: container_linux.go: 348: запуск процесс контейнера вызвал "exec: \" bash\": исполняемый файл не найден в $PATH": неизвестно

, потому что /bin/bash не существует. Вместо этого вы должны использовать:

docker exec -it 9f7d99aa6625 ash

или

docker exec -it 9f7d99aa6625 sh

чтобы проверить файлы, запускать docker run -it <image> /bin/bash чтобы получить интерактивный терминал. Список изображений можно получить с помощью docker images. В противоположность docker exec это решение работает также в случае, если изображение не запускается (или завершает работу сразу после запуска).


это просто!

Список всех ваших докеров изображений:

sudo docker images

в моей системе показал следующие результаты:

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
bash                latest              922b9cc3ea5e        9 hours ago
14.03 MB
ubuntu              latest              7feff7652c69        5 weeks ago         81.15 MB

у меня есть два изображения Docker на моем компьютере. Допустим, я хочу запустить первый.

sudo docker run -i -t ubuntu:latest /bin/bash

Это даст вам терминальное управление контейнером. Теперь вы можете выполнять все типы операций оболочки внутри контейнера. Как делать ls выведет все папки в корне файла система.

bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

если у Вас установлен Docker с Kitematic, вы можете использовать GUI. Открыть Kitematic из значка Docker и в Kitematic окно выберите контейнер, а затем нажмите на кнопку .

вы можете увидеть журнал контейнера и много информации о контейнере (на вкладке настроек) в этом GUI тоже.

Select Kitematic from menu

Click on exec


GOINSIDE РЕШЕНИЕ

установить goinside командная строка, с:

sudo npm install -g goinside

и зайдите внутрь контейнера докера с правильным размером терминала с:

goinside docker_container_name

ответ

мы поместили этот фрагмент в ~/.profile:

goinside(){
    docker exec -it  bash -c "stty cols $COLUMNS rows $LINES && bash";
}
export -f goinside

мало того, что это делает каждый может попасть внутрь работающего контейнера с:

goinside containername

он также решает долгоживущие проблема о фиксированном терминале контейнера Докера размеры. Что очень раздражает, если посмотреть правде в глаза.

также, если вы следуете ссылке у вас также будет завершение команды для имен контейнеров docker.


используйте эту команду:

docker exec -it containerid /bin/bash`

другой вариант-использовать nsenter.

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid

Если вы используете Docker Compose, это приведет вас внутрь контейнера Docker.

docker-compose run container_name /bin/bash

внутри контейнера он приведет вас к WORKDIR, определенному в Dockerfile. Вы можете изменить свой рабочий каталог на

WORKDIR directory_path # E.g  /usr/src -> container's path

в моем случае по некоторым причинам мне нужно проверить всю информацию о сети в каждом контейнере. Таким образом, следующие команды должны быть действительны в контейнере...

ip
route
netstat
ps
...

Я проверил все эти ответы, не действительны для меня. Я искал информацию на других сайтах. Я не буду добавлять супер ссылку здесь, так как она не написана на английском языке. Поэтому я просто разместил этот пост с кратким решением для людей, у которых есть те же требования, что и у меня.

скажем, у вас есть один работает контейнер под названием light-test. Выполните следующие действия.

  • docker inspect light-test -f {{.NetworkSettings.SandboxKey}}. Эта команда получит ответ как /var/run/docker/netns/xxxx.
  • затем ln -s /var/run/docker/netns/xxxx /var/run/netns/xxxx. Каталог может не существовать, делать mkdir /var/run/netns первый.
  • теперь вы можете выполнить ip netns exec xxxx ip addr show для изучения сетевого мира в контейнере.

PS. xxxx всегда одно и то же значение, полученное через первую команду. И, конечно же, любые другие команды действительны, т. е. ip netns exec xxxx netstat -antp|grep 8080.


для docker-compose up (Docker4Drupal)

docker-compose exec php bash

Я использую настройки для Drupal на ноутбуке Linux. После запуска контейнера я использую 'docker-compose exec php bash ' для подключения к контейнеру, чтобы я мог запускать Drush commandos. Мне это подходит.