#docker #docker-swarm
#docker #docker-swarm
Вопрос:
Я не могу подключиться к контейнеру, который работает в swarm. Похоже, что следующее не работает:
docker exec -it <container_ID> bash
Вот некоторые выходные данные:
>$ docker service ls
ID NAME REPLICAS IMAGE COMMAND
4rliefwe74o5 login 1/1 login-arm64:1.0
>$ docker service ps login
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
2jk3s2xs7ce62piunbkiptypz login.1 login-arm64:1.0 odroid64-cluster4 Running Running 5 minutes ago
Тогда я запущу:
$ docker exec -it 2jk3s2xs7ce62piunbkiptypz bash
или
$ docker exec -it login.1 bash
и увидите следующие ошибки
Ответ об ошибке от демона: нет такого контейнера: 2jk3s2xs7ce62piunbkiptypz
Ответ об ошибке от демона: нет такого контейнера: login.1
Комментарии:
1. Опубликуйте сообщение об ошибке, и я полагаю, что это было
bash
и неbash"
2. Обновлено исходное сообщение. В принципе, docker не видит эти контейнеры
Ответ №1:
Используется docker ps
для поиска имен, которые вы можете использовать. Посмотрите под обоими CONTAINER ID
и NAMES
, либо будет работать.
>$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e53bff8bebfc login-arm64:1.0 "/bin/sh -c 'node ser" 27 seconds ago Up 25 seconds login.1.cg7fltcu3wfe7ixtnqzg8myy1
>$ docker exec -it e53bff8bebfc bash
root@e53bff8bebfc:/#
Длинное имя имеет вид $SERVICE_NAME.$REPLICA_NUMBER.$ID_FROM_SERVICE_PS
>$ docker exec -it login.1.cg7fltcu3wfe7ixtnqzg8myy1 bash
root@e53bff8bebfc:/#
Комментарии:
1. В моем случае длинное имя не сработало, но «идентификатор контейнера» работает.
2. Это, вероятно, очевидно для всех, кроме меня, но все же, если кто-то ошеломлен таким же образом,
docker ps
он должен быть запущен на рабочем узле swarm, в противном случае на главномdocker ps
для меня ничего не получается, так как нет запущенных контейнеров.3. Небольшое дополнение: Если вы видите нужный контейнер
docker service ps
, но его нетdocker ps
, проверьтеNODE
список bydocker service ps
и войдите в этот хост вместо главного узла, с которого вы начали. Оттуда вы можете использоватьdocker exec
, как описывает @sam-myers.
Ответ №2:
Довольно старый вопрос, но только мои два цента здесь: я очень часто запускаю:
docker exec -it $(docker ps -q -f name="login*") sh
-q
возвращает только идентификатор контейнера
-f name="login*"
применяет фильтр на основе имени контейнера, используя регулярное выражение
Это удобно, потому что запуск нового контейнера приведет к изменению имени контейнера с некоторыми случайными символами в нем. Важно, чтобы ваш фильтр возвращал только 1 контейнер, поэтому укажите имя таким образом, чтобы было только 1 результат. Например: если у вас есть контейнер «monster» и контейнер «monitor», вам необходимо -f name="moni*"
исключить контейнер «monster».
Команда приведет к чему-то вроде:
docker exec -it login.1.cg7fltcu3wfe7ixtnqzg8myy1 sh
Комментарии:
1.
*
Действительно ли это полезно? Я получаю идентификатор контейнера, не используя его.2. Возможно, двоичные файлы docker делают что-то умное при фильтрации на основе регулярного выражения, я этого не знаю. Это именно то, как я его использую :).