我们来部署一个简单的例子:

  将一个简单的.Aps Core项目部署到Docker容器中并被外网访问

说明:

  1. 下面的步骤都是建立在宿主服务器系统已经安装配置过Docker容器,安装Docker相对比较简单我们这里,网上有很多资料,我们这里跳过
  2. 开发环境:VS2017
  3. 部署服务器系统: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

命令解释:

  1. --name:指定容器名称为mydockerdome
  2. -p:指定容器端口,上面左边的8082代表宿主机的端口,右边代码容器的8082端口,即将容器的8082端口随机映射到宿主机8082的一个端口上
  3. -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官方文档

https://docs.docker.com/

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核心技术与实现原理

https://draveness.me/docker

Linux下将.Asp Core 部署到 Docker容器中的更多相关文章

  1. docker多个容器连接 将 Rails 程序部署到 Docker 容器中

    在docker中使用MySQL数据库 https://yq.aliyun.com/articles/583765 将 Rails 程序部署到 Docker 容器中

  2. 将netcore网站部署到docker容器中

    一.背景 最近一直在看docker的教程,基础知识看的差不多了.理论总要运用于实践,所以下面我们就来把最简单的一个netcore网站托管到docker容器中. 环境:1.docker for wind ...

  3. 【Step By Step】将Dotnet Core部署到Docker(中)

    在Docker中运行MySql MySQL 官方也提供了各种版本的MySQL Image来供用户使用,我们可以使用如下命令来创建并运行一个MySQL Image: docker run -it -p ...

  4. jenkins集成基于maven的javaweb项目,部署到docker容器中

    使用开源工具:Jenkins,码云gitee,docker,docker页面管理工具PortainerUI,github 各种工具的安装就不必介绍了,首先打开Jenkins,刚安装完Jenkins,可 ...

  5. 如何将 asp.net core 应用进行 docker 容器部署

    asp.net core 部署在 docker 容器中比较简单,但常因asp.net core程序发布的问题造成容器无法正常启动.现在把详细的操作的步骤记录如下: 一.asp.net core web ...

  6. Asp Core部署到IIS服务器

    之前有文章写了.Asp Core Kestrel服务器可以独立运行在linux下,也可以部署到Docker上面通过容器管理,当然也可以直接部署到IIS中 一:安装环境 1)首先需要在服务器安装对应环境 ...

  7. 【原创】大叔经验分享(71)docker容器中使用jvm工具

    java应用中经常需要用到jvm工具来进行一些操作,如果java应用部署在docker容器中,如何使用jvm工具? 首先要看使用的docker镜像, 比如常用的openjdk镜像分为jdk和jre,只 ...

  8. windows/Linux下设置ASP.Net Core开发环境并部署应用

    10分钟学会在windows/Linux下设置ASP.Net Core开发环境并部署应用 创建和开发ASP.NET Core应用可以有二种方式:最简单的方式是通过Visual Studio 2017 ...

  9. 【Step By Step】将Dotnet Core部署到Docker下

    一.使用.Net Core构建WebAPI并访问Docker中的Mysql数据库 这个的过程大概与我之前的文章<尝试.Net Core—使用.Net Core + Entity FrameWor ...

随机推荐

  1. JavaScript基础入门01

    JavaScript能用来做什么?     页面分为:结构.样式.行为.   JavaScript的组成:     ECMAScript.BOM.DOM       ECMAScript是一个标准,它 ...

  2. cronicle 任务调度一主多从安装试用

    cronicle 对于一主多从的安装还是很简单的,对于slave 就是少了setup一步,同时在master 界面,添加下slave 就可以了 就会加入集群中了 项目使用docker-compose ...

  3. memset使用技巧

    memset可以对高位数组进行初始化,非常方便.需要注意的是memset的头文件是string.h和memory.h . 下面来谈memset的4个使用技巧: (注:一下dp高维数组都是全局变量,局部 ...

  4. 《Java虚拟机JVM故障诊断与性能优化》读书笔记(未完待续)

    前言: 对于JVM学习用处的理解:我们程序员写的代码,虽说是放在服务器(linux)系统上的.但是很多时候,受JVM的影响,其实程序并没有发挥出服务器的最大性能.这时候,JVM就成为了瓶颈了.有瓶颈就 ...

  5. JVM参数笔记

    Java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足, ...

  6. SQL进阶-数据类型转换

    一般有这几种转换: 一.数值型与字符型的转化 ### 数值型转为字符型: –> '65' select cast(65 as char); –> 'A' select char(65); ...

  7. share memory between guest and nic

    通过硬件的IOMMU,内核提供的共享内存.VFIO可以实现. REF: 1. offical DPDK API Doc, 简书有翻译版 DPDK编程指南(翻译)(一)  (二十七) 2. dpdk v ...

  8. 组件&Props

    组件允许你将Ui拆分为独立可复用的代码片段,并对每个片段进行独立构思.本指南只在介绍组件的相关概念.你可以参考详细组件 API. 组件,从概念上类似与JavaScript函数.它接受任意的入参(既“p ...

  9. struct 声明类

    #include <iostream> using namespace std; struct Student{ Student(char *name, int age, float sc ...

  10. shell 脚本接收参数

    test.sh #!/bin/bash echo "脚本名$0" echo "第1个参数$1" echo "第2个参数$2" echo &q ...