两种方式 打包 或者编译
一、打包创建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。、、