Как я могу попасть в контейнер Docker?
Я начинаю работать с Докером. Я использую базовое изображение WordPress и компоновку dockerов.
Я пытаюсь ssh в один из контейнеров, чтобы проверить файлы / каталоги, созданные во время начальной сборки. Я попытался запустить docker-compose run containername ls -la
, но это ничего не делало. Даже если бы это было так, я бы предпочел иметь консоль, где я могу пересекать структуру каталогов, а не запускать одну команду. Каков правильный способ сделать это с помощью Docker?
- В чем разница между «разоблачением» и «публикацией» в Docker?
- Docker - способ предоставить доступ к USB-порту или последовательному устройству?
- Копирование файлов из контейнера Docker в хостинг
- Ошибка «Устройство ввода не является TTY»
- В чем разница между изображением Докера и контейнером?
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
.
В этом графическом интерфейсе вы также можете увидеть журнал контейнера и множество информации о контейнере (на вкладке настроек).
Это просто !
Перечислите все ваши изображения 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. Он отлично работает для меня.