1 容器概念

  使用Docker前我们首先要简单了解一下容器的概念。MSDN上有一张虚拟机和容器的对比图,很好的展示了虚拟机和容器的区别,如下所示,虚拟机包括应用程序、必需的库或二进制文件以及完整的来宾操作系统,每台虚拟机都有一个单独的内核,我们完全可以把虚拟机看做是一台真实的物理机。 容器包括应用程序及其所有依赖项,与其他容器共享 OS 内核,容器在主机操作系统上作为独立进程运行,我们可以把容器看做是一个应用沙盒

  我们经常会遇到“我机器上可以运行”的问题吧,然后部署到其他机器时就遇到了各种坑,这多是因为其他设备上缺少应用所需的环境或者缺少应用的依赖项造成的。使用容器技术可以很好的解决这个问题,容器是一个“应用的沙盒”,这个沙盒内部包含了应用所需的环境和所有依赖项,只要有这个沙盒存在,应用在任何环境下都能正常的运行,容器技术的典型特点就是“一次封装,到处运行”。

        

  Docker 是一个使用go语言开发的开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。我们先了解Docker中的三个核心概念:

1  镜像(Image)

 镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

2  容器(Container)

 容器是镜像的运行时实例 ,执行镜像时内存中运行的就是容器。如果把镜像看做面向对象中的类,容器就是对象。使用类时通过new来获取一个对象,类似的使用镜像时通过  docker run <镜像名/镜像id> 创建一个容器。

3 仓库(Repository)

 仓库时用来存放镜像的地方,Docker hub是docker官方提供的仓库,类似于githhub,,通过push推送镜像到仓库,通过pull命令拉取镜像。当然我们也可以使用其他仓库,或者自己搭建一个仓库。

2 安装docker

1 Windows安装docker

  docker是运行在Linux系统上的,在Windows上使用docker默认要用到Hyper-V功能,所以我们在Windows系统上安装Docker必须先开启Hyper-V功能。首先打开【控制面板】,找到【启动或关闭Windows功能】,然后勾选【Hyper-V】,点击确定即可安装Hyper-V。

  安装好Hyper-V后,到docker官网下载Windows版本的docker,docker需要登录账户才能下载,我们可以创建一个账户,牢记这个账号,我们以后会经常用到。docke下载地址:docker下载。下载完成后,双击安装包,一路next即可。安装完成后需要重启电脑,打开命令行,输入 docker run hello-world ,如果出现以下界面,表示docker已经安装成功了。docker run hello-world命令首先会在本地找名字为hello-world的镜像,如果本地不存在这个镜像就会从docker hub上拉取hello-world镜像,然后运行。

2 Centos安装docker

  Linux系统安装常用软件都十分方便,执行下边的命令即可安装docker

  1. #删除旧版本
  2. sudo yum remove docker \
  3. docker-client \
  4. docker-client-latest \
  5. docker-common \
  6. docker-latest \
  7. docker-latest-logrotate \
  8. docker-logrotate \
  9. docker-engine
  10. #安装一些需要的工具
  11. yum install -y yum-utils device-mapper-persistent-data lvm2
  12. #添加软件源信息
  13. sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  14. #更新yum缓存
  15. yum makecache fast
  16. #安装docker
  17. yum -y install docker-ce
  18. #启动docker服务
  19. systemctl start docker
  20. #测试docker
  21. docker run hello-world

  安装完成后执行 docker run hello-world命令,如果出现下边的界面表示docker安装成功了

3 Docker基本使用

1 使用官方docker实例

  可以查看官方教程详细地了解docker的使用,这里我们先用两分钟分钟展示一下微软官方提供的docker栗子,执行命令 docker run  -p 8000:80 --name aspnetcore_sample mcr.microsoft.com/dotnet/core/samples:aspnetapp ,-p 8000:80表示将服务器的8000端口和容器的80端口建立映射,访问服务器8000端口时会去访问容器的80端口。--name设置镜像的名字

  打开浏览器,访问虚拟机的8000端口如下,说明我们的容器已经成功启动了!

  我们使用 docker images 和 docker container ls 查看一下本机的容器和镜像,结果如下:

2 Docker常用命令

  其实我们实际开发中能用到的docker命令并不多,这里简单汇总一下最常用的docker命令。

  1. ## 查看docker版本和信息
  2. #查看docker-cli的版本
  3. docker --version
  4. #查看docker版本和信息
  5. docker version
  6. docker info
  7.  
  8. ## docker镜像相关命令
  9. #拉取镜像
  10. docker pull [imgName:tag]
  11. #运行镜像,执行后会生成一个容器
  12. docker run [imgName:tag/imgID]
  13. #查看所有的镜像
  14. docker images
  15. #删除镜像 执行rmi命令前必须删除所有该镜像的container
  16. docker rmi [imgName:tag/imgID]
  17. #查看所有的容器,没有-a表示查询所有正在运行中的容器
  18. docker container ls -a
  19. #查看docker正在运行和已经停止的容器
  20. docker ps -a
  21. #启动容器
  22. docker start [ctnName/cID]
  23. #停止容器
  24. docker stop [ctnName/cID]
  25. #删除容器,执行rm命令前必须先停止该容器
  26. docke rm [ctnName/cID]
  27.  
  28. ##清理镜像和容器
  29. #删除所有的镜像和容器
  30. docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) ; docker rmi $(docker images -q -a)
  31. #删除所有的容器
  32. docker kill $(docker ps -q) ; docker rm $(docker ps -a -q)
  33. #清除名称为none的镜像
  34. docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop
  35. docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm
  36. docker images|grep none|awk '{print $3 }'|xargs docker rmi

  有时候我们需要和容器交互,可以使用命令 docker exec -it [name/id] common 。如我们启动一个mysql容器mysqlx1,执行 docker exec -it mysqlx1 mysql -p 表示和容器mysqlx1交互,执行的命令是【mysql -p】进行登录,如下所示。 Ctrl +p+q 退出容器,回到服务器目录。

3 定制容器

  大多数用户使用docker的核心目的是更方便的交付项目,就是将我们的应用程序构建成镜像,然后交付镜像即可,这里演示怎么构建一个Aspnet core项目的镜像。

1. 开发aspnet core应用

  我们创建一个Asp net core MVC项目,项目名为DockerDemo,为了方便不勾选Https和Docker支持,如下:

  简单修改首页,运行一下,测试项目没有bug,运行首页如下:

2 发布项目,添加Dockerfile

  发布项目,然后在发布文件夹下添加Dockerfile文件,结构如下:

  Dockerfile的内容如下:

  1. #拉取runtime父镜像,运行aspnet core应用必须要用runtime
  2. FROM microsoft/dotnet:2.2-aspnetcore-runtime
  3. #设置容器工作目录
  4. WORKDIR /DockerDemo
  5. #把当前目录的所有文件copy到工作目录中
  6. COPY . /DockerDemo
  7. #暴露一个端口让外部可以访问
  8. EXPOSE 8080
  9. #容器入口命令,即容器启动时执行dotnet DockerDemo.dll命令
  10. ENTRYPOINT ["dotnet", "DockerDemo.dll"]

  Dockerfile常见指令简单说明

  1. Dockerfile常用指令:
  2.  
  3. #FROM:通常情况下,我们创建的镜像时基于另外一个镜像的,这时就要用FROM,当然我们也可以完全从头创建
  4. #WORKDIR:设置容器的工作目录
  5. #MAINTAINER:该镜像的维护人
  6. #COPY:经常需要把源码复制到容器中,只用COPY就可以实现这一点
  7. #RUN:这里可以定义一些需要运行的命令,执行的目录是WORKDIR。如npm install ,dotnet restore,dotnet run等
  8. #ENTRYPOINT:定义容器的入口,通常是一些dotnet/node等命令,如dotnet xxx.dll
  9. #CMD:设置容器运行的默认命令和参数,即容器启动时执行的命令。当容器运行时,可以通过命令行覆盖CMD定义的命令
  10. #EXPOSE:暴露端口
  11. #ENV:设置环境变量

3 创建镜像

  docker创建镜像很简单,执行 docker build -t dockerdemo:v1. . 命令即可创建镜像,其中dockerdemo:v1.0是镜像的名字和版本tag,名字和tag可以随便设置。然后通过 docker images 命令查看所有镜像,如下:

4 运行容器

 使用命令 docker run -d -p : dockerdemo:v1. 启动容器,-d 表示后台运行,-p 8080:80表示服务器的8080端口映射到容器的80端口,我们也可以使用服务器的其他端口,容器的端口为Dockerfile中Expose的端口。执行 docker container ls 查看容器,这里我们的容器已经启动了,如下:

  打开浏览器,输入【服务器IP:服务器端口】接口访问容器,如下:

  到这一步,本地创建镜像和运行容器成功了。

5 使用docker hub存储和分发镜像

  docker提供了远程仓库用于存储和分发镜像,其作用类似于github,区别在于github托管代码,而docker hub托管镜像。我们创建好了镜像可以推送(push)到远程仓库,然后在其他设备上拉取(pull)镜像,有了docker hub我们可以更方便的管理和分发镜像。docker hub的使用非常简单,只记住三个命令就可以了

  1. #标记镜像,就是设置远程镜像名和标记
  2. docker tag localname:localtag dockeruser/repname:reptag
  3. #推送镜像文件到docker hub
  4. docker push username/repname:reptag
  5. #拉取远程镜像
  6. docker pull repname:reptag
  7.  
  8. #注:localname是本地镜像名 localtag是本地镜像tag
  9. # repname远程仓库的镜像名 reptag是远程仓库的tag
  10. # username是我们的dockerhub用户名

  这里将上边创建的本地镜像推动到docker hub。 使用命令 docker tag dockerdemo:v1. wyyxxx/resdockerdemo:v1. 标记,使用命令 docker push wyyxxx/resdockerdemo:v1. 推动镜像到远程仓库,打开 镜像仓库,登陆后就可以看到我们自定义的镜像了,如下所示。

  然后使用另一台安装了docker的服务器,执行命令 docker run -p : wyyxxx/resdockerdemo:v1. 拉取远程镜像并启动 ,打开浏览器输入地址,如下:

  我们在通过拉取远程镜像并运行容器时,不需要事先部署环境(如安装runtime)等,因为镜像中已经设置了需要的所有环境和依赖资源,只需要使用 docker run 命令运行即可。这也是使用容器交付的方便之处。

4 使用Docker的一点建议

① “3C原则”一个容器只运行一个应用

② 使用镜像交付应用程序,而不是直接部署

  如果要在centos上部署一个aspnet core应用程序。错误的做法是:在docker中先安装一个centos系统,在centos系统中部署环境,然后部署我们的netcore应用程序,,最后把部署的应用程序生成镜像。正确的做法是通过Dockerfile定义我们需要的环境和依赖项,然后生成镜像,通过镜像去分发和执行。

③ 分层构建镜像

  还是上边centos部署netcore应用的栗子,如果从零定制镜像时,我们应该把centos作为一层镜像,环境runtime作为一层镜像,最后我们的应用做为一层镜像,使用Dockerfile的FROM 指令拉取父镜像。这样做的好处是节省空间和复用镜像。如上边我们使用了2.2版本的runtime镜像,当我们创建了另一个web应用再来定制镜像时,这两个应用程序镜像可以 共用同一个runtime镜像。

④ 不要把数据存储在容器中

  容器是随时可能销毁的,销毁后容器内部的数据就不存在了,所以最好不要在容器中存储需要持久化的数据。

 

docker部署Asp.net core应用的更多相关文章

  1. Centos下使用Docker部署asp.net core项目

    本文讲述 CentOS 系统 Docker 中部署 asp.net core开源项目 abp 的过程 步骤 1. 拉取 asp.net core 基础镜像 docker pull microsoft/ ...

  2. docker部署asp.net core

    上一篇文章我们成功的在win10上边安装了docker,这篇文章,我们将在docker中部署asp.net core程序, 先来一张运行成功的hello world镇楼 现在开始,首先创建一个asp. ...

  3. 从零实操基于WSL2 Docker部署Asp.Net Core项目

    前言 平日在公司里都是基于阿里Teambition中的飞流进行Docker部署Api项目或服务,已经习惯了那一套成熟的操作流程,开发和部署确实快捷方便,但是还没在自己的电脑上进行操作过,特别是Wind ...

  4. 使用Docker部署ASP.NET Core应用程序实践

    前言 最近把很火的Docker给看了,于是就磨拳擦掌要去实践一下.于是就拿之前一个aps.net core的项目(已被停止)去练手.该项目之前在ubuntu14.04上确保可以正常运行,所以docke ...

  5. docker部署Asp.Net Core、Nginx、MySQL

    2019/10/24,docker19.03.4, .netcore 3.0,CentOS7.6 摘要:asp.net core 3.0 网站项目容器化部署,使用docker-compose编排Ngi ...

  6. 使用docker部署Asp.net core web应用程序

    拉取aspnetcore最新docker镜像 aspnetcore的docker镜像在docker官网是有的,是由微软提供的.它的依赖镜像是microsoft/dotnet.通过访问网址:https: ...

  7. Linux Docker 部署 ASP.NET Core应用

    一.系统环境 1.腾讯云轻量应用服务器CentOS7.6 二.操作流程及途中遇到的问题 1.SSH方式远程Linux ssh <username>@<IP address or do ...

  8. Docker + Jenkins 持续部署 ASP.NET Core 项目

    Docker 是个好东西,特别是用它来部署 ASP.NET Core Web 项目的时候,但是仅仅的让程序运行起来远远不能满足我的需求,如果能够像 DaoCloud 提供的持续集成服务那样,检测 gi ...

  9. 使用docker来部署asp.net core的程序

    使用docker来部署asp.net core程序 暂不介绍docker是个什么东西?不知道的自己百度. 第一步安装docker: 我的docker是装在centos7系统上,windows上我的也用 ...

随机推荐

  1. Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) C 并查集

    C. String Reconstruction time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  2. C++11中对容器的各种循环遍历的效率比较

    #include "CycleTimeTst.h" #include <string> #include <vector> #include <lis ...

  3. ThinkPHP+Memcache的缓存方案总结

    简介: ThinkPHP用S()方法可以缓存数据,这在访问数据库时非常有用,可以在有限时间内当数据库无变化时从缓存取数据,有变化时从数据库取数据. Memcached+Memcache是一个将数据保存 ...

  4. SpringBoot (六) :如何优雅的使用 mybatis

    原文出处: 纯洁的微笑 这两天启动了一个新项目因为项目组成员一直都使用的是mybatis,虽然个人比较喜欢jpa这种极简的模式,但是为了项目保持统一性技术选型还是定了 mybatis.到网上找了一下关 ...

  5. OpenCV---图像直方图

    一:直方图的直接使用 from matplotlib import pyplot as plt def plot_demo(image): print(image.ravel()) plt.hist( ...

  6. 无密码ssh登录linux

    简介 ssh是常见的远程登录linux的方式,大部分时候需要输入用户名密码登录.本文介绍如何无密码登录linux,适用于mac和linux,windows不清楚. 不过这不是什么新的知识,基本上大家都 ...

  7. 使用git拉取github上的项目

    一. 安装Git 去Git官网,下载安装包,一路点next,默认安装. 安装之后,在空白处右键,菜单显示有 Git GUI Here 和 Git Bash Here ,表示Git安装成功. 二. 配置 ...

  8. LightOJ 1065 - Number Sequence 矩阵快速幂水题

    http://www.lightoj.com/volume_showproblem.php?problem=1065 题意:给出递推式f(0) = a, f(1) = b, f(n) = f(n - ...

  9. 【BZOJ】3963: [WF2011]MachineWorks

    [题意]给定n台在时间di可以买入的机器,pi买入,可在任意时间ri卖出,买入和卖出之间的持有时间每天产生gi金钱,任意时间至多持有一台机器.给定初始钱数c和总天数T,求最大收益.n<=10^5 ...

  10. Array和String测试与java.String.split

    java.string.split() 存在于java.lang包中,返回值是一个数组. 作用是按指定字符或者正则去切割某个字符串,结果以字符串数组形式返回. 例 String [] toSort = ...