Демонстрация того, как вести локальную разработку с помощью Docker, используя удаленную базу данных через защищенный туннель SSH. Никакого взлома Docker, никакого вмешательства в брандмауэр.
Обычно мы разрабатываем наши приложения, используя локальные экземпляры базы данных. Это легко и чертовски просто. Просто добавьте базу данных в стек docker-compose. Однако иногда требуется подключение к удаленной базе данных. Мы также хотим, чтобы это соединение было безопасным. Что, если кто-то прослушивает или регистрирует интернет-трафик по пути?
Самое простое решение — туннель SSH. Разрешить Docker доступ к такому туннелю — нетривиальная задача. Чтобы позволить контейнерам общаться с туннелем SSH, мы сделаем его частью нашего стека docker-compose.
Пример сервера базы данных с доступом по SSH
Давайте запустим экземпляр RDS бесплатного уровня в AWS. Поскольку экземпляр не будет общедоступным:
нам также нужен «хост-бастион» для подключения. Давайте запустим дополнительный экземпляр EC2 бесплатного уровня. После подключения RDS и EC2 у нас теперь есть все головоломки, необходимые для запуска.
Включение службы туннелирования в стек docker-compose
В хабе Docker есть отличный образ Docker под названием cagataygurturk/docker-ssh-tunnel
. Он делает тяжелую работу по поддержанию туннеля открытым. Образ основан на Alpine Linux — он быстрый, компактный и эффективный.
Все, что нам нужно сделать, это создать сервис в стеке docker-compose:
services: // … skipped for brevity mysql_tunnel: image: cagataygurturk/docker-ssh-tunnel volumes: - $HOME/.ssh:/root/ssh:ro environment: TUNNEL_HOST: '[email protected] -i /root/.ssh/ec2.pem' REMOTE_HOST: database-1.xxxxxx.eu-central-1.rds.amazonaws.com LOCAL_PORT: 3306 REMOTE_PORT: 3306
Контейнер ожидает, что каталог /root/ssh
будет смонтирован с вашими ключами SSH. Контейнер при старте скопирует содержимое этой директории, запушит их в /root/.ssh/
директорию и выставит соответствующие разрешения — иначе SSH-агент будет жаловаться на разрешения.
Мой каталог содержит сертификат ec2.pem
, необходимый для подключения к экземпляру EC2, поэтому я использую его как часть переменной TUNNEL_HOST
. Детали подключения также можно настроить в файле конфигурации SSH.
Службы создания докеров теперь могут легко подключаться к этой базе данных, используя имя хоста mysql_tunnel
и порт 3306
, как если бы база данных была локальной. Просто и эффективно, удачи!