2018/12/16

docker-composeでnginxのリバースプロキシを使ったWebサーバを作る

今回使用するファイルはGitHubに置いてあります

https://github.com/minami14/docker-tutorial

環境


まずはgoで文字を出力するだけのWebサーバを作ってstatic linkでgo buildします

CGO_ENABLED=0 go build でstatic linkになります

今回は出力する文字が違うだけの同じWebサーバを2つ作ります

app1.go

package main

import (
	"fmt"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "app1")
}

func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe(":9001", nil)
}

2つ目のWebサーバはFprintfの文字列とListenAndServeのポートだけ適当に変えればokです。

2つ目のWebサーバで出力する文字列とポートはそれぞれapp2, 9002として進めます

ビルド後の実行ファイル名はそれぞれapp1, app2としました


ディレクトリ構造は以下の通りです

.
├── docker-compose.yml
├── nginx
│   ├── Dockerfile
│   └── nginx.conf
├── web1
│   ├── Dockerfile
│   └── app1
└── web2
    ├── Dockerfile
    └── app2

次にDockerfileを作ります

nginx/Dockerfile

FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
nginxは軽量なalpineベースのimageを使用します

web1/Dockerfile

FROM scratch
COPY app1 /app1
ENTRYPOINT ["/app1"]

同様にweb2のDockerfileも作ります。app1をapp2に変えるだけです

次にnginxの設定ファイルを作ります

nginx/nginx.conf

user nginx;
worker_processes auto;

events { worker_connections 1024; }

http {
        sendfile on;

        upstream web1_servers {
                server web1:9001;
        }

        upstream web2_servers {
                server web2:9002;
        }

        server {
                listen 80;

                location /web1 {
                        proxy_pass      http://web1_servers;
                }

                location /web2 {
                        proxy_pass      http://web2_servers;
                }
        }
}

localhost/web1でapp1が、localhost/web2でapp2が表示されるように設定しました

最後にdocker-compose.ymlを作ります

docker-compose.yml

version: '3'

services:
        web1:
                build: ./web1
                expose:
                        - "9001"
        web2:
                build: ./web2
                expose:
                        - "9002"
        proxy:
                build: ./nginx
                ports:
                        - "80:80"

最後にdocker-compose upで2つのWebサーバとnginxが起動し、localhost/web1でapp1が、localhost/web2でapp2が表示されます

$ curl localhost/web1
app1

$ curl localhost/web2
app2

参考資料

Docker/Kubernetes 実践コンテナ開発入門

nginx実践ガイド