コラム

[Docker]Dockerのポート番号とIPアドレスについて

今回は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アドレスの考え方が分かりました。
当然といえば当然の結果ですが、以外に考えてない所だったので良い検証だったと思います。

続けてお読みください

システム開発というお仕事

この記事をシェアする
  • Facebookアイコン
  • Twitterアイコン
  • LINEアイコン

お問い合わせ ITに関するお悩み不安が少しでもありましたら、
ぜひお気軽にお問い合わせください

お客様のお悩みや不安、課題などを丁寧に、そして誠実にお伺いいたします。

お問い合わせ
お電話でのお問い合わせ 03-5820-1777(平日10:00〜18:00)
よくあるご質問