首页 > 其他分享 >Go-web应用部署的方式——(1)Docker

Go-web应用部署的方式——(1)Docker

时间:2023-12-10 12:34:56浏览次数:34  
标签:web 容器 app build Go 镜像 Docker COPY builder

摘要:本系列文章记录了几种Go-web应用的部署方式,记录并解释所有相关的命令。

参考:如何使用Docker部署Go Web应用 | 李文周的博客 (liwenzhou.com)

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

 

标签:web,容器,app,build,Go,镜像,Docker,COPY,builder
From: https://www.cnblogs.com/shui00cc/p/17892388.html

相关文章

  • Python神器!WEB自动化测试集成工具 DrissionPage
    Python神器!WEB自动化测试集成工具DrissionPage 一、前言用requests做数据采集面对要登录的网站时,要分析数据包、JS源码,构造复杂的请求,往往还要应付验证码、JS混淆、签名参数等反爬手段,门槛较高。若数据是由JS计算生成的,还须重现计算过程,体验不好,开发效率不高。使用浏览器,......
  • python语言在web上的应用:如何节省服务器资源?
    背景介绍在web开发中的应用广泛在web开发中的应用广泛。随着互联网的发展,web应用越来越普遍,而Python作为一种简洁、高效的编程语言,被广泛应用于web开发领域。Python提供了丰富的库和框架,如Django、Flask等,使开发人员能够快速搭建功能强大的web应用。同时,Python还具有良好的可扩展性......
  • 基于Docker容器搭建hadoop完全分布式集群环境
    简介物理机:windows10宿主机:Centos7虚拟机,需要安装Docker服务hadoop集群节点:3个centos7的容器,hadoop1、hadoop2、hadoop3组件:容器镜像:Centos7DockerCE24.0.7JDK1.8.0_181Hadoop3.1.31.新建虚拟机安装CentOS72.安装Docker2.1安装docker服务yum-yinstalldocke......
  • docker基础知识
    目录1.docker简介1.为什么要创建隔离的环境?2.为什么dockeri可以比虚拟机极大的节省资源?3.docker基础概念(1)镜像(Image)(2)容器(Container)2.docker使用1.docker安装2.docker命令dockersearch查询镜像dockerpull拉取镜像dockerimages查看镜像dockerbuild构建镜像dockerstart......
  • 【SpringBootWeb入门-8】分层解耦-三层架构
    1、架构前言在讲解三层架构之前,我们先来看一段Controller代码段,代码如下:packagecom.hiker.controller;importcom.hiker.pojo.Emp;importcom.hiker.pojo.Result;importcom.hiker.utils.XmlParserUtils;importorg.springframework.web.bind.annotation.RequestMapping......
  • Docker的常用命令
    docker命令有很多,总的分为以下几大类:容器生命周期管理—docker[run|start|stop|restart|kill|rm|pause|unpause]容器操作运维—docker[ps|inspect|top|attach|events|logs|wait|export|port]容器rootfs命令—docker[commit|cp|diff]镜像仓库—docker[login|pu......
  • Docker - Remove build cache
    dockerbuilderpruneRemovebuildcacheUsagedockerbuilderpruneDescriptionRemovebuildcacheOptionsOptionShortDefaultDescription--all-a Removeallunusedbuildcache,notjustdanglingones--filter  Providefiltervalues(e.g. unt......
  • Vue学习之Vue结合 ElementUI 组件库搭建Web工程项目
    创建Vue项目打开cmd命令行界面,创建一个全新的vue项目,我们命名为hello-vue,这里附上ElementUI网址如下:ElementUI#使用webpack打包工具初始化一个名为hello-vue的工程vueinitwebpackhello-vueNPM安装相关组件依赖时可能会遇到权限问题,此时使用PowerShell管理员模式运行即......
  • Privacy Policy Website(URL)
    Thissoftwarerespectsandprotectsthepersonalprivacyofallusersusingtheservice.Inordertoprovideyouwithmoreaccurateandpersonalizedservices,thissoftwarewilluseanddiscloseyourpersonalinformationinaccordancewiththeprovisions......
  • Spring Web应用的启动流程分析
    在ServletAPI中有一个ServletContextListener接口,它能够监听ServletContext对象的生命周期,实际上就是监听Web应用的生命周期。当Servlet容器启动或终止Web应用时,会触发ServletContextEvent事件,该事件由ServletContextListener来处理。在ServletContextListener接口中定义了处......