Asp.NetCore轻松学-使用Docker进行容器化托管

前言

没有 docker 部署的程序是不完整的,在写了 IIS/Centos/Supervisor 3篇托管介绍文章后,终于来到了容器化部署,博客园里面有关于 docker 部署的文章比比皆是,做为硬核实战派,这里作的必定是一套打完带走的功法。本文使用的学习机器是由 Azure 倾情提供的 30 天试用版本,你们均可以申请的哈。linux

1. 为何要使用 docker

1.1 docker 介绍

docker 带来的好处是显而易见的,使用 docker 能够在同一台服务器上部署多个版本的应用,彼此间不会引发冲突,更快的迁移过程,当须要增长服务实例的时候,只须要下载 docker 镜像便可部署运行,无需担忧环境初始化等一系列前置工做,目前使用 docker 基于阿里云弹性计算的应用已经很是普遍,docker 容器内部就是一个独立的虚拟机,在容器中,你能够作一切你想作的工做,好比测试、代码编译,基于容器的版本回滚也很是的方便;有人说,使用了 docker 而没有使用容器编排的话是没有意义的;朋友们,不要听人云亦云, docker 的存在,本意并不是面向大型应用,如今大量的微服务化就已经证实了 docker 是一个小巧、灵活的载体,因此,在单体应用中使用 docker 也是很是有必要的。git

1.2 应用举例

举个例子,某外包公司为某企业开发了一款基于图像识别的程序套件,最初部署上线是使用 .NET Core 1.0 ,而因为技术迭代和业务的发展,甲方要求该套件必须升级到 .NET Core 2.0+,而该套件程序目前运行于正式环境中,且不能停机,这就是传说中的给飞行中的飞机换引擎;首先,在当前正式环境安装 .NET Core 2.0 风险较大,谁也不能保证没有兼容性问题;其次,使用另一台服务作 .NET Core 2.0 的升级方案,可是该方案的缺点是须要增长服务器、且须要调整反向代理配置;开发方结合现实,给出 docker 部署升级的方案,经过容器化部署,对现有生产环境几乎就是零影响,且无需增长服务器和修改反向代理配置。github

2 Centos 服务器安装前置条件

2.1 安装 docker-ce

参考:https://docs.docker.com/install/linux/docker-ce/centos/docker

$ sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

添加包源centos

sudo yum-config-manager \
   --add-repo \
   https://download.docker.com/linux/centos/docker-ce.repo

开始安装 docker-ce安全

sudo yum install docker-ce docker-ce-cli containerd.io

安装完成,输入bash

docker --version

  • 表示安装成功,可是仅仅是安装成功,截至目前, docker 尚未启动,咱们还须要手动启动 docker 服务,输入下面的命令
sudo systemctl start docker

*测试运行服务器

sudo docker run hello-world

看上图红框处的两个消息,当输入命令 sudo docker run hello-world,docker 检查到本地仓库没有名称为:hello-world 的镜像,立刻从官方仓库中拉取了该镜像,而后执行,hellow-world 执行后输出信息在红框 2 处,表示您安装的 docker 程序已经安装成功并成功使用容器运行。app

2.2 使用安装脚本安装 docker

好消息是,当你对上面的一堆命令很是茫然的时候,docker 官方提供了一份安装脚本,能够一键安装 docker ,地址在:https://github.com/docker/docker-install,注意使用该脚本的权限,而且始终验证脚本的合法性微服务

3. 开始使用 Dockerfile

3.1 为 .NET Core 应用程序编写 Dockerfile 文件

为了将 .NET Core 应用程序进行容器化,咱们须要为程序编写一个 Dockerfile 文件,正如其名称同样,该文件的名字也须要命名为 Dockerfile,,而后将其放入程序根目录下,仍是以以前的 Deploy.Linux 程序为例子,在 Deploy.Linux 根目录下建立 Dockerfile

咱们有两种建立 Dockerfile 文件的方式

经过开发工具 visual studio 右键点击项目:添加-> Docker 支持

或者手动建立该文件,一个标准的 Dockerfile 以下

FROM microsoft/dotnet:2.2-sdk #这是第一个指令,必须是 FROM 这里指定基础构建镜像
WORKDIR /app #工做目录,即程序运行根目录
COPY *.csproj ./ #复制文件到容器中
RUN dotnet restore #下载项目依赖项
COPY . ./ #将剩余文件复制到容器中
RUN dotnet publish "Deploy.Linux.csproj" -c Release -o /app #发布容器中的项目到 容器中 /app 目录
ENTRYPOINT ["dotnet", "Deploy.Linux.dll"] #运行镜像入口命令和可执行文件名称
3.2 构建镜像

建立完 Dockerfile 文件后,将项目文件 copy 到服务器上,定位到目录 Deploye.Linux ,执行如下命令

sudo docker build -t demo .
  • 注意:上面这条命令后面的小数点不是笔误,是必须的!

看到输出结果提示:Successfully tagged demo:latest 表示镜像构建成功

输入命令查看仓库中的镜像,能够看到 demo 镜像已经安静的躺在那里等待咱们去开发了

sudo docker images

3.3 运行镜像

如今,能够输入命令运行咱们刚刚建立的 demo 镜像了

sudo docker run -d -p 80:80 -e  --name demo demo:latest . -v /data/logs/demo:/data/logs/demo

如今你们打开我 Azure 云主机的地址访问:http://139.219.9.102/(学习机器,可能会过时) ,目前运行的程序正是基于 dokcer 容器的实例

很是开心,使用 docker 进行容器化部署成功!!!

4. 扩展的 docker 学习

当咱们成功部署第一个 docker 应用后,后续的问题也随之而来了,好比更新,这个是没法回避的问题,从部署完成的那一刻开始就如影随形,因此,学习其它的 docker 命令是很是有必要的

4.1 更新程序

容器化部署的每一次更新都伴随着下面的步骤,久而久之,生生不息

*步骤说明
一、编译
二、打包
三、发布
四、运行

咱们能够把这些步骤都整合成一份脚本文件,每次都去执行该脚本便可,方便又安全,当后续引入 Jenkins 进行自动化构建以后,咱们直接把该脚本迁移到 Jenkins 中便可,仍是以当前的实例 Deploy.Linux 为例子,编写 demo.sh 脚本文件以下:

sudo docker build -t demo . #开始执行Dockerfile进行构建
sudo docker images -a #列出现有仓库的镜像列表
sudo docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop #查找并中止镜像
sudo docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm #移除已中止的镜像
sudo docker images -q -a | xargs docker inspect --format='{{.Id}}{{range $rt := .RepoTags}} {{$rt}} {{end}}'|grep -v ':' #移除悬空镜像,没起做用,求指导
sudo docker ps -a #列出全部实例
sudo docker stop demo #中止demo实例
sudo docker rm demo #移除demo实例
sudo docker run -d -p 80:80 --name demo demo:latest . -v /data/logs/demo:/data/logs/demoo docker run -d -p 80:80 -e  --names demo demo:latest . -v /data/logs/demo:/data/logs/demo #指定demo镜像,运行demo实例

为了使用脚本,咱们必须为 docker 用户赋予 root 用户组权限,不然 docker 无权执行中止实例等操做,执行下面的命令

sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo service docker restart
newgrp - docker

好了,如今能够愉快的执行脚本了,使用下面的命令执行一键构建镜像

sudo sh demo.sh

4.2 进入镜像

进入运行中的容器的方法有多种,掌握一种足够,在控制台输入命令

sudo docker exec -it demo /bin/bash

在容器内部使用命令和在 Centos 系统中同样,能够看到咱们 demo 程序的执行目录 /app

结束语

经过本文,咱们学习了如下内容

一、在 Centos 中安装 docker 二、编写 Dockerfile 文件 三、在容器中构建 .NET Core 程序 四、编写自动化构建脚本,为迁移到 Jenkins 作准备 五、学习了一些基本的 docker 扩展命令

相关文章
相关标签/搜索