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

Я начинаю работать с Докером. Я использую базовое изображение WordPress и компоновку dockerов.

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

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

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

 docker exec -it  bash 

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

В приведенной выше команде указано имя или идентификатор целевого контейнера. Неважно, используете ли вы 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:  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:  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 

Я мог бы выполнить то же самое, выполнив:

 $ 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($2,6)}' ## Display IP address (optional) 

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

 ssh -X [email protected] xeyes ## run an X11 demo app in the client 

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

  • openssh-server не запускается в контейнере Docker
  • Как получить bash или ssh в запущенный контейнер в фоновом режиме?
  • Можете ли вы запускать приложения GUI в контейнере Docker?
  • Другие полезные подходы к графическому доступу, найденные с поиском: Docker X11
  • Если вы запускаете SSHD в своих контейнерах Docker, вы делаете это неправильно!

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

Я создал контейнерный SSH-сервер, который можно «привязать» к любому запущенному контейнеру. Таким образом, вы можете создавать композиции с каждым контейнером. Единственное требование – контейнер имеет Bash.

Следующий пример запустит 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-специфичный ответ, как я, он обеспечивает простой способ без необходимости поиска сгенерированного идентификатора контейнера.

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

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

 $ docker-compose exec web bash 

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

 winpty docker exec -it  sh 

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

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

 docker attach  

Другим способом, хотя и существует опасность для него, является использование 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) 

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

 docker exec -it d8c25fde2769 cmd 

Где d8c25fde2769 – идентификатор контейнера.

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

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

 docker run -v /Users/:/ 

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

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

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

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

 docker exec -it 9f7d99aa6625 ash 

или

 docker exec -it 9f7d99aa6625 sh 

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

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

Выберите Kitematic из меню

Нажмите на exec

Это просто !

Перечислите все ваши изображения Docker:

 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 

РЕШЕНИЕ GOINSIDE

установите goinside командной строки goinside с помощью:

 sudo npm install -g goinside 

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

 goinside docker_container_name 

старый ответ

Мы поместили этот fragment в ~/.profile :

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

Это не только позволяет каждому войти в рабочий контейнер:

 goinside containername 

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

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

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

 docker exec -it containerid /bin/bash` 

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

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

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

 docker-compose run container_name /bin/bash 

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

 WORKDIR directory_path # Eg /usr/src -> container's path 

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

 ip route netstat ps ... 

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

Скажем, у вас есть один запущенный контейнер с именем 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-компоновки (Docker4Drupal)

 docker-compose exec php bash 

Я использую Docker для Drupal на ноутбуке Linux. После запуска контейнера я использую « docker-compose exec php bash » для соединения с контейнером, чтобы я мог запускать коммандос drush. Он отлично работает для меня.

Interesting Posts

Что означает синтаксис ‘=>’ в C #?

Замените символы разрыва строки с помощью в представлении ASP.NET MVC Razor

Windows 7 – Как подключить .jar к панели задач?

Добавление lib в ‘config.autoload_paths’ в Rails 3 не выполняет автозагрузку моего модуля

Как я могу запустить (16-разрядный) .COM исполняемый файл, который был переименован в .COS?

Как я могу предоставить AntiForgeryToken при публикации данных JSON с использованием $ .ajax?

C ++ 11 streamовая безопасность

Найти центр нескольких местоположений на Картах Google

Восстановите мою SD-карту

Шестиугольная прозрачность в цветах

Как служба Windows может запустить процесс при создании события Timer?

В функциональном стиле Java8, как я могу сопоставить значения с уже существующей парой значений ключа

java конвертировать миллисекунды в формат времени

Способ перемещения курсора по аргументам в bash?

Лучшая клавиатура со встроенным указывающим устройством для медиацентра Mac?

Давайте будем гением компьютера.