Как мне попасть в контейнер 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
вот некоторые связанные ресурсы:
- openssh-сервер не запускается в Docker контейнер
- как получить bash или ssh в работающий контейнер в фоновом режиме?
- можете ли вы запускать приложения GUI в контейнере 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
у меня есть два изображения 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 тоже.
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.
другой вариант-использовать 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. Мне это подходит.