先にバックエンドを起動して、その後でフロントエンドを起動する必要がある時、ネットワークの共有に思ったより時間をかけてしまったので備忘録。
やりかた
以下をすべて同一フォルダに配置した。
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オプションをつけないと、内部のコードを変更した時に再ビルドされない。