Как получить доступ к контейнеру Docker с другого компьютера в локальной сети

Я использую Docker Desktop для Mac и запускаю контейнер на своем хост-компьютере. Я могу получить доступ к контейнеру через локальный хост на хост-компьютере. Но он недоступен из других систем по локальной сети.

Контейнер представляет собой веб-сервер nginx, который доступен в localhost:80, но недоступен из других систем в той же локальной сети.

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

Изменить 1: добавление конфигурации docker-compose и вывода команды «docker info».

version: '2'

services:
  nginx:
    image: artifactory.service.dev:5000/nginx:latest
    network_mode: host
    ports:
      - "80:80"
      - "10001-10020:10001-10020"
      - "8080:8080"
    volumes:
      - ~/docker/.docker/nginx/html:/usr/share/nginx/html

  redis:
    image: artifactory.service.dev:5000/redis:latest
    restart: always
    ports:
      - "6379:6379"

  activemq:
    image: artifactory.service.dev:5000/rmohr/activemq:5.11.1
    restart: always
    ports:
      - "61613:61613"
      - "61616:61616"
      - "8161:8161"

  oracle:
    image: artifactory.service.dev:5000/oracle-12c:latest
    restart: always
    ports:
      - "1521:1521"
    volumes:
      - ~/docker/.docker/oracle:/tmp/oracle:ro
    privileged: true

информация о докере

Containers: 4
 Running: 3
 Paused: 0
 Stopped: 1
Images: 38
Server Version: 1.12.1
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 310
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: host bridge null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: seccomp
Kernel Version: 4.4.19-moby
Operating System: Alpine Linux v3.4
OSType: linux
Architecture: x86_64
CPUs: 6
Total Memory: 11.71 GiB
Name: moby
ID: LBLG:7UQC:W67Q:J744:QAHE:4JLX:QRVB:2QQD:PTB2:MV75:HD6Y:FROD
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): true
 File Descriptors: 50
 Goroutines: 72
 System Time: 2016-09-01T06:51:40.063477725Z
 EventsListeners: 1
No Proxy: *.local, 169.254/16, *.dev
Registry: https://index.docker.io/v1/
Experimental: true
Insecure Registries:
 artifactory.service.dev:5000
 127.0.0.0/8

команда, используемая для запуска контейнера:

docker-compose up -d nginx

person Mohan Krishna    schedule 01.09.2016    source источник
comment
Найдите ответ на этот вопрос здесь: stackoverflow.com/questions/33814696/   -  person Vivek Goel    schedule 01.10.2019


Ответы (1)


Вы не указали, какую команду вы используете. Это работает для меня. Я могу получить к нему доступ, используя IP-адрес моего Mac с моего iphone (та же сеть Wi-Fi).

docker run -d --name myserver -p 80:80 nginx:1.10-alpine

Изменить: пример файла компоновки.

Создайте мостовую сеть (базовую сеть), которая является внутренней для ваших служб. Все они общаются через эту сеть. Единственная внешняя точка доступа — через ваш прокси-сервер nginx (порты: раздел).

Не используйте IP-адрес нигде (например, в nginx.conf). Используйте только имена служб. Например, используйте oracle:1521 для подключения к оракулу.

Найдите другое место для хранения ваших html-файлов. ~/docker/.docker должен использоваться только докером.

version: "2"

services:
  nginx:
  image: artifactory.service.dev:5000/nginx:latest
  ports:
    - "80:80"
    - "10001-10020:10001-10020"
    - "8080:8080"
  volumes:
    - ~/docker/.docker/nginx/html:/usr/share/nginx/html
  networks:
    - backbone

  redis:
  image: artifactory.service.dev:5000/redis:latest
  restart: always
  expose:
    - "6379"
  networks:
    - backbone

  activemq:
  image: artifactory.service.dev:5000/rmohr/activemq:5.11.1
  restart: always
  expose:
    - "61613"
    - "61616"
    - "8161"
  networks:
    - backbone

  oracle:
  image: artifactory.service.dev:5000/oracle-12c:latest
  restart: always
  expose:
    - "1521"
  volumes:
    - ~/docker/.docker/oracle:/tmp/oracle:ro
  privileged: true
  networks:
    - backbone

networks:

  backbone:
    driver: bridge
person Bernard    schedule 01.09.2016
comment
Спасибо за ответ. Я обновил вопрос с конфигурацией docker-compose, которую я использую для запуска контейнера. - person Mohan Krishna; 01.09.2016
comment
Это потому, что он работает в сети моста по умолчанию. Добавьте network_mode: host в определение службы nginx (я предполагаю, что вы используете файл компоновки version: "2", если сначала не конвертируете в версию 2). docs.docker.com/compose/overview - person Bernard; 01.09.2016
comment
Я обновил свою конфигурацию docker-compose, и у network_mode: host осталась та же проблема. URL-адрес локального хоста работает, но не из каких-либо систем в той же локальной сети. Я использую версию 2 docker compose. Ценю твою помощь. - person Mohan Krishna; 01.09.2016
comment
Добавьте строку Edit ‹date› к сообщению выше и добавьте полный список файлов dockerfile. Также добавьте то, что печатает docker info, и командную строку, которую вы используете для запуска своих служб (например: docker-compose up -d) - person Bernard; 01.09.2016
comment
Обновлено с конфигурацией docker-compose и информацией о докере. - person Mohan Krishna; 01.09.2016
comment
У вас есть несколько сервисов, которым нужно взаимодействовать друг с другом, поэтому все они должны быть частью общей сети. Если вы укажете host для одного, все они должны иметь network_mode: host. Но забудьте сеть = хост. В вашем случае хорошо только отлаживать. Удалите network_mode=host из службы nginx. Служба nginx должна быть доступна с любого компьютера в той же сети, что и ваш Mac. Позвольте мне добавить код к ответу выше. - person Bernard; 01.09.2016
comment
Проблема не в том, что контейнеры разговаривают друг с другом, это работает нормально, потому что я запускаю их все сразу с помощью docker-compose up, который создает сеть и добавляет в нее все контейнеры. Проблема в том, что nginx недоступен с других компьютеров. Я пробовал с изменениями, которые вы предложили, все еще не повезло - person Mohan Krishna; 02.09.2016
comment
Вы видите порт, открытый с вашего Mac? sudo lsof -iTCP -sTCP:LISTEN -P - person Bernard; 02.09.2016
comment
Я не вижу ни одного из портов nginx в выводе вышеуказанной команды. Я думаю, что порты не открыты. - person Mohan Krishna; 02.09.2016
comment
Виновником был мой брандмауэр McAfee, который блокирует входящие соединения. Спасибо за помощь. - person Mohan Krishna; 29.12.2016
comment
Пытался добавить маршрут от хоста 1 к сети контейнеров докеров внутри хоста 2. Это возможно? Я попытался добавить статический маршрут на host1 с помощью 172.17.x.x (сеть докеров на host2) и указать шлюз как host2. Я не получаю никаких пакетов на host2. Есть ли что-то, на что мне нужно обратить внимание? 172.17.0.0 172.31.69.211 255.255.0.0 UG 0 0 0 eth0 — это маршрут на host1, указывающий на IP-адрес host2. - person Angelo; 29.04.2020
comment
@Angelo Вам нужно использовать оверлейную сеть, если вы хотите, чтобы она охватывала более одного хоста. docs.docker.com/network/overlay - person Bernard; 03.05.2020
comment
У меня это работает со статическим маршрутом... СПАСИБО, Бернард. - person Angelo; 05.05.2020