Мой компьютер размещает приложение на порте 1234, который никогда не должен быть доступным ни от чего кроме моей машины. Однако мой контейнер Докера (который выполняет Apache) должен смочь получить доступ к этому. Точно так же мой контейнер Докера размещает много ресурсов на различных портах, которые должны так же быть только доступными от моего компьютера. Теперь, это далее осложнено тем, что моя система использует мост для той определенной сети:
NETWORK ID NAME DRIVER SCOPE
4d4b5e752963 bridge bridge local
c387eb42698a project_default bridge local
6818c0eb94bf host host local
f7e4ed6c05a2 none null local
Этот мост (раздражающе) всегда имеет случайным образом сгенерированный идентификатор, который изменяется каждый раз, когда я перезапускаю своего Докера, Составляют установку:
br-c387eb42698a Link encap:Ethernet HWaddr 02:42:29:95:fd:2c
inet addr:172.18.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:29ff:fe95:fd2c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:405753 errors:0 dropped:0 overruns:0 frame:0
TX packets:530699 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:85147217 (85.1 MB) TX bytes:75260996 (75.2 MB)
Короче говоря, мне нужно следующее:
br-c387eb42698a
(или независимо от того, что сетевое имя) к порту доступа 1234 на моей локальной машине (удобно 172.18.0.1)Идеально, решение здесь работало бы агностическим IP способом, таким образом, что оно не зависит от моста, идущего 172.18.0.0/24
подсеть, и при этом это не повредило бы или позволило бы утечки данных, если я подключен к сети, которая, оказывается, содержит 172.18.0.0/24
подсеть.
Самая легкая вещь, о которой я могу думать, состояла бы в том, чтобы израсходовать имя интерфейса и установить правила UFW вокруг этого, но я не могу действительно сделать этого, поскольку мой интерфейс постоянно изменяется.
Как я могу сделать это? В то время как я предпочел бы выполнять в этом чистом ufw
(или iptables
при необходимости), я открыт для решений, которые влекут за собой Докера конфигурирования, чтобы всегда присвоить персистентный идентификатор (или даже пользовательское имя?) к интерфейсу моста.
Это не возможно в ванильном UFW из-за того, что имя интерфейса находится в постоянном состоянии unguessability. Для установки чего-то вроде этого вручную определенная сеть должна быть создана. Короче говоря, можно использовать опции драйвера из Докера bridge
в составить конфигурации для создания пользовательская сеть . Это посмотрит что-то как:
networks:
my_bridge:
driver: bridge
driver_opts:
com.docker.network.bridge.name: my-bridge
Отсюда, конфигурация моста может быть добавлена к каждому сервису в составить файле:
myimage:
image: myimage:1.0
ports:
- "2580:2580"
networks:
- my_bridge
Затем на следующий запуск Составить системы, новая сеть будет создана с именем собственным:
my-bridge Link encap:Ethernet HWaddr 11:22:33:44:55:66
inet addr:172.18.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:1122:3344:5566/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:11 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:788 (788.0 B) TX bytes:695 (695.0 B)
Оттуда, добавляя правила UFW позволить соединение с портом 1234 тривиальны:
ufw allow in on my-bridge from any to any port 1234
И внезапно, все работает отлично!
Для интеграции принятого ответа можно также использовать команду докера для создания сети за пределами докера - сочините:
sudo docker network create -d bridge -o com.docker.network.bridge.name=my-bridge my_bridge
После этого можно осмотреть издание сетей
ip link show
Теперь, в Вашем составлять файлы можно просто перенаправить стандартную сеть или определить любую сеть, Вам нравится повторно отображать ее на уже существующую
version: "3"
services:
test:
image: nginx:alpine
ports:
- "80:80"
networks:
default:
external:
name: my_bridge