docker4dotnet #2 容器化主机

.NET 猿自从认识了小鲸鱼,感觉功力大增。上篇《docker4dotnet #1 前世今生&世界你好》中给大家介绍了如何在Windows上面配置Docker for Windows和Docker Tools for Visual Studio来使用docker协助.NET Core应用的开发,这篇我们来看看如何创建和管理容器化主机。

所谓容器化主机Dockerized Host,就是安装了docker engine的主机,可以使用docker工具进行管理。使用docker来协助开发,我们至少需要本地和云端的容器化主机,本地用于开发,测试,打包;云端的用于生产环境发布。使用容器化主机我们可以将所有的环境标准化,也即是使用统一的docker工具来完成容器在不同环境中的迁移(搬运),真正将容器化开发的优势发挥出来。dockerized-env

使用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}

d4d-2-001

这样,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

小编测试了以下几个环境

d4d-2-002

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}

d4d-2-003

然后运行

docker images

就可以看到已经上传到你的目标宿主机上面的 images,这时就可以运行 docker run 了 (注意:要确保你正确配置了 宿主机的环境变量)

docker run -p 80:80 username/webapp01:latest

d4d-2-004

注:这个过程中你可能会碰到docker版本不匹配的问题

d4d-2-005

你可以安装 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研发运维一体化的信息

qrcode_for_gh_b7c158df1fd1_430

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。

Oozie安装总结 - 2016-07-20 18:07:35

一、使用CM添加服务的方式安装Oozie 如果在创建Oozie数据库时失败,且提示数据库已存在,如下图,则可能是之前已经安装过Oozie,没有卸载干净,需要手动将Oozie服务器数据目录删掉(oozie/data部分),见图二                                                                            (图一)                                                              

kafka本地单机安装部署 - 2016-07-20 18:07:35

kafka是一种高吞吐量的分布式发布订阅消息系统,这几天要上kafka,只在其中的一个节点使用,结合具体的项目实践在此将kafka的本地安装部署流程记录下来与各位同仁分享交流。 准备工作: 上述的文件除了jdk以外均放在/usr/local/kafka目录下。 1、安装jdk,kafka的使用要用到jdk 首先检查有无jdk:java -version cd /usr/local/hadoop(本例中我是将jdk的安装包放到hadoop文件夹下,各位可以依据自己情况) http://www.oracle.

Swift 存储目录 - 2016-07-20 17:07:03

  在 Storage node 上运行着 Linux系统并 使用了 XFS文件系统 ,逻辑上使用一致性哈希算法将固定总数的 partition 映射到每个 Storage node 上,每个 Data 也使用同样的哈希算法映射到 Partition 上,其层次结构如下图所示: Figure1:Stoage node hierachy     以我们的一台 storage node sws51 为例,该 device 的文件路径挂载到 /srv/node/sdc ,目录结构如下所示: root@sws51
翻译:@胡杨(superhy199148@hotmail.com) @胥可(feitongxiaoke@gmail.com) 校对调整: 寒小阳 龙心尘 时间:2016年7月 出处: http://blog.csdn.net/han_xiaoyang/article/details/51932536 http://blog.csdn.net/longxinchen_ml/article/details/51940065 说明:本文为斯坦福大学CS224d课程的中文版内容笔记,已得到斯坦福大学课程@Rich

三分钟部署Laxcus大数据系统 - 2016-07-20 17:07:47

Laxcus是Laxcus大数据实验室历时五年,全体系自主设计研发的国内首套大数据管理系统。能够支撑百万台级计算机节点,提供EB量级存储和计算能力,兼容SQL和关系数据库。 最新的2.x版本已经全面覆盖和集成当前大数据主流技术和功能 ,并投入到国内多个超算项目中使用。Laxcus同时也保持着使用和部署的极简性,所有对计算机略有认识的人都可以很容易掌握它。下面演示在一台Linux计算机上部署Laxcus demo系统的过程。根据我们的测试,这个部署过程大约需要三分钟,或者您熟悉Linux系统 ,也许不需要这

Devstack多节点部署实验 - 2016-07-20 14:07:52

本文为博主翻译文章,转载请注明出处Bob Hou: http://blog.csdn.net/minxihou 这是个在多物理服务器上部署openstack例子: 1 先决条件Linux网络 1.1 最小化安装系统 你需要一个刚安装好的Linux系统。你可以直接下载最小化的Ubuntu版本,devstack会下载安装所有额外的依赖关系。同样也支持网络安装Fedora,Centos/RHEL.安装几个包用于引导程序配置。 apt -get install -y git sudo || yum install
0 说明 0.1 备注 建立文件夹(sparkdir、hadoop、java、scala、spark) 每台机器均有/usr/sparkdir /hadoop /hadoop - 2.7 .2 /java /jdk1 .8 .0 _91 /scala /scala - 2.11 .8 /spark /spark - 1.6 .1 -bin -without -hadoop . tgz 0.2 用户组、用户管理 资源:http://www.cnblogs.com/vincedotnet/p/ 4017574
Ubuntu16.04安装Hadoop2.6+Spark1.6,并安装python开发工具Jupyter notebook,通过pyspark测试一个实例,調通整个Spark+hadoop伪分布式开发环境。 主要内容:配置root用户,配置Hadoop,Spark环境变量,Hadoop伪分布式安装并测试实例,spark安装并通过Jupter notebook进行开发实例,配置Jupter notebook兼容Python2和python3双内核共存开发。 默认已经正确安装了JDK,并设置了JAVA_HOM
摘要 MLlib(机器学习)分两种——监督学习,无监督学习。首先监督学习,类似普贝叶斯这样的分类算法。要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应。显而眼见的是,这种需求另监督学习有很大的局限性,尤其在海量数据处理时。要预先处理数据以满足算法需求得耗费大量资源与时间。此时,可以使用聚类算法这样的无监督学习,相比于分类,聚类不依赖预定义的类和类标号的训练实例。本文将聚类算法拆分开来。深刻理解其思想。 相关知识 相异度计算——聚类,见名之意,便是将数据聚集起来,但是并非是将所有

Kubernetes1.3新特性 - 2016-07-20 14:07:33

本次分析的kubernetes版本号:v1.3.0。 scheduler模块 新增了kube-api-content-type参数,表示scheduler模块发送给api-server的请求类型,默认值是“application/vnd.kubernetes.protobuf”。 新增了hard-pod-affinity-symmetric-weight参数,表示POD调度规则亲和力的权重,取值范围从0到100。 新增了failure-domains参数,这是一个字符串参数,表示POD调度时亲和力参数。在