ドキュメントを読む限りportsもexposeもホスト上にコンテナへの接続ポートを公開するという役割を持っており、両者区別がよくわからなかったので調べてみた。
docker-compose portsとは
Dockerコンテナ内のサービスがホストマシンに公開するポートを定義するための設定です。
docker-compose exposeとは
EXPOSE 命令だけは、実際にはポートを 公開publish しません。これは、どのポートを公開する意図なのかという、イメージの作者とコンテナ実行者の両者に対し、ある種のドキュメントとして機能します。コンテナの実行時に実際にポートを公開するには、 docker run で -p フラグを使い、公開用のポートと割り当てる( マップmap する)ポートを指定します
exposeは実際は公開せず、[ここを公開して使ってね]と言いたいだけってことかな。
とりあえずいろいろ触ってどのようになるか見てみます。( ̄д ̄;)
やること
docker composeのportsとexposeでそれぞれ構築し、curlで接続を行い、挙動の違いを調べる。
環境
Dockerホスト(192.168.10.163)
・コンテナ(Web1)
・コンテナ(Web2)
実践!
1.検証用コンテナ構築
※まずはtomcatサーバを2台構築し、ホストに8080と8081ポートを公開する。
1-1.docker-compose.yaml作成
Version: 23.0.1
version: '3'
services:
web1:
image: tomcat
ports:
- "8080:8080"
web2:
image: tomcat
ports:
- "8081:8080"
1-2.コンテナ起動
[+] Building 0.0s (0/0)
[+] Running 1/0
[+] Running 1/3cat-sample_default Created 0.0s
[+] Running 2/3cat-sample_default Created 0.0s
✔ Network tomcat-sample_default Created 0.0s[+] Running 3/3mcat-sample-web2-1 Starting 0.2s
✔ Network tomcat-sample_default Created 0.0s ✔ Container tomcat-sample-web1-1 Started 0.2s
✔ Container tomcat-sample-web2-1 Started 0.3s
✔ Container tomcat-sample-web1-1 Started 0.2
1-3.起動確認
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c9521e00a1c9 tomcat "catalina.sh run" 4 seconds ago Up 2 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp tomcat-sample-web1-1
ca3649dfdfc4 tomcat "catalina.sh run" 4 seconds ago Up 2 seconds 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp tomcat-sample-web2-1
2.ports動作確認
2-1.ホストからweb1、web2のページが取得できることを確認
<!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:
※TOPページを何も指定していないので404のエラーが返ってくる。
<!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:
curl: (7) Failed to connect to 192.168.10.163 port 8082 after 0 ms: Connection refused
※設定していないポートへの接続は404ではなく[Connection refused]となる。
2-2.web1へログインしweb2のページが取得できることを確認
root@c9521e00a1c9:/usr/local/tomcat# curl http://192.168.10.163:8081
<!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title>
・・・
※端折ってますが取得できてますね。
root@c9521e00a1c9:/usr/local/tomcat# exit
2-3.web2へログインしweb1のページが取得できることを確認
root@ca3649dfdfc4:/usr/local/tomcat# curl http://192.168.10.163:8080
<!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-
※こちらも同様に取得できている。
root@ca3649dfdfc4:/usr/local/tomcat
3.検証用コンテナ再構築
※まずはtomcatサーバを2台構築し、1台をexposeで8080を公開し、もう1台をportsで8081ポートを公開する。
3-1.コンテナを削除
[+] Running 1/2
[+] Running 2/2omcat-sample-web1-1 Removed 0.3s
✔ Container tomcat-sample-web1-1 Removed 0.3s[+] Running 2/3mcat-sample-web2-1 Stopping 0.3s
✔ Container tomcat-sample-web1-1 Removed 0.3s[+] Running 2/3
✔ Container tomcat-sample-web1-1 Removed 0.3s[+] Running 2/3
✔ Container tomcat-sample-web1-1 Removed 0.3s[+] Running 2/3
✔ Container tomcat-sample-web1-1 Removed 0.3s[+] Running 3/3
✔ Container tomcat-sample-web1-1 Removed 0.3s
✔ Container tomcat-sample-web2-1 Removed 0.4s
✔ Network tomcat-sample_default Removed 0.4s
3-2.docker-compose.yaml修正
version: '3'
services:
web1:
image: tomcat
expose:
- "8080"
web2:
image: tomcat
ports:
- "8081:8080"
3-3.コンテナ起動
[+] Building 0.0s (0/0)
[+] Running 1/0
[+] Running 1/3cat-sample_default Created 0.1s
[+] Running 1/3cat-sample_default Created 0.1s
[+] Running 1/3cat-sample_default Created 0.1s
[+] Running 3/3cat-sample_default Created 0.1s
✔ Network tomcat-sample_default Created 0.1s ⠿ Container tomcat-sample-web1-1 Starting 0.3s
✔ Container tomcat-sample-web1-1 Started 0.3s
✔ Container tomcat-sample-web2-1 Started 0.3s
4.expose動作確認
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd8bc24569e1 tomcat "catalina.sh run" 2 minutes ago Up 2 minutes 8080/tcp tomcat-sample-web1-1
51dd32d87712 tomcat "catalina.sh run" 2 minutes ago Up 2 minutes 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp tomcat-sample-web2-1
curl: (7) Failed to connect to 192.168.10.163 port 8080 after 0 ms: Connection refused
<!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:
※8080だけ接続できなくなった。
感想
expose設定しなくても同じ挙動になると思うのであまり意味のない検証になってしまった。。。
まぁこんなのあるかぐらいでいいっか。。(´Д`)