Проблема доступа к локальному хосту контейнера Docker - PullRequest
0 голосов
/ 02 октября 2018

У меня есть докер, работающий внутри ВМ.Я запускаю 2 контейнера, как видно ниже (убран шум).

[abc_dev @ abclocaldev ~] $ docker ps

NAMES             PORTS                     

happy_stallman                                          

repository        0.0.0.0:30081->8081/tcp   

хранилище имеет запущенное приложение, доступ к которому можно получить через порт 30081. Я могу получить к нему доступ как с виртуальной машины, так и с хост-машины (переадресация портов на виртуальной машине). happy_stallman не удается получить доступ к хранилищу 127.0.0.1:30081, я получаю Отказано в соединении .

Кто-нибудь знает, что происходит?

IЯ хотел бы добавить, что happy_stallman может получить доступ к Google, а также к другому приложению в интрасети.

1 Ответ

0 голосов
/ 02 октября 2018

По умолчанию контейнеры 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...