2025/05/03 Updated by
Docker Image を自作する
ubuntu 24.04LTS, sshd, httpd
[Up]
sshd, httpd が自動起動する ubuntu24.04LTS の docker Image を生成する
方針
ホストOS は Ubuntu 24.04LTS
ゲストOS も Ubuntu 24.04LTS
ユーザ情報は Container を生成するときに指定する。(省略可能)
sshd を自動起動する。
httpd を自動起動する。
サーバーは supervisord を用いてバックグラウンドで起動する。
Container 生成時にコマンドが与えられた場合は、フォアグラウンドで実行する。
生成する Docker Image 名は ubuntu24-sshd-httpd
作成手順
作業用フォルダを作成する
$ mkdir -p ~/doc/docker/ubuntu24_sshd_httpd
$ cd ~/doc/docker/ubuntu24_ssd_httpd
作業用フォルダの中に 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=パスワード
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 []
作業用フォルダの中に supervisord.conf を作成する
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
作業用フォルダの中に entrypoint.sh を作成する
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
Image を build する。
$ docker build -t ubuntu24-sshd-httpd .
...
成功
生成した Image を確認する
$ 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 (1 777) のフォルダには、
「誰でもファイルを作成できるが、作成した本人だけがファイルを変更したり消したりできる」
という特徴がある。
$ 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
を生成する。
image から container を生成して起動する。
下の実行例はユーザ名を www とした場合である。
$ 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
起動オプション
--name : 生成するcontainer の名前は ubuntu24-httpd-work
-e : run 時に実行されるシェルスクリプト (entrypoint.sh) 中の環境変数を設定する。
環境変数名 値
UNAME www
UID 2000
GID 2000
PASS 新しいパスワード
--restart : docker が起動すると、このコンテナも自動起動する。
-p : ホストOSのポートへのアクセスをContainerのポートに forwarding する。
ポート番号
ホストOS ゲストOS
21022 22
21080 80
21443 443
-v : ホストOSの /home/docker/www が Container の/home/www /doc にマウントされる。
マウントポイント
ホストOS ゲストOS
/home/docker/www /home/www /doc
使用する Docker Image は ubuntu24-sshd-httpd
Container からマウントされるホスト OS の /home/docker/www が存在しない場合は、
"docker run" を実行したユーザの権限で作成される。
$ ls -ld /home/docker/www
drwxr-xr-x 2 nitta nitta 4096 5月 2 16:08 /home/docker/www
起動した Container の様子を調べる。
$ 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
...
Container のログを調べる。
$ 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)
ホストOS から、ssh を用いてゲストOS にアクセスする。
$ 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
$
(ゲストOS上で)ホームディレクトリを調べる。
(ゲストOS上で)
$ pwd ← ホームディレクトリのパスを表示する。
/home/www
$ ls -l ← ホームディレクトリの情報を表示する。
total 4
drwxr-xr-x 2 www www 4096 May 2 07:28 doc ← ホストOSの /home/docker/httpd にマウントされている
(ゲストOS上で) パスワードを変更する
$ passwd
Changing password for www .
Current password: パスワード ← エコーバックされない
New password: 新しいパスワード(長いバージョン) ← エコーバックされない
Retype new password: 新しパスワード ← エコーバックされない
passwd: password updated successfully
(ゲストOS上で) プロセスがどのユーザ権限で動いているか調べる。
$ 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
(ゲストOS上で) シェルを終了する。
$ exit
Connection to localhost closed.
nitta@um580:~/doc/docker$
Container に port forwarding するホストOSのポートを開放する。
ホストOSにより方法は異なるが、
以下はホストOSが Ubuntu 24.04LTS の場合。
$ 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 内部ネットワークの調査
ホストOSとは異なるマシンでブラウザを立ち上げて、Container ubuntu24-httpd 上のWWWサーバにアクセスする。
URL は http://ホストOSのIPアドレス :21080/
Container ubuntu24-httpd に ssh アクセスする。
$ 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)
...
$
WWWサーバのlogを表示する。← すべてのWWWアクセスが 172.17.0.1 から になっていることがわかる
$ 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/" ...
ネットワークコマンドをインストールする
まず、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
netstat
コマンドを用いて、ルーティング情報を調べる。
→
Container が接続しているネットワークは 172.17.0.0/16で、
デフォルトのルーティング先が 172.17.0.1 であることがわかる
$ 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
ifconfig
でContainer のIPアドレスを調べる。
→ 172.17.0.2 であることがわかる。
$ 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通りあるようだ。
Container を --net=host モードで起動する(ホストOSがLinuxの場合に限る) 。
ただし、Container がホストOSのネットワークを共有するため、-p
で指定した
port forwarding 機能は無視される。
reverse proxy (nginxなど)を使って X-Forwarded-For を渡す。
Docker Contaner を生成する (2)
Image ubuntu24-sshd-httpd を用いて、
新しい Container
ubuntu24-httpd
を生成する。ただし、この Container はホストOSのネットワークを共有するようにする。
上記の「Docker Contaner を生成する (1)」に対して、以下の変更を加える。
Container の起動オプションに --net=host
オプションを追加することにより、
この Container はホストOSのネットワークを共有する。
Container の起動オプションで -p
オプションは指定しない。
ホストOSのネットワークを共有した場合、port forwarding はできないため。
Conatiner がホストOSとネットワークを共有するために、ポート番号の衝突が問題になるため、
外部に公開するポートを次のように割り当てる。'x' は「未使用」, '*' は 「otherwise」 を意味する。
service ポート番号 ホストOS Container
ssh 22 22 20022
http 80 x 80
https 443 x 443
rdp 3389 3389 x
* * * x
Container の sshd の待ち受けポート番号を変更するため、Container を起動する際に次のオプションをつける。
-e SSHD_PORT=20022
Container を作成+実行する
image から container を生成して起動する。
下の実行例はユーザ名を www とした場合である。
$ 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
起動オプション
--name : 生成するcontainer の名前は ubuntu24-httpd-work
-e : run 時に実行されるシェルスクリプト (entrypoint.sh) 中の環境変数を設定する。
環境変数名 値
UNAME www
UID 2000
GID 2000
PASS 新しいパスワード
SSHD_PORT 20022
--restart : docker が起動すると、このコンテナも自動起動する。
-p : ホストOSのポートへのアクセスをContainerのポートに forwarding する。
ポート番号
ホストOS ゲストOS
21022 22
21080 80
21443 443
-v : ホストOSの /home/docker/www が Container の/home/www /doc にマウントされる。
マウントポイント
ホストOS ゲストOS
/home/docker/www /home/www /doc
使用する Docker Image は ubuntu24-sshd-httpd
Container からマウントされるホスト OS の /home/docker/www が存在しない場合は、
"docker run" を実行したユーザの権限で作成される。
$ ls -ld /home/docker/www
drwxr-xr-x 2 nitta nitta 4096 5月 2 16:08 /home/docker/www
起動した Container の様子を調べる。
$ 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
...
Container のログを調べる。
$ 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
ホストOS から、ssh を用いてゲストOS にアクセスする。
$ 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 時点
(ゲストOS上で)ホームディレクトリを調べる。
(ゲストOS上で)
$ pwd ← ホームディレクトリのパスを表示する。
/home/www
$ ls -l ← ホームディレクトリの情報を表示する。
total 4
drwxr-xr-x 2 www www 4096 May 2 07:28 doc ← ホストOSの /home/docker/httpd にマウントされている
(ゲストOS上で) パスワードを変更する
$ passwd
Changing password for www .
Current password: パスワード ← エコーバックされない
New password: 新しいパスワード(長いバージョン) ← エコーバックされない
Retype new password: 新しパスワード ← エコーバックされない
passwd: password updated successfully
(ゲストOS上で) プロセスがどのユーザ権限で動いているか調べる。
$ 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
(ゲストOS上で) シェルを終了する。
$ exit
Connection to localhost closed.
nitta@um580:~/doc/docker$
Container に port forwarding するホストOSのポートを開放する。
ホストOSにより方法は異なるが、
以下はホストOSが Ubuntu 24.04LTS の場合。
$ sudo ufw status
$ sudo ufw allow 21022
$ sudo ufw allow 21080
$ sudo ufw allow 21443