go-zero微服务项目打包&&docker-compose

两种方式 打包 或者编译

一、打包创建Dockerfile 

1.user-api 打包


dockerfile:

FROM golang:1.18 AS build-env
COPY . /app
WORKDIR /app
RUN go env -w GOPROXY=https://goproxy.cn,direct
RUN go mod download
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /app/user-api github.com/f1748x/WerewolfKill/api

FROM alpine:latest
WORKDIR /app
# RUN apk add -U tzdata
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
COPY --from=build-env  /app/user-api /app/user-api
COPY --from=build-env  /app/api/controller/config-test.yaml /app/api/controller/config.yaml
COPY --from=build-env  /app/api/etc/kuber-api-test.yaml /app/etc/kuber-api-test.yaml

CMD ["/app/user-api", "-f", "/app/etc/kuber-api-test.yaml"]


2.user-rpc 打包

FROM golang:1.18 AS build-env
COPY . /app
WORKDIR /app
# ADD go.mod .
# ADD go.sum .
RUN go env -w GOPROXY=https://goproxy.cn,direct
# WORKDIR /go/
# RUN pwd
# RUN ls
RUN go mod download

# RUN ls
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /app/user-rpc github.com/f1748x/WerewolfKill/usercenter

FROM alpine:latest
# RUN apk add -U tzdata
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
COPY --from=build-env  /app/user-rpc /app/user-rpc
COPY --from=build-env  /app/usercenter/etc/usercenter-test.yaml /app/etc/usercenter-test.yaml
# EXPOSE 10001
CMD ["/app/user-rpc", "-f", "/app/etc/usercenter-test.yaml"]

二、先编译

部署方式二
将go程序本地编译后上传。
首先在本地编译成Linux平台运行的可执行文件(必须)。这样的打包方式占用的文件是很小的
go build main.go

Dockerfile

# 表示依赖 alpine 最新版
FROM alpine:latest

#创建文件夹
RUN mkdir /app

#将Dockerfile 中的文件存储到/app下
ADD . /app

# 设置工作目录
WORKDIR /app

#设置时区为上海
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone

ENV GO111MODULE=on
ENV GOPROXY="https://goproxy.io"

#设置权限
RUN chmod -R 777 ./main
# 设置编码
ENV LANG C.UTF-8

# 暴露的端口
EXPOSE 8000
 
# 运行golang程序的命令
ENTRYPOINT ["/app/main"]


1.2 创建镜像
docker build -t hello_go .
docker image ls
docker run -p 8000:8000 hello_go

三、打包(省略)

docker build -t user-service .
docker build -t product-service .

四、docker-compose

1.docker-env.yaml  环境配置

 etcd-server:
    image: bitnami/etcd:latest
    container_name: etcd-server
    environment:
      - TZ=Asia/Shanghai
      - ALLOW_NONE_AUTHENTICATION=yes
    ports: # 设置端口映射
      - "2379:2379"
    networks:
      - center_net
    restart: always
  #zookeeper是kafka的依赖
  zookeeper:
   image: wurstmeister/zookeeper
   container_name: zookeeper
   environment:
     # 时区上海
     TZ: Asia/Shanghai
   restart: always
   ports:
     - "2181:2181"
   networks:
     - center_net

 #消息队列
  kafka:
   image: wurstmeister/kafka
   container_name: kafka
   ports:
     - "9092:9092"
   environment:
     KAFKA_ADVERTISED_HOST_NAME: kafka
     KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
     TZ: Asia/Shanghai
   restart: always
   volumes:
     - /var/run/docker.sock:/var/run/docker.sock
   networks:
     - center_net
   depends_on:
     - zookeeper


  mysql:
#    image: mysql:8.0.24
    image: mysql/mysql-server:8.0.28
    container_name: mysql
    environment:
      # 时区上海
      TZ: Asia/Shanghai
      # root 密码
      MYSQL_ROOT_PASSWORD: xxxxxxxxxxx
    ports:
      - "33069:3306"
    volumes:
      # 数据挂载
      - ./data/mysql/data:/var/lib/mysql
      # 日志
    command:
      # 将mysql8.0默认密码策略 修改为 原先 策略 (mysql8.0对其默认策略做了更改 会导致密码无法匹配)
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
    privileged: true
    restart: always
    networks:
      - center_net
  #redis容器
  redis:
   image: bitnami/redis
   container_name: redis
   ports:
     - "63799:6379"
   environment:
      # 时区上海
     TZ: Asia/Shanghai
   volumes:
      # 数据文件
     - ./data/redis/data:/data:rw
     - ./deploy/source/buster/sources.list:/etc/apt/sources.list
   command: "redis-server --requirepass G62m50oigInC30sf  --appendonly yes"
   privileged: true
   restart: always
   networks:
     - center_net
# 网络设置

networks:
  center_net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.30.0.0/16

2.docker-compose 主要服务

version: '3.0'

services:
  #前端网关nginx-center (只代理center,admin-api不在这里做代理)
  #前端api + 业务rpc

  etcd:
    build:
      context: etcd
    environment:
      - TZ=Asia/Shanghai
      - ALLOW_NONE_AUTHENTICATION=yes
      - ETCD_ADVERTISE_CLIENT_URLS=http://101.37.175.145:2379
    ports: # 设置端口映射
      - "2379:2379"
    networks:
      - backend
    restart: always

  etcd-manage:
    build:
      context: etcd-manage
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "7000:8080"                    # 设置容器8080端口映射指定宿主机端口,用于宿主机访问可视化web
    depends_on:                                       # 依赖容器
      - etcd                                          # 在 etcd 服务容器启动后启动
    networks:
      - backend
    restart: always
  zoo1:
    image: confluentinc/cp-zookeeper:7.3.2
    hostname: zoo1
    container_name: zoo1
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_SERVER_ID: 1
      ZOOKEEPER_SERVERS: zoo1:2888:3888

  kafka1:
    image: confluentinc/cp-kafka:7.3.2
    hostname: kafka1
    container_name: kafka1
    ports:
      - "9092:9092"
      - "29092:29092"
      - "9999:9999"
    environment:
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka1:19092,EXTERNAL://${DOCKER_HOST_IP:-127.0.0.1}:9092,DOCKER://host.docker.internal:29092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT,DOCKER:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
      KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181"
      KAFKA_BROKER_ID: 1
      KAFKA_LOG4J_LOGGERS: "kafka.controller=INFO,kafka.producer.async.DefaultEventHandler=INFO,state.change.logger=INFO"
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_JMX_PORT: 9999
      KAFKA_JMX_HOSTNAME: ${DOCKER_HOST_IP:-127.0.0.1}
      KAFKA_AUTHORIZER_CLASS_NAME: kafka.security.authorizer.AclAuthorizer
      KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: "true"
    depends_on:
      - zoo1
  kafka-ui:
    container_name: kafka-ui
    image: provectuslabs/kafka-ui:latest
    ports:
      - 8080:8080
    depends_on:
      - kafka1
    environment:
      DYNAMIC_CONFIG_ENABLED: "TRUE"


# build
#除了可以基于指定的镜像构建容器,还可以基于 Dockerfile 文件构建,在使用 up 命令时会执行构建任务

#通过 build 配置项可以指定 Dockerfile 所在文件夹的路径。
#Compose 将会利用 Dockerfile 自动构建镜像,然后使用镜像启动服务容器。

build 配置项可以使用绝对路径,也可以使用相对路径。
  # 服务发现
  tag-rpc: #自定义容器名称
    build:
      context: tag
      dockerfile: service/Dockerfile
    container_name: tag-rpc
    restart: always
    environment: #设置环境变量
      - TZ=Asia/Shanghai
    privileged: true
    ports: #设置端口映射
      - "8081:8081"
    networks:
      - backend


  user-rpc: #自定义容器名称
    build:
      context: user
      dockerfile: service/Dockerfile
    restart: always
    environment: #设置环境变量
      - TZ=Asia/Shanghai
    privileged: true
    ports: #设置端口映射
      - "8082:8082"
    networks:
      - backend

  tag-api: #自定义容器名称
    build:
      context: tag
      dockerfile: restful/Dockerfile
    container_name: tag-api
    restart: always
    environment: #设置环境变量
      - TZ=Asia/Shanghai
    privileged: true
    ports: #设置端口映射
      - "8888:8888"
    networks:
      - backend

  user-api: #自定义容器名称
    build:
      context: user
      dockerfile: restful/Dockerfile
    container_name: user-api
    restart: always
    environment: #设置环境变量
      - TZ=Asia/Shanghai
    privileged: true
    ports: #设置端口映射
      - "8887:8887"
    networks:
      - backend

五、启动微服务

在包含docker-compose.yml文件的目录中,运行以下命令启动微服务:

# 会根据 docker-compose 文件,构建镜像,并启动所有容器
$ docker-compose up -d

# 查看容器
$ docker-compose ps -a

# 停止所有容器
$ docker-compose down

执行1.docker-compose -f docker-compose-env.yaml up -d

再   2.docker-compose -f docker-compose.yaml up -d

六、基础命令:

基础命令

FROM:指定基础镜像,用于构建当前镜像的基础。例如:FROM ubuntu:latest。
LABEL:为镜像添加元数据,可以包含任意键值对。例如:LABEL maintainer="yourname@example.com"。
RUN:在镜像中执行命令,并创建新的镜像层。例如:RUN apt-get update && apt-get install -y curl。
CMD:指定容器启动时要执行的命令,该命令只能有一个。例如:CMD ["nginx", "-g", "daemon off;"]。
EXPOSE:声明容器运行时监听的端口。例如:EXPOSE 8080。
ENV:设置环境变量。例如:ENV MYSQL_VERSION 5.7。
ADD:将文件、目录或远程 URL 的内容复制到镜像中。例如:ADD app.jar /app/。
COPY:将文件或目录复制到镜像中。例如:COPY ./src /app/src。
WORKDIR:设置工作目录,后续命令将在该目录下执行。例如:WORKDIR /app。
VOLUME:声明持久化目录,用于在容器和主机之间共享数据。例如:VOLUME /data
ENTRYPOINT:指定容器启动时要执行的命令,与 CMD 不同的是,ENTRYPOINT 不会被Dockerfile 中的指令覆盖。例如:ENTRYPOINT ["java", "-jar", "app.jar"]。
USER:设置运行后续命令的用户名或 UID。例如:USER myuser。
ARG:定义构建参数,可以在构建镜像时通过 --build-arg 传递。例如:ARG VERSION=latest。
ONBUILD:指定触发器命令,在当前镜像被继承时执行。例如:ONBUILD ADD . /app。、、

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值