系统环境:win10专业版 64位

开发环境:VS2017  .Net core 2.2

前言

为什么需要Docker

为什么要用Docer,需要从目前软件行业的痛点来讲

1)软件更新发布及部署低效,过程繁琐且需要人工介入

2)环境一致性难以保证

3)不同环境之间迁移成本太高

举个通俗易懂的例子

如果我的系统重新安装了,我需要重新部署运行程序所需要的环境,需要安装所需的多个安装包、配置相关的环境变量等。还有就是,项目程序在开发环境下运行没有问题,但是如果切换到测试或者生产环境下,经常会出现各种问题,导致程序无法运行。使用docker,直接拉取一份镜像(各种环境都配好了),将镜像运行起来,把程序发布包丢进去就好了。

Docker可以干什么

 1)构建容易分发简单

 2)隔离应用解除依赖

 3)快速部署测完就销

举个简单例子,隔离应用

比如我写了两个应用(网站),这两个应用部署在同一台服务器上, 如果一个应用出现了问题,导致CPU占100%,那另一个应用也会受到关联。这两个应用是完全不同技术栈的应用,比如一个PHP,一个.NET。这两个应用各种的依赖软件都安装在同一个服务器上,可能就会造成各种冲突/无法兼容,这可能调试就非常麻烦了。

Docker就可以解决应用隔离的问题

Docker应用场景

1.本地依赖(Local Dependency)

你需要在本地系统快速尝试 Magento,或者为一个项目使用 MySQL?还是希望尝试大部分开源项目?那就使用 Docker 吧,它将帮你节省大量时间。Docker 能提升开发者的开发效率,让我们快速搭建开发环境。 开发环境的机器通常内存比较小,此前使用虚拟的时候,经常需要为开发环境的机器加内存,而通过 Docker 可以轻易的让几十个服务在 Docker 中跑起来。

2.搭建环境(Build Environment)

如果你希望构建源码,但发现没有准备好合适的环境。 那么使用 Docker是一个值得考虑的方案。毕竟如果使用传统的方法一个一个地安装软件,一大堆软件安装下来确实十分费时间,使用容器技术省时省力,何乐而不为?它能让你将运行环境和配置放在代码中然后部署,同一个 Docker 的配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度。这里有一个值得一看的例子: docker golang builder。

3.微服务(Microservices)

你在使用微服务吗?微服务架构将一个整体式的应用拆分成松耦合的单个服务。 那不妨考虑一下 Docker,你可以将每个服务打包为一个docker镜像并使用docker-compose 来模拟生产环境(checkout docker networks)。最开始实践的时候可能会比较费时费力,但长远地来看,最终将产生巨大的生产力。

4.自动测试(Automated testing)

试想这样一个问题,如何编写自动化的集成测试用例,这些测试用例无需花很长时间来开始运行,使用者也可轻松管理。这里不是指在 Docker 中运行测试用例,而是将测试用例与镜像紧密运行在一起。当你针对一个 docker 镜像编写测试用例时会有一个很大的优势。下面简单介绍一下我的测试流程:运行两个 docker 镜像(app + db),在 MySQL 启动时加载数据,并在 app docker 上使用 API。可查看此脚本以获取快速的示例。

5.部署过程(Deployment process)

你可以使用 docker 镜像进行自我部署。许多主流的主机提供商都支持托管 docker,如果你拥有一个具有 shell 访问权限的专用节点/vm,那么事情将变得更容易。只需要设置好docker,并在你想要的端口上运行你的镜像即可。

6.持续部署(Continuous Deployment)

都说 Docker 天生适合持续集成/持续部署,在部署中使用Docker,持续部署将变得非常简单,并会在进入新的镜像后重新开始。关于这个部分的自动化工作,现在已经有许多方案以供选择,Kubernetes就是一个耳熟能详的名字。Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。

7.多租户环境(Multi-tenancy)

Docker 有意思的一个使用场景是在多租户的应用中,它可以避免关键应用的重写。如果你将应用程序服务公开给多个租户(租户指一组用户,例如组织),使用单租户方案设计的应用程序如果用上了 sub-domain + docker 可以快速获得提供多租户的服务。 关于这个场景的一个例子是为物联网的应用开发一个快速、易用的多租户环境。这种多租户的基本代码非常复杂,很难处理,重新规划这样一个应用不但消耗时间,也浪费金钱。使用Docker,可以为每一个租户的应用层的多个实例创建隔离的环境,这不仅简单而且成本低廉,当然这一切得益于 Docker 环境的启动速度和其高效的 diff 命令。

8.来自一台机器的多个 APP(Multiple apps from one machine)

这与上面提到的微服务有些联系,但即使你没有使用微服务,只是提供服务,Docker仍可以很好地管理单个机器上的所有服务。你应该使用文件夹挂载来为每个基于数据的 docker 镜像保留数据。

9.扩容 QPS(Scaling QPS)

Docker 通过创建另一个容器来帮助你轻松地进行水平扩展。如果遇到巨大的高峰流量,Docker可以帮助你解决问题 —— 只需添加更多的机器并增加负载均衡器背后运行的容器数量。

前言参考文章:https://www.jianshu.com/p/2a873474e976

Docker环境部署

学习参考:https://www.runoob.com/docker/windows-docker-install.html

https://www.runoob.com/docker/docker-tutorial.html

系统环境:win10专业版

针对win10专业版系统,有专门的的docker安装包

开启Hyper-V

控制面板—程序—卸载程序—启用或关闭Windows功能

 

 

Docker下载安装

进入https://www.docker.com/get-started下载,在Docker Desktop选项卡中,选择windows版本进行下载

 

下载完成后,直接安装,等待安装完成后,点击close and restart 重启电脑 

 

 

电脑重启后,再次进入系统后,docker会自动启动

启动成功后,后弹出界面

 

cmd执行命令 docker version查看版本号

 

cmd执行docker run hello-world 测试镜像的载入

镜像加速

对于使用 Windows 10 的系统,在系统右下角托盘 Docker 图标内右键菜单选择 Settings,然后选择Docker Engine,在registry-mirrors中写入https://registry.docker-cn.com,配置完成后,点击apply&Restart 重新启动docker

 

注:镜像加速器地址

"https://registry.docker-cn.com",//docker中国区镜像

"http://hub-mirror.c.163.com",//网易镜像

"https://docker.mirrors.ustc.edu.cn"//中国科学技术大学镜像

Docker部署.Net Core程序

创建一个.net core 项目

以webapi为例

 

项目创建完成后

 

注:如果创建项目时,没有勾选“启用Docker支持”选项,可以在项目上 右击—添加—Docker支持 同样可以生成Dockerfile文件

编写Dockerfile文件

首先看一下自动生成的Dcokerfile文件内容

自动生成的Dockerfile内容可能会有一些错误,所以自己编写一份Dockerfile文件,修改后的Dockerfile内容为

# 使用运行时镜像
FROM microsoft/dotnet:2.2-aspnetcore-runtime-nanoserver-1803
# 设置工作目录
WORKDIR /app
# 把目录下的内容都复制到当前目录下
COPY . .
ENV ASPNETCORE_URLS http://+:1902
# 暴露1902端口
EXPOSE 1902
# 运行镜像入口命令和可执行文件名称
ENTRYPOINT ["dotnet", "DockerDemo.dll"]

 修改Dockerfile文件的属性,修改为始终复制

生成镜像

1、首先将webapi项目进行发布

2、在系统右下角托盘 Docker 图标内右键菜单选择 Switch to Windows containers(若不操作该步骤,那么在执行镜像生成命令时会出现 image operating system "windows" cannot be used on this platform的问题)

3、从Settings菜单设置一下镜像加速

4、cmd执行命令 docker build –t netcoredocker d:\DockerPublish 生成镜像

netcoredocer指镜像名称

d:\DockerPublish指项目发布目录

等待命令执行完成

5、docker images 查看创建的镜像

 

运行镜像

cmd执行命令 docker run --name=netcoredocker -p 1804:1902 -d netcoredocker

--name:指定容器名称

-p:指定端口映射,格式为:主机(宿主)端口:容器端口

-d后台运行容器,并返回容器ID

 

执行命令docker ps查看容器

 执行命令docker inspect netcoredoker 查看netcoredocker镜像的信息,从镜像信息NetworkSettings中查看运行容器ip地址 

 或者执行docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" netcoredocker命令,直接获取运行容器的ip地址

api接口运行验证

1、在浏览器中输入http://运行容器ip:容器暴露端口/api/values查看webapi

2、使用http://localhost:映射的主机端口/api/values查看webapi

 

 

如果需要更新webapi程序,则需要

1)执行命令 docker stop netcoredocker 停止在运行的netcoredocker容器

2)执行命令 docker rm netcoredocker 删除netcoredocker容器

3)执行命令 docker rmi netcoredocker 删除netcoredocker镜像

4)重新生成并运行镜像

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐