Как мне попасть в контейнер Docker?
Я начинаю работать с Docker. Я использую базовое изображение WordPress и docker-compose.
Я пытаюсь ssh в один из контейнеров для проверки файлов / каталогов, которые были созданы во время начальной сборки. Я пытался бежать docker-compose run containername ls -la, но это ничего не делал. Даже если бы это было так, я бы предпочел иметь консоль, где я могу перемещаться по структуре каталогов, а не запускать одну команду. Как правильно это сделать с Докером?
20 ответов:
docker attachпозволит вам подключиться к контейнеру Docker, но это не совсем то же самое, чтоssh. Если ваш контейнер работает на веб-сервере, например,docker attachвероятно, соединит вас с stdout процесса веб-сервера. Это не обязательно даст вам оболочку.The - это, наверное, то, что вы ищете; это позволит вам запускать произвольные команды внутри существующего контейнера. Для пример:
docker exec -it <mycontainer> bashконечно, любая команда, которую вы выполняете, должна существовать в файловой системе контейнера.
В приведенной выше команде
<mycontainer>- имя или идентификатор целевого контейнера. Это не имеет значения, используете ли выdocker compose, просто запуститеdocker psи используйте либо идентификатор (шестнадцатеричная строка, отображаемая в первом столбце), либо имя (отображаемое в последнем столбце). Например, учитывая:$ 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 foreverI может сделать то же самое, запустив:
$ docker exec -it d2d4a89aaee9 ip addrаналогично, я мог бы запустить оболочку в контейнере;
$ docker exec -it web sh / # echo This is inside the container. This is inside the container. / # exit $
скажем, по причинам, которые являются вашими собственными, вы действительно хотите использовать 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вот некоторые связанные ресурсы:
- openssh-сервер не запускается в Docker контейнер
- как получить bash или ssh в работающий контейнер в фоновом режиме?
- можно ли запускать графические приложения в контейнере Docker?
- другие полезные подходы для графического доступа, найденные с помощью search: Docker X11
- если вы запускаете SSHD в своих контейнерах Docker, вы делаете это неправильно!
обратите внимание: этот ответ продвигает инструмент, который я написал.
Я создал контейнерный 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
Если вы здесь ищете 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у меня есть два изображения Докера на моем компьютере. Допустим, я хочу запустить первый.
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 SOLUTION
установить
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.
другой вариант-использовать 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. Это прекрасно работает для меня.


Comments