第6章 构建用户/社交服务并分析服务发现与负载均衡原理

思考并回答以下问题:

deploy/dockerfile/Dockerfile_user_rpc_dev

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
FROM registry.cn-hangzhou.aliyuncs.com/easy-im/alpine:latest

ENV TZ=Asia/Shanghai

ARG SERVER_NAME=user
ARG SERVER_TYPE=rpc

ENV RUN_BIN bin/${SERVER_NAME}-${SERVER_TYPE}
ENV RUN_CONF /${SERVER_NAME}/conf/${SERVER_NAME}.yaml

# 这个关键词的意思是复制的意思,可以将宿主机中的内容复制到容器中
# 命令 左边是宿主机的目录,右边是容器目录
RUN mkdir /$SERVER_NAME && mkdir /$SERVER_NAME/bin && mkdir /$SERVER_NAME/conf && mkdir -p /$SERVER_NAME/etc/conf

# 复制编译后的二进制文件
COPY ./bin/$SERVER_NAME-$SERVER_TYPE /$SERVER_NAME/bin/

# 复制配置文件
COPY ./apps/$SERVER_NAME/$SERVER_TYPE/etc/dev/$SERVER_NAME.yaml /$SERVER_NAME/conf/

# 为二进制提供执行权限
RUN chmod +x /$SERVER_NAME/bin/$SERVER_NAME-$SERVER_TYPE

# 该命令指定容器会默认进入那个目录,如我们每次进入服务器的时候会自动进入root目录一样的作用
WORKDIR /$SERVER_NAME

# 这个命令可以让我们的docker容器在启动的时候就执行下面的命令
# 与CMD不同之处是,在docker run 后跟的命令不能替换它,它仍然会启动的时候执行
# ENTRYPOINT ["$RUN_BIN", "-f", "$RUN_CONF"] // 这种写法不支持对环境变量的解析,
#您正在使用ENTRYPOINT 的exec形式。与shell表单不同,exec表单不会调用命令shell。这意味着正常的外壳处理不会发生。例如,ENTRYPOINT [ "echo", "$HOME" ]
# 将不会在$ HOME上进行变量替换。如果要进行shell处理,则可以使用shell形式或直接执行shell,例如:ENTRYPOINT [ "sh", "-c", "echo $HOME" ]。
#当使用exec表单并直接执行shell时(例如在shell表单中),是由shell进行环境变量扩展,而不是docker。(来自Dockerfile参考)
#

ENTRYPOINT $RUN_BIN -f $RUN_CONF

deploy/mk/user_rpc.mk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
VERSION=latest

SERVER_NAME=user
SERVER_TYPE=rpc

# 测试环境配置
# docker的镜像发布地址
DOCKER_REPO_TEST=registry.cn-hangzhou.aliyuncs.com/easy-chat/${SERVER_NAME}-${SERVER_TYPE}-dev
# 测试版本
VERSION_TEST=$(VERSION)
# 编译的程序名称
APP_NAME_TEST=easy-im-${SERVER_NAME}-${SERVER_TYPE}-test

# 测试下的编译文件
DOCKER_FILE_TEST=./deploy/dockerfile/Dockerfile_${SERVER_NAME}_${SERVER_TYPE}_dev

# 测试环境的编译发布
build-test:

GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o bin/${SERVER_NAME}-${SERVER_TYPE} ./apps/${SERVER_NAME}/${SERVER_TYPE}/${SERVER_NAME}.go
docker build . -f ${DOCKER_FILE_TEST} --no-cache -t ${APP_NAME_TEST}

# 镜像的测试标签
tag-test:

@echo 'create tag ${VERSION_TEST}'
docker tag ${APP_NAME_TEST} ${DOCKER_REPO_TEST}:${VERSION_TEST}

publish-test:

@echo 'publish ${VERSION_TEST} to ${DOCKER_REPO_TEST}'
docker push $(DOCKER_REPO_TEST):${VERSION_TEST}

release-test: build-test tag-test publish-test

deploy/script/user-rpc-test.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
reso_addr='registry.cn-hangzhou.aliyuncs.com/easy-chat/user-rpc-dev'
tag='latest'

pod_ip="192.168.117.24"

container_name="easy-chat-user-rpc-test"

docker stop ${container_name}

docker rm ${container_name}

docker rmi ${reso_addr}:${tag}

docker pull ${reso_addr}:${tag}


# 如果需要指定配置文件的
# docker run -p 10001:8080 --network imooc_easy-im -v /easy-im/config/user-rpc:/user/conf/ --name=${container_name} -d ${reso_addr}:${tag}
docker run -p 10000:10000 -e POD_IP=${pod_ip} --name=${container_name} -d ${reso_addr}:${tag}
0%