dockerコンテナ起動時にポートを指定する引数 -p と --expose の違いは?
結論
違いは指定されたポートを晒す先
-p (--publish):ホストに晒してホスト側からの接続を許可する
Mysqlのコンテナを立てて各種DBツールから localhost:3306
として繋ぎたい場合、
docker run ~~ -p 3306:3306 ~~ mysql
と公開するポートを指定する必要がある。
このとき、ホスト側ですでに3306
ポートが利用中の場合は起動に失敗する。
そんなときは~~ -p 3316:3306 ~~
などにしてホスト側のポート番号を変えてあげればよい。
--expose:同一dockerネットワーク内に晒して、同一ネットワーク内からの接続を許可する
同一dockerネットワーク内に存在するPHP-FPMコンテナから3306ポートを使ってMySQLに接続したい場合に利用する。
※もっとも、MySQLなどはDockerfile
内でEXPOSE
されているため、指定は不要
→ https://github.com/docker-library/mysql/blob/bc6e37a2bed792b1c4fc6ab1ec3ce316e6a5f061/8.0/Dockerfile#L84
感想
気になって調べたけど、docker run のタイミングで --expose
指定するケースが思い浮かばなかった。
(大体、Dockerfile内でEXPOSE
が書かれているため)
あと、MySQLのDockerイメージは33060
ポートも指定してたのね、知らなかった。
→ (さっきと同じリンク)https://github.com/docker-library/mysql/blob/bc6e37a2bed792b1c4fc6ab1ec3ce316e6a5f061/8.0/Dockerfile#L84