Dockerコンテナ に SSHログイン できるようにする(パスワード方式)

経緯

Dockerコンテナ でファイル永続化をすると便利ではあるのですが、 Windows-Linux間 だと異なるファイルシステム間で整合性を保つ処理でもたつき、大量のファイルがある場合は体感的には加速度的に遅延がひどくなってしまいます。

一時的な試験であれば、ファイル永続化を捨てるという選択肢を取ることができると思います。

そこで課題となるのは、ファイルをどうやってコンテナの中に持ち込むか。

そのための一つの方法として、 SFTP を採ることにしました。通常のサーバと同様に、 SFTP で接続してファイルをアップロードする、と。

であれば、 SSHログイン できなければ話が成立しないので、 SSHログイン できるようにしてみたいと思います。

コード

例によって Ambergrease をベースに使います。

.env

# 略
WEB_HOST_PORTSSH=2222
WEB_CONTAINER_PORTSSH=22
WEB_SSH_USER=root
WEB_SSH_PASSWORD=Password-1234
# 略

今回はWebサーバのコンテナに SSHログイン したいので、必要なパラメータを追加します。

管理者権限ユーザもハードコーディングはしたくないので一緒に変数にしておきます。ただ、 Docker で一時的な試験環境なので SSH はパスワード認証方式で良いかな、と。

docker-compose.yml

  web:
    build:
      context: ./apache/docker
      dockerfile: Dockerfile
      args:
        # 略
        WEB_HOST_PORTSSH: $WEB_HOST_PORTSSH
        WEB_CONTAINER_PORTSSH: $WEB_CONTAINER_PORTSSH
        WEB_SSH_USER: $WEB_SSH_USER
        WEB_SSH_PASSWORD: $WEB_SSH_PASSWORD
      # 略
    volumes:
      # 略
      # apache virtual host
#      - ./apache/www:/var/www/$WEB_ROOT_DIRECTORY/web
      # 略
    ports:
      # 略
      - "$WEB_HOST_PORTSSH:$WEB_CONTAINER_PORTSSH"
    entrypoint: bash -c "bash /workspace/entrypoint_web.sh $WEB_ROOT_DIRECTORY $WEB_DOMAIN $WEB_HOST_PORTNUM $WEB_CONTAINER_PORTNUM $WEB_HOST_PORTSSL $WEB_CONTAINER_PORTSSL $WP_CLI $WEB_SSH_USER $WEB_SSH_PASSWORD && /bin/bash"
    # 略

主に変更した部分のみ掲載。

  • args: .env で追加したホスト・コンテナ双方のポート番号を引数に追加
  • volumes: 今回の本題。ファイル数が多いと激重になってしまうので仮想ホストのファイル永続化を切っています
  • ports: .env で追加したホスト・コンテナ双方のポート番号を紐付け
  • entrypoint: エントリポイントとして実行するシェルスクリプトに渡す引数に .env で追加した $WEB_SSH_USER, $WEB_SSH_PASSWORD (SSHログインユーザ名・パスワード)を追加

Dockerfile

# 略
# yum install
RUN yum -y update && yum -y install \
    # 略
    # network ss (instaed of netstat)
    iproute \
    # SSH
    openssh-server

# 略

# SSH
RUN mkdir /var/run/sshd

追加した項目は openssh-server のインストールと、ディレクトリ /var/run/sshd の作成のみ。それ以外の処理はエントリポイント側に投げました。

entrypoint_web.sh

# 略

# SSH
sed -ri 's/^#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config
echo "${8}:${9}" | chpasswd
ssh-keygen -t rsa -N "" -f /etc/ssh/ssh_host_rsa_key
/usr/sbin/sshd -D &

先程述べた通り、 SSHサーバ についての主な処理はこちらに追加しました。

  1. 管理者権限のログインを有効化し
  2. パスワードを上述の Docker Compose から引数で渡された .env の値に書き換え
  3. 使用しないものの存在しないとエラーになるので秘密鍵を生成
  4. 最後にフォアグラウンドで SSHサーバ を起動
TeraTerm で SSH ログイン
TeraTerm で SSH ログイン
TeraTerm で SSH ログイン
TeraTerm で SSH ログイン
TeraTerm で SSH ログイン
TeraTerm で SSH ログイン

これで SSHサーバ が起動し、 .env でアクセスできるようになりました。

なお、ポート番号は .env のホスト用のポートなので接続する際は注意。

参考

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。