Как разрешить трафик из контейнера наружу

Есть несколько способов решить эту задачу:

Использовать сеть хоста

Если не настроены и не нужно создавать/настраивать сети для docker, то это решение подходит - нужно просто запускать контейнер с параметром --net=host:

docker run --net host -d --name prometheus prom/prometheus

Либо в compose файле:

services:
  prometheus:
    container_name: prometheus
    image: prom/prometheus
    ports:
      - "9090:9090"
	network_mode: "host"

iptables

Решение подходит в случае, если уже используется или нужно будет использовать сети docker. Например, сеть будет называться mon-docker-net, тогда правило iptables будет выглядеть так:

iptables \
  --insert DOCKER-USER \
  --in-interface mon-docker-net \
  --jump RETURN

При чем помещать его нужно выше “менее важных” (не таких глобальных) правил. Вот примерно где лежало это правило в одной из моих конфигураций:

#---------------------------------------------------------------------------
# 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

Доступ из одного контейнера в другой

networkdockercontainer