2025/05/02 Updated by 
Docker Image を自作する
ubuntu 24.04LTS, sshd
[Up]

sshd が自動起動する ubuntu24.04LTS の docker Image を生成する
方針
- OS は Ubuntu 24.04LTS
- sshd を自動起動する。
- ユーザ情報は Container を生成するときに指定する。(省略可能)
- サーバーは supervisord を用いてバックグラウンドで起動する。
- Container 生成時にコマンドが与えられた場合は、フォアグラウンドで実行する。
- 生成する Docker Image 名は ubuntu24-sshd-user
作成手順
- 作業用フォルダを作成する
$ mkdir -p ~/doc/docker/ubuntu24_sshd_user
$ cd ~/doc/docker/ubuntu24_ssd_user
- 作業用フォルダの中に Dockerfile を作成する。Dockerfile中の パスワード の部分は、推測されにくい文字列に必ず変更すること。
Dockerfile |
# ゲストOS: Ubuntu 24.04 LTS
FROM ubuntu:24.04
# Change Your Own UNAME, UID, GID, PASS
ENV UNAME=guest
ENV UID=3000
ENV GID=3000
ENV PASS=パスワード
# 必要なパッケージのインストール
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y \
sudo \
openssh-server \
supervisor \
&& rm -rf /var/lib/apt/lists/*
# SSH 設定: パスワード認証を有効化
RUN sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config && \
sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config && \
mkdir /var/run/sshd
# supervisord の設定ファイルを設置する (Daemon 起動用)
RUN mkdir -p /var/log/supervisor
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# ポート開放
EXPOSE 22
# Copy Shell Script "entrypoint.sh"
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD []
|
- 作業用フォルダの中に supervisord.conf を作成する
supervisord.conf |
# supervisord の設定ファイル
[supervisord]
nodaemon=true
# sshd を起動する
[program:sshd]
command=/usr/sbin/sshd -D
|
- 作業用フォルダの中に entrypoint.sh を作成する
entrypoint.sh |
#!/bin/bash
set -e
# 既存のユーザーが存在すれば削除する。先に削除しないとgroupdelできないことがあるので。
if id ${UNAME} &>/dev/null; then
echo "User ${UNAME} exists. Removing ..."
sudo userdel -r ${UNAME}
fi
# 既存のグループが存在すれば削除
if getent group "${UNAME}" &>/dev/null; then
echo "Group ${UNAME} exists. Removing ..."
sudo groupdel "${UNAME}"
fi
# グループ作成
echo "Group ${UNAME} GID=${GID} created."
sudo groupadd -g ${GID} ${UNAME}
# ユーザー作成
echo "User ${UNAME} UID=${UID}, GID=${GID} created."
sudo useradd -m -u ${UID} -g ${GID} ${UNAME}
# ${UNAME} ユーザーのパスワードを再設定
if [ -n "${PASS}" ]; then
echo "${UNAME}:${PASS}" | chpasswd
fi
# supervisord start (background)
/usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf &
# Execute Commands in CMD
if [ "$#" -gt 0]; then
exec "$@"
else
wait
fi
|
- Image を build する。
$ docker build -t ubuntu24-sshd-user .
...
成功
- 生成した Image を確認する
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu24-sshd-user latest c2ea2e38bab2 12 minutes ago 334MB
...
Container 用の永続的なファイルシステムを作成する
コンテナに永続的なファイルシステムを提供するために、1777 のパーミッションでフォルダを作っておく。
skicky bit が on (1777) のフォルダには、
「誰でもファイルを作成できるが、作成した本人だけがファイルを変更したり消したりできる」
という特徴がある。
$ sudo mkdir -p /home/docker ← ディレクトリを作成する
$ sudo chmod 1777 /home/docker ← 誰でもファイルを作成できるが、作成した本人にしか消去できないモードに設定する
$ ls -ld /home/docker ← ディレクトリのsticky bit が on になっていることを確認する。
drwxrwxrwt 3 root root 4096 4月 26 15:47 /home/docker
Docker Contaner を生成する (1)
Image "ubuntu24-sshd-user" のデフォルトのユーザ情報を用いて、新しい Container を生成する。
- Image から Container を生成して起動する。ユーザ情報はデフォルト値 (guest) を利用する。
デフォルトユーザーのホームディレクトリに、ホストOSのディレクトリをマウントしている
$ docker run --name ubuntu24-guest --restart always -p 12022:22 \
-v /home/docker/guest:/home/guest/doc -it ubuntu24-sshd-user
起動オプション
- --name: 生成する Container の名前は ubuntu24-guest
- --restart: docker が起動すると、このコンテナも自動起動する。
- -p: ホストOSのポートにアクセスすると、Containerのポートに forwarding される。
- -v: ホストOSの /home/docker/guest が Container の/home/guest/doc にマウントされる。
マウントポイント |
ホストOS | ゲストOS |
/home/docker/guest | /home/guest/doc |
- 使用する Docker Image は ubuntu24-apache2-sshd
- Container からマウントされるホスト OS の /home/docker/guest が存在しない場合は、
"docker run" を実行したホストOSのユーザ (nitta) の権限で作成される。
$ ls -ld /home/docker/guest
drwxr-xr-x 2 nitta nitta 4096 5月 2 16:28 /home/docker/guest
- ホストOS から、ssh を用いてゲストOS にアクセスする。
$ ssh -p 12022 guest@localhost
guest@localhost's password: パスワード ← エコーバックされない
(ゲスト OS のシェルが起動する)
Welcome to Ubuntu 24.04.2 LTS (GNU/Linux 6.10.14-linuxkit x86_64)
...
Last login: Fri May 2 07:29:20 2025 from 172.17.0.1
$
- (ゲストOS上で)ホームディレクトリを調べる。
(ゲストOS上で)
$ pwd ← ホームディレクトリのパスを表示する。
/home/guest
$ ls -l ← ホームディレクトリの情報を表示する。
total 4
drwxr-xr-x 2 guest guest 4096 May 2 07:28 doc ← ホストOSの /home/docker/guest がマウントされている
- (ゲストOS上で) パスワードを変更する
$ passwd
Changing password for guest.
Current password: パスワード ← エコーバックされない
New password: 新しいパスワード ← エコーバックされない
Retype new password: 新しパスワード ← エコーバックされない
passwd: password updated successfully
- (ゲストOS上で) シェルを終了する。
$ exit
Connection to localhost closed.
nitta@um580:~/doc/docker$
Docker Contaner を生成する (2)
Image "ubuntu24-sshd-user" を用いて、ユーザ情報を指定して、新しい Container を生成する。
- Image から Container を生成して起動する。下に示すのはユーザ名を nitta とした例であり、
自分の環境に合わせて適切に変更すること。
$ docker run --name ubuntu24-ssh -e UNAME=nitta -e UID=2000 -e GID=2000 -e PASS=新しいパスワード \
--restart always -p 11022:22 -v /home/docker/nitta:/home/nitta/doc -it ubuntu24-sshd-user
起動オプション
- --name: 生成するcontainer の名前は ubuntu24-ssh
- -e: 変数に値を指定する
シェル変数名 | 値 |
UNAME | nitta |
UID | 2000 |
GID | 2000 |
PASS | 新しいパスワード |
- --restart: docker が起動すると、このコンテナも自動起動する。
- -p: ホストOSのポートアクセスが、Containerのポートに forwarding される。
- -v: ホストOSの /home/docker/nitta が Container の/home/nitta/doc にマウントされる。
マウントポイント |
ホストOS | ゲストOS |
/home/docker/nitta | /home/nitta/doc |
- 使用する image は ubuntu24-apache2-sshd
- Container からマウントされるホスト OS の /home/docker/geust が存在しない場合は、
"docker run" を実行したホストOSのユーザの権限 (nitta) で作成される。
$ ls -ld /home/docker/nitta
drwxr-xr-x 2 nitta nitta 4096 5月 2 16:08 /home/docker/nitta
- ホストOS から、ssh を用いてゲストOS にアクセスする。
$ ssh -p 11022 nitta@localhost
nitta@localhost's password: パスワード ← エコーバックされない
(ゲスト OS のシェルが起動する)
Welcome to Ubuntu 24.04.2 LTS (GNU/Linux 6.10.14-linuxkit x86_64)
...
Last login: Fri May 2 07:29:20 2025 from 172.17.0.1
$
- (ゲストOS上で)ホームディレクトリを調べる。
(ゲストOS上で)
$ pwd ← ホームディレクトリのパスを表示する。
/home/nitta
$ ls -l ← ホームディレクトリの情報を表示する。
total 4
drwxr-xr-x 2 nitta nitta 4096 May 2 07:28 doc ← ホストOSの /home/docker/nitta がマウントされている
- (ゲストOS上で) パスワードを変更する
$ passwd
Changing password for nitta.
Current password: パスワード ← エコーバックされない
New password: 新しいパスワード(長いバージョン) ← エコーバックされない
Retype new password: 新しパスワード ← エコーバックされない
passwd: password updated successfully
- (ゲストOS上で) シェルを終了する。
$ exit
Connection to localhost closed.
nitta@um580:~/doc/docker$