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

摘要:本系列文章记录了几种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

 

posted on 2023-12-10 12:25  shui00cc  阅读(47)  评论(0编辑  收藏  举报