目录
文章目录[隐藏]
前言
go项目想运行在docker中,需要先制作镜像。主要有两种方式!
1、依赖 golang 镜像 (大概100M左右),go项目在构建镜像时编译。
2、依赖 alpine 镜像 (大概5M左右),先本地交叉编译go项目的Linux可执行文件,再把这个可执行文件打包到docker。(推荐)
创建hello.go
1 2 3 4 5 6 7 8 9 10 |
//hello.go package main import ( "fmt" ) func main() { fmt.Println("Hello, World!") } |
依赖 golang 镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
FROM golang:1.16 # 为我们的镜像设置必要的环境变量 ENV GO111MODULE=on \ CGO_ENABLED=0 \ GOOS=linux \ GOARCH=amd64 \ GOPROXY="https://goproxy.cn,direct" # 移动到工作目录:/home/www/goWebBlog 这个目录 是你项目代码 放在linux上 # 这是我的代码跟目录 # 你们得修改成自己的 WORKDIR /home/www/goWebBlog # 将代码复制到容器中 COPY . . # 将我们的代码编译成二进制可执行文件 可执行文件名为 app RUN go build -o app . # 移动到用于存放生成的二进制文件的 /dist 目录 WORKDIR /dist # 将二进制文件从 /home/www/goWebBlog 目录复制到这里 RUN cp /home/www/goWebBlog/app . # 在容器目录 /dist 创建一个目录 为src RUN mkdir src . # 在容器目录 把宿主机的静态资源文件 拷贝到 容器/dist/src目录下 # 这个步骤可以略 因为项目是引用到了 外部静态资源 RUN cp -r /home/www/goWebBlog/src/static ./src/ # 声明服务端口 EXPOSE 9090 # 启动容器时运行的命令 CMD ["/dist/app"] |
依赖 alpine 镜像
交叉编译go项目
在windows下编译Linux可执行文件命令:
1 2 3 4 |
> set CGO_ENABLED=0 // 关闭CGO > set GOOS=linux // 编译为linux可执行文件 > set GOARCH=amd64 // 64位,如果镜像系统是32位,则GOARCH=386 > go build main.go // 编译 |
编写Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# 表示依赖 alipine 最新版 FROM alpine:latest # 为维护人 MAINTAINER binz # 版本号 ENV VERSION 1.0 # 在容器根目录 创建一个 apps 目录 WORKDIR /apps # 挂载容器目录 VOLUME ["/apps/config"] # 拷贝当前目录下main可执行文件 COPY ./main /apps/goApp # 拷贝配置文件到容器中 COPY config/app.yml /apps/config/app.yml COPY config/model.conf /apps/config/model.conf # 设置容器为上海 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime RUN echo 'Asia/Shanghai' > /etc/timezone # 设置编码 ENV LANG c.UTF-8 # 暴露端口 EXPOSE 81 # 运行程序 ENTRYPOINT ["/apps/goApp"] |
构建镜像
1 2 |
docker build -t hello-image . docker images //查看镜像 |
运行容器
1 |
docker run hello-image ./hello |
Q:我们需要将 Golang 容器和 Mysql 容器关联起来,那么我们需要怎么做呢?
A:增加命令 –link mysql:mysql 让 Golang 容器与 Mysql 容器互联;通过 –link,可以在容器内直接使用其关联的容器别名进行访问,而不通过IP,但是–link只能解决单机容器间的关联,在分布式多机的情况下,需要通过别的方式进行连接