.NET Core Web 应用部署到 Docker 中运行
环境介绍 :
虚拟机:VirtualBox 5.1.6
系 统:Ubuntu 16.04.1 LTS
系统准备完成后可以使用 sudo apt-get udpate 和 sudo apt-get upgrade 对系统进行更新,然后打开 https://www.microsoft.com/net/core#ubuntu 这个网址,在ubuntu系统中安装 .net core 运行环境。直接复制/粘贴给出的命令就可以了。
安装 Docker:
什么是 Docker ? 这里面就不介绍了,直接打开 https://www.docker.com/what-docker 看吧或自行 google 中文的介绍。
Docker 的安装其实也是使用官方提供的 step by step 安装步骤。如果不想看介绍可以直接使用下面我整理的命令:
//顺序执行这些命令:
sudo apt-get install apt-transport-https ca-certificates
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
//打开 /etc/apt/sources.list.d/docker.list 这个文件,如果不存在就创建一个(sudo touch docker.list)
//在 docker.list 中输入下面这一行内容
deb https://apt.dockerproject.org/repo ubuntu-xenial main //接着执行命令
sudo apt-get update
sudo apt-get purge lxc-docker
apt-cache policy docker-engine
sudo apt-get update
sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
sudo reboot //重启系统
sudo apt-get update
sudo apt-get install docker-engine
sudo service docker start
上面的命令执行后,一定要看一下响应的结果,有些会提示是不用更新的,忽略即可。接下来我们执行一下经典的 hello-world.命令如下:
sudo docker run hello-world
执行这个命令,首先会从 docker 的镜像仓库(https://hub.docker.com/)中拉取名为 hello-world 的镜像,然后在本地运行。运行成功之后,我们会看到 hello world 输出。
这里说一下,docker 提供了一个集中管理镜像的地方,即 https://hub.docker.com/,在这里我们可以找到自己想要的基础镜像,当然我们也可以把自己制作的镜像推送到 docker 的镜像仓库中,前提是注册一个自己的 docker hub 账号。
Pull .NET Core image:
docker 安装成功后,我们就去 docker hub 中找由 Microsoft 维护的 dotnet core 基础镜像(https://hub.docker.com/r/microsoft/dotnet/),执行下面的命令将镜像拉取到本地:
docker pull microsoft/dotnet
等待镜像拉取到本地之后,我们运行下面的命令并查看 dotnet core 环境是否正常(这里其实是多余的,MS 怎么可能给一个不能用的镜像呢?):
docker run -it microsoft/dotnet /bin/bash
这是进入到容器中的命令行。然后我们输入 dotnet --version 查看到当前镜像内的 dotnet CLI 版本号为:1.0.0-preview2-003131。输入 exit 回车 退出容器。
好吧,现在 dotnet core 的 docker 镜像也有了。
创建 ASP.NET Core Web 应用:
文章开头说了我已经在 Ubuntu 虚拟机中也安装了 dotnet core 环境。使用下面的 dotnet CLI 命令创建一个 ASP.NET Core Web 应用并尝试运行:
mkdir web_2
cd web_2/
dotnet new -t web
dotnet restore
dotnet run
我们尝试运行,并看到运行成功。接下来使用 dotnet publish 将应用发布,默认发布到了 bin/Debug/netcoreapp1.0/publish/ 这个目录。
注:这里发布的时候,如果不修改 project.json 里面的 scripts 节点,将会用到 node.js ,可以将 prepublish 暂时注释掉,或者安装一下 node.js 并用 npm(安装完 node.js 自带的) 安装 gulp bower 这些包。
命令:npm install -g gulp bower
编写 Dockerfile:
在应用根目录创建一个名为 Dockerfile 的文件(命令:touch Dockerfile)接下编辑 Dockerfile(命令:vi Dockerfile),输入下面的内容:
# 声明使用的基础镜像
FROM microsoft/dotnet:latest
# 将本地dotnet core 应用拷贝到 容器 /app/ 目录下
COPY bin/Debug/netcoreapp1./publish/ /app/
# 设置工作目录
WORKDIR /app
# 设置导出端口
EXPOSE /tcp
# 指定应用入口点
ENTRYPOINT ["dotnet", "/app/web_2.dll"]
完成 Dockerfile 的编写,接下来构建一个镜像。
命令:docker build -t web_2 .
不要忘记 web_2 后面的那个点。镜像构建完成之后,我们就来运行试试吧。
命令:docker run -it -p 5000:5000 web_2
这里说一下 -it 是指:进入临时交互模式
-p 5000:5000 是指将容器的 5000 端口映射到 Docker 宿主机的 5000 端口
web_2 是指刚才我们构建的镜像。
看到临时交互命令行,显示运行成功。我的 Ubuntu 的 IP 是 192.168.10.107。我们用浏览器访问一下 http://192.168.10.107:5000 。坏了,什么也没有显示,查看 http 状态码为 500 ,这说明是应用报错了。经过排查发现是 dotnet core web 应用引用类库的版本问题。大家知道前两天发布了 dotnet core 1.0.1,我就在 project.json 里面发现我通过 dotnet CLI 创建的应用已经在使用 1.0.1 版本的类库了。但是基础镜像 microsoft/dotnet 中还是 dotnet 1.0.0 的类库。好吧,知道了问题了,就来修改 project.json 中引用的版本吧。将 1.0.1 改为 1.0.0。再次执行 dotnet restore 和 dotnet publish。然后后重新构建 docker 镜像并运行。哇,成功了!
总结:
通过上面的介绍,我们体验了在 docker 中运行 .net core web 应用。一步一步执行下来发现都是通过命令行安装各种执行环境,有 dotnet core 运行环境,有 docker 运行环境,有 node.js 运行环境。与编码人员的关系并不是太大。有时候按着 step by step 走,结果发现走不通,这个时候我们就要仔细分析给出的错误描述是什么,一步一步的找到问题所在,并解决掉。
不过我们想想上面的这些步骤自动化之后,将是一种怎么样的体验?我们来畅想一下。每次开发人员编写完代码提交后,通过 CI 工具,自动构建应用并自动发布,完了再自动构建 docker 镜像并运行。测试通过后,直接将镜像用于生产环境。再进行回归测试。
.NET Core Web 应用部署到 Docker 中运行的更多相关文章
- .net core web api部署到docker
一.创建.net core web api 的Demo 修改部分代码 端口随意指定,ip用星号“*”,方便接下来docker虚拟网络自动分配ip 下一步是Dockerfile文件,如果发现你的项目中没 ...
- Asp.Net Core WebAPI+PostgreSQL部署在Docker中
PostgreSQL是一个功能强大的开源数据库系统.它支持了大多数的SQL:2008标准的数据类型,包括整型.数值值.布尔型.字节型.字符型.日期型.时间间隔型和时间型,它也支持存储二进制的大对像, ...
- .NET Core 3.0 部署在docker上运行
自从.NET Core3.0发布之后,写了几篇关于.NET Core 3.0的文章,有助于你快速入门.NET Core3.0. 本篇文章主要讲解如何一步步创建一个mvc项目,然后发布并部署在Docke ...
- [Linux之旅一] .NET Core 2.2部署到Docker中
第一步,使用VS2017或者VS2019创建.NET Core 2.2或3.1的项目,如下图: 在创建项目的时候记得勾选Docker支持,这样会自动创建Dockerfile文件,这个文件用于构建Doc ...
- ASP.NET Core 网站在Docker中运行
Docker作为新一代的虚拟化方式,未来肯定会得到广泛的应用,传统虚拟机的部署方式要保证开发环境.测试环境.UAT环境.生产环境的依赖一致性,需要大量的运维人力,使用Docker我们可以实现一次部署, ...
- 在docker中运行ASP.NET Core Web API应用程序
本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Cor ...
- docker中运行ASP.NET Core Web API
在docker中运行ASP.NET Core Web API应用程序 本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过 ...
- .net core Ocelot实现API网关并部署在docker中
基于Ocelot(http://ocelot.readthedocs.io)搭建的API网关demo 软件以及系统版本: Asp.Net Core 2.2 Ocelot 13.5.0 CentOS ...
- 把ABP框架部署到Docker中
本文旨在将Abp项目部署到Docker容器中,借助Gitee存储,Jenkins持续构建,利用Docker Compose生成镜像.启动镜像,在官网给定的Abp项目中,虽然用到了Dockerfile. ...
随机推荐
- myeclipse2015CI Server显示derby服务器去除方法
找到myeclipse的安装目录 myeclipse2015CI\configuration\org.eclipse.equinox.simpleconfigurator 打开文件bundles.in ...
- 51nod 1180 方格射击游戏
M*N的方格矩阵,一个人在左下角格子的中心,除他所站位置外,其他格子的中心都有一个敌人,他一次可发射一枚子弹干掉一条直线上的所有敌人,问至少要发射多少子弹才能干掉所有敌人. Input 输入2个数m, ...
- linux c 获取头文件函数getenv
#include <stdio.h>#include <stdlib.h> int main(){ printf("%s\n", getenv(" ...
- 学习opencv
图像缩放 cv::Mat src_img = cv::imread(); ; cv::Mat dst_img1; cv::Mat dst_img2(src_img.rows*0.5, src_img. ...
- 用delphi实现rar文件的解压的方法
http://blog.csdn.net/ad_home/article/details/2818936 准备工作 下载winrar提供的动态链接库unrar.dll http://w ...
- datetime
DateTime字段类型对应的时间格式是 yyyy-MM-dd HH:mm:ss.fff ,3个f,精确到1毫秒(ms),示例 2014-12-03 17:06:15.433 . DateTime2字 ...
- Laravel学习笔记(三)数据库 数据库迁移
该章节内容翻译自<Database Migration using Laravel>,一切版权为原作者. 原作者:Stable Host, LLC 翻译作者:Bowen Huang 正文: ...
- XE7 & IOS开发之开发账号(1):开发证书、AppID、设备、开发授权profile的申请使用,附Debug真机调试演示(XCode所有版本通用,有图有真相)
网上能找到的关于Delphi XE系列的移动开发的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 注意,以下讨论都是以&q ...
- 仅个人兴趣,自己通过搜索他人的成果,结合自己的理解,来分析discuz的代码。
仅个人兴趣,自己通过搜索他人的成果,结合自己的理解,来分析discuz的代码. discuz 版本: 3.2
- SQL Server 数据库备份
declare @filename varchar(1024) declare @SQLDB varchar(50) declare @path varchar(1024) set @path = N ...