目录html
本文建立一个简单的 .net core webapi 项目,并经过 Docker 运行起来。涉及到 Dockerfile 编写,生成镜像,并运行镜像到容器里。git
建立基于 .net core 2.0 的 webapi 项目,命名为 GetMachNameWebAPI。github
并修改 ValuesController 的 Get() 方法返回当前机器的机器名或其余操做。web
// GET api/values [HttpGet] public IEnumerable<string> Get() { return new string[] { Environment.MachineName, Environment.OSVersion.Platform.ToString() }; }
在项目根目录使用 dotnet publish 命令发布应用程序,发布后的资源被保存在目录
\bin\Debug\netcoreapp2.0\publish 下面。docker
在publish里目录里面新建一个Dockerfile文件(文件名就是Dokerfile,没有扩展名),并在该文件中定义以下的内容:shell
# 基于microsoft/aspnetcore:2.0构建Docker Image FROM microsoft/aspnetcore:2.0 # 设置工做路径 WORKDIR /app # 将当前文件夹下的全部文件所有复制到工做目录 COPY *.* ./ # 配置环境变量ASPNETCORE_URLS ENV ASPNETCORE_URLS http://0.0.0.0:5000 # 暴露5000端口 EXPOSE 5000 # 执行dotnet GetMachNameWebAPI.dll命令 CMD ["dotnet", "GetMachNameWebAPI.dll"]
FROM:第一个指令必须为 FROM。 此指令用于初始化新的生成阶段,并为剩余指令设置基础映像。可以使用多个FROM为多个映像。api
WORKDIR:为剩余的任意 RUN、CMD、ENTRYPOINT、COPY 和 ADD Dockerfile 指令设置工做目录。 若是不存在,则会建立该目录。服务器
COPY:从源路径复制新文件或目录,并将它们添加到目标容器文件系统。app
ENV:用来在镜像构建过程当中设置环境变量。curl
RUN:在当前映像之上的一个新层中执行任何命令,并提交结果。
ENTRYPOINT:支持以可执行文件的形式运行容器。每一个Dockerfile中只能有一个 ENTRYPOINT ,当指定多个时,只有最后一个起效。
详细请参考官网Dockerfile reference文档
注意ASPNETCORE_URLS的配置能够直接在代码里面Program的Main方法里指定,好比:
.UseUrls("http://localhost:5001")
也能够如本文经过环境变量配置。可参看.Net Core 修改默认的启动端口
经过WinSCP相似的软件,将该目录下的所有内容复制到Ubuntu机器上。
在 Dockerfile 文件同目录下执行如下命令,建立Docker Image。千万别省略了最后一个点号,它表示采用当前路径的Dockerfile来生成Docker Image。
docker build -t getmachinewebapi:v0.1 .
在这条命令中:
-t参数用来指定 image 文件的名字,后面还能够用冒号指定标签。若是不指定,默认的标签就是latest。
最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径,因此是一个点。
详细请参考官网docker build文档
如今,咱们就可使用docker run来执行刚才产生的Docker Image了。docker run会把Docker Image加载到Docker Container中,而后执行由Dockerfile指定的命令(也就是dotnet DockerWebAPI.dll命令)。docker run的命令以下
docker run -it -p 8080:5000 getmachinewebapi:v0.1
在这条命令中:
-it参数:表示须要提供一个模拟的shell环境,并要求有用户交互功能,这样在本机窗口输入的命令,就会传入容器。
-p 8080:5000参数:表示须要将Docker Container的5000端口映射到主机环境的8080端口,也就是客户端能够直接经过8080端口访问咱们的应用程序。
getmachinewebapi:v0.1参数:image 文件的名字(若是有标签,还须要提供标签,默认是 latest 标签)。
详细请参考官网docker run文档
在Linux主机里面经过curl测试:
curl http://localhost:8080/api/values && echo
或者在另一台机器访问地址 例如http://192.168.174.135:8080/api/values