点击上方蓝字"小黑在哪里"关注我吧

  • 环境准备

  • Docker基础概念

  • Docker基础命令

  • Docker命令实践

  • 构建Docker镜像

    • Dockerfile

    • bulid & run

前言

Docker 是一个开源的应用容器引擎,它十分火热,如今几乎成为了后端开发人员必须掌握的一项技能。即使你在生产环境中可能用不上它,就算把它当作一个辅助开发的工具来使用,也是非常方便的。本文就介绍一下.Net  Core应用在Docker中的一些基本使用。

开始

环境准备

首先安装docker,去官网下载:https://www.docker.com/get-started

windows系统的话,默认win10(较新的版本更好,可以用wsl)。win7只能用Docker Toolbox,bug非常多,不建议使用。。。

windows/mac 直接下载对应的文件安装就可以(本文的系统环境是win10 2004版本。),linux可以通过命令来安装。关于安装,网上已经有很多资料了,就不多介绍。只是安装后有2个必要的设置需要注意一下:

  1. 镜像加速

    有很多提供免费加速服务的网站,可以自行搜索,我这里用的是阿里云。这个国内网络必须配置,不然镜像几乎拉取不下来。

  1. 镜像储存路径

默认docker的运行文件是在C盘,C盘空间不够的话,可以设置到别的盘。

新版本的windows Docker Desktop默认使用wsl运行:

这个设置比较麻烦,具体可以参考我之前的一篇:win10使用WSL 2运行Docker Desktop,运行文件从C盘迁移到其他目录。如果是老版本Hyper-V启动的话,界面上设置就可以。

Docker基础概念

docker中最重要的2个概念就是“镜像”和“容器”。

  • 镜像:

镜像(Image)就是一堆只读层(read-only layer)的统一视角。

  • 容器:

容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

要理解docker镜像和docker容器之间的区别,确实不容易。

想象一下,我们开发的一个asp.net mvc应用,使用Visual Studio将它发布出来后,会得到一堆发布后的文件,包含dll,cshtml,css,js,静态资源文件等等。那么这堆文件就类似于一个镜像,镜像是无法直接运行的。当我们把这堆文件挂载到IIS的一个站点上,就可以运行了,也能被外界访问了,这个IIS站点就类似是一个容器。容器相当于是镜像的一个运行实例,需要注意的是,容器的所有读写操作都只是针对容器的文件系统,并不会影响到镜像。一个镜像可以运行多个容器,容器之间是相互隔离的。

Docker基础命令

  • 镜像相关:

docker images:列出所有本地镜像。

docker rmi 镜像...|镜像ID...:删除本地镜像,可以同时指定多个。

docker build -t myimage:1.1 .:基于Dockerfile构建一个名为myimage,tag为1.1的镜像,结尾的 . 代表当前目录。

docker pull mcr.microsoft.com/mssql/server:2019-CU5-ubuntu-18.04:从微软镜像仓库中拉取tag为2019-CU5-ubuntu-18.04的sqlserver 2019镜像。

......

  • 容器相关:

docker ps:列出运行中的容器。

docker ps -a:列出所有的容器,包含未运行的。

docker run -it --rm -p 8080:80 --name mynginx nginx:使用镜像nginx创建并启动一个名为mynginx的容器;-it代表以交互模式启动,并为容器重新分配一个伪输入终端;-p指定端口映射,将容器的80端口映射到主机的8080端口;--rm代表容器停止时自动删除容器。

docker run -d -p 8080:80 -v /nginx/data:/data --name mynginx nginx:latest:使用镜像nginx(tag为latest)创建并启动一个名为mynginx的容器;-d代表以后台模式启动;-p指定端口映射,将容器的80端口映射到主机的8080端口;-v代表挂载卷,将主机的/nginx/data目录挂载到容器的 /data目录。

docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" -d -p 1433:1433 --name sqlserver2019 mcr.microsoft.com/mssql/server:2019-CU5-ubuntu-18.04:使用sqlserver镜像(tag为2019-CU5-ubuntu-18.04)创建并启动一个名为sqlserver2019的容器;-d代表以后台模式启动;-p指定端口映射,将容器的1433端口映射到主机的1433端口;-e是指定环境变量。

docker start/stop/restart 容器名...|容器ID...:分别是启动,停止,重启容器,可以同时指定多个。

docker rm 容器名...|容器ID... :删除容器,可以同时指定多个。

docker logs 容器名|容器ID:查看容器日志。

......

Docker命令实践

下面在docker中使用sqlserver2019镜像启动一个容器。

  1. 拉取镜像:

docker pull mcr.microsoft.com/mssql/server:2019-CU5-ubuntu-18.04

注意,mcr.microsoft.com是微软的镜像源,国内访问会比较慢。。。

  1. 启动容器:

docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Password@2020" -d -p 1433:1433 --name sqlserver2019 mcr.microsoft.com/mssql/server:2019-CU5-ubuntu-18.04

  1. 连接测试

使用可视化工具连接数据库测试,工具有很多,我这里使用的是SQL Server Management(也可以直接在docker中使用命令进入容器连接数据库测试)。

使用账号sa/Password@2020连接。服务器名称localhost,1433这个1433也可以省略,默认端口就是1433。

测试连接成功。以上通过2个命令即可得到一个sqlserver2019数据库,是不是比直接安装到电脑上要方便很多呢。类似的很多开发环境都可以这么搭建,比如mysql,postgres,redis,mongodb,rabbitmq等等,各种工具随便折腾,玩坏了大不了删除容器,重新再来。。。

构建Docker镜像

下面使用docker构建一个asp.net core web应用的镜像。

首先使用vs2019新建一个asp.net core web应用程序,选择web api作为项目模板。

Dockerfile

右键项目-添加-Docker支持,目标OS选择Linux。

添加docker支持后,vs2019会自动帮我们创建Dockerfile文件。Dockerfile就是用来构建镜像的文件,其中包含了各种指令。以下是Dockerfile指令详解:

#使用asp.net core 3.1作为基础镜像,起一个别名为base
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
#设置容器的工作目录为/app
WORKDIR /app
#暴露80端口
EXPOSE 80#使用.net core sdk 3.1作为基础镜像,起一个别名为build
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
#设置容器的工作目录为/src
WORKDIR /src
#拷贝WebApplication1/WebApplication1.csproj项目文件到容器中的/src/WebApplication1/目录
COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
#执行dotnet restore命令,相当于平时用vs还原nuget包
RUN dotnet restore "WebApplication1/WebApplication1.csproj"
#拷贝当前目录的文件到到容器的/src目录
COPY . .
#设置容器的工作目录为/src/WebApplication1
WORKDIR "/src/WebApplication1"
#执行dotnet build命令,相当于平时用vs生成项目。以Release模式生成到容器的/app/build目录
RUN dotnet build "WebApplication1.csproj" -c Release -o /app/build#将上面的build(.net core sdk 3.1)作为基础镜像,又重命名为publish
FROM build AS publish
#执行dotnet publish命令,相当于平时用vs发布项目。以Release模式发布到容器的/app/publish目录
RUN dotnet publish "WebApplication1.csproj" -c Release -o /app/publish#将上面的base(asp.net core 3.1)作为基础镜像,又重命名为final
FROM base AS final
#设置容器的工作目录为/app
WORKDIR /app
#拷贝/app/publish目录到当前工作目录
COPY --from=publish /app/publish .
#指定容器入口命令,容器启动时会运行dotnet WebApplication1.dll
ENTRYPOINT ["dotnet", "WebApplication1.dll"]

内容挺长,实际上做的事情主要就是通过.net core cli命令来定义了一系列打包发布运行的过程。

bulid & run

来到项目根目录,启动PowerShell或cmd执行docker命令。

构建镜像:docker build -t webapp1 -f ./WebApplication1/Dockerfile .参数-f是指定Dockerfile所在的目录。

使用docker images查看本地镜像,webapp1就是上面构建完成的镜像:

启动容器:docker run -d -p 5000:80 --name web1 webapp1

使用docker ps查看运行中的容器:

浏览器访问:http://localhost:5000/weatherforecast

至此,一个简单的asp.net core web应用就成功运行于docker之中。

其实vs2019本身对docker支持就非常好,以上操作直接可以在vs2019中完成,无需手动执行docker命令。

将项目设置为Docker启动:

Ctrl+F5即可启动:

注意,这里容器工具首次加载会比较慢。。。启动完成后会自动打开浏览器,并绑定了一个随机端口:

这就是vs2019自动帮我们创建的容器:

查看vs2019中容器工具的输出日志,可以看到vs2019执行的指令内容。


本篇先写到这里。

如果本文对您有用,

不妨点个“”或者转发朋友圈支持一下

.Net Core in Docker极简入门(上篇)相关推荐

  1. .Net Core in Docker极简入门(下篇)

    点击上方蓝字"小黑在哪里"关注我吧 Docker-Compose 代码修改 yml file up & down 镜像仓库 前言 上一篇[.Net Core in Dock ...

  2. Docker极简入门

    原 Docker极简入门 2018年05月22日 20:25:12 阅读数:44 一.Docker概述 Docker通过一个包括应用程序运行时所需的一切的可执行镜像启动容器,包括配置有代码.运行时.库 ...

  3. 数据分析及机器学习环境配置(docker极简入门指南)

    做数据科学一般需要用到类似XGBOOST.TensorFlow之类的库,这些库在win下不是那么好安装的,但是很多人又需要它们,那怎么办呢,最简单的就是用docker的方式,不仅具备一个linux虚拟 ...

  4. Docker 极简入门教程,傻瓜都能看懂!

    富 Web 时代,应用变得越来越强大,与此同时也越来越复杂.集群部署.隔离环境.灰度发布以及动态扩容缺一不可,而容器化则成为中间的必要桥梁. 本文我们就来探索一下 Docker 的神秘世界,从零到一掌 ...

  5. Docker 极简入门指南,10 分钟就能看懂~

  6. SkyWalking 极简入门

    1. 概述 1.1 概念 SkyWalking 是什么? FROM http://skywalking.apache.org/ 分布式系统的应用程序性能监视工具,专为微服务.云原生架构和基于容器(Do ...

  7. Seata 极简入门

    1. 概述 Seata 是阿里开源的一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务. 1.1 四种事务模式 Seata 目标打造一站式的分布事务的解决方案,最终会提供四种事务 ...

  8. RL极简入门:从MDP、DP MC TC到Q函数、策略学习、PPO

    前言 22年底/23年初ChatGPT大火,在写ChatGPT通俗笔记的过程中,发现ChatGPT背后技术涉及到了RL/RLHF,于是又深入研究RL,研究RL的过程中又发现里面的数学公式相比ML/DL ...

  9. APISIX 极简入门(国产微服务网关)

    1. 概述 APISIX 是基于 OpenResty + etcd 实现的云原生.高性能.可扩展的微服务 API 网关.它是国人开源,目前已经进入 Apache 进行孵化,牛逼!!! OpenRest ...

最新文章

  1. 怎样允许远程访问mysql_如何开启MySQL远程访问权限 允许远程连接
  2. HDU4546(优先队列)
  3. 阿里巴巴Java开发手册-使用JDK8的Opional类来防止出现NPE问题
  4. python 两个数据框合并计算_一文掌握Excel、SQL、Python【数据合并】大法!
  5. 洛谷 P3745 [六省联考2017]期末考试
  6. 本地数据库_干货|本地数据库调用的实现案例
  7. 在rhel6 64位环境下部署LNMP环境
  8. zen服务器芯片,Intel颤抖!AMD 32核心终极版Zen亮相:媲美人脑
  9. 专业的统计分析软件 IBM SPSS Statistics 26.0.2 Mac版(内附安装包网盘链接)
  10. 通达信主力强势上涨预警副图指标公式(源码)
  11. OpenWrt官方入门手册
  12. 河南中睿保险中介系统环境升级配置纪录
  13. 使用consul注册中心要求服务以自定义instance-id形式注册
  14. Snaker 用户手册
  15. 创意简约土木黑灰配色PPT-朴尔PPT
  16. 7-4 房产税费计算2022(分数 12)
  17. 使用script#编写Xrm的Javascript
  18. 哪一个属于计算机外存储器,下边哪一个属于计算机的外存储器()
  19. java 面试知识点总结
  20. Azure AKS、ACR访问

热门文章

  1. Adobe Air 写文件如何换行
  2. 使用Visual Studio 创建新的Web Part项目
  3. wdcp mysql密码_WDCP提示无法连接mysql及创建站点提示mysql密码不正确
  4. weui-react项目实战新心得
  5. 中国版LinkedIn呼之欲出
  6. SDN火爆!未来五年年复合增长率达98%
  7. npm执行命令后无任何响应(windows下)
  8. vim学习日志(5):vim下wimrc的配置,解决中文乱码问题
  9. Linux命令之tar等
  10. iOS开发之Runtime关联属性