- 03-5820-1777平日10:00〜18:00
- お問い合わせ
今回はDockerコンテナとローカルホストでポート番号とIPアドレスがどのような関連付けになっているのか調査していこうと思います。
ポート番号について
Dockerで使用するポート番号はローカルホスト側のポート番号とDocker内で使用するポート番号の2つを設定する必要があります。
これにより、ローカルホストからのアクセス、Dockerコンテナ内からのアクセスを切り分けています。
services:
db:
image: postgres
container_name: db
ports:
- 5432:5432 ①
environment:
- POSTGRES_DB=${DB_NAME:-postgres}
- POSTGRES_USER=${USER_NAME:-postgres}
- POSTGRES_PASSWORD=${DB_PASSWORD:-password}
volumes:
- pgdata:/var/lib/postgresql/data
- ./db/init:/docker-entrypoint-initdb.d
①の部分の左側にローカルホストのポート番号、右側にDocker内でのポート番号を指定します。
ローカルホストのポート番号が他のアプリケーションやDockerコンテナで既に使用されている場合、左側のポート番号に指定する事は出来ません。
右側のポート番号(Docker内でのポート番号)の使用可否について以下の表に記述します。
Dockerポート番号 | Dockerサービス | 使用可否 |
---|---|---|
未使用 | 同一 | 使用可 |
使用済 | 同一 | 使用不可 |
未使用 | 別 | 使用可 |
使用済 | 別 | 使用可 |
同一サービスであれば重複使用不可、別サービスであれば使用可という当然といえば当然の話ですね。
IPアドレスについて
IPアドレスへの接続の可否を以下の表に記述します。
接続元 | 接続先 | 接続可否 |
---|---|---|
ローカルホスト | Dockerコンテナ | 接続不可(IP直接指定では不可) |
Dockerコンテナ | Dockerコンテナ | 接続可 |
Dockerコンテナ(App内) | Dockerコンテナ | 接続不可 |
Dockerコンテナ(App内) | Dockerコンテナ(同一App内) | 接続可 |
Dockerコンテナ(App内) | Dockerコンテナ(別App内) | 接続不可 |
Dockerコンテナ | ローカルホスト | 接続可 |
Dockerコンテナ(App内) | ローカルホスト | 接続可 |
ローカルホストからDockerコンテナのIPへは接続不可となっており、Dockerコンテナに関しては、App未所属のコンテナ同士は接続可、App所属のコンテナは同一のApp内のみ接続可、ローカルホストへの接続は全てのコンテナが接続可になっています。
以下がローカルホスト、Docker内のイメージ図になります。
ローカルホストからコンテナ内へのIP指定での接続は不可ですが、ローカルホストとポート番号の組み合わせで接続する事が可能です。
ローカルホストからDockerコンテナに接続する方法
Dockerファイルのポート番号が8081:8080になっているサービスがWebサーバであった場合、ブラウザからlocalhost:8081を指定して当該のサービスに接続する事が可能です。
ローカルホスト、Dockerからの接続例
Dockerコンテナ上のPostgreSqlへAdminerを使用してローカルホストからの接続、Dockerコンテナからの接続、それぞれの接続のを実際に試してみようと思います。
ローカル環境の準備
ローカル環境にwebサーバを立ち上げ、Adminerのphpファイルを配置します。
簡易的なサーバ立ち上げには「php -S {hostname}:{port} -t {docbase}」を使用すると便利です。
ポート番号8080で起動します。
Docker環境準備
docker-compose.ymllを用意し、「docker-compose up -d」コマンドでコンテナ作成
version: '3.8'
volumes:
pgdata:
networks:
default:
services:
db:
image: postgres
container_name: db
ports:
- 5431:5432
environment:
- POSTGRES_DB=${DB_NAME:-postgres}
- POSTGRES_USER=${USER_NAME:-postgres}
- POSTGRES_PASSWORD=${DB_PASSWORD:-password}
volumes:
- pgdata:/var/lib/postgresql/data
- ./db/init:/docker-entrypoint-initdb.d
adminer:
image: adminer
container_name: adminer
ports:
- 8081:8080
restart: always
depends_on:
- db
environment:
- ADMINER_SERVER=db
- ADMINER_DRIVER=pgsql
- ADMINER_DB=${DB_NAME:-db}
- ADMINER_USERNAME=${DB_USER:-postgres}
- ADMINER_PASSWORD=${DB_PASSWORD:-postgres}
- ADMINER_NAME=ADMINER for PostgreSQL DB
DBへアクセスしてみる
・ローカルからアクセス
ローカルのAdminerからDockerコンテナのDBへアクセス
ログイン画面のサーバの箇所にローカルサーバのIPとdocker-compose.ymlのdbのポート番号の左側のポート番号を指定します。
・Dockerからのアクセス
DockerコンテナのAdminerからDockerコンテナのDBへアクセス
ログイン画面のサーバの箇所にDBコンテナのIPとdocker-compose.ymlのdbのポート番号の右側のポート番号を指定します。ローカルと同一の内容が表示されているので、同一DBにアクセスしている事が分かります。
以上です。今回の検証でDockerのポート番号とIPアドレスの考え方が分かりました。
当然といえば当然の結果ですが、以外に考えてない所だったので良い検証だったと思います。