2025/4/26 Updated by

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

ubuntu 24.04LTS, apache2, ssh


[Up] Japanese English

前提条件


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


セキュリティ対策

ホスト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 -d --restart always --name httpd ubuntu24-apache2-sshd
    
  3. 既に作成済みのコンテナに対して docker update --restart オプションで設定する。
  4. (使用例)
    $ docker update --restart unless-stopped httpd
    
--restart オプションで指定できる値
説明
no 自動起動しない (default)
alwaysホスト再起動後も自動起動
unless-stopped手動停止しない限り自動起動
on-failure異常終了したときのみ自動起動

apache2関連の設定

php をインストールする

$ sudo apt update
$ sudo apt install -y libapache2-mod-php
$ sudo sed -i 's/^;date\.timezone =.*/date\.timezone = "Asia\/Tokyo"/' /etc/php/8.3/apache2/php.ini

PHP+FPM による高速化

$ sudo apt -y install php-fpm

------/etc/apache2/sites-available/default-ssl.conf
# <VirtualHost> </VirtualHost> の間に記述する
<FilesMatch "\.php$">
  SetHandler "proxy:unix:/var/run/php/php8.3-fpm.sock|fcgi://localhost/"
</FilesMatch>
$ sudo a2enmod proxy_fcgi setenvif $ sudo a2enconf php8.3-fpm $ sudo service php8.3-fpm restart ← sudo systemctl restart php8.3-fpm は使えない $ sudo apachectl restart ← sudo systemctl restart apache2 は使えない

その他


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

php のインストールと、さらに PP+FPM による高速化も行う。
Dockerfile
FROM ubuntu:24.04

# 必要なパッケージのインストール
RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y \
    sudo \
    apache2 \
    libapache2-mod-php \
    php-fpm \
    openssh-server \
    supervisor \
    && rm -rf /var/lib/apt/lists/*

# guestユーザー追加+パスワード設定+sudo権限
RUN useradd -m guest && \
    echo 'guest:パスワード' | chpasswd && \
    adduser guest 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

# Apache 設定: ServerNameエラー防止
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf

# PHP 設定
RUN sed -i 's/^;date\.timezone =.*/date\.timezone = "Asia\/Tokyo"/' /etc/php/8.3/apache2/php.ini

# PHP-FPM によるPHPの高速化
RUN sed -i '/<\/VirtualHost>/i <FilesMatch "\\.php$">\n  SetHandler "proxy:unix:/var/run/php/php8.3-fpm.sock|fcgi://localhost/"\n</FilesMatch>' /etc/apache2/sites-available/default-ssl.conf

RUN a2enmod proxy_fcgi setenvif
RUN a2enconf php8.3-fpm

# supervisord 設定ファイル設置
RUN mkdir -p /var/log/supervisor
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

# ポート開放
EXPOSE 22 80

CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
supervisord.conf
[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D

[program:php-fpm]
command=/usr/sbin/php-fpm8.3 -F
autostart=true
autorestart=true
stdout_logfile=/var/log/php-fpm.log
stderr_logfile=/var/log/php-fpm.err

[program:apache2]
command=/usr/sbin/apache2ctl -D FOREGROUND
buildする。
$ docker build -t ubuntu24-apache2-php-sshd .
$ docker image ls
REPOSITORY                  TAG       IMAGE ID       CREATED          SIZE
ubuntu24-apache2-php-sshd   latest    52d211a7a4f8   12 seconds ago   470MB
ubuntu24-apache2-sshd       latest    2e70eec62db8   16 hours ago     431MB
起動する
$ docker run --name apache2 --restart always -p 21022:22 -p 21080:80 -p 21443:443 -v /home/docker/httpd:/home/guest/doc -it ubuntu24-apache2-php-sshd

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

Dockerfile
FROM ubuntu:24.04

ENV UNAME=guest
ENV UID=3000
ENV GID=3000
ENV PASS=パスワード

# 必要なパッケージのインストール
RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y \
    sudo \
    apache2 \
    libapache2-mod-php \
    php-fpm \
    openssh-server \
    supervisor \
    && rm -rf /var/lib/apt/lists/*

# guestユーザー追加+パスワード設定+sudo権限
RUN useradd -m guest && \
    echo 'guest:guestpass' | chpasswd && \
    adduser guest 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

# Apache 設定: ServerNameエラー防止
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf

# PHP 設定
RUN sed -i 's/^;date\.timezone =.*/date\.timezone = "Asia\/Tokyo"/' /etc/php/8.3/apache2/php.ini

# PHP-FPM によるPHPの高速化
RUN sed -i '/<\/VirtualHost>/i <FilesMatch "\\.php$">\n  SetHandler "proxy:unix:/var/run/php/php8.3-fpm.sock|fcgi://localhost/"\n</FilesMatch>' /etc/apache2/sites-available/default-ssl.conf

RUN a2enmod proxy_fcgi setenvif
RUN a2enconf php8.3-fpm

# supervisord 設定ファイル設置
RUN mkdir -p /var/log/supervisor
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

# ポート開放
EXPOSE 22 80

#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"]
supervisord.conf
[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D

[program:php-fpm]
command=/usr/sbin/php-fpm8.3 -F
autostart=true
autorestart=true
stdout_logfile=/var/log/php-fpm.log
stderr_logfile=/var/log/php-fpm.err

[program:apache2]
command=/usr/sbin/apache2ctl -D FOREGROUND
entrypoint.conf (docker run 時に実行されるスクリプト)
#!/bin/bash
set -e

# ${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
buildする。
$ docker build -t ubuntu24-apache2-php-sshd-uid .
$ docker image ls
REPOSITORY                      TAG       IMAGE ID       CREATED          SIZE
ubuntu24-apache2-php-sshd-uid   latest    f63c6004e567   23 seconds ago   470MB
ubuntu24-apache2-php-sshd       latest    52d211a7a4f8   4 hours ago      470MB
ubuntu24-apache2-sshd           latest    2e70eec62db8   21 hours ago     431MB
起動する
$ docker run --name webserver --restart always -e PASS=新しいパスワード -p 20022:22 -p 20080:80 -p 20443:443 -v /home/docker/www:/home/guest/www -it ubuntu24-apache2-php-sshd-uid