Я нашел решение своей проблемы.
Решение
ufw allow out on docker0 from 172.17.0.0/16
Поскольку я знаю конкретный порт, который использует nginx, я также могу сделать это правило более строгим, выполнив
ufw allow out on docker0 from 172.17.0.0/16 port 80 proto tcp
Объяснение
Docker создает новый интерфейс для контейнеров, и вы можете увидеть его, запустив ifconfig
:
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:a4:5e:e9:9c txqueuelen 0 (Ethernet)
RX packets 87 bytes 17172 (17.1 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 117 bytes 14956 (14.9 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Этот интерфейс маршрутизирует трафик через 172.17.xxx.xxx. Вы можете прочитать больше о том, как я нашел эту маску здесь .
Это дает нам всю информацию, необходимую для написания правила. Если вы публикуете контейнер на другом порту, вы можете проверить номер порта и протокол, выполнив следующие действия:
- Найдите идентификатор вашего контейнера
docker container ls
- Найдите порт вашего контейнера
docker container port {id}