あめがえるのITブログ

頑張りすぎない。ほどほどに頑張るブログ。

docker-composeのportsとexposeについて調べてみた

ドキュメントを読む限り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設定しなくても同じ挙動になると思うのであまり意味のない検証になってしまった。。。
まぁこんなのあるかぐらいでいいっか。。(´Д`)