使用Docker、Golang和Nginx构建具有反向代理和热重载的开发环境

首先

你好,我叫yoship1639,主要玩3D游戏和游戏。

我以前對網絡知識一無所知,但最近(被迫)開始接觸網絡領域,並且處於構建使用Docker+golang+Nginx的網絡服務的情況下。因此,我想分享一下如何在Docker上構建Nginx+golang環境的方法,包括一些備忘錄。

由于希望建立一个尽可能简约的环境,因此我只需要在配置中描述Nginx的反向代理部分,以及用realize实现的热重载功能。

我暂且是这种环境:
– Win10 64位家庭版
– VSCode 1.34.0
– Virtualbox 5.2.8 r121009
– Docker 18.03.0-ce

建立

这次要创建的项目名称将简单明了地命名为「docker_go_nginx」。
它的存放位置是在go/src/github.com/docker_go_nginx。
文件夹结构如下所示。

docker_go_nginx
 ├─ app
 │  ├─ main.go
 │  └─ .realize.yml
 ├─ nginx
 │  ├─ Dockerfile
 │  └─ nginx.conf
 ├─ docker-compose.yml
 └─ Dockerfile

我們將分別觀察每一個事物。

docker-compose.yml 的意思是Docker Compose配置文件。

docker-compose文件如下。

version: "3"

services:
  golang:
    tty: true
    build: "."
    volumes:
      - ./app:/go/src/github.com/docker_go_nginx/app
    ports:
      - "3000"
    command: bash -c "cd app && realize start --server"
  nginx:
    build: ./nginx
    ports:
      - "80:80"
    depends_on:
      - "golang"

由于golang容器的端口通过Nginx代理来转发,因此将端口指定为3000而不是80。相反,将Nginx容器的端口指定为80。此外,在golang容器启动时,将启动热重载(realize start –server)。这将自动运行main.go。

因为Nginx将成为golang的反向代理,所以需要指定depends_on: – “golang”。

Dockerfile(适用于Go语言)

FROM golang:latest

RUN go get -u github.com/oxequa/realize && \
    go get -u github.com/gorilla/mux

WORKDIR /go/src/github.com/docker_go_nginx/

使用golang获取最新的镜像,并使用realize包进行go get。
指定WORKDIR /go/src/github.com/docker_go_nginx作为工作目录,为了方便以后进入容器的shell时不需要每次都cd。

Dockerfile(适用于nginx)

FROM nginx:latest
COPY ./nginx.conf /etc/nginx/nginx.conf

由於我們希望應用主機端的nginx.conf設定,我們將把它複製到容器端的/etc/nginx/nginx.conf中。

nginx配置文件

worker_processes auto;

events {
    worker_connections  1024;
}

http {
    server {
         listen       80;
         location / {
             proxy_http_version 1.1;
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection "upgrade";
             proxy_set_header Host $host;

             proxy_pass http://golang:3000;
         }
    }
}

以下为非常简单的nginx.conf配置文件。当监听到80端口时,将请求转发到http://golang:3000作为反向代理。通过这样设置,我们可以通过Nginx访问web应用(golang)。另外,请确保在http://golang:3000中的”golang”与服务名称相同,否则将无法正常工作。

主要.go

package main

import (
    "fmt"
    "net/http"

    "github.com/gorilla/mux"
)

func rootHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Println("Hello world!")
}

func main() {

    r := mux.NewRouter()
    r.HandleFunc("/", rootHandler)

    http.Handle("/", r)
    http.ListenAndServe(":3000", nil)
}

关于main.go没有什么特别要说的。
它只需要监听3000端口,并在有根访问时仅返回”Hello world!”。

.realize.yaml 文件

settings:
  legacy:
    force: true
    interval: 0s
server:
  status: true
  open: false
  port: 5002
  host: localhost
schema:
- name: app
  path: .
  commands: 
    run:
      status: true
  watcher:
    extensions:
    - go
    paths:
    - /
    ignored_paths:
    - .git
    - .realize
    - vendor

我在稍微修改自动生成的代码后,让它能够在容器启动时自动执行。

执行

当文件集齐后,就执行docker-compose up操作。

$ cd docker_go_nginx
$ docker-compose up
Starting dockergonginx_golang_1 ... done
Starting dockergonginx_nginx_1  ... done
Attaching to dockergonginx_golang_1, dockergonginx_nginx_1
golang_1  | [04:08:01][APP] : Watching 1 file/s 0 folder/s
golang_1  | [04:08:01][APP] : Install started
golang_1  | [04:08:01][REALIZE] : Started on localhost:5002
golang_1  | ⇨ http server started on 127.0.0.1:5002
golang_1  | [04:08:02][APP] : Install completed in 1.330 s
golang_1  | [04:08:02][APP] : Running..
golang_1  | [04:08:44][APP] : Hello world!

由于`realize`工具的帮助,`main.go`文件自动运行,然后只需在浏览器中访问`192.168.99.100`,如果出现空白页面,说明成功了。同时,还会输出”Hello world”。

我们现在已经建立了一个支持反向代理和热重载的开发环境,所以剩下的就是随便搞了,随心所欲地去开发。

总结

我使用Docker搭建了一个最小限的开发环境,使用Nginx和golang作为反向代理和热加载功能。当开启热加载后,无需重新编译,可以非常顺利地进行golang开发,非常推荐使用。

由于我是Web初学者,如果有错误请评论告诉我_(:3」∠)_

bannerAds