2018/12/16
今回使用するファイルは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.confnginxは軽量な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