Next.js Logo

Dockerネットワーク入門:コンテナ間通信を実現する

thumbnail

※この記事で使用しているリソースを一括でダウンロードすることができます。

今回はpostgresを入れたコンテナとpythonを入れたコンテナを使用して、コンテナ間通信を実現する方法について解説していきます。

結論から先に言うとコンテナ間で通信を行うためには、通信を行うコンテナを同一のネットワークに追加する必要があります。

前提

Dockerにおけるポートフォアーディング設定については理解していること。

リソースの準備

postgresのコンテナpythonのコンテナについて準備していきましょう。ディレクトリ構成は以下のようになります。

ディレクトリ構成

. ├── postgres │ └── Dockerfile └── python ├── Dockerfile └── get_user.py

postgresのコンテナ用のDockerfile

postgresのイメージを作成するためににDockerfileを作成します。

docker-entrypoint-initdb.dディレクトリにsqlファイルを入れておくことで、コンテナ作成時にテーブル作成や初期データの投入などを行うことができます。これを利用してpostgresコンテナ作成時にusersテーブルとadminユーザのデータを入るようにしておきます。

Dockerfile

FROM postgres:17.0 ENV POSTGRES_PASSWORD=postgres # 初期化用SQLスクリプトを作成 RUN echo "CREATE TABLE users (id SERIAL PRIMARY KEY, username TEXT NOT NULL);" \ > /docker-entrypoint-initdb.d/init.sql \ && echo "INSERT INTO users (username) VALUES ('admin');" \ >> /docker-entrypoint-initdb.d/init.sql

pythonのコンテナ用のDockerfile

pythonのイメージを作成するためににDockerfileを作成します。

postgresにアクセスできるようにライブラリpsycopg2-binaryをpipインストールしておきます。またの後の手順で作成するget_user.pyをコピーするようにしておきます。

Dockerfile

FROM python:3.11.10 RUN pip install psycopg2-binary COPY ./get_user.py /

pythonコードの準備

pythonコンテナからpostgresに接続できることを確認するためにpythonコードを書いておきます。

内容はpostgresに接続してユーザーテーブルを検索した結果をprintで出力するようなコードにしています。

ここで重要なことはDockerのネットワーク上でコンテナ間で通信を行う場合のホストはコンテナ名になることです。(後のdocker runでpostgresのコンテナ名をdbとするので「host="db"」としています。)

get_user.py

import psycopg2 try: # `with`で接続を管理 with psycopg2.connect(host="db", database="postgres", user="postgres", password="postgres", port=5432) as connection: # `with`でカーソルを管理 with connection.cursor() as cursor: # SQLクエリを実行 query = "SELECT * FROM users;" cursor.execute(query) # 結果を取得して処理 rows = cursor.fetchall() for row in rows: print(row) except psycopg2.Error as e: print("データベース操作中にエラーが発生しました:", e)

コンテナをビルド

postgresイメージとpythonイメージをビルドします。

※postgresコンテナのビルド時に「ENVにパスワードを記載しない」とwarningが出ますが今回は手順削減のためにENVに記載していることを理解してください。

ターミナル

docker build ./postgres -t postgres

postgresイメージをビルド

ターミナル

docker build ./python -t python

pythonイメージをビルド

ネットワークを作成する

ここで本記事のタイトルにもあるネットワーク設定をしていきます。network createでネットワークを作成することができます。docker runするときにこのネットワークに追加するようなイメージになります。

ターミナル

docker network create simple-network

ネットワークを作成

コンテナ起動

オプションの解説-postgresコンテナ

ターミナル

docker run --name db -d --rm --net=simple-network -p 5432:5432 postgres

オプションの解説-postgresコンテナ

ターミナル

docker run --name python -d --rm --net=simple-network -it python

コンテナ起動

pythonからpostgresに接続する

pythonコンテナにshellをアタッチしてpythonファイル(get_user.py)を実行します。

pythonコンテナshell

python ./get_user.py

pythonからpostgresに接続する

最後に

今回はネットワークにコンテナを追加し、コンテナ間で通信できるようにしてみました。開発で使っていくイメージがついてきたのではないでしょうか? また、今回はネットワーク作成やコンテナ起動を個別に行っていきましたが、docker-composeというものを使用するとビルドからコンテナ起動までを1コマンドで実施することができます。今後docker-composeについても記事にしていきます!

今回の記事が役に立った、ほかにも記事が見たいという方は最新情報を公式Xで配信しているのでフォローお願いします!