По умолчанию контейнеры Docker работают в сети bridge
.Когда вы пытаетесь получить доступ к 127.0.0.1:8080
из контейнера, вы получаете доступ к порту 8080
контейнера.
Для демонстрации, давайте попробуем получить доступ к другому контейнеру, используя его IP-адрес.Запустите простой сервер:
$ docker run -it -p 8080:8080 trinitronx/python-simplehttpserver
Serving HTTP on 0.0.0.0 port 8080 ...
Затем переключитесь на другой терминал и убедитесь, что 8080
открыт для хоста:
$ wget 127.0.0.1:8080
--2018-10-02 10:51:14-- http://127.0.0.1:8080/
Connecting to 127.0.0.1:8080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 178 [text/html]
Saving to: <<index.html.5>>
index.html.5 100%[=====================================================================================>] 178 --.-KB/s in 0s
2018-10-02 10:51:14 (18.9 MB/s) - <<index.html.5>> saved [178/178]
Контейнер обслуживал файл, работает нормально.Теперь давайте попробуем сделать то же самое, используя другой контейнер:
$ docker run -it alpine wget 127.0.0.1:8080
Connecting to 127.0.0.1:8080 (127.0.0.1:8080)
wget: can't connect to remote host (127.0.0.1): Connection refused
Не работает, потому что 127.0.0.1
здесь это локальный адрес alpine
, а не адрес хоста.
Чтобы получить IP-адрес контейнера, используйте следующую команду:
$ docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 4f1fe52be173
172.17.0.3
Где 4f1fe52be173
- имя контейнера.После указания правильного IP-адреса контейнер может получить доступ к другому порту контейнера:
$ docker run -it alpine wget 172.17.0.3:8080
Connecting to 172.17.0.3:8080 (172.17.0.3:8080)
index.html 100% |*******************************| 178 0:00:00 ETA
Это может быть упрощено, если вы используете docker-compose:
$ cat docker-compose.yml
version: '3'
services:
web:
image: trinitronx/python-simplehttpserver
ports:
- "8080:8080"
client:
image: alpine
command: wget web:8080
depends_on:
- web
$ docker-compose up
Creating soon_web_1 ... done
Creating soon_client_1 ... done
Attaching to soon_web_1, soon_client_1
web_1 | soon_client_1.soon_default - - [02/Oct/2018 05:59:16] "GET / HTTP/1.1" 200 -
client_1 | Connecting to web:8080 (172.20.0.2:8080)
client_1 | index.html 100% |*******************************| 178 0:00:00 ETA
client_1 |
soon_client_1 exited with code 0
Как выКак видите, нет прямых спецификаций контейнеров по IP-адресам.Вместо этого вы получаете доступ к порту контейнера с помощью web:8080
.
Обратите внимание, что depends_on
не ждет, пока контейнер будет "готов".Для лучшего контроля, пожалуйста, прочитайте это руководство: https://docs.docker.com/compose/startup-order/