ドキュメントを読む限り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作成
# docker version | grep Version Version: 23.0.1 # vi docker-compse.yaml version: '3' services: web1: image: tomcat ports: - "8080:8080" web2: image: tomcat ports: - "8081:8080"
1-2.コンテナ起動
# docker compose up -d [+] 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.起動確認
# docker ps 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のページが取得できることを確認
# 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-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 – Not Found</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.</p><hr class="line" /><h3>Apache Tomcat/10.1.9</h3></body></html> ※TOPページを何も指定していないので404のエラーが返ってくる。 # curl http://192.168.10.163:8081 <!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:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 – Not Found</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.</p><hr class="line" /><h3>Apache Tomcat/10.1.9</h3></body></html # curl http://192.168.10.163:8082 curl: (7) Failed to connect to 192.168.10.163 port 8082 after 0 ms: Connection refused ※設定していないポートへの接続は404ではなく[Connection refused]となる。
2-2.web1へログインしweb2のページが取得できることを確認
# docker exec -it c9521e00a1c9 /bin/bash 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のページが取得できることを確認
# docker exec -it ca3649dfdfc4 /bin/bash 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# exit #
3.検証用コンテナ再構築
※まずはtomcatサーバを2台構築し、1台をexposeで8080を公開し、もう1台をportsで8081ポートを公開する。
3-1.コンテナを削除
# docker compose down [+] 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修正
# vi docker-compose.yaml version: '3' services: web1: image: tomcat expose: - "8080" web2: image: tomcat ports: - "8081:8080"
3-3.コンテナ起動
# docker compose up -d [+] 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動作確認
# docker ps 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 http://192.168.10.163:8080 curl: (7) Failed to connect to 192.168.10.163 port 8080 after 0 ms: Connection refused # curl http://192.168.10.163:8081 <!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:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 – Not Found</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.</p><hr class="line" /><h3>Apache Tomcat/10.1.9</h3></body></html> ※8080だけ接続できなくなった。
感想
expose設定しなくても同じ挙動になると思うのであまり意味のない検証になってしまった。。。
まぁこんなのあるかぐらいでいいっか。。(´Д`)