Docker是一项比较流行的容器化技术,可以让开发者将应用以及应用依赖的环境,依赖包一起打包到容器中,然后部署容器到生产环境就可以了,解决了应用程序部署到不同服务器环境带来的问题(很多开发人员都遇到过应用程序在自己本地服务器跑的好好的,部署到生产环境就运行不起来,各种奇葩的异常),实现了“一次构建,处处运行”。

官方为我们提供了针对不同系统的Docker版本,今天我们基于windows系统简单介绍下如何使用。

Windows部署Docker

目前官方发布的Docker桌面版,仅支持Windows 10 64-bit: Pro, Enterprise(企业版), Education(教育版),其他windows操作系统版本使用Docker需借助官方发布的Docker ToolBox工具。

1.首先,我们到Git上下载Docker ToolBox(https://github.com/docker/toolbox/releases

注意点:1)需要windows 7及以上的64位操作系统

2)系统上的虚拟化(Hyper-V )功能启用

2.下载完成之后,直接双击启动DockerToolbox-19.03.1.exe 安装程序。按着指示往下执行即可

3.安装成功之后,桌面上会出现如下三个图标:

  • 1)Docker QuickStart shell - 这是一个已经配置好Docker的命令行环境,启动docker。
  • 2)Oracle VM Virtualbox - 虚拟机,windows系统模拟了一个linux虚拟环境
  • 3)Kitematic - 这是 Docker 的 GUI 版本,相较于以前的敲命令行,操作简单了。

4.启动docker

双击桌面上的Docker QuickStart shell的快捷方式,程序窗口显示出“鲸鱼”就表示启动成功了。

这里我们会看到启动成功后,提供给我们一个IP地址:192.168.99.100。大家这里需要注意,后面我会具体描述下。

Docker基础使用

1.Image文件

Docker容器将应用程序及其依赖,打包到image文件中。然后,通过image文件来生成Docker容器,image文件可以当做是容器的模板,一个image文件可以生成多个同时运行容器。

image操作:

1.列出所有image
$ docker image ls

2.从仓库拉取可用的image
$ docker image pull (image文件地址)

3.image文件删除
$ docker image rmi (image文件ID)

我们可以自己制作image文件,也可以直接从仓库拉取别人上传的image文件。Docker Hub为我们提供了image文件的上传和下载,实现了文件的共用。

2.容器Container

前面我们提到Docker容器是依靠image文件生成的,但是Docker容器生成后确是区别于image文件存在的。需要通过关键字“container”对容器进行操作。

# 列出正在运行的容器
$ docker container ls # 列出所有容器,包括终止运行的容器
$ docker container ls --all #终止容器运行
$ docker container kill (容器ID) #删除容器
$ docker container rm (容器ID)

这里我们需要注意下,在删除image文件时如果存在依赖image文件生成的容器,我们需先删除容器才能删除image文件。

3.Dockerfile文件

前面我们介绍了image文件和容器文件,那么image文件和容器具体是怎么生成的呢?实际项目中,image文件的生成需要依赖dockerfilew文件(一个不带后缀的文本文件),大家可以把dockerfile理解成是生成image文件的一个配置文件,我们这里简单介绍几个常用的配置节点:

1)FROM:配置一个基础镜像,也就是后面你要生成的镜像是基于此基础来的。

2)WORKDIR:指定image文件的工作目录

3)COPY:格式:copy [源地址] [目标地址],将源地址文件拷贝到image文件中的目标地址。

4)EXPOSE:暴露出容器对外的端口

5)ENTRYPOINT:容器运行后默认执行的cmd命令。

样例:

FROM microsoft/dotnet:2.2-aspnetcore-runtime
WORKDIR /app #指定工作目录为/app
COPY . . #.表示当前目录 将当前命令行执行程序所在目录文件都拷贝到image文件的当前工作目录下
EXPOSE 7000 #容器对外暴露7000端口
ENTRYPOINT ["dotnet", "NetCoreSqlSugar.dll"] #容器生成后,默认执行cmd命令:dotnet NetCoreSqlSugar.dll

4.生成image文件和容器

有了dockerfile文件之后,我们就可以通过如下cmd命令生成image文件和容器。

1)首先cmd定位到dockerfile所在文件目录。

2)生成image文件

$ docker image build -t myimage .
  • -t 参数:指定image文件名称。
  • myimage是文件名称。
  • "."最后还有个符号,千万不要忘记,这里表示的是dockerfile文件的路径。

生成成功之后,我们通过命令 docker image ls  可以看到image文件已存在了。

3)生成容器

$ docker container run -p 8001:7000 -it -d myimage
  • -p参数:容器的 7000 端口映射到宿主机的 8001 端口。
  • -it参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。
  • myimage:image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。
  • -d参数:容器启动后,后台运行。

容器生成之后,我们通过命令 docker container ls  可以看到正在运行的容器。

.NetCore WebApi部署docker

好了,前面我们简单了介绍了一些Docker的一些简单入门,下面我们结合.netcore webapi应用程序具体给大家说一说实际项目中如何使用Docker。

1.新建一个.NetCore WebApi项目,并启用docker支持。

如果创建的项目忘记启用docker,也不用担心,我们可以右键项目,添加-->docker支持。

2.修改dockerfile文件,如下:

FROM microsoft/dotnet:2.2-aspnetcore-runtime
WORKDIR /app
COPY . .
EXPOSE 7000
ENTRYPOINT ["dotnet", "NetCoreSqlSugar.dll"]

dockerfile文件右键--属性,选择始终复制,可以直接发布到目录。

3.修改应用程序端口号(Program.cs文件)

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseUrls("http://*:7000")
.UseStartup<Startup>();

我这里用了最简单的方式UseUrls方法定义了端口号,实际项目中并不推荐大家这么使用。偷懒了。。。哈哈

4.发布项目

发布应用程序到执行目录,我们会发现发布目录多了一个dockerfile文件。

5.生成image文件和容器

#生成image文件
$ docker image build -t myimage . #创建容器并运行
$ docker container run -p 8001:7000 -it -d myimage

到了这里,基本上我们任务都完成了。但是使用windows的同学会发现当我们使用http://localhost:8001/api/Values访问API应用程序模板接口时,并不可行,那么问题来了???

这里我们回到docker启动,docker启动成功之后会提供我们一个IP地址:192.168.99.100。那么这个IP到底是干什么用的呢?

我们知道Docker是运行在Linux上的,在Windows中运行docker,实际上还是在Windows下先安装了一个Linux虚拟环境,然后再运行的docker。也就是说,应用程序中使用的localhost指的是这个Linux环境的地址,而不是我们的宿主环境Windows。这下大家也就恍然大悟了。我们在浏览器输入:http://192.168.99.100:8001/api/Values 果然可以正常访问。

Nginx实现局域网访问

上面我们在本地虽然可以通过192.168.99.100这个IP访问容器中的API接口,但是并不能被其他同事访问。前端时间刚好接触了Nginx,于是,这里果断搬了出来,通过Nginx的“反向代理”来解决这个问题。至于为什么选择这种方式,其实也是自己想重温下Nginx的使用,小小自私一下。。。关于Nginx的使用我这里就不赘述了,感兴趣的同学可以去了解下。

Nginx配置

upstream serlist{
server 192.168.99.100:8001;#实际请求地址
} server {
listen 8001;
server_name 192.168.60.4;#本机地址 #charset koi8-r; #access_log logs/host.access.log main; location ~ {
proxy_pass http://serlist; proxy_connect_timeout 10; #连接超时 默认为60秒
proxy_send_timeout 10; #读取超时 默认为60秒
proxy_read_timeout 10; #发送超时 默认为60秒
}
}

有了如上配置之后,局域网内的同事就可以通过我Windows下的本机地址192.168.60.4:8001直接访问我本机容器内的接口了,方便了大家调试调用。

 以上学习内容有不足的地方,欢迎大家多多交流。

Docker结合.Net Core初步使用的更多相关文章

  1. Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(2)

    上一篇:Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(1) 服务器版本 Ubuntu 16.04 LTS. 本 ...

  2. Docker 创建 Jira Core(Jira SoftWare) 7.12.3 中文版

    目录 目录 1.介绍 1.1.什么是 JIRA Core? 1.2.什么是 JIRA SoftWare 2.JIRA 的官网在哪里? 3.如何下载安装? 4.对 JIRA 进行配置 4.1.JIRA ...

  3. Docker的使用初探(二):Docker与.NET Core的结合

    目录 Docker的使用初探(二):Docker与.NET Core的结合 添加Dockefile 1. 在创建项目时添加 2. 手动添加 3. 容器业务流程协调控制程序支持 Dockefile语法 ...

  4. Docker & ASP.NET Core 教程

    第一篇:把代码连接到容器 第二篇:定制Docker镜像 第三篇:发布镜像 第四篇:容器间的连接 第五篇: Docker & ASP.NET Core (5):Docker Compose AS ...

  5. Docker 部署Dotnet Core MVC项目

    原文:Docker 部署Dotnet Core MVC项目 1.dotnet core创建项目 dotnet new mvc -o myweb cd myweb 然后就是业务代码的编辑,增删改查乱七八 ...

  6. 七缸发动机预热,docker swarm + .net core 高速飙车成功

    (图片来源:Microsoft Blog) 上周五上午在我们将 .net core 博客站点由 docker swarm 自动驾驶改为 docker-compose 手动驾驶后,依然发生了翻车,意料之 ...

  7. windows下docker与.net core 的简单示例

    一 windows 下安装docker 二 .net core 项目 新建一个空的ASP.NET Core Web 应用程序 在该项目的目录下执行dotnet publish,可以看到在bin\Deb ...

  8. 【ASP.NET Core分布式项目实战】(五)Docker制作dotnet core控制台程序镜像

    Docker制作dotnet core控制台程序镜像 基于dotnet SDK 新建控制台程序 mkdir /home/console cd /home/console dotnet new cons ...

  9. 三分钟学会使用Docker部署.NET Core

    大概快有一年的时间没有碰过docker了,理由很简单,基本上都是在IIS上部署,看到很多大佬都开始Devops持续化集成了,但相对来说成本会更高,但对于大型团队来说还是不错的,这不?不想被大伙甩下,哈 ...

随机推荐

  1. mysql主从模式部署

    1.下载tar.gz格式的安装包 下载地址https://dev.mysql.com/downloads/mysql/ 2.解压 tar -zvxf mysql-5.7.19-linux-glibc2 ...

  2. Java学习预热

    预备知识 什么是计算机 点击进入百度百科(计算机) 计算机硬件组成 主要部件 CPU 内存 主板 IO设备 键盘 鼠标 麦克风 显示器 音箱 冯·诺依曼体系结构 计算机软件 系统软件 DOS wind ...

  3. pytest封神之路第三步 精通fixture

    首先放一句"狠话". 如果你不会fixture,那么你最好别说自己会pytest. (只是为了烘托主题哈,手上的砖头可以放下了,手动滑稽) fixture是什么 看看源码 def ...

  4. Java线程阻塞方法sleep()和wait()精炼详解

    版权声明:因为个人水平有限,文章中可能会出现错误,如果你觉得有描述不当.代码错误等内容或者有更好的实现方式,欢迎在评论区告诉我,即刻回复!最后,欢迎关注博主!谢谢 https://blog.csdn. ...

  5. Jenkins打Docker镜像推送到私有仓库

    Jenkins打Docker镜像推送到私有仓库 因为我的Jenkins是安装在群晖NAS中的docker,所以我这边就以Docker安装Jenkins为例 echo '================ ...

  6. Mysql的ONLY_FULL_GROUP_BY

    今天在测试环境遇到一个问题,本地测试是没有问题,在测试环境sql报错了: nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntax ...

  7. Spring事务管理(编码式、配置文件方式、注解方式)

    1.事务(https://www.cnblogs.com/zhai1997/p/11710082.html) (1)事务的特性:acdi (2)事务的并发问题:丢失修改,脏读,不可重复读 (3)事务的 ...

  8. ARCENGINE 10 开发遇到的一些问题

    许多版友在刚刚使用ArcGIS 10做开发的时候,都会遇到这样那样的问题.在担任实习版主的这一个多月里,看到了这么几个与开发环境相关的问题,重复被提到相当多,于是我就做了这个FAQ.Q:哪儿有10的A ...

  9. Centos-用户管理-useradd userdel usermod groupadd groupdel id

    linux是多用户.多任务操作系统 linux角色分类 超级用户 root # 管理员.特定服务主进程 0 普通用户    $  普通管理员.服务运行需要的用户 500~65535 虚拟用户 不能登录 ...

  10. 再玩树莓派(二)Jexus&.NetCore

    接上一篇,操作系统弄好之后,轮到开发运行环境的搭建. 先说说目标,也就是我到底想搞什么飞机.先说说小目标吧. 现有一个手机App客户端,以答题小游戏作为其内容(例如:口算题,24点,科学百科等) 树莓 ...