Moby: Нет docker0 на докере для Mac?

Созданный на 16 мая 2016  ·  115Комментарии  ·  Источник: moby/moby

Вывод docker version :

Client:
 Version:      1.11.1
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   5604cbe
 Built:        Wed Apr 27 00:34:20 2016
 OS/Arch:      darwin/amd64

Server:
 Version:      1.11.1
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   8b63c77
 Built:        Tue May 10 10:39:20 2016
 OS/Arch:      linux/amd64

Вывод docker info :

Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 21
Server Version: 1.11.1
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 25
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins: 
 Volume: local
 Network: null host bridge
Kernel Version: 4.4.9-moby
Operating System: Alpine Linux v3.3
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 1.954 GiB
Name: moby
ID: DFWG:ZZBI:QGZP:CAFF:PZVX:WLED:3XNK:J2LK:UV3V:X2JR:VCGJ:QFBK
Docker Root Dir: /var/lib/docker
Debug mode (client): false
Debug mode (server): true
 File Descriptors: 17
 Goroutines: 38
 System Time: 2016-05-15T23:53:58.530098977Z
 EventsListeners: 1
Registry: https://index.docker.io/v1/

Дополнительные сведения о среде (AWS, VirtualBox, физическая и т. Д.):

Шаги по воспроизведению проблемы:
1.
2.
3.

Опишите полученные результаты:
Нет docker0 и абсолютно нет возможности подключиться к службам, работающим на хосте докеров, через мост-шлюз.
Я перепробовал все это и подумал, что схожу с ума, потом я попробовал то же самое на своем хосте ubuntu без проблем

Опишите ожидаемые результаты:
Я хотел бы иметь возможность подключаться к моим локальным Redis и другим службам без необходимости докерировать их ...

kinquestion platfordesktop versio1.11

Самый полезный комментарий

Что ж, не совсем удовлетворительно, поскольку Mac обычно не производственные серверы, а
машины разработки.

На моих производственных машинах я не возражаю против того, чтобы
подключиться к хосту.

Но на машине разработчика, подключающейся к службам на том же хосте изнутри
контейнер - это именно тот сценарий, в котором требуется эта функция,
большинство.

Все 115 Комментарий

вы нашли ip в виртуальном боксе или на хосте?

Я думаю, что docker0 был на виртуальной машине виртуального бокса.

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

Я тоже столкнулся с той же проблемой. Найден IP-адрес хоста на докере с помощью команды ниже. Предполагая, что 0.0.0.0 представляет хост, поправьте меня, если я ошибаюсь.
netstat -nr | grep '^ 0.0.0.0' | awk '{print $ 2}'
172.17.0.1

но когда вы делаете curl на этом ip с портом, на котором я запускаю веб-сервер, он дает отказ в соединении.
завиток 172.17.0.1:9000
curl: (7) Не удалось подключиться к порту 172.17.0.1 9000: соединение отклонено

Не знаю, как правильно исправить. Кажется, это вызывает проблемы, поскольку необходимо подключиться к службе, которая будет работать на хост-машине.
Также нашел способ исправить IP-адрес хост-машины, установив его в DOCKER_OPTS.
DOCKER_OPTS = "- H tcp: //0.0.0.0 : 5000 -H unix: ///var/run/docker.sock --bip = 172.17.42.1 / 16"

но где на Mac я могу разместить эти параметры? в Ubuntu его можно разместить в / etc / default / docker.

Предоставьте инструкции, если это можно исправить на Mac.

ping @justincormack, возможно, у вас есть подсказки.

@MiteshSharma точно, это одна из первых вещей, которые я пробовал, и с точно такими же проблемами

@NinoFloris Похоже, мы оба в одном месте. В моем случае я запускаю mysql на своем хост-компьютере.
Эй, ребята,
Сделайте обновление, если кто-то может это сделать.

Я использовал это
https://docs.docker.com/engine/installation/mac/

не уверен, что ваша бета особенная

@HackToday это другое, это установка Mac на основе VirtualBox; Docker для Mac находится на сайте beta.docker.com

Спасибо @thaJeztah Любая возможная хорошая ссылка на документ для связанной архитектуры Mac Docker или что-то еще? Кажется интересным

@HackToday https://blog.docker.com/2016/03/docker-for-mac-windows-beta/ дает немного больше, и есть документация, но я думаю, что это только если вы находитесь в бета-версии; https://beta.docker.com/docs/. Если вы подписались на участие в бета-тестировании, дайте мне «пинг»; Я могу попытаться внести вас в список приоритетов как соавтора: smile:

oh @thaJeztah Спасибо, я подумал, что можно бесплатно поработать и попробовать. Не нужно ничего особенного. Я сначала прочитаю этот блог, чтобы понять, прежде чем пытаться. 😺

@HackToday это совершенно бесплатно, просто чтобы не перегружать команду, было решено сначала выпустить его как "частную" бета-версию, потому что "многие пользователи '===" много вопросов в службу поддержки ": smile:

Привет, да, в настоящее время нет способа проложить маршрут с Mac на мост docker0 . Возможно, мы сможем добавить это позже, но обычно мы рекомендуем вам подключаться из контейнера или путем открытия портов. Это то же самое, что и с оверлейными сетями докеров в Linux, к которым вы не можете подключиться с хоста.

Что ж, не совсем удовлетворительно, поскольку Mac обычно не производственные серверы, а
машины разработки.

На моих производственных машинах я не возражаю против того, чтобы
подключиться к хосту.

Но на машине разработчика, подключающейся к службам на том же хосте изнутри
контейнер - это именно тот сценарий, в котором требуется эта функция,
большинство.

Мне тоже нужен этот интерфейс docker0 для использования в смешанной среде «docker + на хосте (из IDE) с запущенными приложениями».

На данный момент лучшее решение - подключиться к вашим контейнерам из другого контейнера. В настоящее время мы не можем обеспечить маршрутизацию к этим контейнерам из-за проблем с OSX, которые Apple еще не решила. мы отслеживаем это требование, но в настоящее время ничего не можем с этим поделать.

Правильный ли приведенный выше комментарий?

Я обнаружил, что из контейнеров docker-for-mac-beta можно найти хост докера и подключиться к нему по обычному адресу 172.17.0.1 (при условии, что служба привязана к 0.0.0.0 ).

@igrayson Это связано с тем, что контейнеры находятся в виртуальной
Проблема заключается в маршрутизации из OSX в сеть виртуальной машины.

Проблема заключается в маршрутизации из OSX в сеть виртуальной машины.

Это не мое понимание проблемы OP:

Я хотел бы иметь возможность подключаться к моим локальным Redis и другим службам без необходимости докерировать их ...

Я использую docker-for-mac-beta, и у меня нет проблем с подключением к redis и другим локальным сервисам, работающим на OSX, если они слушают 0.0.0.0 , а мои докеризованные приложения подключаются к 172.17.0.1 .

Обзор

У меня та же проблема. Используется версия Docker 1.11.1-beta14 (build: 8670) 984649fbd63d53a62b34f08b59694d4d569b74d5 . Мой pinata doctor говорит, что все в порядке.

Я не могу свернуть службу, работающую на хосте, например приложение ExpressJS, прослушивающее порт 3001 , изнутри контейнера:

root<strong i="11">@e19fc8e02595</strong>:/# curl localhost:3001
curl: (7) Failed to connect to localhost port 3001: Connection refused

root<strong i="12">@e19fc8e02595</strong>:/# curl 0.0.0.0:3001
curl: (7) Failed to connect to 0.0.0.0 port 3001: Connection refused

root<strong i="13">@e19fc8e02595</strong>:/# curl 172.25.8.25:3001
{"status":200} 
root<strong i="14">@e19fc8e02595</strong>:/#

_Примечание: 172.25.8.25 - это мой IP-адрес WiFi.

Пиньята

$pinata list
These are advanced configuration settings to customize Docker.app on MacOSX.
You can set them via pinata set <key> <value> <options>.

🐳  hostname = docker
   Hostname of the virtual machine endpoint, where container ports will be
   exposed if using nat networking. Access it via 'docker.local'.

🐳  hypervisor = native (memory=4, ncpu=6)
   The Docker.app includes embedded hypervisors that run the virtual machines
   that power the containers. This setting allows you to control which the
   default one used for Linux is.

 ▸  native: a version of the xhyve hypervisor that uses the MacOSX
              Hypervisor.framework to run container VMs. Parameters:
              memory (VM memory in gigabytes), ncpu (vCPUs)


🐳  network = hostnet (docker-ipv4=192.168.65.2, host-ipv4=192.168.65.1)
   Controls how local containers can access the external network via the
   MacOS X host. This includes outbound traffic as well as publishing ports
   for external access to the local containers.

 ▸ hostnet: a mode that helps if you are using a VPN that restricts
              connectivity. Activating this mode will proxy container network
              packets via the Docker.app process as host socket traffic.
              Parameters: docker-ipv4 (docker node), host-ipv4 (host node)
 ▸     nat: a mode that uses the MacOS X vmnet.framework to route container
              traffic to the host network via a NAT.

🐳  filesystem = osxfs
   Controls the mode by which files from the MacOS X host and the container
   filesystem are shared with each other.

 ▸   osxfs: a FUSE-based filesystem that bidirectionally forwards OSX
              filesystem events into the container.


🐳  native/port-forwarding = true
   Expose container ports on the Mac, rather than the VM

 ▸    true: Container ports will be exposed on the Mac
 ▸   false: Container ports will be exposed on the VM

🐳  daemon = run 'pinata get daemon' or 'pinata set daemon [@file|-]>
   JSON configuration of the local Docker daemon. Configure any custom
   options you need as documented in:
   https://docs.docker.com/engine/reference/commandline/daemon/. Set it
   directly, or a <strong i="20">@file</strong> or - for stdin.

Возможные дубликаты, ссылки, справка и т. Д.

У меня были похожие проблемы, и я обнаружил 172. * ips не позволял мне подключаться к локальному экземпляру mysql, привязанному к 0.0.0.0.

Я мог подключиться к нему с любого маршрутизируемого IP-адреса с моей хост-машины. ifconfig и найди одну из своих.

Теперь, как мне динамически поместить это в контейнер?

Имея ту же проблему, что и @Kazanz (mysql работает локально / без ограничений), пытается 172.17.0.1. Думаю, я попробую Docker Toolbox? Было бы полезно, если бы это ограничение было задокументировано. Я ничего не мог найти об этом, пока не наткнулся на эту проблему.

Пинг @londoncalling ^^

Есть новости об этом? потому что в Ubuntu (хост) приложение внутри контейнера, которое прослушивает 0.0.0.0, может связаться с хостом, используя IP 172.17.*.*. . Поэтому нет необходимости открывать порт при запуске контейнера.

В Docker для Mac Beta я не могу этого сделать, потому что отсутствует docker0. Надеюсь, это будет исправлено в финальном выпуске :)

@thaJeztah @astasoft Я посмотрю на это сегодня, спасибо @

Насколько я понимаю, ваша проблема заключается в доступе к службам, работающим на вашем Mac, из контейнера.
Если это так, вы можете сделать это, используя IP-адрес, предоставленный интерфейсом en0.
ifconfig en0 | grep "inet" | вырезать -d "" -f2

Например, если у меня есть веб-сервер, работающий на моем Mac через порт 80:
docker run -it tutum / curl curl ifconfig en0 | grep "inet " | cut -d " " -f2

Оно работает!

Вы можете установить этот ip в переменной окружения и передать его своему контейнеру, как я делаю для сервера X11 в https://github.com/chanezon/docker-tips/blob/master/x11/README.md

@chanezon Мне удалось заставить это работать, но это кажется не идеальным, поскольку этот IP-адрес часто меняется в зависимости от сети, к которой вы подключены. Я надеялся установить более или менее статический IP-адрес, представляющий мой локальный мост докеров.

@londoncalling Спасибо,

@chanezon Нет, в моем случае доступ к службе от хоста к контейнеру. Есть случай, когда я хочу запустить веб-сервер на моем хосте на порту 80 и на том же порту в моем контейнере. Если я предоставлю хосту порт 80 контейнера, я не смогу запустить веб-сервер на моем хост-компьютере. Такая установка очень важна для моего развития.

Мой текущий обходной путь - вернуться в Docker Toolbox для Mac и выполнить переадресацию портов на экземпляре Boot2Docker на Virtualbox.

sudo iptables -t nat -A PREROUTING -d 192.168.99.100/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80

Затем я могу вызвать службу в контейнере, используя IP-адрес boot2docker 192.168.99.100:80.

curl -i http://192.168.99.100

Итак, у меня возникла следующая проблема, которая может быть связана с этим.
Просто для ясности я использую Docker Beta for Mac 1.12.0-beta21 (build: 10868) .

В основном я не могу подключиться с хоста к контейнеру, используя IP-адрес 172.17.0.2 , потому что нет интерфейса docker0 с назначенным адресом 172.17.0.1 .

Контейнер - это образ ubuntu, и вот информация, имеющая отношение к сети.

root<strong i="12">@app</strong>:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:02
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:524 errors:0 dropped:0 overruns:0 frame:0
          TX packets:370 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:217502 (217.5 KB)  TX bytes:40451 (40.4 KB)

root<strong i="13">@app</strong>:~# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.17.0.1      0.0.0.0         UG    0      0        0 eth0
172.17.0.0      *               255.255.0.0     U     0      0        0 eth0

Хост - это MacbookPro, и, как вы можете видеть в следующем фрагменте, у него нет docker0 (или какого-либо интерфейса в этом отношении) с IP-адресом 172.17.0.1 , который назначается в контейнере как шлюз.

robert<strong i="19">@localhost</strong> $ ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
    options=3<RXCSUM,TXCSUM>
    inet6 ::1 prefixlen 128
    inet 127.0.0.1 netmask 0xff000000
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
    nd6 options=1<PERFORMNUD>
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
en0: flags=8823<UP,BROADCAST,SMART,SIMPLEX,MULTICAST> mtu 1500
    ether f4:5c:89:c9:be:0d
    nd6 options=1<PERFORMNUD>
    media: autoselect (<unknown type>)
    status: inactive
en1: flags=963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX> mtu 1500
    options=60<TSO4,TSO6>
    ether 6a:00:02:06:b7:f0
    media: autoselect <full-duplex>
    status: inactive
en2: flags=963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX> mtu 1500
    options=60<TSO4,TSO6>
    ether 6a:00:02:06:b7:f1
    media: autoselect <full-duplex>
    status: inactive
p2p0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> mtu 2304
    ether 06:5c:89:c9:be:0d
    media: autoselect
    status: inactive
awdl0: flags=8902<BROADCAST,PROMISC,SIMPLEX,MULTICAST> mtu 1484
    ether 0e:f1:f1:4d:46:88
    nd6 options=1<PERFORMNUD>
    media: autoselect
    status: inactive
bridge0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    options=63<RXCSUM,TXCSUM,TSO4,TSO6>
    ether f6:5c:89:9c:e6:00
    Configuration:
        id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
        maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
        root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
        ipfilter disabled flags 0x2
    member: en1 flags=3<LEARNING,DISCOVER>
            ifmaxaddr 0 port 5 priority 0 path cost 0
    member: en2 flags=3<LEARNING,DISCOVER>
            ifmaxaddr 0 port 6 priority 0 path cost 0
    nd6 options=1<PERFORMNUD>
    media: <unknown type>
    status: inactive
en4: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    options=10b<RXCSUM,TXCSUM,VLAN_HWTAGGING,AV>
    ether 39:c9:87:45:22:ee
    inet6 fe80::3ac9:86ff:fe40:22de%en4 prefixlen 64 scopeid 0x9
    inet 192.168.1.123 netmask 0xffffff00 broadcast 192.168.1.255
    nd6 options=1<PERFORMNUD>
    media: autoselect (1000baseT <full-duplex,flow-control>)
    status: active

У некоторых коллег это работает правильно на хостах Ubuntus, поэтому я предполагаю, что это проблема Mac или локальной среды.
Есть идеи?

@robertoestivill не уверен в точном localhost:port

@nikdavis, если вам нужен стабильный IP-адрес, вы можете добавить IP-адрес (любой, на который вы никогда не будете маршрутизировать) к интерфейсу обратной связи lo0 на Mac и использовать его.

Привет, имхо, это большая разница по сравнению с докером на Linux. Есть много документации, которая просто неприменима. Я также недостаточно разбираюсь в сети, чтобы знать, как подключить еще один ip к lo0 и что дальше. Было бы очень полезно, если бы было описание обходных путей (не связанных с boot2docker) для этой проблемы и упоминание об этом в документации.

@justincormack @chanezon можем ли мы вместе поработать над этим, чтобы получить хорошие документы по этой проблеме?

@ pourquoi42
Вы можете добавить еще один IP к интерфейсу lo0 следующим образом:
CONTAINER_IP = $ (docker inspect --format '{{.NetworkSettings.IPAddress}}' имя-контейнера)
ifconfig lo0 псевдоним $ CONTAINER_IP

Чтобы удалить это:
ifconfig lo0 -alias $ CONTAINER_IP

@itilk Похоже, не работает на MacO. Пробовал с names и container id .

robert<strong i="9">@work</strong>:~ $ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
d047790e196a        group/name              "/bin/bash"         About a minute ago   Up About a minute                       jovial_goodall

robert<strong i="10">@work</strong>:~ $ docker inspect --format '{{ .NetworkSettings.IPAddress }}' jovial_goodall

robert<strong i="11">@work</strong>:~ $ docker inspect --format '{{ .NetworkSettings.IPAddress }}' d047790e196a

robert<strong i="12">@work</strong>:~ $

У меня был Docker 1.12.0 (сборка 10871) на Дарвине,
1) Весь докер-контейнер работает нормально;
2) Контейнер может связываться с хостом ;
3) Связь между контейнерами работает нормально;

Где виртуальный интерфейс docker0 ? ИЛИ есть ли способ разрешить хосту подключаться к контейнерам?

грустно читать это: известные ограничения на OSX

Known Limitations
There is no docker0 bridge on OSX
Because of the way networking is implemented in Docker for Mac, you cannot see a docker0 interface in OSX. This interface is actually within HyperKit.

I can’t ping my containers
Unfortunately, due to limtations in OSX, we’re unable to route traffic to containers, and from containers back to the host.

Итак, пока у нас есть только один способ подключения хоста к контейнеру : сопоставление портов.

Version 1.12.0-beta21 (build: 11019)
1) Весь док-контейнер работает нормально.
2) Контейнер не может связаться с хостом.
3) Связь между контейнерами работает нормально.
4) docker0 недоступно.

Ad.2)

У меня есть экземпляр hugo, который привязывается к 0.0.0.0 на порту 1313 . curl из работающего контейнера возвращает: curl: (7) Failed to connect to 172.19.0.1 port 1313: Connection refused .
Использование IP-адреса, возвращаемого ifconfig en0 | grep "inet " | cut -d " " -f2 тоже не работает:
curl: (7) Failed to connect to 172.19.27.228 port 1313: No route to host .

Привет всем,

Я нашел статью из другого контейнерного продукта ( не докера ): https://www.flockport.com/using-flockbox-with-xhyve/ , и я также даже не тестировал ее, действительно ли она работает.

в конце упоминается:

Вы также можете использовать маршрутизацию вместо переадресации портов, описанной выше, для доступа к приложениям в контейнерах. Маршрутизация сделает всю подсеть контейнера внутри виртуальной машины доступной на хосте.

Если вы предпочитаете использовать маршрутизацию вместо переадресации портов, вот как это работает. Команды маршрутизации необходимо запускать на хосте.

Если ваш IP-адрес виртуальной машины 192.168.64.3, а подсеть контейнера - 10.0.3.0/24, вы можете создать маршрут с помощью команды, как показано ниже.

sudo route -n add 10.0.3.0/24 192.168.64.3

Xyhve автоматически создает интерфейс bridge100 для сети виртуальных машин. Запустите быстрый ifconfig, чтобы проверить, включен ли интерфейс bridge100, например en4, а затем выполните команду ниже.

sudo ifconfig bridge100 -hostfilter en4

Теперь у вас должна быть возможность пинговать любой контейнер внутри виртуальной машины прямо с хоста.

ping 10.0.3.175

Чтобы получить доступ к приложению в браузере Hosts, отредактируйте файл / etc / hosts на хосте, как описано выше, с перенаправлением портов, но на этот раз свяжите IP-адрес контейнера с URL-адресом приложения.

Извините, что я плохо разбираюсь в сетевых особенностях Linux, но есть ли это обходной путь?

Я не знаю, как получить IP-адрес виртуальной машины (alpine с докером), работающей внутри xhyve, есть идеи?

Привет @Kaijun , я не устанавливал Docker Machine, а откуда у вас bridge100?

@junjiemars нет, статья, которую я опубликовал, не связана с докером, это просто еще один контейнерный продукт, который работает в основном так же, как и докер. (Хост -> ВМ (xhyve) -> Контейнеры)

Я подумал, сможем ли мы вдохновиться этой статьей или этим продуктом и применить тот же обходной путь для самого Docker.

@Kaijun , я знаю, что может быть способ взломать xhyve, чтобы добиться цели. Если вы это сделали, поделитесь своим взломом.

@nikdavis, если вам нужен стабильный IP-адрес, вы можете добавить IP-адрес (любой, на который вы никогда не будете выполнять маршрутизацию) к интерфейсу обратной связи lo0 на Mac и использовать его.

@justincormack Не
Я пробовал то, что опубликовал @itilk , но у меня это не сработало.

В общем: есть ли ETA для повторного внедрения сети docker0 в бета-версию docker для Mac?

Спасибо

@georgehrke, вы можете сделать sudo ifconfig lo0 alias 10.200.10.1/24 - очевидно, выберите адрес, который вы не найдете локально. Затем вы можете использовать этот адрес для разговора с хостом независимо от того, есть ли у вас сетевое соединение.

Извините, что не изложил мою проблему более точно.

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

Я использовал docker inspect container_name для получения IP.
Но я не могу ни пинговать его, ни открывать в браузере, хотя в Dockerfile есть веб-сервер и EXPOSE 80 в нем.

Да, есть две отдельные проблемы, которые в некоторой степени связаны.

  1. Я хочу подключиться из контейнера к службе на хосте. Mac имеет измененный IP-адрес или его нет, если у вас нет доступа к сети.

Текущая рекомендация - прикрепить неиспользуемый IP-адрес к интерфейсу lo0 на Mac, например, sudo ifconfig lo0 alias 10.200.10.1/24 , убедитесь, что ваша служба прослушивает этот адрес или 0.0.0.0 (т.е. не 127.0.0.1 ). Затем контейнеры могут подключаться к этому адресу.

  1. Я хочу подключиться к контейнеру с Mac.

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

Мы понимаем, что это не идеально, но есть несколько проблем, в частности, ошибка в OSX, которая исправлена ​​только в 10.12 и которая не переносится, насколько мы можем судить, что означает, что мы не могли поддерживать это во всех поддерживаемых OSX версии. Кроме того, для этой настройки сети потребуется root-доступ, которого мы пытаемся полностью избежать в Docker для Mac (в настоящее время у нас есть очень маленький root-помощник, который мы пытаемся удалить).

( @londoncalling , вы хотите добавить это резюме в документы?)

@justincormack, ты хочешь сказать, что все --net=host на MacOS Docker бесполезны?

@ m1ome это не совсем бесполезно - вы можете подключаться к службам, которые запускаете там, из других контейнеров, поскольку порты открываются на виртуальной машине, но люди ожидают, что службы там будут доступны на Mac, например, опубликованные порты, которые у нас нет работать, пока это довольно сложно (мы не получаем поток событий для портов, которые вы открываете таким образом, в отличие от опубликованных портов, где мы используем события докеров).

@justincormack есть какое-то решение этой проблемы, по крайней мере, на данный момент? Если он есть в Docker, думаю, будет полезно записать его в документации.

@justincormack Я могу добавить вашу запись в документацию, но я думаю, что мы должны включить некоторые конкретные примеры. Я попробую сам, но, возможно, понадобится твоя или чья-то помощь. Я вернусь к вам, когда буду работать над этим.

@londoncalling обязательно пришлет вам немного.

30 августа 2016 г. в 18:28 «Виктория» [email protected] написала:

@justincormack https://github.com/justincormack Я могу добавить вашу запись
в документацию, но я думаю, что мы должны включить некоторые конкретные примеры. я буду стараться
сам, но, вероятно, понадобится твоя или чья-то помощь. Больной
Вернусь к вам, пока я работаю над этим.

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/docker/docker/issues/22753#issuecomment -243515932,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AAdcPPgFU3H6TZCLcI0yUvbPn4tPwZj7ks5qlGhUgaJpZM4Ie9PB
.

@justincormack спасибо - учитывая эту

  1. Пример того, как получить доступ к службе на хосте Mac из контейнера (например, будет ли работать, если приложение будет веб-сервером, например nginx подключенным к базе данных Redis на хосте?)
  2. Пример подключения к контейнеру с Mac. Покрывает ли наш текущий пример nginx второй случай, поскольку мы открываем порт в команде run ; т.е. docker run -d -p 80:80 --name webserver nginx ? @justincormack, но мы должны показать это с отображением портов и без него согласно комментарию @weaver ниже, так что, вероятно, здесь два разных варианта использования?
  3. Пример того, как запустить приложение в одном контейнере, которое использует службу в другом (например, повторить пример nginx plus redis но на этот раз запустить redis в контейнере?

An example of connecting to a container from the Mac. Does our current nginx example cover the second case, since we expose a port in the run command; i.e., docker run -d -p 80:80 --name webserver nginx?

Я был бы очень признателен за пример подключения с Mac к контейнеру, который не включает отображение портов. В моем сценарии использования мезокластер для локальной разработки. Если отображение портов - единственный способ выполнить прямую связь от Mac к контейнеру (ведомому устройству), требуется дополнительная работа, чтобы убедиться, что каждый ведомый процесс mesos работает на уникальном порте, чтобы любой доступ с Mac (просмотр журналов для отладки, для пример) согласуется с портами, которые мезо использует внутри (в противном случае мезофреймворки отображают URL-адреса в панелях мониторинга с внутренними номерами портов, которые не работают с хоста).

Прямо сейчас я использую docker-machine с маршрутом от Mac в виртуальную сеть, чтобы все IP-адреса и номера портов, которые использует кластер mesos, «просто работали» с Mac. Это очень простое решение.

@weaver, как указано, в настоящее время нет способа подключиться к контейнеру напрямую с хоста, если у него нет опубликованного порта. Однако вы можете подключиться из другого контейнера.

@justincormack Я прочитал весь поток, пытаясь понять, как подключиться с моего Mac к контейнеру, точно так же, как я это делаю в Linux: container-ip: 8080, например. Насколько я понимаю, это должно быть возможно в MacOS (10.12), верно?

@matiasserrano, вы можете сделать это с помощью docker run -p 8080:8080

@ m1ome да, я это знаю. Но для меня не масштабируется. Я разработчик и обычно запускаю несколько контейнеров с apache / Nginx, поэтому 80 всегда используется. Если я сделаю то, что вы предлагаете, сначала мне нужно отключить apache на моем Mac, а во-вторых, мне нужно запускать один контейнер за раз, потому что они используют один и тот же порт. Использование разных портов не вариант.
С другой стороны, мы даем разработчикам контейнеры для начала работы, и они снова могут работать над более чем одним проектом одновременно.
Таким образом, возможность подключения Mac к контейнерам по их IP-адресу является для нас обязательной.

@matiasserrano Почему бы не использовать -P для автоматической переадресации открытых портов на порт с произвольным высоким уровнем? Если вы ищете IP-адрес контейнера через что-то вроде docker inspect , можно также выполнить очень похожую операцию для открытого порта.

@nathanleclaire Проблема не в том, чтобы знать порт или IP-адрес контейнера, это в основном то же решение, что и в предыдущем посте. Другое решение - создать бродячую виртуальную машину для каждого проекта и запустить докер внутри или использовать докер-машину, что в основном то же самое. Оба решения для нас неприемлемы. Вместо этого мы предпочитаем использовать Vagrant.

Что бы это ни стоило, у меня есть вариант использования, аналогичный @weaver (т.е. прямой доступ к сети контейнеров с хоста). Я запускаю кластер Spark через Docker в его собственной сети. Я использую docker-machine и добавляю статический маршрут через интерфейс docker0 для подсети, которую использует кластер.

Пользовательский интерфейс Spark доступен на главном узле и включает HTML-ссылки на все остальные узлы кластера (через их IP-адреса). Добавив статический маршрут, я могу получить доступ к пользовательскому интерфейсу Spark на главном сервере прямо с моей машины разработки, и все ссылки, которые он генерирует с другими узлами в кластере, просто работают. Эти ссылки также означают, что это не просто случай переадресации порта 7080 для работы мастера без docker0 - мне нужно каким-то образом достичь всей сети.

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

@nathanleclaire Проблема не в том, чтобы знать порт или IP-адрес контейнера, это в основном то же решение, что и в предыдущем посте.

Я не понимаю

Ты говоришь:

Таким образом, возможность подключения Mac к контейнерам по их IP-адресу является для нас обязательной.

Почему именно разные IP-адреса? Вы описываете конфликты портов как проблему здесь:

Я разработчик и обычно запускаю несколько контейнеров с apache / Nginx, поэтому 80 всегда используется. Если я сделаю то, что вы предлагаете, сначала мне нужно отключить apache на моем Mac, а во-вторых, мне нужно запускать один контейнер за раз, потому что они используют один и тот же порт.

С -P никакие два контейнера не будут открывать один и тот же порт, даже если все они слушают 80 внутренне. Так зачем вам отключать Apache и т. Д.?

Другое решение - создать бродячую виртуальную машину для каждого проекта и запустить докер внутри или использовать докер-машину, что в основном то же самое. Оба решения для нас неприемлемы. Вместо этого мы предпочитаем использовать Vagrant.

Если вы твердо намерены использовать Vagrant и не будете использовать Docker Machine или Docker для Mac, зачем писать / обсуждать здесь?

@nathanleclaire В Linux, используя созданные мной контейнеры, при желании я могу запускать 4 контейнера одновременно, например, которые открывают порт 80. IE: один для Magento, один для Drupal, один для Larabel и еще один с чистым апач.

Каждый контейнер будет иметь IP-адрес, например 192.100.200.1, 192.100.200.2, 192.100.200.3 и 192.100.200.4.

С этими IP-адресами я добавляю хост в свой файл / etc / hosts с псевдонимом для каждого из них, например:

192.100.200.1 magento.local
192.100.200.2 drupal.local
192.100.200.3 larabel.local
192.100.200.4 apache.local

а затем войдите на серверы прямо из браузера.

В Mac я не могу этого сделать, потому что не могу получить IP-адрес для каждого контейнера. Использование -P не вариант, потому что вместо псевдонима для каждого контейнера мне нужно будет использовать что-то вроде localhost: 8012 для Magento, localhost: 9823 для drupal и так далее.

Другой способ решения проблемы - использовать vagrant с виртуальной машиной Linux для каждого контейнера, внутри которого запущен контейнер, и использовать отображение портов 80:80. С этим решением докер не имеет смысла, потому что, если я создам машину Vagrant, с теми же вещами, что и контейнер докера, будет то же самое. (Я знаю разницу между Docker и Vagrant, и я предпочитаю Docker вместо Vagrant 100 раз ...)

Надеюсь, этот вариант использования поможет вам понять, почему для нас так важно получить IP-адрес контейнера.

Пример с портом 80, но применим к любому порту, который вы хотите.

@matiasserrano Хорошо, я подозревал, что это может быть связано с

Была такая же проблема (подключение к хосту из контейнера). У меня сработало 192.168.65.1. Не совсем уверен, что это, но я думаю, что это кратко отображается в журнале pinata @thalesfsp :

🐳  network = hostnet (docker-ipv4=192.168.65.2, host-ipv4=192.168.65.1)
   Controls how local containers can access the external network via the
   MacOS X host. This includes outbound traffic as well as publishing ports
   for external access to the local containers.

(Спасибо @feedthefire за то, что показал мне это!)

Если вы твердо намерены использовать Vagrant и не будете использовать Docker Machine или Docker для Mac, зачем писать / обсуждать здесь?

@nathanleclaire Это довольно бесполезный ответ, возможно, даже

Спасибо @cpoonolly , ваш ответ очень полезен, но я думаю, что ваше решение работает в противоположном направлении: контейнер пытается подключиться к Mac Host. Мне нужно прямо противоположное: хост Mac пытается подключиться к контейнерам, используя их IP.

Эй, ребята. Эта проблема распространилась по разным направлениям, и я бы посоветовал разработчикам докеров / докеров закрыть ее и разделить на несколько подзадач. например, один для достижения IP-адреса Mac изнутри виртуальной машины D4M, а второй для IP-адресации для каждого контейнера (хотя я бы сказал, что это может быть лучше, чем просто поддержка сопоставления DNS / имени хоста контейнера изначально в D4M). Скорее всего, в репозитории Docker для Mac, поскольку это репозиторий для «Engine», и в идеале в трекере должны быть сообщения о проблемах Engine в Linux / Windows.

Как бы то ни было, в Docker для Mac VM есть _definally_ мост docker0 . Вы можете убедиться в этом сами, если запустите контейнер с --net host и запустите ifconfig . Однако различные проблемы здесь не связаны с тем, что предполагает исходное название: они связаны с сетью контейнеров и виртуальных машин и видимостью.

@icecrime @justincormack Что ты думаешь. Спасибо всем.

@nathanleclaire Это гораздо лучший ответ, спасибо, и я полностью согласен с тем, что разделение на несколько дополнительных вопросов было бы хорошим шагом вперед здесь

Я согласен!!!! нет проблем, если вы это сделаете!

@nathanleclaire @justincormack , тем временем документы Beta 25 (которые будут опубликованы сегодня, немного отстают от выпусков приложений) будут содержать предложения Джастина и Натана по обходным путям в темах Networking и FAQ. Хотя я знаю, что это не решает всех проблем, это будет началом для предоставления некоторых решений в документации и признания проблем.

@matiasserrano в следующей бета-версии, которая должна выйти во вторник, вы сможете публиковать порты на разных IP-адресах на хосте. Итак, если вы добавите несколько адресов к интерфейсу обратной связи, как я упоминал выше, а затем добавите их в свой файл hosts, вы сможете публиковать разные контейнеры для порта 80 на каждом из этих адресов и использовать имена хостов.

так что если вы добавите

192.100.200.1 magento.local
192.100.200.2 drupal.local
192.100.200.3 larabel.local
192.100.200.4 apache.local

в /etc/hosts тогда вы можете:

sudo ifconfig lo0 alias 192.100.200.1/24
sudo ifconfig lo0 alias 192.100.200.2/24
sudo ifconfig lo0 alias 192.100.200.3/24
sudo ifconfig lo0 alias 192.100.200.4/24

тогда

docker run -p 192.100.200.1:80:80 magento
docker run -p 192.100.200.2:80:80 drupal
...

тогда вы сможете подключиться напрямую к drupal.local и т. д.

@londoncalling, мы должны задокументировать это для следующих бета-документов.

@justincormack придирки : это правильный блок?

$ ifconfig lo0 alias 192.100.200.1/24
$ ifconfig lo0 alias 192.100.200.2/24
$ ifconfig lo0 alias 192.100.200.2/24
$ ifconfig lo0 alias 192.100.200.2/24

должны ли последние два быть 192.100.200.3 и 192.100.200.4 ? И почему псевдоним всего cidr ( 192.100.200.1/24 - это полный диапазон от 192.100.200.0 до 192.100.200.255 правильно?)? Должен ли быть только один IP?

Извините, опечатка. Да, /32 тоже подойдет.

@justincormack Будет ли DNS в ближайшее время в

Также почему docker устанавливает 10 ip-адресов [192.168.65.1 to 10] в /etc/resolv.conf?
PS: не используйте 192.100.xx, так как это общедоступный диапазон. Используйте 192.168.xx

Мы стараемся не добавлять DNS в интерфейс, а просто прочтите
настройки с Mac. Мы читаем файл hosts, но прочитаем все
настройки скоро.

Адреса файлов hosts сопоставляются с преобразователями файлов hosts, но
вокруг, так что аварийное переключение работает правильно.

11 сентября 2016 года в 19:09 "Джиджо Варгезе" [email protected] написал:

@justincormack https://github.com/justincormack Будет ли DNS в графическом интерфейсе
интерфейс в ближайшее время? Поскольку beta25 по-прежнему не может разрешать имена DNS
через VPN с разделенным туннелем я надеялся запустить dnsmasq на моем компьютере Mac. Все остальные
порты на моем Mac доступны через 192.168.65.1 из контейнеров, но
не днс.

Также почему docker устанавливает 10 ip-адресов [192.168.65.1 to 10] в /etc/resolv.conf?
PS: не используйте 192.100.xx, так как это общедоступный диапазон. Используйте 192.168.xx

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/docker/docker/issues/22753#issuecomment -246194539,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AAdcPEQcEyn3w7BPJCeaz5mlbgJx5etTks5qpEPUgaJpZM4Ie9PB
.

Я просто хочу поблагодарить @justincormack за это:

Да, есть две отдельные проблемы, которые в некоторой степени связаны.

  1. Я хочу подключиться из контейнера к службе на хосте. Mac имеет измененный IP-адрес или его нет, если у вас нет доступа к сети.
    Текущая рекомендация - прикрепить неиспользуемый IP-адрес к интерфейсу lo0 на Mac, например, sudo ifconfig lo0 alias 10.200.10.1/24 , убедитесь, что ваша служба прослушивает этот адрес или 0.0.0.0 (т.е. не 127.0.0.1). Затем контейнеры могут подключаться к этому адресу.

Хотя это и не идеально, сейчас это должно сработать для нас. (проверено и работает)

@justincormack

Мы стараемся не добавлять DNS в интерфейс, а просто читаем настройки с Mac.
Комбинации VPN разнообразны и сложны, поэтому было бы недальновидно предполагать, что вы всегда можете прочитать правильные настройки. https://github.com/docker/for-mac/issues/19 (закрыто) по-прежнему не работает для нас на vpn с разделенным туннелем. Вероятно, проблема не в докере, а в том, как наш vpn-сервер делает split-dns.

В другом примере, в моем предыдущем месте, мы говорили QA и разработчикам указывать на разные серверы имен в зависимости от того, в какой env они хотели попасть. Если этот тип тестирования нужен только внутри Docker, то это еще один вариант использования, который следует рассмотреть. Благодарю.

Мы работаем над поддержкой раздельного сервера имен для VPN.

13 сентября 2016 года в 18:48 "Джиджо Варгезе" [email protected] написал:

@justincormack https://github.com/justincormack

Мы стараемся не добавлять DNS в интерфейс, а просто прочтите
настройки с Mac.
Комбинации VPN разнообразны и сложны, поэтому было бы недальновидно
Предположим, вы всегда можете прочитать правильные настройки. Докер / для Mac # 19
https://github.com/docker/for-mac/issues/19 (закрыт) все еще не работает
у нас на сплит-туннель впн. Вероятно, проблема не в докере, а в том, как
наш сервер vpn делает split-dns.

Другой пример, в моем предыдущем месте, мы сказали бы QA и разработчикам указать
к разным серверам имен в зависимости от того, в какой env они хотели попасть. Если это
тип тестирования был нужен только внутри Docker, тогда это еще одно применение
случай для рассмотрения. Благодарю.

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/docker/docker/issues/22753#issuecomment -246764433,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AAdcPDXx3ziQv81fPBXpQHvU7_j9YWKQks5qpuHdgaJpZM4Ie9PB
.

Большое спасибо @justincormack , я могу использовать ваш обходной путь для доступа ко всем моим контейнерам напрямую, используя псевдоним lo0 , что позволяет мне начать работу с Docker для Mac: +1:

Я использую docker-compose для запуска своих контейнеров, поэтому последняя проблема заключается в настройке переадресации портов для привязки к правильному IP-адресу на хосте для каждого контейнера. (Привязка к 0.0.0.0 вызовет конфликты портов, если у меня более одного контейнера).

Я не уверен, нашел ли кто-нибудь способ обойти это? - Мне действительно нужно интерполировать конфигурацию docker-compose, поскольку IP-адрес неизвестен до запуска контейнера.

(Обратите внимание, что мы отклоняемся от исходной проблемы).

@NoOrdInaryGuy, это должно работать на последних выпусках (как стабильных, так и бета-версиях) - вы можете указать конкретный IP-адрес на Mac для привязки, например, адрес на lo0 .

@justincormack Да, я могу подтвердить, что работает успешно. Единственная проблема - при использовании docker-compose (особенно с масштабированием, или я думаю, вы можете просто настроить статические адреса). Невозможно добавить переадресацию портов после запуска контейнера, и я не знаю, как ссылаться на фактический IP-адрес контейнера на файл compose / Dockerfile во время «выполнения», который, я думаю, мне понадобится по порядку чтобы настроить переадресацию порта на прослушивание правильного IP-адреса.

В настоящее время я работаю над этим, не используя docker-compose в этом сценарии и имея собственный сценарий bash для вызова докера, но мне было интересно, придумал ли кто-нибудь еще лучшее решение.

Это выглядит многообещающе.

Мой вариант использования похож на то, что заявили другие. Мы создаем контейнеры с запущенными службами Java и пытаемся протестировать эти службы из хост-системы. Мы запускаем тесты в конвейере Дженкинса, поэтому публикация портов в хост-системе проблематична, потому что хост-система может запускать несколько контейнеров, пытающихся привязать одни и те же порты.

Поэтому обычно мы только «открываем» порты, а затем используем docker inspect для обнаружения IP-адреса контейнера и подключения к служебным портам на этом IP-адресе. Когда разработчики хотели попробовать тесты на Mac, мы использовали трюк boot2docker, чтобы добавить статический маршрут к контейнерам через виртуальную машину VirtualBox.

Я наблюдал за Mac Beta в надежде, что мы сможем получить доступ к открытым портам, используя аналогичный метод, и этот трюк с псевдонимом lo0 выглядит как билет.

Вероятно, это не место для запроса функции, но мне было интересно, можно ли добавить IP в качестве входных данных для параметра docker run publish-all. Это будет выглядеть примерно так: I:

sudo ifconfig lo0 псевдоним 10.200.10.1/32
docker run --publish-all 10.200.10.1 -d --name webserver my_test_image

Затем, если бы в my_test_image было несколько портов EXPOSED, я мог бы получить к ним доступ через псевдоним IP.

Я могу подтвердить отсутствие docker0 в последней версии docker-mac


MacBook $ docker version
Client:
 Version:      1.12.1
 API version:  1.24
 Go version:   go1.7.1
 Git commit:   6f9534c
 Built:        Thu Sep  8 10:31:18 2016
 OS/Arch:      darwin/amd64

Server:
 Version:      1.12.1
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   23cf638
 Built:        Thu Aug 18 17:52:38 2016
 OS/Arch:      linux/amd64
MacBook$ docker info
Containers: 7
 Running: 0
 Paused: 0
 Stopped: 7
Images: 107
Server Version: 1.12.1
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 133
 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.20-moby
Operating System: Alpine Linux v3.4
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.953 GiB
Name: moby
ID: W53J:DFZB:4SCO:CS34:6CRF:FCDR:74RZ:TBJC:WZ35:QUVW:NZQU:7ANZ
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): true
 File Descriptors: 17
 Goroutines: 29
 System Time: 2016-09-26T00:20:31.292958501Z
 EventsListeners: 1
No Proxy: *.local, 169.254/16
Registry: https://index.docker.io/v1/
Insecure Registries:
 127.0.0.0/8

Моя потребность противоположна исходному сообщению. Я хотел бы получить доступ к фиксированному адресу контейнера, например 172.17.0.3 от хоста. Например, у меня будет запущено веб-приложение, и я хочу получить к нему доступ с хоста; Я предпочитаю не делать неприятную переадресацию портов, которая необходима без docker0 в качестве интерфейса на хосте. VirtualBox имеет сеть только для хоста, и я могу разговаривать с этой сетью только для хоста с хоста.

docker0 отображается, если мой хост - Linux; он отсутствует только в docker-mac. Я также не хочу использовать виртуальный бокс для запуска докера на Mac.

Как описано в документе: в 10.12 исправлены некоторые ошибки.

Мы понимаем, что эти обходные пути не идеальны, но есть несколько проблем. В частности, _ есть ошибка в OSX, которая исправлена ​​только в 10.12 _ и не переносится, насколько мы можем судить, а это означает, что мы не могли поддерживать ее во всех поддерживаемых версиях OSX.

Я бы спросил, исправляет ли Docker эту проблему уже в версии 10.12? или еще нет, для совместимости всех версий.

@Kaijun нет, нам нужно поддерживать несколько версий OSX, и то, как мы делали это раньше, имеет другие проблемы, поэтому мы вряд ли вернемся к этому.

Привет, я очень ценю все обсуждения в этой ветке. Мне интересно: может ли кто-нибудь резюмировать (или указать мне) на эту актуальную проблему с OS X, которая не позволяет нам установить маршрут непосредственно в контейнеры?

Я видел комментарии о том, что это какая-то проблема с OS X (здесь и в других темах). Кажется, я не могу найти твердого описания того, в чем на самом деле проблема, почему 10.12 вроде как исправлен и т. Д.

(1) Почему это работает для чего-то вроде virtualbox / docker-machine, но не для xhyve?

(2a) Даже если докер не может поддерживать эту функцию только для 10.12, могу ли я что-нибудь сделать, если запущу 10.12, чтобы взломать его и заставить работать?

(2b) Каковы «другие проблемы» с тем, «как мы делали это раньше»?

Мне очень жаль, если это глупые вопросы (или если ответ уже есть в этой ветке, и я его пропустил).

Благодарю.

@weaver мы ранее использовали параметр vmnet на https://github.com/docker/hyperkit, который действительно создает мост для виртуальной машины, который позволяет выполнять маршрутизацию от контейнеров к хосту по IP на мосту. Однако он не позволяет выполнять маршрутизацию к контейнерам. Был CVE, связанный с открытием открытого DNS-сервера при включении, что было исправлено в Sierra.

У режима vmnet есть много других недостатков: нет поддержки IPv6, мало контроля, мы должны работать как root, не работает со многими настройками VPN и многое другое. Мы начали использовать «режим VPN» как вариант, который стал текущим значением по умолчанию, а затем другой вариант был удален из-за проблемы с безопасностью.

Вариант того, что мост docker0 волшебным образом мог бы появиться на Mac, а не на виртуальной машине Linux, никогда не реализовывался и как реально невозможен, точно так же, как он недоступен, если вы используете удаленный хост. . Однако люди привыкли полагаться на различные способы использования различных настроек маршрутизации, и мы хотели бы попытаться учесть некоторые из этих вариантов использования, но это не очень просто. Virtualbox устанавливает для этого модули ядра на Mac, чего мы делать не собираемся.

Привет,

Прежде всего, позвольте всем перестать отвечать на вопросы о перенаправлении портов. Мы знаем это и не хотим этого, потому что, как многие уже писали, нам нужен простой порт для доступа по IP.
Можем ли мы попытаться сохранить эту ветку о решениях для этого?
Я был очень удивлен, что это оказалось невозможным. Я не понимаю, зачем нам нужен мост на Mac как таковой, если сеть является маршрутизируемой?

Итак, для всех, кто этого хочет: удалите docker для Mac, установите docker toolbox и запустите что-то вроде:
sudo route -n добавить 172.17.0.0/24 192.168.99.100
где 172.xxx - это сеть докеров, настроенная на хосте VirtualBox, а 192.xxx - это фактический IP-адрес этого хоста, который маршрутизируется на Mac (через сетевой интерфейс VirtualBox).
Он просто правильно направляет трафик.

Это можно добавить в документацию докера?

Поскольку приведенное выше дало мне то, что я хочу, я не стал углубляться в xhyve.
Разве не решением было бы ввести команду, подобную приведенной выше, которая работает с настройкой сети из этого? Мне не удалось пропинговать адрес 192.168.65.x, поэтому добавление маршрута не сработало. Если кто-то опубликует команду, чтобы включить это, команда маршрута тоже должна работать.

Задача решена? Было бы здорово, если бы они были задокументированы, где описываются ограничения Mac.
благодарю вас

@justincormack @ dmp42 @jeanlaurent не могли бы вы взглянуть на комментарий @VGerris прямо выше и сообщить мне, как / где вы хотите документировать re: Toolbox и d4mac?

Возможно ли, что это может быть исправлено для версии 10.12 и выдать ошибку / предупреждение, если необходимое исправление 10.12 отсутствует в системе? Затем вы можете задокументировать обходной путь / etc / host или toolbox для людей, использующих 10.11.

Имхо возможность доступа к контейнерной сети с хоста без переадресации портов или ручной настройки сети является фундаментальной особенностью докера. Тот факт, что это не работает должным образом, действительно является серьезной проблемой.

@justincormack - он по-прежнему не работает для нашей раздельной конфигурации DNS после сегодняшней бета-версии.

повторяя сверху.

Мы стараемся не добавлять DNS в интерфейс, а просто прочтите
настройки с Mac.

Комбинации VPN разнообразны и сложны, поэтому было бы недальновидно предполагать, что вы всегда можете прочитать правильные настройки.

@justincormack вы не предоставили никакого решения для пользователей Docker для Mac, доступ по IP очень востребован, потому что для разработки с помощью docker требуется прямой доступ к службе контейнера из контейнера-докера и с хоста, перенаправление портов не работает в этой ситуации служба будет иметь другой адрес из другого места).

также libvmnet не очень хорош, но это решение, sudo приемлемо, чем ничего !!!

решение для устройства с краном не требует разрешения sudo. по крайней мере, докер для Mac должен предоставить какой-нибудь способ взлома, чтобы позволить разработчику пробиться. например, аргумент команды запуска гиперкадра может быть настроен пользователем.

На данный момент Docker для Mac практически бесполезен для людей.

дерьмо!

Есть ли какие-нибудь сведения о том, когда это будет исправлено?

@justincormack : Кроме того, для этой настройки сети потребуется root-доступ, которого мы пытаемся полностью избежать в Docker для Mac (в настоящее время у нас есть очень маленький root-помощник, который мы пытаемся удалить).

Почему? В Linux невозможно запустить докер без прав root, и все в порядке, в OSX вы хотите этого избежать. В чем причина этого? Итак, с этого момента докер для OSX должен быть похож на приложение facebook, не имеет значения, что основная функция не работает, но для этого не требуются привилегии root?

ИМО, если привилегия root помогает решить эту проблему, исправьте ее, а пока попробуйте добиться ее без рута. В настоящее время у нас нет основной функции, к которой мы привыкли, мы планировали весь процесс на основе этой функции, и теперь нам нужно решить множество проблем.

Было бы приемлемым компромиссом считать эту функцию расширенной. А когда включены расширенные функции, им требуются дополнительные привилегии?

Причина, по которой я хочу вернуть эту функцию, состоит в том, чтобы хранить файлы на стандартных портах. У нас есть стандартное соглашение об именах для всех наших услуг. У меня есть записи DNS, созданные даже для разработчиков, которые могут указывать на статический IP-адрес на их Mac. Каждый контейнер получает собственный IP-адрес, поэтому это всегда порт 3306, независимо от того, с каким проектом вы работаете. Каждый проект действительно разделен, как и в qa, вплоть до prd.

Теперь, когда разработчик хочет подключиться к MySQL на своем локальном компьютере, он должен посмотреть на диаграмму, чтобы узнать, какой уникальный порт имеет проект. Проект A - это 3307, проект B - это 3308, что снова было Project Q? Рандомизация порта также неаккуратна, потому что не позволяет сохранять настройки подключения и тому подобное. Вам все равно нужно постоянно его искать.

Хотя это может показаться незначительной проблемой. Очень часто переключение между проектами раздражает, поскольку эта стандартизация устраняет множество лишних шагов. Вы хотите работать над другим проектом? Git clone и запускаем make. С этого момента ВСЕ настраивается. Несколько контейнеров, учетные данные, конфигурации и т. Д. Настройка разработки одной команды.

+1, отчаянно нужен: - /

Я только что ознакомился с документацией на https://docs.docker.com/docker-for-mac/networking/, поэтому я понимаю возникающие проблемы.

К сожалению, это серьезное препятствие для использования встроенного докера в нашей локальной среде разработки. Я надеялся уйти с Virtualbox / Vagrant.

Наша проблема в том, что мы используем Consul для обнаружения сервисов. Для локальной разработки мы хотим запускать сочетание сервисов из docker-compose и непосредственно из IDE разработчика на Mac. Поскольку службы, работающие в контейнерах, регистрируются в consul с использованием своего docker ip: port, службы, работающие вне докера, не могут интегрироваться.

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

Похоже, что наконец-то разрабатывается API интроспекции, чтобы помочь решить эту проблему (https://github.com/docker/docker/issues/7472). Надеюсь, что API интроспекции также будет работать с докером для Mac / Windows).

Привет, ребята, я думаю, что есть кое-что, чем стоит поделиться в этой теме, мы можем общаться с машиной host из контейнеров, используя default IP созданный Docker for Mac/Windows .

IP-адрес: 192.168.65.1

Вы можете проверить это, выполнив следующие действия:

rogaha@MacBook-Pro:~/development/rogaha$ docker run --name docker-nginx -p 80:80 -d nginx                                
4bc4818c49cffd7b4186294c71e6d4608c0482fd74521b3e9d03a14d499b3e6b
rogaha@MacBook-Pro:~/development/rogaha$

rogaha@MacBook-Pro:~/development/rogaha$ docker run -it --rm tutum/curl curl 192.168.65.1                                                                                   5:52:22
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
rogaha@MacBook-Pro:~/development/rogaha$

Я надеюсь, что это помогает!

@rogaha Это интересная информация. Это где-то задокументировано? Как вы узнали об этом?

Я подтвердил локально на своем Mac, что он действительно достигает хоста (а не просто другого контейнера Docker) через 192.168.65.1 .

Я не уверен. @thaJeztah @justincormack вы случайно не знаете?

Да, этот маршрут был добавлен для поддержки связи с хостом.

Пока не будет стандартного именования, обычно мы не рекомендуем использовать
это, поскольку очевидно, что он не будет работать в производстве, но его можно передать как
параметр.

27 февраля 2017 г., 08:49, "Роберто Гандольфо Хашиока" [email protected]
написал:

Я не уверен. @thaJeztah https://github.com/thaJeztah @justincormack
https://github.com/justincormack вы случайно не знаете?

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/docker/docker/issues/22753#issuecomment-282777837 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AAdcPJ3h5OrhxpgWao8by-qu-UmsuWIOks5rgv62gaJpZM4Ie9PB
.

@rogaha 192.168.65.1 не работает на моей

Я просто хотел добавить + 1 / подписаться вместе со всеми остальными в этом потоке и добавить еще один голос к запросу функции о возможности простого доступа к контейнерам докеров через интерфейс моста по уникальным / настраиваемым IP-адресам.

Я бился головой о стену в течение как минимум 4 часов, пытаясь понять, почему я не могу заставить работать какие-либо задокументированные примеры, пока я каким-то образом не нашел эту проблему, идеально описывающую проблему.

На данный момент обходной путь, упомянутый @justincormack (https://github.com/moby/moby/issues/22753#issuecomment-246054946), кажется, работает достаточно хорошо. Я добавляю экспериментальную поддержку Docker в виртуальную машину Drupal, следуя инструкциям:

  1. Добавьте хост в /etc/hosts с помощью sudo /etc/hosts (например, 192.168.1.100 mysite.dev )
  2. Создайте псевдоним на интерфейсе обратной связи: sudo sudo ifconfig lo0 alias 192.168.1.100/24
  3. Поднимите контейнер со следующим псевдокомпонентом:

      version: "3"
    
      services:
        app:
          image: image-name
          ports:
            - 192.168.1.100:80:80
            - 192.168.1.100:443:443
          [...]
    

Мне кажется, что это отлично работает, и хотя в настоящее время для этого требуется несколько ручных шагов (которых можно избежать при использовании других инструментов поверх Docker ... то, что я не хочу заставлять своих пользователей делать), это позволяет мне почти достигли Docker nirvana на Mac.

Так что спасибо за обходной путь, и я надеюсь, что вы скоро найдете способ заставить мостовую сеть работать (или просто откажитесь от macOS <10.12 😏)

@rogaha, большое спасибо, 192.168.65.1 решил мою проблему. Я надеюсь, что это не изменится в будущем, если они не найдут более чистое решение. Что касается Docker для Mac 17.0.3.1, это позволило моему контейнеру общаться с сервером MySQL, работающим на локальном хосте моей машины.

@TheAntonioReyes Я рад, что это сработало для вас. Спасибо за ответ!

Привет,

Я читаю документы здесь: https://docs.docker.com/docker-for-mac/networking/#use -cases-and-workarounds, и я пытаюсь использовать указанное там _собственное DNS-имя только для Mac_ : docker.for.mac.localhost .

Если я выполняю команду ping на терминале внутри контейнера докеров, он разрешается до 192.168.65.1, и выполнение curl для приложения, запущенного на моем Mac, дает ожидаемый результат.

Я использую это изображение: https://github.com/elgalu/docker-selenium , и я могу открыть там браузер Chrome. Итак, я хотел перейти на http: //docker.for.mac.localhost : 80, но в соединении было отказано. Однако выполнение http://192.168.65.1 : 80 работает.

Я что-то упускаю? Я хотел начать использовать docker.for.mac.localhost .

Я использую это: Версия 17.06.0-ce-mac18 (18433)

EDIT : похоже, это происходит только в Chrome, и эта проблема объясняет это. https://github.com/docker/for-mac/issues/1837

Я считаю, что использование docker.for.mac.localhost было плохим решением. Вся суть контейнеров в том, что они переносимы и _ не должны_ зависеть от типа хоста, на котором они находятся. Если моя команда наполовину состоит из пользователей Windows, а наполовину - Mac, тогда код внутри наших контейнеров придется настраивать по-другому.

Я рад, что есть подход с использованием имени хоста, я просто думаю, что встреча, на которой был решен этот подход, должна была продлиться еще 5 минут.

docker.for.mac.localhost сработало. Весело. https://docs.docker.com/docker-for-mac/networking/#use -cases-and-workarounds

Я решил эту проблему, вернувшись к докер-машине для Mac. Docker machine VM - это дистрибутив Linux, что означает, что он создает интерфейс docker0, который имеет доступ к частному сетевому диапазону контейнеров докеров. Затем на своем хост-компьютере Mac я создал маршрут для диапазона адресов 172.18.xx контейнеров, который указывает на IP-адрес экземпляра докер-машины (192.168.99.100 в моем случае).

Это позволяет моей Mac OS пересылать пакеты, предназначенные для частной контейнерной сети, на IP-адрес Linux-виртуальной машины докер-машины, которая знает, как добраться до частных контейнеров и пересылать пакеты напрямую им.

Создание маршрута к виртуальной машине докера для частной контейнерной сети

sudo route -n add -net 172.18.0.0/16 192.168.99.100

Вы можете получить адрес контейнерной сети, используя docker network inspect или docker inspect <container_name> .

Вы можете найти IP-адрес хоста в докере для Mac, выполнив эту команду:

docker run busybox ping -c 1 docker.for.mac.localhost | awk 'FNR==2 {print $4}' | sed s'/.$//'

Запустите эту команду

docker run -i -d --expose=80 <container_name> bash

Затем получите IP-адрес от

docker ps

если он говорит 0.0.0.0, тогда он будет работать нормально, как только порт будет открыт или любой другой IP-адрес, записанный там.

Решение на самом деле относительно простое; IDK, почему Docker не исправляет.

См. Https://github.com/AlmirKadric-Published/docker-tuntap-osx для обходного пути, который прокладывает бинарный файл Hyperkit.

Частичный дубликат № 155 (и № 171, № 515, № 3484).

Я закрываю. Это сделано намеренно и никак не связано с данным репо.

Следующее работает для меня чудесно. Никаких промежуточных контейнеров, никакого обходного пути DNS.

Из https://github.com/AlmirKadric-Published/docker-tuntap-osx#how -it-works:

После этого IP-адрес 10.0.75.2 можно использовать в качестве шлюза сетевой маршрутизации для доступа к любым контейнерам на виртуальной машине хоста:
route add -net <IP RANGE> -netmask <IP MASK> 10.0.75.2

Спасибо @pauldraper (!).

@pauldraper прокомментировал 14 июля 2019 г.

Решение на самом деле относительно простое; IDK, почему Docker не исправляет.

См. Https://github.com/AlmirKadric-Published/docker-tuntap-osx для обходного пути, который прокладывает бинарный файл Hyperkit.

Моя версия для macOS:

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.6
BuildVersion:   18G3020
$
Была ли эта страница полезной?
1 / 5 - 1 рейтинги