docker4dotnet #2 容器化主机
.NET 猿自从认识了小鲸鱼,感觉功力大增。上篇《docker4dotnet #1 前世今生&世界你好》中给大家介绍了如何在Windows上面配置Docker for Windows和Docker Tools for Visual Studio来使用docker协助.NET Core应用的开发,这篇我们来看看如何创建和管理容器化主机。
所谓容器化主机Dockerized Host,就是安装了docker engine的主机,可以使用docker工具进行管理。使用docker来协助开发,我们至少需要本地和云端的容器化主机,本地用于开发,测试,打包;云端的用于生产环境发布。使用容器化主机我们可以将所有的环境标准化,也即是使用统一的docker工具来完成容器在不同环境中的迁移(搬运),真正将容器化开发的优势发挥出来。
使用docker发布应用与以往的应用发布方式有很大不同,从上图中可以看出。
- 因为应用本身与依赖,应用服务器和操作系统都是分离的;我们在自动化过程中就必须处理各种不同的场景,难以标准化;而使用容器技术,我们就可以将自动化简化为对容器的搬运。
- 各种依赖的解决都集中在开发环境中完成,常见的npm,nexus, nuget等工具都是开发人员很熟悉的,这些依赖的获取都可以由开发人员自己解决,在后续的自动化中无需再次处理。
- 仅从自动化的复杂程度来说,你可以很明显的看出传统开发中自动化会变成各种复杂情况的汇聚点,这就是为什么做CI/CD需要如此复杂的工具;如果再考虑不同种类的工具,如:Jenkins/TeamCity/Travis,Chef/Puppet等,这个环境会变的非常难以控制和维护。
- 以往我们必须给不同的应用创建不同的运行环境,而且这个环境必须从操作系统开始一层层搭建;使用容器话之后,不同类型的应用可以运行在统一的操作系统层之上,大大提高了资源利用率和灵活性。
在不同的环境中统一使用容器化主机就是向着容器化开发演进的第一步,也是大幅降低自动化系统复杂程度的第一步。
创建容器化主机
今天给大家介绍一下docker工具集中用来管理容器化主机的工具 docker-machine。上一篇文章中我们提到 Docker for Windows 其实是在 Hyper-V 中创建了一台运行着 docker daemon 守护程序的 linux vm 来接收 windows 命令行中运行的 docker 指令的,在你第一次启动 docker for windows 的过程中, docker-machine 工具完成了这个 vm 的初始化工作。
这个初始化的操作很简单,如果你已经安装了 docker for windows,可以打开命令行(注意:一定要用管理员权限),然后键入如下命令;
docker-machine create --driver hyperv {machine-name}
这样,docker-machine 就完成了在你本地的hyper-v上初始化一台可以运行容器的vm(一般称为Dockerized host 容器化主机)的工作了。
注:在以上过程中如果docker-machine无法在本地找到boot2docker.iso这个文件的话,会从网络上下载,这个过程会很慢,我已经将这个文件上传到了 d4dtools 的网站盘中,请在公众号中输入 d4dtools 获取。
下载后放入当前用户的~\.docker\machine\cache\ 这个目录即可。
完成初始化后,如果你希望让docker命令直接对这个新的主机进行操作,可以运行下面的命令。
@FOR /f "tokens=*" %i IN ('docker-machine env {machine-name}') DO @%i
注意将{machine-name}替换成你自己的容器化主机名称,这个命令会设置以下三个环境变量
SET DOCKER_TLS_VERIFY=1
SET DOCKER_HOST=tcp://xxx.xxx.xxx.xxx:2376
SET DOCKER_CERT_PATH=C:\Users\LeiXu\.docker\machine\machines\{machine-name}
SET DOCKER_MACHINE_NAME={machine-name}
完成后如果运行 docker 命令,那么你所使用的就是新的容器化主机了。
Docker-Machine 的环境驱动
上面的命令中你会注意到 –driver hyperv 这个参数,docker 提供了很多驱动可以让你在不同的环境中一键创建容器化主机,这些环境包括:
– Virtual Box (virtualbox)
– Hyper-V (hyperv)
– Azure (azure)
– Aws (amazonec2)
– VMware Fusion (vmwarefusion)
– VMware vCloud Air (vmwarevcloudair)
– Vmware vSphere (vmwarevshpere)
– …
括号中的内容就是驱动的命令参数,完整的列表可以访问:
https://docs.docker.com/machine/reference/create
另外,阿里云也提供了driver,不过并不在 docker 官方列表中
https://github.com/denverdino/docker-machine-driver-aliyunecs
小编测试了以下几个环境
Azure 国际版命令:
docker-machine create --driver azure --azure-subscription-id {sub-id} --azure-open-port 80 {machine-name}
Azure 世纪互联版命令:
docker-machine create --driver azure --azure-environment "AzureChinaCloud" --azure-subscription-id {sub-id} --azure-open-port 80 --azure-location "ChinaNorth" {machine-name}
AWS 国际版命令:
docker-machine create --driver amazonec2 --amazonec2-region "ap-northeast-1" --amazonec2-vpc-id {vpc-id} {machine-name}
这些命令都可以提供丰富的参数来控制主机的操作系统镜像,主机配置大小,网络连接,主机位置等。大家可以通过以下命令获取这些参数的详情:
docker-machine create --driver {driver-name}
这些主机创建好以后,如果要列出所有绑定到你自己环境上主机,可以运行:
docker-machine ls
如果你需要直接登陆到主机上进行操作,可以 运行:
docker-machine ssh {machine-name}
因为docker-machine在创建主机的过程中已经自动完成了public key的生成和配置,你无须输入用户名和密码就可以ssh进入主机进行操作,所有这些public key的证书文件都存放在 ~\.docker\machine的目录下面。
注:因为网络的原因,这些操作有可能失败。如果遇到这种情况,先进入云平台的控制台查看相关的资源是否都创建成功呢了,如果已经资源已经在那里了。尝试运行:
docker-machine regenerate-certs {machine-name}
这样会强制宿主机的 docker deamon 重启,一般来说可以解决问题。
使用docker-machine这个工具,你可以完成容器化主机的创建,启动,关闭等主要操作;而不必通过云提供商的控制台来完成,也就是说你本地的docker环境就变成中对于所有开发,测试和生产环境的控制台;通过docker所提供的命令,你可以完成从应用打包,环境创建,发布部署的整个过程。当然,如果你的团队比较大,其中的一些步骤还是需要借助自动化系统来完成,这样才能完成代码的集成和团队协同,安全性控制和集群环境的编排也是需要考虑的问题。这些,我们将在后续的文章中给大家提供解决方案。
将应用发布到云端
到了这里,小编到觉得没啥可说的了,docker的发布实在是简单!简单!简单!重要事情说三遍。
进入你的应用目录调用那个 dockertask.ps1 脚本,就可以完成应用的打包和image上传操作
.\DockerTask.ps1 -Build -Environment Release -Machine {machine-name}
然后运行
docker images
就可以看到已经上传到你的目标宿主机上面的 images,这时就可以运行 docker run 了 (注意:要确保你正确配置了 宿主机的环境变量)
docker run -p 80:80 username/webapp01:latest
注:这个过程中你可能会碰到docker版本不匹配的问题
你可以安装 docker version manager 这个工具,然后使用以下命令来获取使用正确版本
dvm install {version}
dvm use {version}安装命令(Poweshell):
Invoke-WebRequest https://download.getcarina.com/dvm/latest/install.ps1 -UseBasicParsing | Invoke-Expression
小结
到这里,我们就完成了本地和云端的docker环境的创建,并进行了最简单的应用部署。你可以看到,docker 提供了一套简单易用的工具和部署方式,让我们的应用开发,调试和打包部署都变的非常快捷。下一篇中我们将介绍如何使用macOS环境完成.net core应用的创建,调试和docker打包部署过程。
请关注微信公众号 【devopshub】,获取更多关于DevOps研发运维一体化的信息
docker4dotnet #2 容器化主机的更多相关文章
- .NET Core容器化@Docker
温馨提示:本文适合动手演练,效果更佳. 1. 引言 我们知道. NET Core最大的特性之一就是跨平台,而对于跨平台,似乎大家印象中就是可以在非Windows系统上部署运行.而至于如何操作,可能就 ...
- .NET Core容器化之多容器应用部署@Docker-Compose
1.引言 紧接上篇.NET Core容器化@Docker,这一节我们先来介绍如何使用Nginx来完成.NET Core应用的反向代理,然后再介绍多容器应用的部署问题. 2. Why Need Ngin ...
- 容器化的 DevOps 工作流
对于 devops 来说,容器技术绝对是我们笑傲江湖的法宝.本文通过一个小 demo 来介绍如何使用容器技术来改进我们的 devops 工作流. devops 的日常工作中难免会有一些繁琐的重复性劳动 ...
- 谈谈surging引擎的tcp、http、ws协议和如何容器化部署
1.前言 分布式已经成为了当前最热门的话题,分布式框架也百花齐放,群雄逐鹿.从中心化服务治理框架,到去中心化分布式服务框架,再到分布式微服务引擎,这都是通过技术不断积累改进而形成的结果.esb,网关, ...
- Asp.NetCore轻松学-使用Docker进行容器化托管
前言 没有 docker 部署的程序是不完整的,在写了 IIS/Centos/Supervisor 3篇托管介绍文章后,终于来到了容器化部署,博客园里面有关于 docker 部署的文章比比皆是,作为硬 ...
- Docker最全教程——MongoDB容器化(十二)
MongoDB容器化 MongoDB是一个免费的.开源的.跨平台分布式面向文档存储的数据库,由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和 ...
- Docker最全教程——数据库容器化之持久保存数据(十一)
上一节我们讲述了SQL Server容器化实践(注意,SQL Server现在也支持跨平台),本节将讲述如何持久保存数据,并且接下来将逐步讲解其他数据库(MySql.Redis.Mongodb等等)的 ...
- Docker最全教程——数据库容器化(十)
终于按时完成第二篇.本来准备着手讲一些实践,但是数据库部分没有讲到,部分实践会存在一些问题,于是就有了此篇以及后续——数据库容器化.本篇将从SQL Server容器化实践开始,并逐步讲解其他数据库的容 ...
- 容器化-Docker介绍
导读:本文章对Docker技术进行了介绍,阐述了Docker的技术发展历程.容器与虚拟机的差异.Docker原理.特点.Docker三组件和Docker带来的影响,为我们进一步理解Docker打下基础 ...
随机推荐
- MySQL高级知识- MySQL的架构介绍
[TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...
- Http状态码之:301、302重定向
概念 301 Moved Permanently 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一.如果可能,拥有链接编辑功能的客户端应当自动把请求的地 ...
- iOS二维码生成、识别、扫描等
二维码扫描 前言: 最近的项目中使用到了二维码,二维码这个模块功能也完成:觉得还是有必要总结一下用来做记录.好长时间没有写二维码了都忘记在差不多了,重新拾起来还是挻快的. 二维码使用场景: 生活中有很 ...
- MVC如何使用开源分页插件shenniu.pager.js
最近比较忙,前期忙公司手机端接口项目,各种开发+调试+发布现在几乎上线无问题了:虽然公司项目忙不过在期间抽空做了两件个人觉得有意义的事情,一者使用aspnetcore开发了个人线上项目(要说线上其实只 ...
- 如果你也会C#,那不妨了解下F#(7):面向对象编程之继承、接口和泛型
前言 面向对象三大基本特性:封装.继承.多态.上一篇中介绍了类的定义,下面就了解下F#中继承和多态的使用吧.
- Effective java笔记(二),所有对象的通用方法
Object类的所有非final方法(equals.hashCode.toString.clone.finalize)都要遵守通用约定(general contract),否则其它依赖于这些约定的类( ...
- Windows API 设置窗口下控件Enable属性
参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-put.html http://www.yuanjiaocheng.net/we ...
- js闭包 和 prototype
function test(){ var p=200; function q(){ return p++; } return q; } var s = test(); alert(s()); aler ...
- servlet 简介,待完善
什么是Servlet?① Servlet就是JAVA 类② Servlet是一个继承HttpServlet类的类③ 这个在服务器端运行,用以处理客户端的请求 Servlet相关包的介绍--javax. ...
- 利用poi导出Excel
import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.r ...