d4d#8.1 – 三国杀之Docker锦囊:无中生有

1
4464

docker-tricks

公元220年-280年,东汉政权没落;曹魏,蜀汉和东吴三分天下。赤壁之战,曹操被孙权刘备联军击败,自此奠定了三国鼎立的雏型。各国急需锦囊妙计以能独霸一方。

公元2013年,DevOps正在兴起,Flicker的10 Deployment per day在几年前点燃的星星之火已经渐成燎原之势,IT界急需一种可以大规模提升交付效率的解决方案;Docker在这个时候面世,在短短几个月内就已经席卷全球,形成迅雷不及掩耳盗铃之势。

今天我来看看Docker锦囊妙计第一计:无中生有

“天下万物生于有,有生于无”《老子》

装够了。我们来看看Docker如何能够“无中生有”,让你在无须安装任何SDK的状况下完成应用代码编译和调试,首先获取锦囊:
https://github.com/ups216/netcore-docker-example

看以下这段 docker-compose.ci.build.yml 代码

version: '2'

services:
 ci-build:
 image: microsoft/aspnetcore-build:1.0-1.1
 volumes:
 - .:/src
 working_dir: /src
 command: /bin/bash -c "dotnet restore ./netcore-docker-example.sln && dotnet publish ./netcore-docker-example.sln -c Release -o ./obj/Docker/publish"

有了这个文件后,你只需要运行(记住:运行这个命令你除了docker之外无须安装任何其他软件,你可以在任何安装了docker的windows, mac或者linux环境中执行这个操作)

docker-compose -f docker-compose.ci.build.yml up

30秒演示如下:

docker-compose-ci-build

这个命令将完成3件事情:

1. 从docker hub拉取 microsoft/aspnetcore-build:1.0-1.1 镜像,并运行这个容器
2. 将当前目录映射到容器内的/src目录
3. 在容器内的/src目录中执行以下命令

dotnet restore ./netcore-docker-example.sln
dotnet publish ./netcore-docker-example.sln -c Release -o ./obj/Docker/publish

这里发生了什么?

首先这个aspnetcore-build镜像中已经预先打包好了开发,编译和调试asp.net core所需要的所有sdk和工具,比如:dotnet, node, npm, bower等。这第一步就是从docker hub获取这个镜像并将其运行起来。第二步则利用docker volume的目录映射功能将本机上的源码目录映射到了容器内的/src目录,这样容器内部在操作这个目录的时候实际上是在操作本机上的代码,相当于我们将代码塞到了一个具备.net sdk的隔离环境中。最后,我们运行dotnet retore和dotnet publish命令来完成编译和打包发布,注意由于这两个命令是在容器内执行的,所以在本机上无须预先安装任何环境。

此乃:无中生有。

nothing-yielding-fruit-trick

利用docker的无中生有特性,我们还可以做很多事情,比如

  • 搭建干净的持续集成环境:以往在搭建持续集成环境的时候最繁琐的就是为各种不同的应用准备vm镜像,如果你要同时支持java, .net, node, php等不同开发语言,那就必须给每一种语言(甚至不同版本)准备各自不同的vm镜像;这样做不仅繁琐,而且有些不良代码还会将环境搞坏。有了docker以后,我们就可以利用以上的“无中生有”锦囊,在仅仅安装了docker的环境中按需拉取build镜像,映射代码到容器,完成编译后再将容器清理掉。
  • 共享计算资源:既然可以使用干净的环境,编译环境都是临时拉取的,那也就意味这我们可以让不同的应用共享共一套环境,这将大大降低资源的占用,提高利用率。

往期docker4dev文章:


请关注微信公众号 【devopshub】,获取更多关于DevOps研发运维一体化的信息

qrcode_for_gh_b7c158df1fd1_430

1 COMMENT

Comments are closed.