Некоторые команды, которые стоит использовать, чтобы понять, что происходит:
docker ps -a
- перечисляет все контейнеры и их статус docker ps -aq
- перечисляет только идентификаторы контейнеров.
docker container list --all
- так же, как docker ps -a
docker container inspect [container_id]
- это выводит кучу информации, относящейся к контейнеру, - внизу вы найдете информацию о сети (IP-адрес, сопоставления портов). Это мое go, когда возникают проблемы.
Часто я нахожу старый контейнер, блокирующий порт, который я хочу использовать, чтобы ...
docker rm -f $(docekr ps -aq)
- принудительно удаляет все контейнеры. Это эффективно очищает ваши docker контейнеры и дает вам чистую доску.
Другим местом для проверки будут журналы приложения / db в самом контейнере ... для входа в docker контейнер и получите командный терминал:
docker exec -it [container_id] bash
- или sh
вместо bash (или предпочитаемый вами вариант терминала, если он поддерживается). Последний параметр здесь - команда для выполнения над контейнером. Вы можете просто написать ls -al
. Примечание: контейнер должен быть в рабочем состоянии, чтобы это работало.
Также стоит отметить, что открытый порт вашего mongo
контейнера - это 27016, а не тот, который указан в соединении: mongodb://mongo:27016
- 27016 - это порт открыт внутри (внутри контейнера). 27017 - это порт, который вы должны использовать для соединений из других контейнеров / внешних местоположений. Если приложение узла запускается в контейнере, то вам может повезти, но это противоречит передовым методам. Одно приложение на контейнер.
Мой метод запоминания порядка сопоставления портов - src(localhost):destination(container)
- это то же самое для большинства команд unix: cp, scp, mv, et c. то есть мы пишем mv/scp/cp src_file dest_dir
, чтобы было проще узнать, к какому порту вы должны подключаться, если вы следуете этому практическому правилу.
Вы также захотите проверить это из контейнера node
(docker exec -it [node_container_id] bash
), что вы можете пропинговать контейнер mon go. Возможно, вы даже сможете telnet [mongo_ip] 27017
в контейнер mongo
, используя порт, который вы ожидаете открыть. Это докажет, что два хоста могут общаться по сети. Тогда вы знаете, что это не проблема сети, а проблема приложения.