先にバックエンドを起動して、その後でフロントエンドを起動する必要がある時、ネットワークの共有に思ったより時間をかけてしまったので備忘録。

やりかた

以下をすべて同一フォルダに配置した。

insider.yml

先に起動するyaml

version: "3"
services:
  host:
    image: python:3.11.0a3-alpine3.15
    container_name: host
    hostname: host
    volumes:
      - ./:/app
    ports:
      - 5000:5000
    entrypoint: ["sh", "/app/host_init.sh"]

  client_insider:
    image: python:3.11.0a3-alpine3.15
    container_name: client_insider
    tty: true

networks:
  default:
    driver: bridge
    name: common_network

5000番ポートを開放したhostと、検証用のclient_outsiderを定義

outsider.yml

あとで起動するyml

version: "3"

services:
  client_outsider:
    image: python:3.11.0a3-alpine3.15
    container_name: client_outsider
    tty: true

networks:
  default:
    external: true
    name: common_network

検証用のclient_outsiderを定義

重要なのがnetworksで、external: trueを設定している。
これによって外部で作成されたネットワークに相乗りできるようになる

api.py

ただの実験用コード。hostコンテナで動く。5000ポートで待ち受け、hello worldを返す。

from fastapi import FastAPI
import uvicorn

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}

if __name__ == "__main__":
    uvicorn.run("api:app", host="0.0.0.0", port=5000, log_level="info")

host_init.sh

ただの実験用コード。hostコンテナで動く

pip install fastapi uvicorn
python /app/api.py

結果

client_insiderコンテナ

当たり前だけどきちんと取得できる。

C:\Users\aaa>docker exec -it client_insider /bin/sh
/ # apk add curl
fetch https://dl-cdn.alpinelinux.org/alpine/v3.15/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.15/community/x86_64/APKINDEX.tar.gz
(1/4) Installing brotli-libs (1.0.9-r5)
(2/4) Installing nghttp2-libs (1.46.0-r0)
(3/4) Installing libcurl (7.80.0-r0)
(4/4) Installing curl (7.80.0-r0)
Executing busybox-1.34.1-r3.trigger
OK: 16 MiB in 40 packages
/ # curl http://host:5000
{"Hello":"World"}

client_outsiderコンテナ

コチラも同様。

C:\Users\aaa>docker exec -it client_outsider /bin/sh
/ # apk add curl
fetch https://dl-cdn.alpinelinux.org/alpine/v3.15/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.15/community/x86_64/APKINDEX.tar.gz
(1/4) Installing brotli-libs (1.0.9-r5)
(2/4) Installing nghttp2-libs (1.46.0-r0)
(3/4) Installing libcurl (7.80.0-r0)
(4/4) Installing curl (7.80.0-r0)
Executing busybox-1.34.1-r3.trigger
OK: 16 MiB in 40 packages
/ # curl http://host:5000
{"Hello":"World"}

また、docker-compose up –buildとbuildオプションをつけないと、内部のコードを変更した時に再ビルドされない。