GNU/Linux >> Linux の 問題 >  >> Linux

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

SSHを使用してDockerコンテナに入るにはどうすればよいですか?従来のアプローチは2つのステップで構成されています:

ステップ1 :リモートLinuxサーバーにSSHで接続します(リモートシステムでコンテナーを実行している場合)。‌

ssh [email protected]_ip_address

ステップ2 :次に、実行中のDockerコンテナのシェルを次のようにインタラクティブモードで入力します:

docker exec -it container_ID_or_name /bin/bash

これにより、Linuxコマンドを実行したり、コンテナー内で実行されているサービスのメンテナンスを実行したりできます。

上記の方法に問題はありません。これは、コンテナに簡単に入る従来の推奨される方法です。

ただし、ある程度の努力を払えば、最初にホストシステムにログインしなくても、実際に実行中のコンテナに直接SSHで接続できます。

DockerコンテナへのSSH:しかし、なぜですか?

これはちょっと変ですね。 SSH経由でコンテナにログインします。従来とは異なるように聞こえますが、可能性があります ユースケースに応じて、それでもあなたにとって有用です。

コンテナにSSHで接続する機能を使用して達成できることがいくつかあります。

  1. 偽物を設定できます 潜在的な攻撃者のホス​​ト。ホストのSSHデーモンに非標準のポートを使用し、攻撃者のためにポート22でSSH接続を提供する。
  2. 完全に別個の認証レベル。つまり、パスワードログインまたは異なるsshキーはすべてあなた次第であり、ホストが現在使用しているものとは別個のものです。
  3. チームの個人がログインするために使用するのと同じsshキーを使用せずに、自動化されたリモートプロセスを実行します。

上記のすべての方法を説明する前に、これが実際にどのように機能するかについて説明します。

既存のコンテナにsshログインを使用することはお勧めしません。それはホスト分離のポイント全体を殺します。

DockerコンテナのSSHアクセスの設定[中級から上級者]

この動作に興味がない場合は、このセクションを無視してもかまいません。ダミーコンテナをお見せします。手順に従って練習することができます。

コンテナを実行する

まず、Dockerコンテナを起動する必要があります。非常に小さいalpine:latestを使用します 今のところ画像。次のコマンドでコンテナを起動します:

docker run --rm --name ssh-test -it -p 7655:22 alpine:latest ash 

コマンドラインオプションに関するいくつかの注目すべき点は次のとおりです

  • -rmを使用 オプションの場合、後でコンテナを明示的に削除する必要はありません。
  • -それ コンテナの機能するインタラクティブなシェルを作成できるように、オプションがあります。
  • 最後に、コンテナのポート22をホストのポート番号7655(またはホストシステムのSSHデーモンでまだ使用されていないその他のポート番号)にバインドします。使用しているポートを覚えておいてください。
コンテナにSSHデーモンを設定します

次に、コンテナ内にsshサーバーをインストールする必要があります。 Alpine Linuxでは、次のコマンドを使用できます。‌

apk update; apk add openssh-server

次に、rootログインを許可するために、構成パラメーターをすばやく変更する必要があります。これを行うには、/ etc / ssh / sshd_configファイルを手動で編集するか、次のコマンドを使用します。

sed -E 's/^#(PermitRootLogin )no/\1yes/' /etc/ssh/sshd_config -i 

次のコマンドでホストキーを生成します:

ssh-keygen -A

最後に、sshサーバーを起動し、 / usr / sbin / sshd&を実行します。 。 ps auxで実行されているかどうかを確認します 。

コンテナのrootアカウントのパスワードを設定します

デフォルトでは、コンテナのrootアカウントにはパスワードがありません。 SSHアクセスを開く場合は、rootアカウントのパスワードを設定する必要があります。

オプションなしでpasswdコマンドを使用し、画面の指示に従うことができます:

passwd

SSH経由でコンテナにログイン

別のホストから、今すぐコンテナにログインしてみてください。

ssh [email protected]_address_of_host_server -p port_number

-pは必要ありません 以前にポート22にバインドした場合はオプション。 IPの場合は、ホストサーバーのIPアドレス(コンテナのIPアドレスではありません)を使用します。

コマンドを実行すると、次のような出力が表示されます。

[email protected]:/mnt/data/documents/Linux Handbook/container-ssh$ ssh [email protected]
   [email protected]'s password: 
   Welcome to Alpine!
   
   The Alpine Wiki contains a large amount of how-to guides and general
   information about administrating Alpine systems.
   See <http://wiki.alpinelinux.org/>.
   
   You can setup the system with the command: setup-alpine
   
   You may change this message by editing /etc/motd.
   
   c4585d951883:~#

これはどのように機能しますか?

これは視覚的によく理解できます。次の図を見てください。‌

コンテナは、ポート22がホストのポート7655(または選択したポート)と一緒に接着されている仮想マシンと考えてください。これにより、2つの異なるsshプロセスを同じマシンで実行して異なるポートにバインドすることができます。

ホストシステムでSSH用に他のポートを使用し、ポート22をコンテナのポートに接着するとします。これで、誰かがSSHのデフォルトポート22を使用してホストサーバーに接続しようとすると、その人はコンテナのルートファイルシステム内にいることになります。

DockerCompose[エキスパート]を使用したコンテナーのSSHのセットアップ

SSHサーバーコンテナに信頼できるオプションを提供せずにこの場所に置いておくのは公平ではありません。

リモートシステムで実行されている別のルートファイルシステムを備えた別の分離されたsshサーバーを利用したい場合は、これを行うことができますが、前のウォークスルー、つまり実行中のベースにsshdをインストールして構成することはできません。容器。

簡単に再現できないという理由だけで、実行中のコンテナーに加えたすべての変更は永続的ではなく、コンテナーが再起動し、すべてが失われます。

そこで、ここでは、SSHサーバーコンテナをリモートホストにデプロイするための、はるかに簡単で、簡単に再現でき、構成可能な方法を紹介します。

前提条件

明らかにdockercomposeをインストールする必要があります。 DockerComposeの基本的な知識はここで必須です。

SSHキーを介してサーバーにアクセスするため、ローカルシステムの公開SSHキーをdocker-composeファイルが配置されているホストLinuxサーバーのディレクトリに追加し、念のため「id_rsa.pub」という名前を維持する必要があります。

作成ファイルを準備します

linuxserver / openssh-serverを使用することをお勧めします 画像。これは非常に軽量なイメージであり、環境変数を介した十分な構成オプションがあります。

ここでは、作成ファイル全体が貼り付けられます。これをサーバー上のある場所にコピーし、ファイルに docker-compose.yamlという名前を付けます。 。‌

version: "3.7"

services:
    ssh:
        image: "linuxserver/openssh-server"
        ports:
            - "22:2222"
        volumes:
            - "./id_rsa.pub:/pubkey:ro"
        environment:
            PUID: ${ID}
            PGID: ${ID}
            TZ: ${TZ}
            PUBLIC_KEY_FILE: "/pubkey"
            SUDO_ACCESS: "false"
            PASSWORD_ACCESS: "false"
            USER_NAME: ${USER_NAME}
        restart: "always"

かなり小さな作曲ファイルですね。この作成ファイルのさまざまな部分について説明します。

ボリューム: バインドマウントは1つだけで、コンテナ内に公開鍵を pubkeyとしてマウントします。 。読み取り専用でもあります。

ポート: コンテナ内のsshdプロセスはポート2222で実行されます。そのため、そのポートをホストのポート22にバインドしました。必要に応じて22を変更しますが、後でSSHを介してコンテナにログインする必要があるため覚えておいてください。

環境変数:

  • USER_NAME:コンテナ内のユーザー。ローカルマシンからログインします。
  • PUIDとPGID:USER_NAMEのUIDとGID。これはオプションです。環境変数が設定されていない場合、コンテナはルート以外のIDのペアを自動的に割り当てます。
  • TZ:現在のタイムゾーン。 cat / etc / timezoneで取得できます 。
  • PUBLIC_KEY_FILE:公開鍵ファイルの場所
  • SUDO_ACCESS&PASSWORD_ACCESS:自明です。

再開ポリシー: デーモンがリロードされてもコンテナを再起動する「常に」再起動ポリシーを設定しました。

サービスをデプロイする

簡単にするために、いくつかの質問をするBashスクリプトを作成し、その回答に基づいてサービスを展開します。

#! /usr/bin/env bash

vars=("ID" "USER_NAME")
defaults=("991" "dummy")
questions=("What'd be your preferred UID & GID for the username of your choice? [default] " "Your preferred username for the container? [dummy] ")

put()
{
    echo "$1" >> .env
}

for i in {1..0}; do
    read -p "${questions[$i]}" ans
    case $ans in
        ""|"default")
            put "${vars[$i]}=${defaults[$i]}" ;;
        *)
            put "${vars[$i]}=$ans" ;;
    esac
done

put "TZ=$(cat /etc/timezone)"

docker-compose up -d

docker-composeファイルが配置されていたのと同じディレクトリにbashスクリプトをdeploy.shとして保存しました。

このスクリプトを実行すると、いくつかの質問が表示され、Dockerコンテナが実行されます。

bash deploy.sh

完了したら、サーバーにログインしてみてください:

ssh [email protected] -p port 

これで、Dockerコンテナーを使用したsshに関するこの記事は終わりです。気に入った場合、または他に言及したいことがある場合は、下にコメントするか、@imdebdutにツイートしてください。

他の記事を書いてほしい場合は、遠慮なくお知らせください。


Linux
  1. 特定のディレクトリにSSHで接続する方法は?

  2. Lxcコンテナにログインする方法は?

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

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

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

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

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

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

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