GNU/Linux >> Linux の 問題 >  >> Panels >> Docker

DockerコンテナにSSHで接続する方法

SSHは、システム管理者のツールボックスで最もよく使用されるコマンドの1つですが、Dockerと一緒に一般的に見られることはありません。実行中のコンテナにSSHで接続する方法と、実行する前によく考える必要がある理由は次のとおりです。

DockerコンテナでSSHを使用する必要がありますか?

DockerコンテナへのSSH接続は、一般的に避けるべき悪い習慣です。ほとんどの場合、docker execを使用することをお勧めします コンテナ内にシェルを取得するコマンド。

Dockerの初心者は、SSHを使用してコンテナー内のファイルを更新したくなる可能性があります。ただし、コンテナは使い捨てであることが意図されているため、ボリューム内に保存されている永続データを除いて、作成後は不変として扱う必要があります。ソースコードを編集するときに、新しいイメージを作成してコンテナを再起動します。

マルチステップの構成プロセスとは別に、DockerイメージにSSHをインストールすると、いくつかの依存関係パッケージが追加され、別の潜在的な攻撃ベクトルが明らかになります。複数のアクティブなコンテナがあるシステムでは、複数の独立したSSHプロセスを実行し、各コンテナの正しいポートを覚えておく必要があります。

SSHを個々のコンテナに追加する代わりに、Dockerを実行している物理ホストに一度インストールします。 SSHを使用してホストに接続し、docker exec -it my-container bashを実行します 個々のコンテナにアクセスします。

docker exec 推奨されるアプローチですが、SSHが役立つ可能性のあるシナリオがまだあります。従来の展開システムと統合するための一時的な手段として導入できます。また、一部のIDEやビルドツールで使用され、開発中にライブリロード機能を提供する場合もあります。

DockerコンテナへのSSHサーバーのインストール

最も人気のあるDockerベースイメージは意図的に合理化されています。一般的なオペレーティングシステムの配布から派生したイメージであっても、OpenSSHサーバーを自分で追加する必要があります。

これがDockerfileの例です Debianベースのイメージの場合:

RUN apt-get update && apt-get install -y openssh-server
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

ENTRYPOINT service ssh start && bash

SSH構成が変更され、rootとしてログインできるようになりました 、Dockerコンテナのデフォルトユーザー。セキュリティを強化するには、代わりに専用のユーザーアカウントを設定してください:

RUN useradd -m -s /bin/bash sshuser

これにより、sshuserという新しいユーザーが作成されます ホームディレクトリ(-m )。 -s スイッチは、ユーザーのデフォルトのログインシェルをBashに設定します。

ENTRYPOINTの使用 コンテナが起動するときにSSHサービスが常に起動することを保証します。その後、実行はコンテナのフォアグラウンドプロセスとしてBashに渡されます。これをアプリケーションのバイナリに置き換えることができます。

認証の構成

次に、認証システムを設定する必要があります。 sshuserにパスワードを割り当てることができます アカウントとログイン:

RUN echo "sshuser:Changeme" | changepasswd

より安全な方法は、SSHキー認証を設定することです。クライアントマシンでキーペアを作成してから、パブリック部分をコンテナにコピーする必要があります。このようにして、SSHデーモンは接続時にマシンのIDを確認できます。

Dockerfileを変更する .sshを設定するには ユーザーの構成フォルダー。 docker cpを使用して、作業ディレクトリから公開鍵をコピーします。 コマンドまたはCOPY Dockerfileの命令 。後者の場合、キーは画像に焼き付けられ、アクセス権を持つすべての人に表示されます。

COPY id_rsa.pub /home/sshuser/.ssh/authorized_keys
RUN chown -R sshuser:sshuser /home/sshuser/.ssh
RUN chmod 600 /home/sshuser/.ssh/authorized_keys

この一連のコマンドにより、SSHのauthorized_keysが作成されます id_rsa.pubを含むファイル 作業ディレクトリの公開鍵。ファイルシステムの権限は、SSHの要件に一致するように調整されます。

コンテナへの接続

これで、コンテナに接続する準備が整いました。ポート22をホストにバインドしてコンテナを実行します:

docker run -p 22:22 my-image:latest

ssh [email protected]を実行しています コンテナ内にシェルが表示されます。

Dockerコンテナをホストしているマシンから接続する場合は、ポートのバインドをスキップできます。 docker inspectを使用する コンテナのIPアドレスを取得し、SSH接続コマンドに渡します。

docker inspect <id-or-name> | grep 'IPAddress' | head -n 1

マシンのSSHクライアントを使用してコンテナに接続します:

ssh [email protected]

# OR

ssh [email protected]

ホストで別のSSHサーバーを実行している場合、またはポート22を必要とする複数のコンテナーがある場合は、代替ポートを使用する必要があります。SSHがポート2220にバインドされているときに接続を開始する方法は次のとおりです。

>
docker run -p 22:2220 my-image:latest

ssh [email protected] -p 2220

SSH構成を使用したコンテナショートカットの設定

SSH構成ファイルを操作して、個々のコンテナーへの接続を簡素化できます。 ~/.ssh/configを編集します 事前設定されたポートを使用して短縮ホストを定義するには:

Host my-container
    HostName 172.17.0.1
    Port 2220
    User sshuser

これで、ssh my-containerを実行できます。 コンテナに直接ドロップします。これにより、コンテナのIPとポートを覚えていなくても、複数の接続を簡単に調整できます。

代わりに、Docksshを使用してコンテナ管理を簡素化する

Docksshプロジェクトは、ssh [email protected]を実行できる別のデーモンを提供することで、これをさらに一歩進めています。 、手動のSSH構成なし。コンテナにSSHサーバーをインストールする必要はありません。 DocksshはSSH接続を自動的にプロキシし、正しいdocker execを実行します 代わりにコマンド。

Docksshの構成データを保存するには、最初にRedisをインストールする必要があります:

sudo apt install redis

次に、コンテナの名前とSSH接続のパスワードを含むRedisレコードを追加して、公開するコンテナを定義します。

redis-cli set dockssh:my-container:pass "container-password-here"

次に、Docksshをダウンロードします:

sudo curl https://github.com/alash3al/dockssh/releases/download/v1.1.0/dockssh_linux_amd64 -O /usr/local/bin/dockssh
sudo chmod +x /usr/local/bin/dockssh
sudo ufw allow 22022

# Start DockSSH server
dockssh

これで、コンテナに接続できます:

ssh [email protected] -p 22022

Docksshはデフォルトでポート22022でリッスンします。ポートを使用した着信接続を許可するためにファイアウォールが開かれています。

接続すると、コンテナのパスワードの入力を求められます。これはcontainer-password-hereとして設定されました 上記のRedisレコードにあります。

Docksshを使用すると、多数のDockerコンテナにSSHで簡単に接続できます。このアプローチは、2段階の「SSHとdocker exec」を合理化するため、リモートホストからコンテナに定期的に接続する場合に理想的です。 」シーケンスを1つの記憶に残るコマンドに変換します。

Docksshを長期使用のシステムサービスとして登録します:

sudo nano /etc/systemd/system/dockssh.service
[Unit]
Description=Dockssh service
After=network.target

[Service]
type=simple
Restart=always
RestartSec=1
User=root
ExecStart=/usr/local/bin/dockssh

[Install]
WantedBy=multi-user.target

systemctlを使用してサービスを有効にします :

sudo systemctl enable dockssh.service
sudo systemctl start dockssh

システムの起動時にDocksshが自動的に起動するようになりました。

概要

SSHとDockerコンテナーの組み合わせは、アンチパターンと広く見なされていますが、開発、テスト、およびレガシー環境での使用は依然としてあります。代替手段がない場合は、SSHサーバーをコンテナに追加し、公開鍵をコピーして、コンテナのIPまたはホストポートバインディングを介して接続できます。

多数のDockerコンテナをリモートで管理したいシステム管理者は、Dockshを試すことができます。おなじみのsshを実行できます docker execへのシームレスな舞台裏マッピングを介したコマンド 、変更されていない画像を使用して、両方の長所を提供します。


Docker
  1. Dockerを使用してWordPressをインストールする方法

  2. DockerコンテナでMySQLを実行する方法

  3. DockerコンテナにVimをインストールする方法

  1. Dockerコンテナ内でプログラムを実行する方法は?

  2. Dockerコンテナを一覧表示する方法

  3. Dockerコンテナを終了する方法

  1. 実行中のDockerコンテナにSSHで接続してコマンドを実行する方法

  2. ホストディレクトリをDockerコンテナにマウントする方法

  3. Dockerコンテナに静的IPを割り当てる方法