Соединение к удаленному хосту через ssh тунель из docker контейнера

Для того, чтобы из docker контейнера, использующего сетевой интерфейc типа bridge получить доступ к локальной сети используется параметр --add-host. Для него требуется docker версии 20 и выше.  Пример использования:

docker run -d \
    --net=${NETWORK} \
    --add-host=host.docker.internal:127.0.0.1 \
    -p ${PORT}:9999 \
    -v ${DATADIR}:/data \
    --name ${CONTAINER_NAME} \
    ${DOCKER_IMAGE} \
    /run.sh

Пример использования --add-host

Использование опции --net=host зачастую не возможно, поскольку контейнер запускается в контексте определенной сети.

Если вы используете ssh туннель для локальной работы с базой, то для соединения вам нужно пробросить этот туннель в docker0 bridge. Подробнее смотрите здесь.

В моем случае, сначала смотрим ip адрес docker0, затем пробрасываем туда ssh тунель:

ifconfig | grep docker -A 2
# docker0   Link encap:Ethernet  HWaddr 03:41:4a:26:b7:31
#           inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0

ssh -fN -i ~/.ssh/id_rsa -L 172.17.0.1:3051:172.31.10.150:3051 dev

Для доступа к сети хоста из контейнера используем специальное DNS имя host.docker.internal.