こんにちは。今回はDockerの起動とapacheによる疎通確認を行なったあと、外部からのアクセスを受け付けられるようにしてみようと思います。
前回はDocker環境の構築まで行いました。今回は前回からの続きです。
環境
| 項目 | 内容 |
|---|---|
| ホストOS | ubuntu 24.03 LTS |
| デバイス | RaspberryPi 4B |
Dockerの起動
今回はubuntuコンテナを動かしていきます。
# run : コンテナを新規作成
# -it : コンソールに結果を出力 -> コンソール開くよ
# --name : 指定した名前で作成
$ sudo docker run -it --name "docker-01" ubuntu bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
7bdf644cff2e: Pull complete
Digest: sha256:728785b59223d755e3e5c5af178fab1be7031f3522c5ccd7a0b32b80d8248123
Status: Downloaded newer image for ubuntu:latest
root:/#
疎通確認
ipアドレスの確認
【前編】で解説した通り、デフォルトの設定ではbridgeモードになっているので、現在どのようなipを持っているのか調べていきます。
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9583f853b92c ubuntu "bash" 4 minutes ago Up 4 minutes docker-01
# sudo docker inspect [container ID] : 詳細を確認
$ sudo docker inspect 9583f853b92c | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
172.17.0.2を持っているようですね。
パッケージのインストール
今回使用しているosは最小限の機能しか持ってないので、必要なパッケージをインストールしていきます。
root:/# apt update
# ネットワーク系
root:/# apt install -y iproute2 iputils-ping net-tools
# 個人的
root:/# apt install -y nano
| パッケージ名 | 使えるようになるコマンド | 目的 |
|---|---|---|
iproute2 |
ip, tc, devlink, etc. |
ip a |
iputils-ping |
ping, ping6
|
ping |
net-tools |
arp, ifconfig, route, etc. |
なにかと便利 |
疎通確認
# apache を入れる
root:/# apt install -y apache2
# systemctl コマンドを使用したかったが、ないので service コマンドで代用
root@9583f853b92c:/# service apache2 status
* apache2 is not running
root:/# service apache2 start
* Starting Apache httpd web server apache2 *
root:/# service apache2 status
* apache2 is running
# index.html を書き換える
root:/# echo "HelloWorld!" > /var/www/html/index.html
現在こうなっていると思います。

ホストデバイス側からcurlでページが見れるか試しましょう。
$ curl http://172.17.0.2
HelloWorld!
大丈夫そうですね。
serviceコマンドざっくりチートシート
| アクション | 説明 |
|---|---|
status | サービスの状態を表示する |
--status-all | 利用可能なサービスの状態を一覧表示する |
start | サービスを起動する |
stop | サービスを停止する |
restart | サービスを再起動する |
reload | 設定ファイルを再読み込み(再起動なし) |
force-reload | 強制的にreloadする |
try-restart | 実行中なら再起動、止まっているなら何もしない |
外から直接叩けるようにする
次はホストデバイスの外から叩けるようにしたいです。
現在のイメージ
[ホスト]
├── eth0 : 192.168.1.10
└── docker0 : 172.17.0.1(仮想ブリッジ)
└── [コンテナ] : 172.17.0.2
結果のイメージ
[ホスト]
├── eth0 : 192.168.1.10
└── [コンテナ] : 192.168.2.10
着手
まずはコンテナを止める。
$ sudo docker ps
# 現在動いているコンテナのIDを入れる
$ sudo docker stop "CONTAINER ID"
ホストデバイスに二本目のケーブルを挿したらip aコマンドで確認する。
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP>
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP>
inet 192.168.10.10/24 brd 192.168.10.255 scope global eth0
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP>
inet 192.168.1.34/24 metric 600 brd 192.168.1.255 scope global dynamic wlan0
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP>
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
7: enx207bd221e7a4: <BROADCAST,MULTICAST>
link/ether 20:7b:d2:21:e7:a4 brd ff:ff:ff:ff:ff:ff
7:が新たに増やした物理的なインターフェースの名前。
次に仮想的なネットワークを作っていく。パラメータparentにこの名前を入れる。ここではinf0というネットワークを作成する。
$ sudo docker network create -d macvlan --subnet=192.168.10.0/24 -o parent=enx207bd221e7a4 inf0
設定ができたら確認してみる
$ sudo docker network inspect inf0
[
{
"Name": "inf0",
"Id": "bb48283f93c66c3ee3e77886f328be1cad58799b197b9e71021fae6d87890d26",
"Created": "2025-10-06T11:50:04.083554265Z",
"Scope": "local",
"Driver": "macvlan",
"EnableIPv4": true,
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.10.0/24"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {
"parent": "enx207bd221e7a4"
},
"Labels": {}
}
]
ここからネットワークとコンテナを繋げていく。
# 紐付け
$ sudo docker network connect --ip 192.168.10.20 inf0 docker-01
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9583f853b92c ubuntu "bash" 12 hours ago Exited (137) 21 minutes ago docker-01
# status より docker が止まっていることを確認
$ sudo docker start 9583f853b92c
$ sudo docker attach 9583f853b92c
# 反映されたか確認
root:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP>
2: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP>
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
9: eth1@if7: <NO-CARRIER,BROADCAST,MULTICAST,UP>
inet 192.168.10.20/24 brd 192.168.10.255 scope global eth1
確認完了。別のデバイスから確認する。
$ curl http://192.168.10.20
HelloWorld!
ドツボにハマった話
(apacheを別デバイスで確認しようとしていたがうまくいかなかったとき)
あぁ権限を与えるためにコピーして再度作り直す必要が出てきた。
(とこの時は思っていたがそれは大きな間違いだった)
# まずはコピー
$ sudo docker commit 9583f853b92c myapache:withdata
# 権限をつけて新規作成&起動
$ sudo docker run -it --privileged --name "docker-02" myapache:withdata bash
# ネットワークの紐付け
$ sudo docker network connect --ip 192.168.10.30 inf0 docker-02
うまくいかない。現状確認
root:/# ip a
2: eth0@if18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
19: eth1@if10: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default
inet 192.168.10.30/24 brd 192.168.10.255 scope global eth1
stateがLOWERLAYERDOWNになっている。
ホストデバイス側も確認
$ ip link show enx207bd221e7a4
10: enx207bd221e7a4: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 20:7b:d2:21:e7:a4 brd ff:ff:ff:ff:ff:ff
stateがDOWNになっている。これは物理的に落ちているので起動させてあげる。
$ sudo ip link set enx207bd221e7a4 up
$ ip link show enx207bd221e7a4
10: enx207bd221e7a4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 20:7b:d2:21:e7:a4 brd ff:ff:ff:ff:ff:ff
stateがUPになったことがわかる。
(物理層が落ちていたのでいくらやっても疎通が通らないのである。)
