2025/4/26 Updated by

Docker GustOSのカスタムイメージを作成する

ubuntu 24.04LTS, sshd


[Up] Japanese English

実験環境


docker の基本概念と操作

Docker Image

(操作)Image の一覧を表示する
  $ docker image ls

Docker Container

(操作) Container の一覧を表示する
  $ docker container ls -a
(操作) 動作中のContainer の一覧を表示する
  $ docker container ls 

カスタムな Image を作成する

  • カスタムな docker Image を生成するには、新しいフォルダを作成し、その中に Dockerfile を置いて build 作業を行う。
  • 以下では、Image を生成するタイミングを build 時、Imageからコンテナを作成するタイミンを run時と呼ぶ。
  • Dockerfile 中で ARG で宣言した変数は、build 時にのみ有効。
  • Dockerfile 中で ENV で宣言した変数は、build 時だけではなく、run 時にも有効となる。
  • Dockerfile 中の RUN 命令は、build時に実行される。
  • グで実行したいコマンドは entrypoint.sh のような シェルスクリプトを用意して、その中で設定文を実行する。

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

    UIDやGIDは指定しない場合。

    セキュリティ対策

    ホストOSから ssh でゲストOSの guest ユーザにアクセスして、パスワードを変更する。

    (ホストOSのターミナルから)
    $ ssh -p 20022 guest@localhost    ← ホストOSから自分の 20022番ポートへ ssh アクセスすると、ゲストOSの22番ポートへforwardされる。
    guest@localhost's password: パスワード   ← Dockerfile で指定したguest のパスワード
    
    (ゲストOS上のシェルにアクセスできた)
    Welcome to Ubuntu 24.04.2 LTS (GNU/Linux 6.10.14-linuxkit x86_64)
    Last login: Week Month Day Hour:Minitue:Second Year from XXX.XXX.XXX.XXX
    
    $ passwd                                ← ゲストOS上でパスワードを変更する
    Current password: パスワード            ← Dockerfile で指定したguest のパスワード
    New password: 新しいパスワード          ← 新しいパスワード(推測されにくい文字列を使うこと)
    Retype new password: 新しいパスワード   ← 再度入力する
    

    ゲストOSの自動起動

    Docker Desktop において、ホストOSが再起動すると自動的にゲストOSが起動するように設定する方法は2通りある。

    1. コンテナ作成時に docker run --restart オプションで設定する。
    2. (使用例)
      $ docker run --name コンテナ名 --restart always -it イメージ名
      
    3. 既に作成済みのコンテナに対して docker update --restart オプションで設定する。
    4. (使用例)
      $ docker update --restart always  コンテナ名
      
    --restart オプションで指定できる値
    説明
    no 自動起動しない (default)
    alwaysホスト再起動後も自動起動
    unless-stopped手動停止しない限り自動起動
    on-failure異常終了したときのみ自動起動

    VPN関連の設定

    F5 VPN ソフトウェアををインストールする

    
    
    
    
    

    その他


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

    UIDやGIDを指定する場合。
    Dockerfile
    FROM ubuntu:24.04
    
    ENV UNAME=guest
    ENV GNAME=${UNAME}
    ENV UID=3000
    ENV GID=3000
    ENV PASS=guestpass
    
    # 必要なパッケージのインストール
    RUN apt-get update && \
        DEBIAN_FRONTEND=noninteractive apt-get install -y \
        sudo \
        openssh-server \
        supervisor \
        && rm -rf /var/lib/apt/lists/*
    
    ## ${UNAME} ユーザー追加+パスワード設定+sudo権限
    #RUN useradd -m ${UNAME} && \
    #    echo "${UNAME}:${PASS}" | chpasswd && \
    #    adduser ${UNAME} sudo
    
    # 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 設定ファイル設置
    RUN mkdir -p /var/log/supervisor
    COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
    
    # ポート開放
    EXPOSE 22 
    
    #CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
    
    # Add User and start Supervisord in entrypoint.sh
    COPY entrypoint.sh /entrypoint.sh
    RUN chmod +x /entrypoint.sh
    
    ENTRYPOINT ["/entrypoint.sh"]
    
    CMD []
    
    supervisord.conf
    [supervisord]
    nodaemon=true
    
    [program:sshd]
    command=/usr/sbin/sshd -D
    
    
    entrypoint.sh
    #!/bin/bash
    set -e
    
    # ${UNAME} ユーザーのパスワードを再設定
    if [ -n "${PASS}" ]; then
        if ! id ${UNAME} &>/dev/null; then
    	groupadd -g ${GID} ${GNAME} || true
    	useradd -m -u ${UID} -g ${GNAME} ${UNAME}
    	adduser ${UNAME} sudo
        fi
        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
    
    $ docker build -t ubuntu24-sshd-user .
    
    docker run --name ubuntu24-vpn-user --restart always -e PASS=PASS -e UNAME=nitta -e GNAME=nitta -e GID=3000 -e UID=3000 -p 13322:22  -v /home/docker/sshd:/home/nitta/doc -it ubuntu24-sshd-user