1. Обзор
При запуске контейнеров Docker мы иногда можем столкнуться с ошибкой «имя уже используется контейнером» .
В этом кратком руководстве мы рассмотрим эту распространенную проблему, которую легко исправить.
Сначала мы покажем, как вызвать эту ошибку .
Тогда мы объясним причину этого. Наконец, мы покажем, как это исправить.
2. Как вызвать ошибку
2.1. Получение образа Docker
Давайте сначала выберем образ Docker для нашего примера.
Мы собираемся использовать бесплатный и общедоступный демонстрационный образ Nginx . NGINX — это бесплатный веб-сервер с открытым исходным кодом, используемый многими компаниями, такими как Netflix
, CloudFare
и Airbnb
. Демонстрационный образ Docker, который мы собираемся использовать, обслуживает веб-страницу с несколькими основными свойствами, такими как имя хоста, IP-адрес и порт.
2.2. Запуск нескольких контейнеров и причина ошибки
Чтобы вызвать ошибку, нам нужно запустить два экземпляра, которые будут использовать одно и то же имя , foreach_nginx
.
Стоит подумать, зачем нам вообще нужно имя для контейнера. Имена могут быть удобным способом добавить смысл в список запущенных контейнеров. Более того, это имя можно использовать в качестве ссылки в сети Docker .
Запустим первый контейнер:
docker run --name foreach_nginx -p 80:80 -d nginxdemos/hello:plain-text
Мы запускаем контейнер в автономном режиме, что означает, что он будет работать в фоновом режиме. Мы публикуем порт 80 контейнера на тот же порт на хост-компьютере. Наконец, мы указали собственное имя для контейнера — foreach_nginx
.
Теперь, если мы откроем http://localhost
в нашем браузере, мы должны увидеть что-то похожее на это:
Server address: 123.45.6.7:80
Server name: e378ad49d49d
Date: 08/Apr/2022:22:08:44 +0000
URI: /
Request ID: 7bda7e3234cb6d1e51900fccc89320d5
Давайте теперь попробуем запустить второй контейнер. Мы назначим порт 81 для второго экземпляра, потому что хост-порт 80 уже занят первым контейнером:
docker run --name foreach_nginx -p 81:80 -d nginxdemos/hello:plain-text
К сожалению, это не работает. Получаем ошибку:
docker: Error response from daemon: Conflict. The container name "/foreach_nginx" is already in use by container "76da8f6d3accc9b6d41c8a98fd492d4b8622804220ee628a438264b8cf4ae3d4".
You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
3. Объяснение основной причины ошибки
Каждому контейнеру Docker присвоено уникальное имя. Если мы не используем необязательный аргумент name в команде
запуска docker
, Docker назначает случайное имя.
В нашем случае мы хотели присвоить одно и то же имя foreach_nginx
двум разным контейнерам. Следует отметить, что хотя мы используем один и тот же образ Docker, каждая команда запуска
Docker создает новый контейнер.
Поскольку второй контейнер не мог использовать уже используемое имя, мы получили ошибку.
4. Как это исправить
4.1. Перезапуск контейнера
Это решение применимо к случаю, когда контейнер Docker с именем foreach_nginx
уже существует в системе, и это правильное состояние . В этом случае мы не хотим иметь два разных экземпляра с одинаковым именем. Вместо этого мы хотим перезапустить уже существующий контейнер .
Чтобы перезапустить существующий контейнер, мы должны использовать команду docker start
вместо команды docker run
. ``
docker run
создает новый контейнер образа. Мы можем создать как можно больше клонов одного и того же изображения. С другой стороны, docker start
запускает ранее остановленный контейнер .
Таким образом, мы можем не столько пытаться запустить новый контейнер, сколько перезапустить существующий, и в этом случае это решение. Однако иногда мы хотим запустить замену существующего контейнера новым образом.
4.2. Удаление существующего контейнера
Когда мы уверены, что хотим, чтобы наш новый контейнер принял это имя, и мы остановили любой другой контейнер с этим именем, мы можем просто удалить предыдущий контейнер с этим именем:
docker rm foreach_nginx
К сожалению, эта команда работает не всегда. Например, другим контейнерам может понадобиться наш контейнер для корректной работы. Если это так, и мы все еще хотим удалить наш контейнер, мы можем использовать флаг силы
в команде удаления:
docker rm -f foreach_nginx
Как только предыдущий контейнер будет удален, мы можем запустить новый контейнер с выбранным нами именем.
4.3. Использование разных имен для контейнеров
Что, если мы хотим запустить два экземпляра одного и того же образа? Решение для этого случая простое. Все, что нам нужно сделать, это использовать два разных имени, а также порты:
docker run --name foreach_nginx_1 -p 80:80 -d nginxdemos/hello:plain-text
docker run --name foreach_nginx_2 -p 81:80 -d nginxdemos/hello:plain-text
Теперь давайте воспользуемся следующей командой Docker для вывода списка запущенных контейнеров:
docker ps
Мы должны увидеть что-то похожее на это:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f341bb9fe165 nginxdemos/hello:plain-text "/docker-entrypoint.…" 2 seconds ago Up 2 seconds 0.0.0.0:81->80/tcp foreach_nginx_2
33883c2b31a7 nginxdemos/hello:plain-text "/docker-entrypoint.…" 12 seconds ago Up 11 seconds 0.0.0.0:80->80/tcp foreach_nginx_1
5. Вывод
В этой статье мы узнали, как исправить ошибку «имя уже используется контейнером»
в Docker.
Во-первых, мы увидели, как воспроизвести ошибку. Затем мы рассмотрели основную причину ошибки.
Наконец, мы увидели три разных решения для решения проблемы.