Dockerfileを用いたSSH接続可能なコンテナの構築

Dockerを用いてコンテナを立ち上げる場合、Docker Hubで共有されているイメージを使うのがまず思い浮かびますが、場合によっては個別にカスタマイズしたイメージを用いたコンテナを使いたい場合があります。

そんなとき、今回紹介するDockerfileが役に立つので、Dockerを使い始めたばかりの人は是非参考にしていただければ幸いです。

前提

  • Docker Desktopがインストールされている

Dockerfileとは

Dockerfileとは、Dockerイメージを作成(ビルド)するときに用いられるレシピと考えてもらえれば大丈夫です。そのため、DockerはDockerfileに書かれている内容を上から順番に読み取っていき、その結果としてイメージがビルドされます。また、そのイメージを用いて、コンテナを作成することができます。

すでに用意されているイメージを使う場合は手っ取り早いですが、やはり痒いところに手が届かない場合が多いです。そのような場合、Dockerfileを自分で書いてオリジナルのイメージをビルドすることにより、自分が作りたい環境・アプリケーションの基礎が手に入り、しかもそれをシェアすることで、同じ環境がチームメンバ全員に提供することが可能になります!

Dockerfileの書き方

ここでは基本的なインストラクションについて、軽くまとめたいと思います。詳しくは以下の公式ページを御覧ください。

NO IMAGE

よく使うインストラクション

  • FROM
    • コンテナのベースイメージを指定するのに使用。
    • DockerfileはFROMから始まる必要あり

  • RUN
    • 現在のレイヤ上でコマンドを実行して、その環境を次のレイヤとして積み重ねる
    • FROM ubuntu:20.04 の次にRUN apt-get install -y curlと書くと、ベースイメージのubuntu:20.04上でcurlのインストールを行って、その状態を次に渡すイメージ。
    • イメージをビルドするときに実行される。
  • CMD
    • コンテナを立ち上げたときに実行される。
    • レイヤは作られず、Dockerfileの中で複数CMDがある場合は一番最後に書かれたコマンドが採用される。
  • WORKDIR
    • このコマンドが書かれた以降の作業ディレクトリを指定する
  • COPY
    • 作業ディレクトリ内のコピーしたいファイルを、指定したディレクトリにコピーする。
  • ENV
    • 環境変数に値を代入する。
    • ENV MY_NAME="Tanaka"とすれば、MY_NAMETanakaが入る。

SSH接続可能なコンテナを作ろう

それでは、SSH接続可能なコンテナを立ち上げるのに必要なDockerファイルを作りましょう。

今回使うDockerファイル

今回自分が用意したのは以下のDockerfileです。

Dockerfile
FROM almalinux:latest

RUN dnf -y update \
&& dnf install -y openssh-server

RUN ssh-keygen -A

RUN useradd test-user\
&& echo 'test-user:hogefuga' | chpasswd \

CMD ["/usr/sbin/sshd", "-D"]

簡単に、上記Dockerfileの説明をします。

FROM almalinux:latest

→ベースイメージをAlmaLinuxの最新版に設定。

RUN dnf -y update \
&& dnf install -y openssh-server

→ベースイメージにインストール済みのパッケージをアップデート。その後openssh-server(SSH接続を受け付けるためのミドルウェア)をインストール。

RUN ssh-keygen -A

→ホスト鍵を生成。これがないとこの命令の下で実行するCMD ["/usr/sbin/sshd", "-D"]がエラーで落ちる。

通常のLinuxサーバであれば、openssh-serverをインストールするとホスト鍵が自動で生成されます。ただし、Dockerイメージなどの最小構成では自動生成されないことがあるため、明示的にホスト鍵を生成するようにしています。

RUN useradd test-user\
&& echo 'test-user:hogefuga' | chpasswd \
&& usermod --append -G wheel test-user

→ test-userを作成し、そのパスワードをhogefugaに設定

通常のターミナル操作では対話的にパスワードを設定しますが、Dockerfileの場合はユーザが対話無しになるため上記のようなパスワード変更コマンドが必要になります。

CMD ["/usr/sbin/sshd", "-D"]

→ コンテナ作成時にsshdを開始するコマンドです。これがないと、なにもプロセスが立ち上がらず、docker runを実行してもすぐにコンテナが停止するため必要です。

ビルドとコンテナ立ち上げ

ビルドが無事に終われば以下の出力がされて、イメージが作成されます。

Bash
$ docker build ./ -t almalinux-ssh
[+] Building 262.7s (8/8) FINISHED
 => [internal] load build definition from Dockerfile                                                                        0.0s
 => => transferring dockerfile: 308B                                                                                        0.0s
 => [internal] load .dockerignore                                                                                           0.0s
 => => transferring context: 2B                                                                                             0.0s
 => [internal] load metadata for docker.io/library/almalinux:latest                                                         0.0s
 => [1/4] FROM docker.io/library/almalinux:latest                                                                           0.0s
 => [2/4] RUN dnf -y update && dnf install -y openssh-server                                                              261.2s
 => [3/4] RUN sed -i 's/#PermitRootLogin yes/PermitRootLogin yes/g' /etc/ssh/sshd_config                                    0.3s
 => [4/4] RUN useradd test-user&& echo 'test-user:hogefuga' | chpasswd && usermod --append -G wheel test-user               0.2s
 => exporting to image                                                                                                      0.8s
 => => exporting layers                                                                                                     0.8s
 => => writing image sha256:01519eb2d10e8c820b099976fd4278cfa0cbc30980b82373c5df9565467d198f                                0.0s
 => => naming to docker.io/library/almalinux-ssh                                                                            0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

docker imagesで見ると、almalinux-sshというイメージができてます。

Bash
$ docker images | grep my-alma-ssh
my-alma-ssh                            latest    69560a623a66   25 seconds ago   486MB

それでは最後に、作ったイメージからコンテナを立ち上げてターミナルアプリからSSH接続できるか見てみましょう。

まずは、以下のコマンドでコンテナを立ち上げます。

Bash
docker run -d --name ssh-test -p 2222:22 my-alma-ssh

まだ各オプションについて説明します。

  • -d
    • コンテナをデタッチモードで起動。これを指定すると、自動的にコンテナの中にはいっていかず、バックグラウンドでコンテナが起動する。
  • -p
    • 接続許可するポート番号を指定。今回の場合、ローカルの2222番ポートに接続すると、コンテナ内の22番ポートに接続される。

無事コンテナが起動できれば、docker psコマンドで該当のコンテナが表示されます。

Bash
$ docker ps
CONTAINER ID   IMAGE         COMMAND               CREATED              STATUS              PORTS                  NAMES
8a06db6a17f3   my-alma-ssh   "/usr/sbin/sshd -D"   About a minute ago   Up About a minute   0.0.0.0:2222->22/tcp   ssh-test

SSH接続確認

それでは最後に、このコンテナにSSH接続してみましょう。以下のコマンドで接続できるはずです。

Bash
ssh -p 2222 test-user@localhost

Bash
ssh -p 2222 test-user@localhost
The authenticity of host '[localhost]:2222 ([::1]:2222)' can't be established.
ED25519 key fingerprint is SHA256:/82GhGyztxgcmR5E6m7uqE0u26tfPrvZaKGPTHB4vwI.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[localhost]:2222' (ED25519) to the list of known hosts.
test-user@localhost's password:
Last login: Thu Sep 18 14:01:50 2025 from 172.17.0.1
[test-user@8a06db6a17f3 ~]$

test-userのプロンプトが表示されれば、無事立ち上げたコンテナにSSH接続できてます!

まとめ

今回はDockerfileについてまとめてみました。今回紹介した内容は、チームで開発をするときはもちろん個人で開発する際にも役立つ内容と思います。

Dockerfile
  • オリジナルのDockerイメージを作るときに必要。
  • Dockerfileに記載の命令文毎に、ベースイメージの上にレイヤを重ねていく。