文档章节

Docker打包 Asp.Net Core应用,在CentOS上运行

李朝强
 李朝强
发布于 2017/09/08 12:00
字数 1645
阅读 521
收藏 14
点赞 2
评论 1

 

开篇借用百科上对docker的介绍。

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

方便大家学习:

http://www.docker.org.cn/(中文站) 

https://www.docker.com/(英文站)

docker镜像站:https://hub.docker.com/

【搭建环境】

系统:CentOS 7.0    容器:Docker 1.12.6          .Net Core版本: .NET Core 1.1

工具:putty、winScp

 

一、首先,我们先介绍下关于docker容器的安装。

直接用黄狗安装工具安装docker。

$ #安装Docker
$ yum install docker
$ #启动docker服务
$ systemctl  start docker.service
$ #配置开机启动
$ systemctl  enable docker.service

安装并成功启动docker服务后,可以通过以下命令查看docker版本信息

docker version
Client:
 Version:         1.12.6
 API version:     1.24
 Package version: docker-1.12.6-32.git88a4867.el7.centos.x86_64
 Go version:      go1.7.4
 Git commit:      88a4867/1.12.6
 Built:           Mon Jul  3 16:02:02 2017
 OS/Arch:         linux/amd64

Server:
 Version:         1.12.6
 API version:     1.24
 Package version: docker-1.12.6-32.git88a4867.el7.centos.x86_64
 Go version:      go1.7.4
 Git commit:      88a4867/1.12.6
 Built:           Mon Jul  3 16:02:02 2017
 OS/Arch:         linux/amd64

docker客户端、服务端版本信息都展示出来了。

二、安装Docker加速器。

 我目前使用的阿里开发者提供的docker加速服务。

有阿里云账号直接登录,https://dev.aliyun.com/search.html

如何使用Docker加速器

针对Docker客户端版本大于1.10的用户

您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://ihllojuv.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

为什么要安装Docker加速器?

摘自网友的话:众所周知的原因,要想流畅地使用Docker,需要配置Docker加速器,否则你会觉得回到了拨号上网的时代 。

三、发布Asp.Net Core程序。

 我这里是新建了也给Asp.Net Core web程序。

红色圈住部分,是后来手动添加进去的,dockerfile是你的应用部署到docker上所必须的配置信息,只是个不带扩展名的纯文本文件而已。hosting.json需要是配置服务启动时,监听信息。使用配置文件,需要手动修改Program.cs中的入口程序。

     /// <summary>
        /// 
        /// </summary>
        /// <param name="args"></param>
        public static void Main(string[] args)
        {
            //实例化一个配置生成器
            var config = new ConfigurationBuilder()
          .SetBasePath(Directory.GetCurrentDirectory())
          .AddJsonFile("hosting.json", optional: true)//添加配置文件hosting.json
          .Build();

            var host = new WebHostBuilder()
                .UseKestrel()
                .UseConfiguration(config)//使用配置信息
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .UseApplicationInsights()
                .Build();

            host.Run();
        }

完成以上操作后,我们发布这个demo程序,解决方案,右键发布。

docker

发布成功后,默认在bin/release/publishOutPut文件夹下。

docker

然后,我把publishOutPut重命名为publish后,通过WinScp工具把文件传到root/docker/下。

docker

另外,我们在网站根目录下,创建的Dockerfile文件,排上用场了,我们编辑修改文件。

FROM microsoft/aspnetcore:1.1
COPY . /publish
WORKDIR /publish    
EXPOSE 80
CMD ["dotnet", "demo.dll"]

指定容器对外暴露端口80。注意,COPY .后面有空格,表示是当前位置,意思是从当前位置复制文件到/publish目录下。网上有篇博客,少了个.,导致

copy requires at least one argument

这样的错误。

四、打包镜像

首先,我们进入/docker/publish目录

docker

执行以下命令:

 docker build -t demo-netcore .

意思是生成一个名为demo-netcore的镜像。(注意:最后空格后面有一个.)。

这个命令会,根据当前目录下dockerfile配置文件,进行打包。

[root@localhost publish]# docker build -t demo-netcore .
Sending build context to Docker daemon 17.84 MB
Step 1 : FROM microsoft/aspnetcore:1.1
 ---> 983c2fe9cbef
Step 2 : COPY . /publish
 ---> ae9533f162da
Removing intermediate container d8bdd1cb7061
Step 3 : WORKDIR /publish
 ---> Running in 06a5fbef40ea
 ---> c63de53ebe20
Removing intermediate container 06a5fbef40ea
Step 4 : EXPOSE 80
 ---> Running in 8d0eaa657905
 ---> 228e30d1bf74
Removing intermediate container 8d0eaa657905
Step 5 : EXPOSE 8080
 ---> Running in a38fd6c59d4a
 ---> ab126ceac6ae
Removing intermediate container a38fd6c59d4a
Step 6 : CMD dotnet demo.dll
 ---> Running in 7dc71cdf0f87
 ---> 96ef55dd9fc9
Removing intermediate container 7dc71cdf0f87
Successfully built 96ef55dd9fc9

打包成功。

接下来,看看我们打包好的镜像。

[root@localhost publish]# docker images
REPOSITORY                       TAG                 IMAGE ID            CREATED              SIZE
demo-netcore                     latest              96ef55dd9fc9        About a minute ago   322.8 MB
docker.io/microsoft/aspnetcore   1.1                 983c2fe9cbef        23 hours ago         305.1 MB
[root@localhost publish]#

因为,刚打包的镜像demo-netcore是基于docker.io/microsoft/aspnetcore镜像的,所以在打包demo-netcore的过程中,会优先从镜像库中拉取docker.io/microsoft/aspnetcore镜像。至此,我们的第一个docker镜像就打包成功了。接下来,在容器中运行镜像。

五、运行docker容器

docker run --name demo  -p 8080:80 demo-netcore:latest

其中,demo是制定容器的名称,-p是进行宿主和容器之间端口的映射,(-p 宿主端口:容器端口),

 执行完以上命令后,正常情况下,会出现如下内容:

Hosting environment: Production
Content root path: /publish
Now listening on: http://+:80
Application started. Press Ctrl+C to shut down.

这表明,你的asp.net core程序已经成功在docker容器中运行,监听端口为80。这个80指的是容器的端口,以上信息都是在容器中执行的结果输出。它会提示,按Ctrl+C终止当前应用程序。如果在执行docker run的时候,加上 -d命令,这样容器就会一直运行,即使关掉终端窗口。于是,我们想让docker程序一直运行,以上命令可以修改为:

docker run --name demo -d -p 8080:80 demo-netcore:latest

检验docker容器是否运行成功,执行如下命令:

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE                 COMMAND             CREATED                                                      STATUS              PORTS                            NAMES
1abf4952db5b        demo-netcore:latest   "dotnet demo.dll"   About a minute ago                                           Up About a minute   8080/tcp, 0.0.0.0:8080->80/tcp   demo

以上信息可以看到,容器ID,容器名称,命令,镜像名称,

由于,我再dockerfier文件中,配置宿主的端口为8080,那么我们访问容器中的asp.net core程序时,需要通过8080端口访问,完成以上步骤,接下来让我们看下结果吧!浏览器打开http://localhost:8080或者执行

wget http://localhost:8080

docker

第一个asp.net core docker应用运行起来了!

以下,是在本次操作中,常用的几个docker命令。

#生成镜像
docker build -t demo-netcore .

#运行容器
docker run --name demo  -p 8080:80 demo-netcore:latest


#删除所有容器进程
docker rm $(docker ps -a -q)

#删除一个镜像
docker rmi 镜像ID

#查看所有镜像
docker images

关于怎样把本地镜像推送到hub.docker.com,请访问我的另一篇博客《推送docker 镜像到hub.docker.com》

docker

© 著作权归作者所有

共有 人打赏支持
李朝强
粉丝 80
博文 269
码字总数 137880
作品 0
郑州
产品经理
加载中

评论(1)

这个男人有点坏
这个男人有点坏
写的不错,受教了!!!
ASP.NET Core 网站在Docker中运行

Docker作为新一代的虚拟化方式,未来肯定会得到广泛的应用,传统虚拟机的部署方式要保证开发环境、测试环境、UAT环境、生产环境的依赖一致性,需要大量的运维人力,使用Docker我们可以实现一...

26度出太阳 ⋅ 2017/04/20 ⋅ 0

.NET Core+MySql+Nginx 容器化部署

1. 引言 上两节我们通过简单的demo学习了docker的基本操作。这一节我们来一个进阶学习,完成ASP.NET Core + MySql + Nginx的容器化部署。 本文是基于CentOS 7.4环境进行演示,示例项目可以访...

dotNET跨平台 ⋅ 01/11 ⋅ 0

ASP.NET Core 应用在Linux上如何运行

ASP.NET Core 应用如何运行在 Linux (以下以ubuntu 14.04为例)平台上,首先要确保按照 官方指导 安装 .NET Core 运行环境。然后按照以下几种步骤发布并运行应用。 一、复制发布 使用命令 ...

鼎六智能 ⋅ 2016/10/17 ⋅ 0

ASP.NET Core 2.1 使用Docker运行

1.新建一个 ASP.NET Core 2.1 项目 然后运行一下项目,确保我们刚刚建立的项目可以正常运行。 2.编写 Dockerfile 新建一个文本文件,命名为 这里我们需要用到官方的镜像: 如果要尝试更小的镜...

晓晨master ⋅ 06/20 ⋅ 0

农码一生/Hi-Blogs

Hi-Blogs 嗨博客,基于ASP.NET Core2.0的跨平台的免费开源博客系统 演示地址:https://haojima.net/ 意见和建议:https://github.com/zhaopeiym/Hi-Blogs/issues 使用到的相关平台、技术和工...

农码一生 ⋅ 2015/09/24 ⋅ 0

Docker & Consul & Fabio & ASP.NET Core 2.0 微服务跨平台实践

相关博文: Ubuntu 简单安装 Docker Mac OS、Ubuntu 安装及使用 Consul Consul 服务注册与服务发现 Fabio 安装和简单使用 阅读目录: Docker 运行 Consul 环境 Docker 运行 Fabio 环境 使用 ...

那谁爸爸 ⋅ 01/08 ⋅ 0

把旧系统迁移到.Net Core 2.0 日记(1) - Startup.cs 解析

因为自己到开发电脑转到Mac Air,之前的Webform/MVC应用在Mac 跑不起来,而且.Net Core 2.0 已经比较稳定了。 1. 为什么会有跨平台的.Net Core 近年来,我们已经进入云计算时代,在云平台的P...

dotNET跨平台 ⋅ 04/16 ⋅ 0

centos通过Jexus部署dotnetcore .net程序

什么是Jexus Jexus是一款Linux平台上的高性能WEB服务器和负载均衡网关,以支持ASP.NET、ASP.NET CORE、PHP为特色,同时具备反向代理、入侵检测等重要功能。可以这样说,Jexus是.NET、.NET CO...

yzy121403725 ⋅ 05/04 ⋅ 0

ASP.NET CORE做的网站运行在docker上(不用dockerfile文件部署)

按网上的做法用dockerfile文件是可以弄得出来的,http://www.docker.org.cn/article/119.html, 不过我想把网站文件放在外面硬盘目录,再映射进去,这样只要在硬盘目录中修改CSHTML文件后重启...

niunan ⋅ 2017/07/23 ⋅ 0

Centos7 系统下搭建.NET Core2.0+Nginx+Supervisor+Mysql环境搭建

一、简介 一直以来,微软只对自家平台提供.NET支持,这样等于让这个“理论上”可以跨平台的框架在Linux和macOS上的支持只能由第三方项目提供(比如Mono .NET)。直到微软推出完全开源的.NET ...

MrXiong2017 ⋅ 2017/09/06 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CENTOS7防火墙命令记录

安装Firewall命令: yum install firewalld firewalld-config Firewall开启常见端口命令: firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --zone=public --add-po......

cavion ⋅ 49分钟前 ⋅ 0

【C++】【STL】利用chromo来测量程序运行时间与日志时间打印精确到微秒

直接上代码吧,没啥好说的。头疼。 #include <iostream>#include <string>#include <ctime>#include <sstream>#include <iomanip>#include <thread>#include <chrono>using ......

muqiusangyang ⋅ 52分钟前 ⋅ 0

Mac环境下svn的使用

在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境。在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装任何第三方软件的前提下使用svn功能,不过还需做一下简...

故久呵呵 ⋅ 今天 ⋅ 0

破解公司回应苹果“USB限制模式”:已攻破

本周四,苹果发表声明称 iOS 中加入了一项名为“USB 限制模式”的功能,可以防止 iPhone 在连接其他设备的时候被破解,并且强调这一功能并不是针对 FBI 等执法部门,为的是保护用户数据安全。...

六库科技 ⋅ 今天 ⋅ 0

MyBtais整合Spring Boot整合,TypeHandler对枚举类(enum)处理

概要 问题描述 我想用枚举类来表示用户当前状态,枚举类由 code 和 msg 组成,但我只想把 code 保存到数据库,查询处理,能知道用户当前状态,这应该怎么做呢?在 Spring 整合MyBatis 的时候...

Wenyi_Feng ⋅ 今天 ⋅ 0

synchronized与Lock的区别

# <center>王梦龙的读书笔记第一篇</center> ## <center>-synchronized与Lock的区别</centre> ###一、从使用场景来说 + synchronized 是能够注释代码块、类、方法但是它的加锁是和解锁使用一......

我不想加班 ⋅ 今天 ⋅ 0

VConsole的使用

手机端控制台打印输出,方便bug的排查。 首先需要引入vconsole.min.js 文件,然后在文件中创造实例。就能直接使用了。 var vConsole = new VConsole(); vConsole的文件地址...

大美琴 ⋅ 今天 ⋅ 0

Java NIO之字符集

1 字符集和编解码的概念 首先,解释一下什么是字符集。顾名思义,就是字符的集合。它的初衷是把现实世界的符号映射为计算机可以理解的字节。比如我创造一个字符集,叫做sex字符集,就包含两个...

士别三日 ⋅ 今天 ⋅ 0

Spring Bean基础

1、Bean之间引用 <!--如果Bean配置在同一个XML文件中,使用local引用--><ref bean="someBean"/><!--如果Bean配置在不同的XML文件中,使用ref引用--><ref local="someBean"/> 其实两种......

霍淇滨 ⋅ 今天 ⋅ 0

05、基于Consul+Upsync+Nginx实现动态负载均衡

1、Consul环境搭建 下载consul_0.7.5_linux_amd64.zip到/usr/local/src目录 cd /usr/local/srcwget https://releases.hashicorp.com/consul/0.7.5/consul_0.7.5_linux_amd64.zip 解压consu......

北岩 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部