.NET Core容器化开辟系列(一)——Docker内里跑个


玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。

媒介

    博客园中已有许多如安在Docker内里运转ASP.NET Core的引见了。本篇重要引见一些细节,资助初学的同伙越发深切地明白如安在Docker中运转ASP.NET Core。


装置Docker

    Docker现支撑在主流Linux、Windows和macOS上装置,官方的装置文档请参考docker docs。鉴于国内的收集情况,发起经由历程国内大厂/高校供应的镜像站疾速装置,好比 阿里巴巴开源镜像站,Ubuntu和Centos7上的装置体式格局以下:


Ubuntu 14.04 16.04 (运用apt-get举行装置)

# step 1: 装置须要的一些体系对象
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 装置GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并装置 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce

# 装置指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
#   docker-ce | 17.03.1~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
#   docker-ce | 17.03.0~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 装置指定版本的Docker-CE: (VERSION 比方上面的 17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]

CentOS 7 (运用yum举行装置)

# step 1: 装置须要的一些体系对象
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 增加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并装置 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker效劳
sudo systemctl enable docker && systemctl start docker

# 注重:
# 官方软件源默许启用了最新的软件,您能够经由历程编纂软件源的体式格局猎取各个版本的软件包。比方官方并没有将测试版本的软件源置为可用,你能够经由历程以下体式格局开启。同理能够开启种种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
#   将 [docker-ce-test] 下方的 enabled=0 修改成 enabled=1
#
# 装置指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
#   Loading mirror speeds from cached hostfile
#   Loaded plugins: branch, fastestmirror, langpacks
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable
#   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
#   Available Packages
# Step2 : 装置指定版本的Docker-CE: (VERSION 比方上面的 17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]

    以下我的试验在Centos7中举行,其他体系基本相似。

装置完成后,能够看到最新Docker版本为18.09(2018年12月27日)


结果0X01

既然Docker装置好了,也一般运转起来了,我们第一件事儿做的就是运转一下Demo,看看是个甚么结果,微软将dotnet的Docker镜像都托管在Docker Hub上,我们能够翻开Docker Hub的官方网站:https://hub.docker.com 并直接搜刮dotnet,找到microsoft/dotnet便可。

依据Wiki提醒,我们运用以下敕令运转第一个ASP.NET Core的Demo:

docker run -it --rm -p 8000:80 --name aspnetcore_sample microsoft/dotnet-samples:aspnetapp

运转后输出:

[root@singleCentos7 ~]# docker run -it --rm -p 8000:80 --name aspnetcore_sample microsoft/dotnet-samples:aspnetapp
Unable to find image 'microsoft/dotnet-samples:aspnetapp' locally
aspnetapp: Pulling from microsoft/dotnet-samples
a5a6f2f73cd8: Pull complete 
1e6f560accc2: Pull complete 
8176b77dc10d: Pull complete 
e21dd5015bb0: Pull complete 
10a7ec297783: Pull complete 
52c4b3af04fb: Pull complete 
Digest: sha256:de388b1ced92eadb906f806d0253d93c76cb92b0814798e7441c014b9645a32c
Status: Downloaded newer image for microsoft/dotnet-samples:aspnetapp
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
      No XML encryptor configured. Key {024f9978-2fea-4d8e-818a-b9a378553244} may be persisted to storage in unencrypted form.
Hosting environment: Production
Content root path: /app
Now listening on: http://[::]:80
Application started. Press Ctrl C to shut down.


简朴解释一下敕令中几个罕见的参数:

-it 开启一个交互窗口,也急运转docker后,处于docker的交互式输入输出页面

--rm 当从运转的容器中退出(ctrl c)时,删除镜像残留信息及数据

-p 端口映射,将宿主机端口映射到容器内端口

--name 给容器起个名字,如不设置该项,容器称号将有docker效劳随机设定

末了是镜像的地点和tag


运转该段敕令后:

起首查询宿主机当地是不是存在microsoft/dotnet-samples:aspnetapp镜像

如不存在,则从远端拉取镜像

拉取胜利后,运转指定敕令,将Demo效劳运转起来


此时我们在局域网的恣意一台电脑浏览器中输入http://[宿主机IP]:8000 便可翻开容器运转的demo

结果0X02

看完官方的Demo,接下来我们克己一个DemoV2 。该思绪接纳将Docker容器转制为镜像的设施,因该要领扩展性不强,不合适重复运用,因而不被引荐,但个中的局部思绪异常合适自创进修:

docker run -it --rm --name dotnet_sdk microsoft/dotnet:sdk

接下来我们在tmp目次下新建一个ASP.NET Core MVC项目,并宣布该项目都/app目次下


此时我们进入/app目次后,实行敕令,便可看到demo1已能在容器中一般运转:

cd /app && dotnet demo1.dll

接下来我们运用docker commit敕令将当期容器转制为镜像,以便于我们重复运用。

起首,新开一个宿主机终端,并在终端中检察当期运转的容器:

docker ps

能够发明称号为dotnet_sdk的容器,其容器Id为9bc83a01a0d1,此时实行以下敕令:

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。-
docker commit 9bc83a01a0d1 mydemo:v1

便可将指定容器生存为称号为mydemo的镜像,实行docker images检察:

包罗我们demo顺序的镜像就已生存下来了,接下来我们能够直接运转该镜像检察结果:

docker run -it --rm -p 8001:80 --name ggg mydemo:v1 sh -c "cd /app && dotnet demo1.dll"

翻开浏览器接见结果:


结果0x03

接下来我们用最罕见也是最合适的体式格局制造我们的.NET Core MVC镜像---Dockerfile

若是我们愿望在Linux下直接最先.NET Core的代码编写,起首就必须要装置平台相干的.Net Core SDK,装置完成后,才能够运用dotnet 的相干指令建立、编译、宣布项目。此时我们能够在Docker下接纳更“鸡贼”一些的设施:

起首,我们运转一个.Net Sdk的容器,并进入交互式界面:

docker run -it --rm --name dotnet_sdk -v /tmp/src:/tmp/src  microsoft/dotnet:sdk

运转.Net Core最新的SDK,并将宿主机/tmp/src 文件夹挂在到容器/tmp/src下面,然后我们在这个文件夹的文件都不会因容器烧毁二丧失。

检察容器中dotnet版本信息,并在容器的/tmp/src文件夹下建立新的ASP.NET Core MVC项目:

cd /tmp/src
dotnet new mvc -n mydemo


此时能够退出以后容器了,接下来进入的是Docker的打包步调。

虽然这类做法有点“弄巧成拙”,但在某些时候照样挺有效的,好比体系中存在老版本的.NET Core SDK,装置新版本的SDK可能会发生未知的题目,此时在Docker内里瞎玩,随意搞都没题目,棒呆!


同时有须要再强调一下,Docker从17.05版本最先支撑“多阶段构建(multi-stages builds)”,而大多数清洁的Linux操作体系在直接运用体系包管理器装置docker时装置的是13.1的版本Docker,是不支撑该特征的。

下面引见的形式是分层构造的构建体式格局。

在宿主机/tmp/src/mydemo下新建Dockerfile文件,输入以下内容:

FROM microsoft/dotnet:2.2-runtime AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/dotnet:2.2-sdk AS publish
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "mydemo.dll"]


该剧本一共分3次,第一次界说了基本镜像,并设置/app为基本事情目次,示知外部80为开放端口

第二次,将当期目次下的一切文件发送给Docker效劳,实行宣布历程,将宣布输出到/app文件夹下

第三次,接纳第一次的镜像基本作为当期镜像,并将第二次宣布输出拷贝到以后基本事情目次/app

末了设置事情进口,当镜像运转时,实行dotnet mydemo.dll

经由历程docker images敕令能够看到方才打包出的镜像


接下来我们实验将镜像运转起来:

docker run -it --name mydemo -p 8002:80 mydemo:v1

胜利!



此次漫笔重要引见了在Docker内里怎样运转一个.NET Core项目的Demo,发起人人在进修Docker时,对怎样誊写Dockerfile多下点工夫,明白内里的基本敕令关键词。


-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。