2025/05/02 Updated by

Docker Image を自作する

ubuntu 24.04LTS, sshd


[Up] Japanese English

sshd が自動起動する ubuntu24.04LTS の docker Image を生成する

方針

作成手順

  1. 作業用フォルダを作成する
  2.   $ mkdir -p ~/doc/docker/ubuntu24_sshd_user
      $ cd ~/doc/docker/ubuntu24_ssd_user
    
  3. 作業用フォルダの中に Dockerfile を作成する。Dockerfile中の パスワード の部分は、推測されにくい文字列に必ず変更すること。
  4. 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 []
    
  5. 作業用フォルダの中に supervisord.conf を作成する
  6. supervisord.conf
    # supervisord の設定ファイル
    
    [supervisord]
    nodaemon=true
    
    # sshd を起動する
    
    [program:sshd]
    command=/usr/sbin/sshd -D
    
  7. 作業用フォルダの中に entrypoint.sh を作成する
  8. 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
    
  9. Image を build する。
  10.   $ docker build -t ubuntu24-sshd-user .
      ...
    成功
    
  11. 生成した Image を確認する
  12. $ 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 を生成する。

  1. Image から Container を生成して起動する。ユーザ情報はデフォルト値 (guest) を利用する。 デフォルトユーザーのホームディレクトリに、ホストOSのディレクトリをマウントしている
  2. $ docker run --name ubuntu24-guest --restart always -p 12022:22  \
        -v /home/docker/guest:/home/guest/doc -it ubuntu24-sshd-user
    
    起動オプション
  3. Container からマウントされるホスト OS の /home/docker/guest が存在しない場合は、 "docker run" を実行したホストOSのユーザ (nitta) の権限で作成される。
  4. $ ls -ld /home/docker/guest
    drwxr-xr-x 2 nitta nitta 4096  5月  2 16:28 /home/docker/guest
    
  5. ホストOS から、ssh を用いてゲストOS にアクセスする。
  6. $ 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
    $
    
  7. (ゲストOS上で)ホームディレクトリを調べる。
  8. (ゲストOS上で)
    $ pwd            ← ホームディレクトリのパスを表示する。
    /home/guest
    $ ls -l          ← ホームディレクトリの情報を表示する。
    total 4
    drwxr-xr-x 2 guest guest 4096 May  2 07:28 doc     ← ホストOSの /home/docker/guest がマウントされている
    
  9. (ゲストOS上で) パスワードを変更する
  10. $ passwd
    Changing password for guest.
    Current password: パスワード ← エコーバックされない
    New password:  新しいパスワード ← エコーバックされない
    Retype new password:  新しパスワード ← エコーバックされない
    passwd: password updated successfully
    
  11. (ゲストOS上で) シェルを終了する。
  12. $ exit
    Connection to localhost closed.
    nitta@um580:~/doc/docker$ 
    

Docker Contaner を生成する (2)

Image "ubuntu24-sshd-user" を用いて、ユーザ情報を指定して、新しい Container を生成する。

  1. Image から Container を生成して起動する。下に示すのはユーザ名を nitta とした例であり、 自分の環境に合わせて適切に変更すること。
  2. $ 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
    
    起動オプション
  3. Container からマウントされるホスト OS の /home/docker/geust が存在しない場合は、 "docker run" を実行したホストOSのユーザの権限 (nitta) で作成される。
  4. $ ls -ld /home/docker/nitta
    drwxr-xr-x 2 nitta nitta 4096  5月  2 16:08 /home/docker/nitta
    
  5. ホストOS から、ssh を用いてゲストOS にアクセスする。
  6. $ 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
    $
    
  7. (ゲストOS上で)ホームディレクトリを調べる。
  8. (ゲストOS上で)
    $ pwd            ← ホームディレクトリのパスを表示する。
    /home/nitta
    $ ls -l          ← ホームディレクトリの情報を表示する。
    total 4
    drwxr-xr-x 2 nitta nitta 4096 May  2 07:28 doc      ← ホストOSの /home/docker/nitta がマウントされている
    
  9. (ゲストOS上で) パスワードを変更する
  10. $ passwd
    Changing password for nitta.
    Current password: パスワード ← エコーバックされない
    New password:  新しいパスワード(長いバージョン) ← エコーバックされない
    Retype new password:  新しパスワード ← エコーバックされない
    passwd: password updated successfully
    
  11. (ゲストOS上で) シェルを終了する。
  12. $ exit
    Connection to localhost closed.
    nitta@um580:~/doc/docker$