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で接続する機能を使用して達成できることがいくつかあります。
- 偽物を設定できます 潜在的な攻撃者のホスト。ホストのSSHデーモンに非標準のポートを使用し、攻撃者のためにポート22でSSH接続を提供する。
- 完全に別個の認証レベル。つまり、パスワードログインまたは異なるsshキーはすべてあなた次第であり、ホストが現在使用しているものとは別個のものです。
- チームの個人がログインするために使用するのと同じ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サーバーをインストールする必要があります。 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アカウントにはパスワードがありません。 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にツイートしてください。
他の記事を書いてほしい場合は、遠慮なくお知らせください。