前言
对于游戏服务来说.docker并不是必须项,因为游戏服务与互联网服务所关注的重点差异很大.对于正式线上环境来说中间多一层就有更多隐患.但是我们依然会采用docker参与到整个项目的环节中.因为docker的理念”Build once,Run anywhere”即使不用于最终部署,也可以在生产环节带来很多便利.
使用范围
镜像(Image)容器(Container)仓库(Repository)是docker的三大核心概念.出于学习目的.这次不讨论Repository.所有的构建和运行都是基于本地仓库.在这个基础上我们能用docker做什么.实际工作中我是用开发机的Docker Desktop windows版本去运行linux容器.效果是一样的
基础:构建镜像
修改配置文件
LocalAllServer.txt需要修改.和部署到公网类似{ “_t” : “OuterConfig”, “Address” : “0.0.0.0:10002”, “Address2” : “<你的ip>:10002” }
前期镜像准备
docker pull mcr.microsoft.com/dotnet/core/runtime:2.2
docker pull mcr.microsoft.com/dotnet/core/sdk:2.2
镜像文件
为了充分减少image大小和便于阅读.自然是要用多阶段构建.基本思路: 多阶段构建
基于官方et5.0项目的AllServer单进程版本dockerfile,要注意发布项目需要用sdk镜像.而运行版本用runtime镜像.从而减少包体大小
FROM mcr.microsoft.com/dotnet/core/runtime:2.2 AS base
WORKDIR /app
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
WORKDIR /app
COPY Server/*.sln .
COPY Server/App/*.csproj /app/App/
COPY Server/Hotfix/*.csproj /app/Hotfix/
COPY Server/Model/*.csproj /app/Model/
COPY Server/ThirdParty/KcpLib/*.csproj /app/ThirdParty/KcpLib/
COPY Server/ThirdParty/Google.Protobuf/*.csproj /app/ThirdParty/Google.Protobuf/
COPY Server/ThirdParty/MongoDBDriver/MongoDB.Driver/*.csproj /app/ThirdParty/MongoDBDriver/MongoDB.Driver/
COPY Server/ThirdParty/MongoDBDriver/MongoDB.Bson/*.csproj /app/ThirdParty/MongoDBDriver/MongoDB.Bson/
COPY Server/ThirdParty/MongoDBDriver/MongoDB.Driver.Core/*.csproj /app/ThirdParty/MongoDBDriver/MongoDB.Driver.Core/
COPY Server/ThirdParty/MongoDBDriver/MongoDB.Driver.GridFS/*.csproj /app/ThirdParty/MongoDBDriver/MongoDB.Driver.GridFS/
RUN dotnet restore
COPY Server/. ./Server
COPY Unity/Assets/Model/. ./Unity/Assets/Model
COPY Unity/Assets/Hotfix/Module/Message/. ./Unity/Assets/Hotfix/Module/Message
COPY Unity/Assets/ThirdParty/. ./Unity/Assets/ThirdParty
COPY Unity/Assets/Plugins/x86_64/. ./Unity/Assets/Plugins/x86_64
WORKDIR /app/Server
RUN dotnet publish -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY ./Config /Config
COPY --from=build /app/publish .
ENV APPTYPE=AllServer
ENV APPID=1
ENV CONFIG=../Config/StartConfig/LocalAllServer.txt
EXPOSE 10002
CMD dotnet App.dll --appId=$APPID --appType=$APPTYPE --config=$CONFIG
注意:这是基于官方版本重新整理的一份.我自己的版本已经去掉了ThirdParty中的mongodb项目改为nuget引用.而且.netcore版本已经是net5了.所以会有少许出入.sdk和运行时镜像都要引用正确的版本.这里微软有个自己的坑..从3.1开始他的docker路径改变了.去掉core.统一为版本号.
例如netcore 3.1分别是:mcr.microsoft.com/dotnet/sdk:3.1和mcr.microsoft.com/dotnet/runtime:3.1
开始构建镜像
docker build -t ks/server:latest -f dockerfile .
构建完成后查看docker列表
docker images
应该如下列表
REPOSITORY TAG IMAGE ID CREATED SIZE
ks/server latest f5275dfc3d08 2 months ago 227MB
<none> <none> 1f1d3840a7f7 2 months ago 1.2GB
<none> <none> 067ce76154ac 2 months ago 1.2GB
<none> <none> 09eaf39f5136 2 months ago 1.2GB
mongo latest ef5c2207766e 3 months ago 493MB
mcr.microsoft.com/dotnet/sdk 5.0-buster-slim 84c49e6701a5 3 months ago 618MB
mcr.microsoft.com/dotnet/runtime 5.0-buster-slim 902c36f50b36 3 months ago 186MB
mcr.microsoft.com/dotnet/sdk 5.0 b6d20f6bb373 3 months ago 618MB
mcr.microsoft.com/dotnet/runtime 5.0 e75984d9639b 3 months ago 186MB
redis latest 62f1d3402b78 4 months ago 104MB
alpine latest d6e46aa2470d 4 months ago 5.57MB
docker/desktop-kubernetes kubernetes-v1.19.3-cni-v0.8.5-critools-v1.17.0 7f85afe431d8 4 months ago 285MB
可以看到成功打出了docker镜像.
运行镜像
docker run -p 10002:10002 ks/server
至此不出意外的话就可以用<你的ip>:10002端口正常访问了
结语
对于快速构建docker镜像.到目前为止就ok了.明眼人一眼就看出来.如果仅仅是到此为止.那没有必要整这么多复杂的过程.实际上基于docker容器还有非常多的可以做的工作.比如
- 自动构建以及管理多进程集群.
- 持续集成
对于1:基于dockercompose我们可以简单的一键创建,管理多进程et集群
对于2:Continuous integration,简称CI.我们的项目采用了基于gitlab ci的持续集成.用于自动化打包.自动测试.以及服务端自动拉取最近image运行.
有机会的话会在下一篇详细讲解如何用docker解放生产力