Go-web应用部署的方式——(1)Docker
摘要:本系列文章记录了几种Go-web应用的部署方式,记录并解释所有相关的命令。
1. 编写Dockerfile文件
# 使用基础镜像
FROM golang:alpine # 设置环境变量 ENV GO111MODULE=on \ GOPROXY=https://goproxy.cn,direct \ CGO_ENABLED=0 \ GOOS=linux \ GOARCH=amd64 # 移动到工作目录:/build WORKDIR /build # 将代码复制到容器中 COPY . . # 将我们的代码编译成二进制可执行文件app RUN go build -o app . # 移动到用于存放生成的二进制文件的 /dist 目录 WORKDIR /dist # 将二进制文件从 /build 目录复制到这里 RUN cp /build/app . # 声明服务端口 EXPOSE 8888 # 启动容器时运行的命令 CMD ["/dist/app"]
2. 创建镜像运行
docker build . -t goweb_app
"-t" 指定镜像名称
3. 运行镜像
docker run -p 80:8084 goweb_app
"-p 宿主机端口:容器内端口" ,这里程序在容器内运行端口为8084,在宿主机上通过80端口访问
4. 分阶段构建的Dockerfile示例
Go程序编译后得到可执行文件,最终的镜像是不需要Go环境的,也就是说我们只需要一个运行最终二进制文件的容器即可。
FROM golang:alpine AS builder # 为我们的镜像设置必要的环境变量 ENV GO111MODULE=on \ GOPROXY=https://goproxy.cn,direct \ CGO_ENABLED=0 \ GOOS=linux \ GOARCH=amd64 # 移动到工作目录:/build WORKDIR /build # 将代码复制到容器中 COPY . . # 将我们的代码编译成二进制可执行文件 app RUN go build -o app . ################### # 接下来创建一个小镜像 ################### FROM scratch # 从builder镜像中把/dist/app 拷贝到当前目录 COPY --from=builder /build/app / # 需要运行的命令 ENTRYPOINT ["/app"]
5. 附带静态文件、配置文件等其他文件
如果项目中带有静态文件或配置文件,需要将其拷贝到最终的镜像文件中。
......(编译时同上)
################### # 接下来创建一个小镜像 ################### FROM scratch # 从builder镜像中把静态文件拷贝到当前目录 COPY ./templates /templates COPY ./static /static # 从builder镜像中把配置文件拷贝到当前目录 COPY ./conf /conf # 从builder镜像中把/dist/app 拷贝到当前目录 COPY --from=builder /build/bubble / # 需要运行的命令 ENTRYPOINT ["/bubble", "conf/config.ini"]
6. 关联其他容器
如果项目中的数据库同样使用docker部署,我们修改配置文件:
[mysql] user = root password = root
# host = 127.0.0.1
# host修改为容器名 host = mysql8019 port = 3306 db = bubble
修改后重新build,然后run时关联容器
docker run --link=mysql8019:mysql8019 -p 80:8084 bubble_app
7. 使用docker-compose关联多个容器
编写docker-compose.yml文件:
# yaml 配置
version: "3.7"
services:
mysql8019:
image: "mysql:8.0.19"
ports:
- "3306:3306"
command: "--default-authentication-plugin=mysql_native_password --init-file /data/application/init.sql"
environment:
MYSQL_ROOT_PASSWORD: "root"
MYSQL_DATABASE: "bubble"
MYSQL_PASSWORD: "root"
volumes:
- ./init.sql:/data/application/init.sql
bubble_app:
build: .
command: sh -c "./wait-for.sh mysql8019:3306 -- ./bubble ./conf/config.ini"
depends_on:
- mysql8019
ports:
- "80:8084"
"command"定义了mysql8019容器启动前会执行init.sql,app容器启动前会执行wait-for.sh等待数据库容器启动,然后执行可执行文件。
因此,这里不再使用scratch
镜像构建了,改为使用debian:stretch-slim
,同时还要安装wait-for.sh
脚本用到的netcat
,并把wait-for.sh
脚本文件COPY到最终的镜像中,赋予可执行权限,最后注释掉最后一行命令。
......(编译时同上)
################### # 接下来创建一个小镜像 ################### FROM debian:stretch-slim # 从builder镜像中把脚本拷贝到当前目录 COPY ./wait-for.sh / # 从builder镜像中把静态文件拷贝到当前目录 COPY ./templates /templates COPY ./static /static # 从builder镜像中把配置文件拷贝到当前目录 COPY ./conf /conf # 从builder镜像中把/dist/app 拷贝到当前目录 COPY --from=builder /build/bubble / RUN set -eux; \ apt-get update; \ apt-get install -y \ --no-install-recommends \ netcat; \ chmod 755 wait-for.sh # 需要运行的命令(注释掉这一句,因为需要等MySQL启动之后再启动我们的Web程序) # ENTRYPOINT ["/bubble", "conf/config.ini"]
最后运行
docker-compose up
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!