🐋

Dockerでポートを指定して起動する

2023/12/26に公開

Dockerで888ポートをLISTENするサーバーを起動して、curlで叩いて動作確認したい。期待するポート番号と実際のポート番号とが違って、エラーになっている。

# 正しいポートでサーバーが起動していないのでエラーになる
$ curl localhost:8888
curl: (7) Failed to connect to localhost port 8888: Connection refused

# Dockerfileを確認する
$ cat Dockerfile
...
# 8880ポートをコンテナがリッスンする設定になっている
EXPOSE 80
...

1. docker containerコマンドの-pオプションでポートを指定するパターン

ただしこの場合、シンプルに実行するとDockerコンテナの外からはアクセスができない(Dockerコンテナの外からcurlで叩いたりブラウザ確認ができない)。ホストポートとコンテナポートを別に指定する場合は、--network=hostオプションが必要になる。

# -pオプションでポートを指定する(ホストポート:コンテナポート)
$ docker container run --name app -it --rm -p 8888:80 app_image

# エラーになる
$ curl localhost:8888
curl: (56) Recv failure: Connection reset by peer

# ホストポートとコンテナポートを別に指定する場合は、--network=hostオプションが必要
$ docker container run --name app -it --rm -p 8888:80 --network=host app_image

$ curl localhost:8888
Hello World!

2-1. docker container runを使ってコンテナの作成と起動を同時に行うパターン

$ docker container run --name app_run -p 8888:8888 app_image

# 別セッションから動作チェック
$ curl localhost:8888
Hello World!

$ docker container stop app_run
$ docker container rm app_run

2-2. docker container runを使ってコンテナの作成と起動を同時に行う&停止後にコンテナを削除するパターン

$ docker container run -it --rm --name app_run -p 8888:8888 app_image

# 別セッションから動作チェック
$ curl localhost:8888
Hello World!

2-3. docker container createでコンテナを作成し、docker container startで起動するパターン

# コンテナを作成する
$ docker container create --name app_create -p 8888:8888 app_image

# コンテナを起動する
$ docker container start app_create
app_create

# 動作チェック
$ curl localhost:8888
Hello World!

# 事後処理
$ docker container stop app_run

参考

https://maku77.github.io/p/y8cfimp/

Discussion