获取Docker镜像
我们使用官方最新稳定版的镜像 golang:latest, 获取镜像前先得确保你电脑上运行了 Docker 客户端,没有的去官网下载一下吧这里就不多说了。
下载dockerHub上的镜像直接使用命令:
docker pull golang
下载完镜像后用镜像运行一个容器:
运行完上面的命令后我们就进入了运行的容器中,运行 go version 查看以下 go的版本:
root@965425c5bdcf:/go# go version
go version go1.13.6 linux/amd64
root@965425c5bdcf:/go#
在容器中运行Go项目
我们使用《深入学习用Go编写HTTP服务器》中最后写的支持优雅关停服务的 HTTPServer的源码,将它放到 Docker容器里伺服宿主机的请求。HTTP Server的源码如下,想探究代码具体怎么实现的看链接里的文章就好了。
package main
import (
"context"
"fmt"
"log"
"os"
"os/signal"
"syscall"
)
func main() {
mux.Handle("/", &helloHandler{})
Addr: ":8080",
Handler: mux,
}
// 创建系统信号接收器
done := make(chan os.Signal)
signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-done
if err := server.Shutdown(context.Background()); err != nil {
log.Fatal("Shutdown server:", err)
}
}()
log.Println("Starting HTTP server...")
err := server.ListenAndServe()
if err != nil {
log.Print("Server closed under request")
} else {
log.Fatal("Server closed unexpected")
}
}
}
type helloHandler struct{}
fmt.Fprintf(w, "Hello World")
}
接下来就要把这个代码放到容器里去运行了,切到代码目录里执行如下命令:
-p 8000:8080
golang
-p指定主机和容器的端口映射,因为代码里 HTTP服务是监听 8080端口的,所以我们将主机的 8000端口和容器的 8080端口做了映射。
用 docker-compose 管理容器
通过上面的内容我们已经用 Docker构建好了一个 Go的开发环境,不过每次打那堆命令,还要进容器执行 go命令启动程序太费事了,我们用 docker-compose把上面那些流程自动化一下。
在项目代码根目录创建docker-compose.yml:
version: '3'
services:
app:
image: golang:latest
volumes:
ports:
- "8000:8080"
如果你们项目里不允许就找个目录放这个文件,我自己就是单独有个目录里面放了好几个项目的 Docker配置文件,有 PHP项目的也有 Go项目的。
上面的编排文件里只定义了一个叫 app的服务,其他的也很容易理解我就不说了,唯一要注意的一点就是如果 yml文件在项目外 volumes里的配置就换成绝对路径不要用 $PWD了
接下来启动 docker-compose:
docker-compose up -d
如果启动不成功先不要在 daemon模式下运行把 -d去掉,就能看到具体什么错误,等调试正常了再后台启动。
代码有修改后,需要重新编译项目,针对我们的容器执行下面的命令即可
docker-compose restart
想要进入运行的容器中执行操作使用命令:
docker exec -it bash
给我们创建的 app发送 go test命令让它在容器内执行:
docker-composeexecapp gotest
最近想尝试把老项目换成用 go mod管理,项目还是在用 go1.12所以我就先用 Docker搭环境,容器隔离的环境怎么瞎折腾也没事。今天做的这个开发环境还是很简单的,没有用 Dockerfile自己创建镜像, docker-compose配置文件里的设置也很简单,后面用着不顺手有更新了我再推送。下面的两篇老文章对 Docker镜像和 docker-compose讲的都比较深入,例子也多,感兴趣的可以看看。
教你如何做出想要的PHPDocker镜像
用Docker搭建Laravel开发环境
哈哈~各位小伙伴关注我后私信【Java】就可以免费领取哒!