Демонстрация того, как вести локальную разработку с помощью 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, как если бы база данных была локальной. Просто и эффективно, удачи!