経緯
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サーバ についての主な処理はこちらに追加しました。
- 管理者権限のログインを有効化し
- パスワードを上述の Docker Compose から引数で渡された
.env
の値に書き換え - 使用しないものの存在しないとエラーになるので秘密鍵を生成
- 最後にフォアグラウンドで SSHサーバ を起動
これで SSHサーバ が起動し、 .env
でアクセスできるようになりました。
なお、ポート番号は .env
のホスト用のポートなので接続する際は注意。