Как получить доступ к порту одного контейнера в других контейнерах docker с localhost в той же сети

#docker #docker-compose #dockerfile

#docker #docker-compose #dockerfile

Вопрос:

Я могу получить доступ к порту контейнера docker на локальном компьютере с помощью localhost с сопоставлением портов, но он недоступен в других контейнерах аналогичным образом.

Мой файл docker-compose создает контейнеры Ubuntu и Nginx с сопоставлением портов 80: 80. Когда я пытаюсь получить доступ к URL-адресу Nginx из Ubuntu, порт отклоняет соединение. Я могу получить доступ к порту с именем контейнера, но не с помощью localhost.

 .
├── Dockerfile
└── docker-compose.yml
  

содержимое файла docker-compose.yml

 version: '2'

services:
    web:
      image: nginx
      ports:
       - "80:80"
      links:
        - userver
      depends_on:
        - userver

    userver:
      build:
        context: .
        dockerfile: Dockerfile

  

Содержимое файла Dockerfile

 FROM ubuntu

RUN apt-get update amp;amp; apt-get install -y net-tools curl
CMD tail -f /dev/null
  
 docker-practice $ docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                NAMES
c3f06dc519d8        nginx                     "nginx -g 'daemon of…"   4 hours ago         Up 10 minutes       0.0.0.0:80->80/tcp   docker-practice_web_1
40324fa76612        docker-practice_userver   "/bin/sh -c 'tail -f…"   4 hours ago         Up 10 minutes       80/tcp               docker-practice_userver_1
  

Доступ к URL-адресу Nginx с локального хоста с помощью localhost

 docker-practice $ curl http://localhost -I
HTTP/1.1 200 OK
Server: nginx/1.15.10
Date: Tue, 09 Apr 2019 03:35:46 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 26 Mar 2019 14:04:38 GMT
Connection: keep-alive
ETag: "5c9a3176-264"
Accept-Ranges: bytes
  

Доступ к URL-адресу Nginx из контейнера Ubuntu с помощью localhost

 root@40324fa76612:/# curl http://localhost -I
curl: (7) Failed to connect to localhost port 80: Connection refused
  

Доступ к URL-адресу Nginx из контейнера Ubuntu с именем контейнера

 root@40324fa76612:/# curl http://docker-practice_web_1 -I
HTTP/1.1 200 OK
Server: nginx/1.15.10
Date: Tue, 09 Apr 2019 03:42:13 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 26 Mar 2019 14:04:38 GMT
Connection: keep-alive
ETag: "5c9a3176-264"
Accept-Ranges: bytes
  

Я ожидаю доступа к порту в контейнере docker Ubuntu с помощью localhost, но порт отказывается подключаться.

Комментарии:

1. Изнутри docker-compose (сеть) userver может ссылаться на контейнер Nginx по имени его службы web на порту 80: curl --head http://web

2.NB links устарел в docker-compose: docs.docker.com/compose/compose-file/#links

Ответ №1:

Контейнер действует как машина (компьютер) сам по себе. Итак, если вы вводите контейнер и вызываете «localhost», то localhost указывает на этот контейнер. Вся идея контейнера заключается в том, чтобы «содержать» его среду. Старайтесь больше не использовать localhost при работе с контейнерами.

Используйте либо имена контейнеров, либо имена служб (когда вы находитесь в сети docker-compose).