Dockerネットワーク入門:コンテナ間通信を実現する
※この記事で使用しているリソースを一括でダウンロードすることができます。
今回はpostgresを入れたコンテナとpythonを入れたコンテナを使用して、コンテナ間通信を実現する方法について解説していきます。
結論から先に言うとコンテナ間で通信を行うためには、通信を行うコンテナを同一のネットワークに追加する必要があります。
前提
Dockerにおけるポートフォアーディング設定については理解していること。
リソースの準備
postgresのコンテナとpythonのコンテナについて準備していきましょう。ディレクトリ構成は以下のようになります。
ディレクトリ構成. ├── postgres │ └── Dockerfile └── python ├── Dockerfile └── get_user.py
postgresのコンテナ用のDockerfile
postgresのイメージを作成するためににDockerfileを作成します。
docker-entrypoint-initdb.dディレクトリにsqlファイルを入れておくことで、コンテナ作成時にテーブル作成や初期データの投入などを行うことができます。これを利用してpostgresコンテナ作成時にusersテーブルとadminユーザのデータを入るようにしておきます。
DockerfileFROM 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をコピーするようにしておきます。
DockerfileFROM 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.pyimport 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
ターミナルdocker build ./python -t python
ネットワークを作成する
ここで本記事のタイトルにもあるネットワーク設定をしていきます。network createでネットワークを作成することができます。docker runするときにこのネットワークに追加するようなイメージになります。
ターミナルdocker network create simple-network
コンテナ起動
オプションの解説-postgresコンテナ
- --name(コンテナ名) : db
- -d : バックグラウンドで起動
- --rm : コンテナ停止時に削除
- ---net=simple-network : ネットワーク「simple-network」に所属させる設定
- -p : ポートフォアーディング設定
- postgres : イメージ名
ターミナルdocker run --name db -d --rm --net=simple-network -p 5432:5432 postgres
オプションの解説-postgresコンテナ
- --name(コンテナ名) : python
- -d : バックグラウンドで起動
- --rm : コンテナ停止時に削除
- ---net=simple-network : ネットワーク「simple-network」に所属させる設定
- -it : コンテナ内でシェルを操作できる環境を作る(-i -tの組み合わせになるのですが、詳しく書くと長くなるので割愛します)
- python : イメージ名
ターミナルdocker run --name python -d --rm --net=simple-network -it python
pythonからpostgresに接続する
pythonコンテナにshellをアタッチしてpythonファイル(get_user.py)を実行します。
pythonコンテナshellpython ./get_user.py
最後に
今回はネットワークにコンテナを追加し、コンテナ間で通信できるようにしてみました。開発で使っていくイメージがついてきたのではないでしょうか? また、今回はネットワーク作成やコンテナ起動を個別に行っていきましたが、docker-composeというものを使用するとビルドからコンテナ起動までを1コマンドで実施することができます。今後docker-composeについても記事にしていきます!
今回の記事が役に立った、ほかにも記事が見たいという方は最新情報を公式Xで配信しているのでフォローお願いします!