Подключиться к Docker sqlserver через SSH

Я создал Docker-контейнер, который содержит базу данных mssql. В командной строке ip a дает IP-адрес для контейнера, однако пытается ssh в него username@docker_ip_address доходность ssh: connect to host ip_address port 22: Connection refused, Поэтому мне интересно, смогу ли я вообще использовать ssh в контейнере, чтобы мне не всегда приходилось использовать инструмент docker docker exec .... и если да, то как мне поступить?

3 ответа

Решение

По сути, измените ваш Dockerfile на что-то вроде следующего - это установит openssh-сервер, изменит запретительные конфигурации по умолчанию и запустит службу:

# FROM a-image-with-mssql
RUN echo "root:toor" | chpasswd
RUN apt-get update
RUN apt-get install -y openssh-server
COPY entrypoint.sh .
RUN cd /;wget https://gist.githubusercontent.com/spekulant/e04521d6c6e1ccffbd3455c673518c5b/raw/1e4f6f2cb32caf3a4a9f73b02efdcbd5dde4ba7a/sshd_config
RUN rm /etc/ssh/sshd_config; cp sshd_config /etc/ssh/
ENTRYPOINT ["./entrypoint.sh"]
# further commands

Теперь у вас есть изображение с ssh-сервером внутри, все, что вам нужно сделать, это запустить службу, вы не можете сделать RUN service ssh start потому что это не будет работать - особенности докера, обратитесь к документации. Вы должны использовать Entrypoint следующим образом:

#!/bin/bash
set -e
sh -c 'service ssh start'
exec "$@"

Поместите это в файл entrypoint.sh рядом с вашим Dockerfile - Запомни chmod 755 entrypoint.sh Это. Здесь нужно упомянуть одну вещь: вы все равно не сможете войти в контейнер по ssh - конфигурация сервера SSH по умолчанию не позволяет войти в корневую учетную запись с использованием пароля. Таким образом, вы либо сами меняете конфиги и предоставляете их образу, либо можете доверять мне и использовать созданный мной файл - проверить его по ссылке из Dockerfile - там нет ничего вредоносного, только изменение из prohibit-password в yes,

К счастью для нас - официальные образы MSSQL начинаются с Ubuntu, поэтому все приведенные выше команды идеально вписываются в среду.

редактировать

Обязательно спросите, если что-то неясно или я прыгаю слишком быстро.

Если ваш контейнер содержит сервер базы данных, обычный способ взаимодействия с ним будет через клиент SQL, который подключается к нему; Google предлагает SQL Server Management Studio и библиотеки коннекторов для популярных языков. Мне не ясно, что бы вы сделали, используя оболочку в контейнере, и моя основная рекомендация здесь заключается в том, чтобы сосредоточиться на работе с сервером в обычном режиме.

Контейнеры Docker обычно запускают один процесс, и это обычно основной процесс сервера. В этом случае контейнер работает только на SQL Server. Как показывают некоторые другие ответы здесь, вам нужно значительно перестроить контейнер, чтобы даже иметь возможность запустить демон ssh, после чего вам нужно беспокоиться о множестве других вещей, таких как ключи хоста ssh, учетные записи пользователей и пароли. что типичное изображение Docker вообще не задумывается.

Также обратите внимание, что Docker-внутренний IP-адрес (что вы получили от ip addr; какие docker inspect мог бы сказать вам) по сути бесполезно. Всегда есть лучшие способы доступа к контейнеру (использование DNS между контейнерами для связи между контейнерами; использование IP-адреса хоста или DNS-имени для доступа к опубликованным портам с того же или другого хоста).

Для ssh в контейнер вы должны полностью заполнить следующие

  • Сервер SSH (Openssh) должен быть установлен внутри контейнера, и служба ssh должна быть запущена
  • Порт 22 должен быть опубликован из контейнера (при запуске контейнера). Более подробная информация здесь> Опубликовать порты в Docker
  • docker ps команда должна отображать сопоставленные порты 22

Надеюсь, выше информация поможет вам понять ситуацию...

Другие вопросы по тегам