Я настоятельно рекомендую вам рассмотреть autossh
. У него есть определенные эвристики, которые позволят ему определить, является ли потеря соединения основной причиной, и снизят частоту попыток повторного подключения. Кроме того, он контролирует соединение с помощью дополнительных туннелей, что делает его очень полезным для сценариев, подобных тому, о котором вы спрашиваете.
Если вы, например, используете Ubuntu, вы можете выполнить поиск в Интернете по запросу autossh upstart
, чтобы найти несколько полезных примеров того, как настроить Ubuntu так, чтобы туннель постоянно поддерживался.
Я использую это, чтобы постоянно поддерживать открытое туннельное соединение с моим сервером для определенных служб.
Я добился этого:
1)Открытие портов :5037, 5554, 5555 и 5900 (вместо 5037 ).
2)Запуск socat
внутри контейнера на открытых портах, передав IP-адрес контейнера (, вы можете поместить его в файл точки входа или запустить перед другими командами):
(при условии, что IP-адрес 172.23.0.2)
socat tcp-listen:5037,bind=172.23.0.2,fork tcp:127.0.0.1:5037 &
socat tcp-listen:5554,bind=172.23.0.2,fork tcp:127.0.0.1:5554 &
socat tcp-listen:5555,bind=172.23.0.2,fork tcp:127.0.0.1:5555 &
Если вы определяете имя хоста для контейнера (docker run --hostname...
), вы можете использовать имя хоста вместо IP-адреса (, что лучше, потому что IP-адрес может измениться )в команде socat. Например, если имя хоста android-emulator
, вы можете запустить приведенные выше команды как:
socat tcp-listen:5037,bind=android-emulator,fork tcp:127.0.0.1:5037 &
socat tcp-listen:5554,bind=android-emulator,fork tcp:127.0.0.1:5554 &
socat tcp-listen:5555,bind=android-emulator,fork tcp:127.0.0.1:5555 &
3)Добавление IP-адреса док-контейнера для проверки Chrome в Configure...
(, например. :172.23.0.2:5037
, используя здесь ip, потому что он должен быть виден за пределами контейнера ).