🐋
Dockerでポートを指定して起動する
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
参考
Discussion