Предоставление доступа к контейнерам docker-compose Windows в сети хоста Windows

#docker #docker-compose #dockerfile

Вопрос:

Я довольно новичок в докере, и докер сочиняет. У меня есть простой сценарий, основанный на трех приложениях (app1, app2, app3), которые я хочу подключить к сети своего хоста. Цель состоит в том, чтобы иметь подключение к Интернету также внутри контейнера.

Вот мой файл docker-compose:

 version: '3.9'
services:
    app1container:
        image: app1img
        build: ./app1
        networks:
            network_comp:
                ipv4_address: 192.168.1.1
        extra_hosts: 
            anotherpc: 192.168.1.44
        ports:
            - 80:80
            - 8080:8080
    app2container:
        depends_on: 
            - "app1container"
        image: app2img
        build: ./app2
        networks:
            network_comp:
                ipv4_address: 192.168.1.2
        ports:
            - 3100:3100
    app3container:
        depends_on: 
            - "app1container"
        image: app3img
        build: ./app3
        networks:
            network_comp:
                ipv4_address: 192.168.1.3
        ports:
            - 9080:9080

networks:
    network_comp:
        driver: ""
        ipam:
            driver: ""
            config:
                - subnet: 192.168.0.0/24
                  gateway: 192.168.1.254
 

Я уже читал документацию docker-compose, в которой говорится, что для ОС Windows нет драйвера моста. Есть ли в любом случае решение этой проблемы?

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

1. Обычно вы не даете отдельным процессам в физической системе их собственные IP-адреса, работающие в контейнерах или иным образом. Вы должны иметь возможность использовать IP-адрес хост-системы и первый опубликованный ports: номер для доступа к контейнерам. Указание внутренних IP-адресов Docker, которые конфликтуют с внешней сетью, может вызвать проблемы, и вы можете удалить все networks: блоки во всем файле.

2. Большое спасибо! Это сработало!

Ответ №1:

Обычно вам не нужно выполнять какие-либо специальные настройки, чтобы это работало. Когда у вашей службы создания есть ports: , это делает порт доступным на IP-адресе хоста. Основными правилами для этого являются:

  1. Служба внутри контейнера должна прослушивать специальный адрес 0.0.0.0 «все интерфейсы» (а не 127.0.0.1 «только этот контейнер») на каком-либо (обычно фиксированном) порту.
  2. Контейнер должен быть запущен с помощью Compose ports: (или docker run -p ). Вы выбираете первый номер порта, второй номер порта должен соответствовать порту внутри контейнера.
  3. Служба может быть доступна через IP-адрес хоста по первому номеру порта (или, если вы используете более старую настройку Docker Toolbox, по docker-machine ip адресу).
   http://host.example.com:12345  (from other hosts)
             |
             v
     ports: ['12345:8080']       (in the `docker-compose.yml`)
             |
             v
./my_server -bind 0.0.0.0:8080   (the main container command)
 

Вы можете удалить всю ручную networks: конфигурацию в этом файле. В частности, это проблематично, если вы попытаетесь указать, чтобы сеть Docker имела тот же диапазон IP-адресов, что и сеть хоста, поскольку это две отдельные сети. Compose автоматически предоставляет сеть с именем default , которая должна работать для большинства практических приложений.