使用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」∠)_