Как разрешить трафик из контейнера наружу
Есть несколько способов решить эту задачу:
Использовать сеть хоста
Если не настроены и не нужно создавать/настраивать сети для docker, то это решение подходит - нужно просто запускать контейнер с параметром --net=host
:
Bash
docker run --net host -d --name prometheus prom/prometheus
Либо в compose файле:
YAML
services:
prometheus:
container_name: prometheus
image: prom/prometheus
ports:
- "9090:9090"
network_mode: "host"
iptables
Решение подходит в случае, если уже используется или нужно будет использовать сети docker. Например, сеть будет называться mon-docker-net
, тогда правило iptables будет выглядеть так:
Bash
iptables \
--insert DOCKER-USER \
--in-interface mon-docker-net \
--jump RETURN
При чем помещать его нужно выше "менее важных" (не таких глобальных) правил. Вот примерно где лежало это правило в одной из моих конфигураций:
Bash
#---------------------------------------------------------------------------
# Iptables configuration
#---------------------------------------------------------------------------
# Iptables configuration according to the principle
# "everything that is not allowed should be prohibited"
iptables --policy INPUT DROP
iptables --policy FORWARD DROP
# Allow all traffic from the Docker network interface
iptables \
--insert DOCKER-USER \
--in-interface "$DOCKER_NETWORK_NAME" \
--jump RETURN
# Allowing ntp port (123/udp)
iptables --append INPUT --protocol udp --dport 123 --jump ACCEPT
[[Доступ из одного контейнера в другой]]