Linux下将.Asp Core 部署到 Docker容器中
我们来部署一个简单的例子:
将一个简单的.Aps Core项目部署到Docker容器中并被外网访问
说明:
- 下面的步骤都是建立在宿主服务器系统已经安装配置过Docker容器,安装Docker相对比较简单我们这里,网上有很多资料,我们这里跳过
- 开发环境:VS2017
- 部署服务器系统:Linux
1):新建项目
新建一个.Aps Core项目,选择Web应用程序,勾选启用Docker支持,勾选Docker支持后VS会自动给我们生成一个Dockerfile文件

2)编写Dockerfile脚本
我们会看到Dockerfile文件文件有如下内容,首先你要知道Dockerfile是什么:Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。简单来说Dockerfile脚本就好比我们处理数据用到的SQL脚本一样,只不过Dockerfile不是用来处理数据的,而是把程序的部署和环境配置等操作写成了命令脚本,方便到时发布线上的时候直接执行,从而极大的降低了部署难度和部署时间

上面的代码看起来有点复杂,好多都用不到,也不利于初学者理解,我们自己重写一下这个文件,代码只有简单六句,但注释比较多,如下:
#FROM :Dockerfile 中的 FROM 指令用于指定要构建的镜像的基础镜像,此处是apscore 2.2运行时为基础镜像。它通常是 Dockerfile 中的第一条指令。
FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
#WORKDIR:该WORKDIR指令为Dockerfile中的任何RUN,CMD,ENTRYPOINT,COPY和ADD指令设置工作目录。如果WORKDIR不存在,即使它未在任何后续Dockerfile指令中使用,也将创建它。
#/app是工作目录的任意选择。你可以使用你喜欢的任何东西(foo,bar或baz),但app它很好,因为它是自我描述和常用的。
WORKDIR /app
#COPY :指令用于将文件作为一个新的层添加到镜像中。通常使用 COPY 指令将应用代码赋值到镜像中。
#此处的.点代表 WORKDIR /app 目录,将本地应用拷贝到 容器 /app/ 目录下 "./"代表的就是/app 因为dockerfile文件和程序文件都在发布文件夹下 所以两个目录是一样的
COPY . .
#指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。
#在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;
#另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。要将 EXPOSE 和在运行时使用 -p <宿主端口>:<容器端口> 区分开来。
#-p,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问
#切记:EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。
EXPOSE 8082
#设置环境变量,修改.netCore 默认的80端口(此处只是为了演示.netCore项目更改如何在docker容器中使用其他端口,你也可以去掉这句代码默认用80端口),此处改为8082端口
ENV ASPNETCORE_URLS http://+:8082
#指定应用入口点 DockerTest.dll代表的是主程序文件
ENTRYPOINT ["dotnet", "DockerTest.dll"]
此外我们检查一下我们的Dockerfile是否在发布时复制到输出目录,如果是不复制则不会进入打包文件

3):构建Docker镜像
我们将我们新建的项目打包

远程连接到linux服务器,然后用MobaXterm将打包后的项目复制到linux服务器中去,我此处放在/root/dockerdome/文件下

我们先用cd 命令定位到当前文件夹下:
然后创建镜像,命令如下,mydockerdome为我们自定义的镜像名称
docker build -t mydockerdome . (注意不要漏掉命令中的最后一个点,代表命令执行在当前目录)
或者也可以用如下命令:
docker build 发布文件目录 -t mydockerdome
完成后如下图,我们可以看到脚本执行的每一个步骤:

我们可以通过docker image ls来查看定制好的镜像
然后我们运行RUN命令启动容器:
docker run --name=mydockerdome -p 8082:8082 -d mydockerdome
命令解释:
--name:指定容器名称为mydockerdome-p:指定容器端口,上面左边的8082代表宿主机的端口,右边代码容器的8082端口,即将容器的8082端口随机映射到宿主机8082的一个端口上-d:指定容器 后台运行,如果不指定此命令,当前终端关闭或者被占用程序则会退出
对应此命令的所有扩展:
- -a stdin:指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
- -d: 后台运行容器,并返回容器ID;
- -i: 以交互模式运行容器,通常与 -t 同时使用;
- -p:端口映射,格式为:主机(宿主)端口:容器端口
- -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
- --name="nginx-lb":为容器指定一个名称;
- --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
- --dns-search example.com:指定容器DNS搜索域名,默认和宿主一致;
- -h "mars": 指定容器的hostname;
- -e username="ritchie"::设置环境变量;
- --env-file=[]:从指定文件读入环境变量;
- --cpuset="0-2" or --cpuset="0,1,2":绑定容器到指定CPU运行;
- -m :设置容器使用内存最大值;
- --net="bridge":指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
- --link=[]: 添加链接到另一个容器;
- --expose=[]:开放一个端口或一组端口;
运行成功后我们浏览器输入服务器IP:端口号,可以成功访问

4):总结与扩展
简单总结一下有几点需要注意的地方
1:.Asp Core项目环境默认使用的是80端口,即上面Dockerfile文件中的ENV ASPNETCORE_URLS命令可以用来修改为其他端口,好多非Asp Core项目Docker相关部署的资料文档没有提到这一点,如果我们不用这个命令那么容器只能用默认的80端口映射宿主主机的任意端口,用其他端口会导致外网无法访问,且如果两个容器,两个容器不能同时映射同一个宿主主机端口;
2:如果项目部署到Docker容器中外网无法访问,先检查宿主服务端口防火墙是否可以通过,安全组配置有没有问题,其次检查容器映射时候正确,容器是否指定默认端口。
3:我们在使用Docker的时候经常会创建,移除镜像或者容器等等操作,每次输入命令很繁琐,我们可以用工具来管理容器和镜像,比如:Portainer 安装配置教程网上有很多,具体效果如下

4:docker常用命令
# 列出本机的所有 image 文件。
docker image ls # 删除 image 文件
docker image rm [imageName] # 从仓库拉取镜像
docker image pull library/hello-world #删除一个imageid的镜像
docker rmi [image_id] #删除所有镜像
docker rmi $(docker images -q) #查看所有容器运行状态
docker ps -a #删除一个containerid的容器(实例)
docker rm [container_id] #删除所有容器
docker rm $(docker ps -a -q) # 列出本机正在运行的容器
docker container ls # 列出本机所有容器,包括终止运行的容器
docker container ls --all #启动已经生成、已经停止运行的容器文件。
docker container start [containerID] #用来查看 docker 容器的输出
docker container logs [containerID]
5:参考相关资料
Docker官方文档
Docker入门教程
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
Docker基础详细教程
https://yeasy.gitbooks.io/docker_practice/
Docker端口映射
https://www.jianshu.com/p/b92d4b845ed6
Docker核心技术与实现原理
Linux下将.Asp Core 部署到 Docker容器中的更多相关文章
- docker多个容器连接 将 Rails 程序部署到 Docker 容器中
在docker中使用MySQL数据库 https://yq.aliyun.com/articles/583765 将 Rails 程序部署到 Docker 容器中
- 将netcore网站部署到docker容器中
一.背景 最近一直在看docker的教程,基础知识看的差不多了.理论总要运用于实践,所以下面我们就来把最简单的一个netcore网站托管到docker容器中. 环境:1.docker for wind ...
- 【Step By Step】将Dotnet Core部署到Docker(中)
在Docker中运行MySql MySQL 官方也提供了各种版本的MySQL Image来供用户使用,我们可以使用如下命令来创建并运行一个MySQL Image: docker run -it -p ...
- jenkins集成基于maven的javaweb项目,部署到docker容器中
使用开源工具:Jenkins,码云gitee,docker,docker页面管理工具PortainerUI,github 各种工具的安装就不必介绍了,首先打开Jenkins,刚安装完Jenkins,可 ...
- 如何将 asp.net core 应用进行 docker 容器部署
asp.net core 部署在 docker 容器中比较简单,但常因asp.net core程序发布的问题造成容器无法正常启动.现在把详细的操作的步骤记录如下: 一.asp.net core web ...
- Asp Core部署到IIS服务器
之前有文章写了.Asp Core Kestrel服务器可以独立运行在linux下,也可以部署到Docker上面通过容器管理,当然也可以直接部署到IIS中 一:安装环境 1)首先需要在服务器安装对应环境 ...
- 【原创】大叔经验分享(71)docker容器中使用jvm工具
java应用中经常需要用到jvm工具来进行一些操作,如果java应用部署在docker容器中,如何使用jvm工具? 首先要看使用的docker镜像, 比如常用的openjdk镜像分为jdk和jre,只 ...
- windows/Linux下设置ASP.Net Core开发环境并部署应用
10分钟学会在windows/Linux下设置ASP.Net Core开发环境并部署应用 创建和开发ASP.NET Core应用可以有二种方式:最简单的方式是通过Visual Studio 2017 ...
- 【Step By Step】将Dotnet Core部署到Docker下
一.使用.Net Core构建WebAPI并访问Docker中的Mysql数据库 这个的过程大概与我之前的文章<尝试.Net Core—使用.Net Core + Entity FrameWor ...
随机推荐
- Oracle 实现自增主键
废话不多讲,直接上代码 //1.创建表 Create Table testZcm( Id Number(2) Not Null Primary Key, postCode Nu ...
- websocket 浅学
websocket ,可以实现客户端与服务器的即时通讯,比如即时聊天,获取项目中的消息提醒等(小铃铛上的标红数字提醒) 话不多说,上马奔腾,走起 只写demo,不在项目中使用: 1.初始化项目, np ...
- rushjs来自微软的单体仓库管理工具
rushjs 是来自微软的单体仓库管理工具 ,与lerna 类似但是使用上稍显复杂 安装 npm install -g @microsoft/rush 简单使用 一个传统的基于npm 的处理 ~$ ...
- [Java] Spring boot 的 SrpingSecurity 框架搭建
参考: SrpingSecurity]之一:框架搭建https://blog.csdn.net/qq_28296925/article/details/82021092 [SpringSecurity ...
- 寄存器,移位寄存器的电路原理以及verilog代码实现
寄存器:用以存放二进制代码的电路,下图为由维特阻塞D触发器组成的4位数码寄存器: 逻辑功能分析: 1.异步端CR置0时,输出置0: 2.同步并行置数:D0~D3为4个输入代码,当CP上升沿到达时,D0 ...
- 《Java虚拟机JVM故障诊断与性能优化》读书笔记(未完待续)
前言: 对于JVM学习用处的理解:我们程序员写的代码,虽说是放在服务器(linux)系统上的.但是很多时候,受JVM的影响,其实程序并没有发挥出服务器的最大性能.这时候,JVM就成为了瓶颈了.有瓶颈就 ...
- 内置函数— — eval、exec、compile
字符串类型代码:eval.exec.compile eval() 执⾏字符串类型的代码,并返回最终结果 print(eval("2+2")) # 4 n=8 def func() ...
- markdown转html
今天临时要写接口文档,然后发现部门给的文档是markdown文件的,而接口文档是要html格式的,因此想直接把markdown转为html 这里我使用的是marked 首先初始化一个node项目 np ...
- 拼多多面试真题:如何用 Redis 统计独立用户访问量!
阅读本文大概需要 2.8 分钟. 作者:沙茶敏碎碎念 众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作 3 年的开发,稍微优秀一点的,都给到 30K 的 Offer. 当然,拼 ...
- 使用iis部署asp.net core 中的坑
使用vs2017创建asp.net core mvc 模板网站然后部署到iis上,如果在一直有并发访问的情况下,操作iis重新绑定域名操作,网站会直接挂掉,重启应用池也没用,而且部署到iis上容易出现 ...