はじめに
私がDocker composeを使ってリバースプロキシを実装するのに苦労したため、その備忘録として残します。また、実験用コンテナのため最小構成で構築されていますので、必要に応じて読み替えてください。
因みにDocker-Composeは勉強し始めて3日なので漏れがあるかも知れませんがあしからず。
本実装の想定図
リバプロのコンテナのみ80:80でフォワーディングを行い、WEB1・WEB2に対しては直接アクセスできないように実装を行う。
本編
今回のフォルダ構造は以下の通りにしています
.
├── docker-compose.yml
├── web1
│ ├── dockerfile
│ └── index.html
├── web2
│ ├── dockerfile
│ └── index.html
└── reverse-proxy
├── dockerfile.proxy
└── nginx.conf
まずプロキシされる側のコンテナの設定を行います。
index.html
は任意のコードを作成してください。
FROM nginx:latest
次にプロキシコンテナの設定を行います。
FROM nginx:latest
# nginx内のconf置き換え
COPY nginx.conf /etc/nginx/
またnginx.conf
は
events {
worker_connections 1024;
}
http {
server {
listen 80;
location / {
root /usr/share/nginx/html;
}
location /web1/ {
proxy_pass http://web1/;
}
location /web2/ {
proxy_pass http://web2/;
}
}
}
必ずロケーション設定は/<dir_name>/
と書くのを忘れないようにしてください。
こうしないとプロキシした際のディレクトリがズレてwebサーバ側のディレクトリ配置が複雑になります。
最後にdocker-compose
を記述します。
version: '3'
services:
web1:
build:
context: ./web1
dockerfile: dockerfile
volumes:
- ./web1:/usr/share/nginx/html
web2:
build:
context: ./web2
dockerfile: Dockerfile
volumes:
- ./web2:/usr/share/nginx/html
reverse-proxy:
build:
context: ./reverse-proxy
dockerfile: dockerfile.proxy
ports:
- 80:80
この様に記述することでリバプロのみフォワーディングを許可しながら、他のコンテナには直接アクセスができないようになります。また、composeファイルを組むことでコンテナが同一のネットワークに入るので、内部の通信をコンテナ名で解決できるようになります。これによりnginx.conf
がコンテナ名で指定することが可能となり、コードの複雑化を防ぐことが可能です。
以上で設定は終了しました。docker compose up
でログも流れるので挙動の確認も可能です。
終わり
今回のコードは一応GitHubにて公開しています。(他のも混ざっています)
必要とあらばご使用ください。
Docker_Container_demos