2025/05/03 Updated by

Docker Image を自作する

ubuntu 24.04LTS, sshd, httpd


[Up] Japanese English

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

方針

作成手順

  1. 作業用フォルダを作成する
  2.   $ mkdir -p ~/doc/docker/ubuntu24_sshd_httpd
      $ cd ~/doc/docker/ubuntu24_ssd_httpd
    
  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=パスワード
    
    ENV SSHD_PORT=22
    
    # 必要なパッケージのインストール
    
    RUN apt-get update && \
        DEBIAN_FRONTEND=noninteractive apt-get install -y \
        sudo \
        openssh-server \
        supervisor \
        apache2 \
        libapache2-mod-php \
        php-fpm \
        net-tools iputils-tracepath traceroute iputils-ping curl iproute2 \
        && 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 && \
        sed -i "s/^#Port.*/Port ${SSHD_PORT}/" /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 の設定ファイルを設置する (Daemon 起動用)
    
    RUN mkdir -p /var/log/supervisor
    COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
    
    
    # ポート開放
    
    EXPOSE 22 80
    
    
    # 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
    logfile=/var/log/supervisor/supervisord.log
    
    [program:sshd]
    command=/usr/sbin/sshd -D
    autostart=true
    autorestart=true
    
    [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/apachectl -D FOREGROUND
    autostart=true
    autorestart=true
    
  7. 作業用フォルダの中に entrypoint.sh を作成する
  8. entrypoint.sh
    #!/bin/bash
    set -e
    
    
    # ユーザーが存在しない場合のみ作成する
    if id "${UNAME}" &>/dev/null; then
        echo "User ${UNAME} already exists. Skipping creation."
    else
        # 同名グループが無ければ作成
        if ! getent group "${UNAME}" &>/dev/null; then
            echo "Creating group ${UNAME} with GID=${GID}"
            groupadd -g ${GID} ${UNAME}
        else
            echo "Group ${UNAME} already exists. Skipping group creation."
        fi
    
        echo "Creating user ${UNAME} with UID=${UID}, GID=${GID}"
        useradd -m -u ${UID} -g ${GID} -s /bin/bash ${UNAME}
        echo "${UNAME}:${PASS}" | chpasswd
        adduser ${UNAME} sudo
    fi
    
    
    # ホームディレクトリの Owner を明示的に設定する
    chown -v ${UNAME}:${UNAME}  /home/${UNAME}
    
    
    # SSHD のポート番号を変更する
    sed -i "s/^Port.*/Port ${SSHD_PORT}/" /etc/ssh/sshd_config
    
    
    # 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-httpd .
      ...
    成功
    
  11. 生成した Image を確認する
  12. $ docker image ls
    REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
    ubuntu24-sshd-httpd   latest    2d6ebe12e98a   28 seconds ago   470MB
    ubuntu24-sshd         latest    1f06d9a9455f   2 hours 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-httpd を用いて、 新しい Container ubuntu24-httpd-work を生成する。

  1. image から container を生成して起動する。 下の実行例はユーザ名を www とした場合である。
  2.   $ docker run --name ubuntu24-httpd-work --restart always \
        -e UNAME=www -e UID=2000 -e GID=2000 -e PASS=新しいパスワード \
        -p 21022:22 -p 21080:80 -p 21443:443 \
        -v /home/docker/www:/home/www/doc -d ubuntu24-sshd-httpd
    
    起動オプション
  3. Container からマウントされるホスト OS の /home/docker/www が存在しない場合は、 "docker run" を実行したユーザの権限で作成される。
  4. $ ls -ld /home/docker/www
    drwxr-xr-x 2 nitta nitta 4096  5月  2 16:08 /home/docker/www
    
  5. 起動した Container の様子を調べる。
  6. $ docker container ls
    CONTAINER ID  IMAGE                COMMAND           CREATED         STATUS         PORTS                   NAMES
    6d4c9b319883  ubuntu24-sshd-httpd  "/entrypoint.sh"  36 seconds ago  Up 28 seconds  0.0.0.0:21022->22/tcp,  ubuntu24-httpd-work
                                                                                         0.0.0.0:21080->80/tcp,
                                                                                         0.0.0.0:21443->443/tcp   
    ...
    
  7. Container のログを調べる。
  8. $ docker logs ubuntu24-httpd-work
    Creating group www with GID=2000
    Creating user www with UID=2000, GID=2000
    info: Adding user `www' to group `sudo' ...
    ownership of '/home/www' retained as www:www
    2025-05-04 16:18:54,788 CRIT Supervisor is running as root.  Privileges were not dropped because no user is specified
    in the config file.  If you intend to run as root, you can set user=root in the config file to avoid this message.
    2025-05-04 16:18:54,789 INFO supervisord started with pid 38
    2025-05-04 16:18:55,792 INFO spawned: 'apache2' with pid 39
    2025-05-04 16:18:55,794 INFO spawned: 'php-fpm' with pid 40
    2025-05-04 16:18:55,795 INFO spawned: 'sshd' with pid 41
    2025-05-04 16:18:56,816 INFO success: apache2 entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
    2025-05-04 16:18:56,816 INFO success: php-fpm entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
    2025-05-04 16:18:56,816 INFO success: sshd entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
    
  9. ホストOS から、ssh を用いてゲストOS にアクセスする。
  10. $ ssh -p 21022 www@localhost
    www@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
    $
    
  11. (ゲストOS上で)ホームディレクトリを調べる。
  12. (ゲストOS上で)
    $ pwd            ← ホームディレクトリのパスを表示する。
    /home/www
    $ ls -l          ← ホームディレクトリの情報を表示する。
    total 4
    drwxr-xr-x 2 www www 4096 May  2 07:28 doc            ← ホストOSの /home/docker/httpd にマウントされている
    
  13. (ゲストOS上で) パスワードを変更する
  14. $ passwd
    Changing password for www.
    Current password: パスワード ← エコーバックされない
    New password:  新しいパスワード(長いバージョン) ← エコーバックされない
    Retype new password:  新しパスワード ← エコーバックされない
    passwd: password updated successfully
    
  15. (ゲストOS上で) プロセスがどのユーザ権限で動いているか調べる。
  16. $ ps aux
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root         1  0.0  0.0   4324  3372 ?        Ss   17:05   0:00 /bin/bash /entrypoint.sh
    root        37  0.1  0.3  34692 28060 ?        S    17:05   0:00 /usr/bin/python3 /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
    root        38  0.0  0.0   2800  1836 ?        S    17:05   0:00 /bin/sh /usr/sbin/apachectl -D FOREGROUND
    root        39  0.0  0.2 203800 23532 ?        S    17:05   0:00 php-fpm: master process (/etc/php/8.3/fpm/php-fpm.conf)
    root        40  0.0  0.1  12020  8040 ?        S    17:05   0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
    root        42  0.0  0.3 203712 25540 ?        S    17:05   0:00 /usr/sbin/apache2 -D FOREGROUND
    www-data    43  0.0  0.1 204196 12048 ?        S    17:05   0:00 /usr/sbin/apache2 -D FOREGROUND
    www-data    44  0.0  0.1 204196 12048 ?        S    17:05   0:00 /usr/sbin/apache2 -D FOREGROUND
    www-data    45  0.0  0.1 204196 12048 ?        S    17:05   0:00 /usr/sbin/apache2 -D FOREGROUND
    www-data    46  0.0  0.1 204196 12048 ?        S    17:05   0:00 /usr/sbin/apache2 -D FOREGROUND
    www-data    47  0.0  0.1 204196 12048 ?        S    17:05   0:00 /usr/sbin/apache2 -D FOREGROUND
    www-data    48  0.0  0.1 204168 10460 ?        S    17:05   0:00 php-fpm: pool www
    www-data    49  0.0  0.1 204168 10460 ?        S    17:05   0:00 php-fpm: pool www
    root        50  0.0  0.1  14432 10264 ?        Ss   17:05   0:00 sshd: www [priv]
    www         61  0.3  0.0  14692  6704 ?        S    17:05   0:00 sshd: www@pts/0
    www         62  0.0  0.0   5016  3984 pts/0    Ss   17:05   0:00 -bash
    www         68  0.0  0.0   8280  4212 pts/0    R+   17:06   0:00 ps augx
    
  17. (ゲストOS上で) シェルを終了する。
  18. $ exit
    Connection to localhost closed.
    nitta@um580:~/doc/docker$ 
    
  19. Container に port forwarding するホストOSのポートを開放する。 ホストOSにより方法は異なるが、 以下はホストOSが Ubuntu 24.04LTS の場合。
  20. $ sudo ufw status
    $ sudo ufw allow 21022
    $ sudo ufw allow 21080
    $ sudo ufw allow 21443
    

Docker の内部ネットワークに関する注意

上記のように起動したContainer 上の WWW サーバでは、アクセスしてくるクライアントのIPアドレスを用いたアクセス制限がうまく動作しない。 その原因は、

「Docker ホストOS (172.17.0.1) がDocker内部ネットワーク(172.17.0.0/16)に対して NAPT をかけていて、 外部からのアクセスがすべて 172.17.0.1 からに見える」
である。

Docker 内部ネットワークの調査

  1. ホストOSとは異なるマシンでブラウザを立ち上げて、Container ubuntu24-httpd 上のWWWサーバにアクセスする。
  2. URL は http://ホストOSのIPアドレス:21080/
  3. Container ubuntu24-httpd に ssh アクセスする。
  4. $ ssh -p 21022 www@localhost
    www@localhost's password: パスワード ← エコーバックされない
    (ゲスト OS のシェルが起動する)
    Welcome to Ubuntu 24.04.2 LTS (GNU/Linux 6.10.14-linuxkit x86_64)
    ...
    $
    
  5. WWWサーバのlogを表示する。← すべてのWWWアクセスが 172.17.0.1 からになっていることがわかる
  6. $ sudo tail /var/log/apache2/access.log
    ...
    172.17.0.1 - - [04/May/2025:05:10:49 +0000] "GET /work2/ HTTP/1.1" 200 21202 "http://ホストOSのIPアドレス:21080/" ...
    172.17.0.1 - - [04/May/2025:05:10:53 +0000] "GET /work3/ HTTP/1.1" 200 21202 "http://ホストOSのIPアドレス:21080/" ...
    
  7. ネットワークコマンドをインストールする
  8. まず、aptのデータベースを更新しておいて
    $ sudo apt update
    
    ifconfig, netstat, arp をインストールする
    $ sudo apt install -y net-tools
    
    traceroute をインストールする
    $ sudo apt install -y iputils-tracepath traceroute
    
    ping をインストールする
    $ sudo apt install -y iputils-ping
    
    curl をインストールする
    $ sudo apt install -y curl
    
    ip をインストールする
    $ sudo apt install -y iproute2
    
  9. netstat コマンドを用いて、ルーティング情報を調べる。 → Container が接続しているネットワークは 172.17.0.0/16で、 デフォルトのルーティング先が 172.17.0.1 であることがわかる
  10. $ netstat -nr
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
    0.0.0.0         172.17.0.1      0.0.0.0         UG        0 0          0 eth0
    172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 eth0
    
  11. ifconfig でContainer のIPアドレスを調べる。 → 172.17.0.2 であることがわかる。
  12. $ ifconfig
    eth0: flags=4163  mtu 1500
            inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
            ether xx:xx:xx:xx:xx:xx  txqueuelen 0  (Ethernet)
            RX packets 57700  bytes 10953734 (10.9 MB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 56874  bytes 6131126 (6.1 MB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10
            loop  txqueuelen 1000  (Local Loopback)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    

対策

対策は2通りあるようだ。

Docker Contaner を生成する (2)

Image ubuntu24-sshd-httpd を用いて、 新しい Container ubuntu24-httpd を生成する。ただし、この Container はホストOSのネットワークを共有するようにする。

上記の「Docker Contaner を生成する (1)」に対して、以下の変更を加える。

Container を作成+実行する

  1. image から container を生成して起動する。 下の実行例はユーザ名を www とした場合である。
  2.   $ docker run --name ubuntu24-httpd --restart always \
        -e UNAME=www -e UID=2000 -e GID=2000 -e PASS=新しいパスワード \
        -e SSHD_PORT=20022 \
        --net=host \
        -v /home/docker/www:/home/www/doc -d ubuntu24-sshd-httpd
    
    起動オプション
  3. Container からマウントされるホスト OS の /home/docker/www が存在しない場合は、 "docker run" を実行したユーザの権限で作成される。
  4. $ ls -ld /home/docker/www
    drwxr-xr-x 2 nitta nitta 4096  5月  2 16:08 /home/docker/www
    
  5. 起動した Container の様子を調べる。
  6. $ docker container ls
    CONTAINER ID  IMAGE                COMMAND           CREATED         STATUS         PORTS      NAMES
    2e660d8f7d30  ubuntu24-sshd-httpd  "/entrypoint.sh"  41 seconds ago  Up 33 seconds             ubuntu24-httpd
    
    ...
    
  7. Container のログを調べる。
  8. $ docker logs ubuntu24-httpd
    Creating group www with GID=2000
    Creating user www with UID=2000, GID=2000
    useradd: warning: the home directory /home/www already exists.
    useradd: Not copying any file from skel directory into it.
    info: Adding user `www' to group `sudo' ...
    changed ownership of '/home/www' from root:root to www:www
    2025-05-04 17:29:06,466 CRIT Supervisor is running as root.  Privileges were not dropped because no user is specified in the config file.  If you intend to run as root, you can set user=root in the config file to avoid this message.
    2025-05-04 17:29:06,467 INFO supervisord started with pid 37
    2025-05-04 17:29:07,471 INFO spawned: 'apache2' with pid 38
    2025-05-04 17:29:07,474 INFO spawned: 'php-fpm' with pid 39
    2025-05-04 17:29:07,477 INFO spawned: 'sshd' with pid 42
    2025-05-04 17:29:08,503 INFO success: apache2 entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
    2025-05-04 17:29:08,504 INFO success: php-fpm entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
    2025-05-04 17:29:08,504 INFO success: sshd entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
    
    
    # ifconfig
    docker0: flags=4163  mtu 1500
            inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
            inet6 fe80::c8b7:f3ff:febd:a6ca  prefixlen 64  scopeid 0x20
            ether ca:b7:f3:bd:a6:ca  txqueuelen 0  (Ethernet)
            RX packets 9  bytes 252 (252.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 7  bytes 826 (826.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    eth0: flags=4163  mtu 1500
            inet 192.168.65.9  netmask 255.255.255.0  broadcast 192.168.65.255
            inet6 fdc4:f303:9324::3  prefixlen 64  scopeid 0x0
            inet6 fe80::5054:ff:fe12:3456  prefixlen 64  scopeid 0x20
            ether 52:54:00:12:34:56  txqueuelen 1000  (Ethernet)
            RX packets 44684  bytes 35235218 (35.2 MB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 25526  bytes 8739721 (8.7 MB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10
            loop  txqueuelen 1000  (Local Loopback)
            RX packets 2158  bytes 240986 (240.9 KB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 2158  bytes 240986 (240.9 KB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    services1: flags=4163  mtu 1500
            inet 192.168.65.6  netmask 255.255.255.255  broadcast 0.0.0.0
            inet6 fe80::1012:aff:fecd:9a67  prefixlen 64  scopeid 0x20
            inet6 fdc4:f303:9324::6  prefixlen 128  scopeid 0x0
            ether 12:12:0a:cd:9a:67  txqueuelen 0  (Ethernet)
            RX packets 49  bytes 7722 (7.7 KB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 43  bytes 3594 (3.5 KB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    veth4301972: flags=4163  mtu 1500
            inet6 fe80::887e:aff:fee9:dd77  prefixlen 64  scopeid 0x20
            ether 8a:7e:0a:e9:dd:77  txqueuelen 0  (Ethernet)
            RX packets 3  bytes 126 (126.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 21  bytes 1778 (1.7 KB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    veth600927e: flags=4163  mtu 1500
            inet6 fe80::a83f:a4ff:fe06:53e6  prefixlen 64  scopeid 0x20
            ether aa:3f:a4:06:53:e6  txqueuelen 0  (Ethernet)
            RX packets 3  bytes 126 (126.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 20  bytes 1736 (1.7 KB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    vethb596a7e: flags=4163  mtu 1500
            inet6 fe80::7888:31ff:fe05:4992  prefixlen 64  scopeid 0x20
            ether 7a:88:31:05:49:92  txqueuelen 0  (Ethernet)
            RX packets 3  bytes 126 (126.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 23  bytes 1950 (1.9 KB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    
    
    # netstat -nr    
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
    127.0.0.0       0.0.0.0         255.0.0.0       U         0 0          0 lo
    172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 docker0
    192.168.65.0    0.0.0.0         255.255.255.0   U         0 0          0 eth0
    192.168.65.7    0.0.0.0         255.255.255.255 UH        0 0          0 services1
    
    # ss -tulpn
    Netid           State      Recv-Q  Send-Q      Loocal Address:Port     Peer Address:Port    Process                                    
    udp             UNCONN     0       0            0.0.0.0:111           0.0.0.0:*                                                         
    udp             UNCONN     0       0          127.0.0.1:954           0.0.0.0:*                                                         
    udp             UNCONN     0       0            0.0.0.0:58694         0.0.0.0:*                                                         
    udp             UNCONN     0       0               [::]:111              [::]:*                                                         
    udp             UNCONN     0       0               [::]:59915            [::]:*                                                         
    tcp             LISTEN     0       4096         0.0.0.0:111           0.0.0.0:*                                                         
    tcp             LISTEN     0        128          0.0.0.0:20022         0.0.0.0:*            users:(("sshd",pid=13,fd=3))              
    tcp             LISTEN     0       4096         0.0.0.0:60979         0.0.0.0:*                                                         
    tcp             LISTEN     0        511                *:80                  *:*            users:(("apache2",pid=15,fd=4))           
    tcp             LISTEN     0       4096            [::]:111              [::]:*                                                         
    tcp             LISTEN     0       4096            [::]:57899            [::]:*                                                         
    tcp             LISTEN     0        128             [::]:20022            [::]:*            users:(("sshd",pid=13,fd=4))   
    
    nitta@um580:~$ docker inspect --format='{{.HostConfig.NetworkMode}}' ubuntu24-httpd
    host
    
    
  9. ホストOS から、ssh を用いてゲストOS にアクセスする。
  10. $ ssh -p 21022 www@localhost
    www@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
    $
    
    entrypoint を上書きして、bash を動かす方法。
     nitta@um580:~$ docker run --rm -it --net=host --entrypoint bash ubuntu24-httpd
    

    Docker Desktopを使用している場合は、docker ホストOSが Ubuntu 24.04LTS であっても --net=host はうまく動作しない。 Docker Engine を使うべし。

    Docker Desktop for Linux を使用している場合 Ubuntu 24.04 上で Docker Desktop を使用していると、--net=host オプションが期待通りに動作しないことがあります。 これは、Docker Desktop が内部的に仮想マシンを使用しており、--net=host がその仮想マシンのネットワークスタックを共有するため、ホスト OS のネットワークとは異なる挙動を示すためです。 この問題は、Docker Community Forums でも議論されています。

    ssh -p 20022 www@localhot は Container上からなら動作するが、 ホストOS の上からでは動作しない(Connection refused)。なぜ?
    今ココ。← 2025/05/05 02:44 時点


  11. (ゲストOS上で)ホームディレクトリを調べる。
  12. (ゲストOS上で)
    $ pwd            ← ホームディレクトリのパスを表示する。
    /home/www
    $ ls -l          ← ホームディレクトリの情報を表示する。
    total 4
    drwxr-xr-x 2 www www 4096 May  2 07:28 doc            ← ホストOSの /home/docker/httpd にマウントされている
    
  13. (ゲストOS上で) パスワードを変更する
  14. $ passwd
    Changing password for www.
    Current password: パスワード ← エコーバックされない
    New password:  新しいパスワード(長いバージョン) ← エコーバックされない
    Retype new password:  新しパスワード ← エコーバックされない
    passwd: password updated successfully
    
  15. (ゲストOS上で) プロセスがどのユーザ権限で動いているか調べる。
  16. $ ps aux
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root         1  0.0  0.0   4324  3372 ?        Ss   17:05   0:00 /bin/bash /entrypoint.sh
    root        37  0.1  0.3  34692 28060 ?        S    17:05   0:00 /usr/bin/python3 /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
    root        38  0.0  0.0   2800  1836 ?        S    17:05   0:00 /bin/sh /usr/sbin/apachectl -D FOREGROUND
    root        39  0.0  0.2 203800 23532 ?        S    17:05   0:00 php-fpm: master process (/etc/php/8.3/fpm/php-fpm.conf)
    root        40  0.0  0.1  12020  8040 ?        S    17:05   0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
    root        42  0.0  0.3 203712 25540 ?        S    17:05   0:00 /usr/sbin/apache2 -D FOREGROUND
    www-data    43  0.0  0.1 204196 12048 ?        S    17:05   0:00 /usr/sbin/apache2 -D FOREGROUND
    www-data    44  0.0  0.1 204196 12048 ?        S    17:05   0:00 /usr/sbin/apache2 -D FOREGROUND
    www-data    45  0.0  0.1 204196 12048 ?        S    17:05   0:00 /usr/sbin/apache2 -D FOREGROUND
    www-data    46  0.0  0.1 204196 12048 ?        S    17:05   0:00 /usr/sbin/apache2 -D FOREGROUND
    www-data    47  0.0  0.1 204196 12048 ?        S    17:05   0:00 /usr/sbin/apache2 -D FOREGROUND
    www-data    48  0.0  0.1 204168 10460 ?        S    17:05   0:00 php-fpm: pool www
    www-data    49  0.0  0.1 204168 10460 ?        S    17:05   0:00 php-fpm: pool www
    root        50  0.0  0.1  14432 10264 ?        Ss   17:05   0:00 sshd: www [priv]
    www         61  0.3  0.0  14692  6704 ?        S    17:05   0:00 sshd: www@pts/0
    www         62  0.0  0.0   5016  3984 pts/0    Ss   17:05   0:00 -bash
    www         68  0.0  0.0   8280  4212 pts/0    R+   17:06   0:00 ps augx
    
  17. (ゲストOS上で) シェルを終了する。
  18. $ exit
    Connection to localhost closed.
    nitta@um580:~/doc/docker$ 
    
  19. Container に port forwarding するホストOSのポートを開放する。 ホストOSにより方法は異なるが、 以下はホストOSが Ubuntu 24.04LTS の場合。
  20. $ sudo ufw status
    $ sudo ufw allow 21022
    $ sudo ufw allow 21080
    $ sudo ufw allow 21443