渭南做网站电话,自己做电影网站需要的成本,网站子页设计,如何推广引流Docker 是 Golang 编写的#xff0c; 自 2013 年推出以来#xff0c;受到越来越多的开发者的关注。如今Docker无处不在#xff0c;这是不争的事实。开发人员都很喜欢它#xff0c;运维工程师也需要它。他们都需要深入了解如何在关键业务环境中构建和维护符合生产级别要求的… Docker 是 Golang 编写的 自 2013 年推出以来受到越来越多的开发者的关注。如今Docker无处不在这是不争的事实。开发人员都很喜欢它运维工程师也需要它。他们都需要深入了解如何在关键业务环境中构建和维护符合生产级别要求的容器化应用那么什么是Docker?运维和开发视角有什么不同本文将告诉你答案。本文摘自《深入浅出Docker》就是那本美亚操作系统排名第一的Docker入门书被业内誉为“高中生也能读懂的 Docker入门教程”。本文从下面两部分内容讲解Docker。运维Ops视角。开发Dev视角。在运维视角中主要包括下载镜像、运行新的容器、登录新容器、在容器内运行命令以及销毁容器。在开发视角中更多关注与应用相关的内容。《深入浅出Docker内》会从GitHub拉取一些应用代码解释其中的Dockerfile将应用容器化并在容器中运行它们。通过上面两部分内容你可以从整体上理解Docker究竟是什么以及主要组件之间是如何相互配合的。推荐读者对开发和运维两部分内容都要阅读。1.1 运维视角当读者安装Docker的时候会涉及两个主要组件Docker客户端和Docker daemon有时也被称为“服务端”或者“引擎”。daemon实现了Docker引擎的API。使用Linux默认安装时客户端与daemon之间的通信是通过本地IPC/UNIX Socket完成的/var/run/docker.sock在Windows上是通过名为npipe:./pipe/docker_engine的管道pipe完成的。读者可以使用docker version命令来检测客户端和服务端是否都已经成功运行并且可以互相通信。 1 docker version 2Client: 3 Version: 18.01.0-ce 4 API version: 1.35 5 Go version: go1.9.2 6 Git commit: 03596f5 7 Built: Wed Jan 10 20:11:05 2018 8 OS/Arch: linux/amd64 9 Experimental: false10 Orchestrator: swarm1112Server:13 Engine:14 Version: 18.01.0-ce15 API version: 1.35 (minimum version 1.12)16 Go version: go1.9.217 Git commit: 03596f518 Built: Wed Jan 10 20:09:37 201819 OS/Arch: linux/amd6420 Experimental: false如果读者能成功获取来自客户端和服务端的响应那么可以继续后面的操作。如果读者正在使用 Linux并且服务端返回了异常响应则可尝试在命令的前面加上 sudo——sudo docker version。如果加上sudo之后命令正常运行那么读者需要将当前用户加入到docker用户组或者给本书后面的命令都加上sudo前缀。1.1.1 镜像将Docker镜像理解为一个包含了OS文件系统和应用的对象会很有帮助。如果读者实际操作过就会认为与虚拟机模板类似。虚拟机模板本质上是处于关机状态的虚拟机。在Docker世界中镜像实际上等价于未运行的容器。如果读者是一名开发者可以将镜像比作类Class。在Docker主机上运行docker image ls命令。1$ docker image ls2REPOSITORY TAG IMAGE ID CREATED SIZE如果读者运行命令环境是刚完成Docker安装的主机或者是Play With Docker那么Docker主机中应当没有任何镜像命令输出内容会如上所示。在Docker主机上获取镜像的操作被称为拉取pulling。如果使用Linux那么会拉取ubuntu:latest镜像如果使用Windows则会拉取microsoft/powershell:nanoserver镜像。1latest: Pulling from library/ubuntu250aff78429b1: Pull complete3f6d82e297bce: Pull complete4275abb2c8a6f: Pull complete59f15a39356d6: Pull complete6fc0342a94c89: Pull complete7Digest: sha256:fbaf303...c0ea5d12128Status: Downloaded newer image for ubuntu:latest再次运行docker image ls命令来查看刚刚拉取的镜像。1$ docker images2REPOSITORY TAG IMAGE ID CREATED SIZE3ubuntu latest 00fd29ccc6f1 3 weeks ago 111MB关于镜像的存储位置以及镜像内部构成本书会在后续的章节中详细介绍。现在读者只需知道镜像包含了基础操作系统以及应用程序运行所需的代码和依赖包。刚才拉取的ubuntu镜像有一个精简版的Ubuntu Linux文件系统其中包含部分Ubuntu常用工具。而Windows示例中拉取的microsoft/powershell镜像则包含了带有PowerShell的Windows Nano Server操作系统。如果拉取了如nginx或者microsoft/iis这样的应用容器则读者会得到一个包含操作系统的镜像并且在镜像中还包括了运行Nginx或IIS所需的代码。重要的是Docker的每个镜像都有自己的唯一ID。用户可以通过引用镜像的ID或名称来使用镜像。如果用户选择使用镜像ID通常只需要输入ID开头的几个字符即可——因为ID是唯一的Docker知道用户想引用的具体镜像是哪个。1.1.2 容器到目前为止读者已经拥有一个拉取到本地的镜像可以使用docker container run命令从镜像来启动容器。在Linux中启动容器的命令如下。1$ docker container run -it ubuntu:latest /bin/bash2root6dc20d508db0:/#在Windows中启动容器的命令如下。1 docker container run -it microsoft/powershell:nanoserver pwsh.exe23Windows PowerShell4Copyright (C) 2016 Microsoft Corporation. All rights reserved.5PS C:\仔细观察上面命令的输出内容会注意到每个实例中的提示符都发生了变化。这是因为-it参数会将Shell切换到容器终端——现在已经位于容器内部了接下来分析一下docker container run命令。docker container run告诉Docker daemon启动新的容器。其中-it参数告诉Docker开启容器的交互模式并将读者当前的Shell连接到容器终端在容器章节中会详细介绍。接下来命令告诉Docker用户想基于ubuntu:latest镜像启动容器如果用户使用Windows则是基于microsoft/powershell:nanoserver镜像。最后命令告诉Docker用户想要在容器内部运行哪个进程。对于Linux示例来说是运行Bash Shell对于Windows示例来说则是运行PowerShell。在容器内部运行ps命令查看当前正在运行的全部进程。Linux示例如下。1root6dc20d508db0:/# ps -elf2F S UID PID PPID NI ADDR SZ WCHAN STIME TTY TIME CMD34 S root 1 0 0 - 4560 wait 13:38 ? 00:00:00 /bin/bash40 R root 9 1 0 - 8606 - 13:38 ? 00:00:00 ps -elfWindows示例如下。 1PS C:\ ps 2 3Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName 4------- ------ ----- ----- ------ -- -- ----------- 5 0 5 964 1292 0.00 4716 4 CExecSvc 6 0 5 592 956 0.00 4524 4 csrss 7 0 0 0 4 0 0 Idle 8 0 18 3984 8624 0.13 700 4 lsass 9 0 52 26624 19400 1.64 2100 4 powershell10 0 38 28324 49616 1.69 4464 4 powershell11 0 8 1488 3032 0.06 2488 4 services12 0 2 288 504 0.00 4508 0 smss13 0 8 1600 3004 0.03 908 4 svchost14 0 12 1492 3504 0.06 4572 4 svchost15 0 15 20284 23428 5.64 4628 4 svchost16 0 15 3704 7536 0.09 4688 4 svchost17 0 28 5708 6588 0.45 4712 4 svchost18 0 10 2028 4736 0.03 4840 4 svchost19 0 11 5364 4824 0.08 4928 4 svchost20 0 0 128 136 37.02 4 0 System21 0 7 920 1832 0.02 3752 4 wininit22 0 8 5472 11124 0.77 5568 4 WmiPrvSELinux容器中仅包含两个进程。PID 1代表/bin/bash进程该进程是通过docker container run命令来通知容器运行的。PID 9代表ps -elf进程查看当前运行中进程所使用的命令/程序。命令输出中展示的ps -elf进程存在一定的误导因为这个程序在ps命令退出后就结束了。这意味着容器内长期运行的进程其实只有/bin/bash。Windows 容器运行中的进程会更多这是由 Windows 操作系统工作方式决定的。虽然Windows容器中的进程比Linux容器要多但与常见的Windows服务器相比其进程数量却是明显偏少的。按Ctrl-PQ组合键可以在退出容器的同时还保持容器运行。这样Shell就会返回到Docker主机终端。可以通过查看Shell提示符来确认。现在读者已经返回到Docker主机的Shell提示符再次运行ps命令。Linux示例如下。1$ ps -elf2F S UID PID PPID NI ADDR SZ WCHAN TIME CMD34 S root 1 0 0 - 9407 - 00:00:03 /sbin/init41 S root 2 0 0 - 0 - 00:00:00 [kthreadd]51 S root 3 2 0 - 0 - 00:00:00 [ksoftirqd/0]61 S root 5 2 -20 0 - 00:00:00 [kworker/0:0H]71 S root 7 2 -0 - 0 - 00:00:00 [rcu_sched]8Snip90 R ubuntu 22783 22475 0 - 9021 - 00:00:00 ps -elfWindows示例如下。 1 ps 2Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName 3------- ------ ----- ----- ------ -- -- ----------- 4 220 11 7396 7872 0.33 1732 0 amazon-ssm-agen 5 84 5 908 2096 0.00 2428 3 CExecSvc 6 87 5 936 1336 0.00 4716 4 CExecSvc 7 203 13 3600 13132 2.53 3192 2 conhost 8 210 13 3768 22948 0.08 5260 2 conhost 9 257 11 1808 992 0.64 524 0 csrss10 116 8 1348 580 0.08 592 1 csrss11 85 5 532 1136 0.23 2440 3 csrss12 242 11 1848 952 0.42 2708 2 csrss13 95 5 592 980 0.00 4524 4 csrss14 137 9 7784 6776 0.05 5080 2 docker15 401 17 22744 14016 28.59 1748 0 dockerd16 307 18 13344 1628 0.17 936 1 dwm17 SNIP18 1888 0 128 136 37.17 4 0 System19 272 15 3372 2452 0.23 3340 2 TabTip20 72 7 1184 8 0.00 3400 2 TabTip3221 244 16 2676 3148 0.06 1880 2 taskhostw22 142 7 6172 6680 0.78 4952 3 WmiPrvSE23 148 8 5620 11028 0.77 5568 4 WmiPrvSE可以看到与容器相比Docker主机中运行的进程数要多很多。Windows容器中运行的进程要远少于Windows主机Linux容器中的进程数也远少于Linux主机。在之前的步骤当中是使用Ctrl-PQ组合键来退出容器的。在容器内部使用该操作可以退出当前容器但不会杀死容器进程。读者可以通过docker container ls命令查看系统内全部处于运行状态的容器。1$ docker container ls2CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES3e2b69eeb55cb ubuntu:latest /bin/bash 7 mins Up 7 min vigilant_borg上述的输出显示只有一个运行中的容器。这就是前面示例中创建的那个容器。输出中有该容器证明了容器在退出后依然是运行的。读者可以看到这个进程是7min之前创建的并且一直在运行。1.1.3 连接到运行中的容器执行docker container exec命令可以将Shell连接到一个运行中的容器终端。因为之前示例中的容器仍在运行所以下面的示例会创建到该容器的新连接。Linux示例如下。1$ docker container exec -it vigilant_borg bash2roote2b69eeb55cb:/#示例中的容器名为“vigilant_brog”。读者环境中的容器名称会不同所以请记得将“vigilant_brog”替换为自己Docker主机上运行中的容器名称或者ID。Windows示例如下。1 docker container exec -it pensive_hamilton pwsh.exe23Windows PowerShell4Copyright (C) 2016 Microsoft Corporation. All rights reserved.5PS C:\本例中使用的容器为“pensive_hamilton”。同样读者环境中的容器名称会不同所以请记得将“pensive_hamilton”替换为自己Docker主机上运行中的容器名称或者ID。注意Shell提示符又发生了变化。此时已登录到了容器内部。docker container exec命令的格式是docker container exec optionscontainer-name or container-id command/app。在示例中将本地Shell连接到容器是通过-it参数实现的。本例中使用名称引用容器并且告诉Docker运行Bash Shell在Windows示例中是PowerShell。使用十六进制ID的方式也可以很容易地引用具体容器。再次使用Ctrl-PQ组合键退出容器。Shell提示符应当退回到Docker主机中。再次运行docker container ls命令来确认容器仍处于运行状态。1$ docker container ls2CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES3e2b69eeb55cb ubuntu:latest /bin/bash 9 mins Up 9 min vigilant_borg通过docker container stop和docker container rm命令来停止并杀死容器。切记需要将示例中的名称/ID替换为读者自己的容器对应的名称和ID。1$ docker container stop vigilant_borg2vigilant_borg34$ docker container rm vigilant_borg5vigilant_borg通过运行docker container ls命令并指定-a参数来确认容器已经被成功删除。添加-a的作用是让Docker列出所有容器甚至包括那些处于停止状态的。1$ docker container ls -a2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1.2 开发视角容器即应用在本节中会分析一份应用代码中的Dockerfile并将其容器化最终以容器的方式运行。相关代码可从本书配套资源或我的Github主页中获取。本节接下来的内容会基于 Linux 示例进行演示。但其实两个示例中都容器化了相同的Web 应用代码所以步骤也是一样的。进入到仓库文件目录之下查看其内容。 1$ cd psweb 2$ ls -l 3total 28 4-rw-rw-r-- 1 ubuntu ubuntu 341 Sep 29 12:15 app.js 5-rw-rw-r-- 1 ubuntu ubuntu 216 Sep 29 12:15 circle.yml 6-rw-rw-r-- 1 ubuntu ubuntu 338 Sep 29 12:15 Dockerfile 7-rw-rw-r-- 1 ubuntu ubuntu 421 Sep 29 12:15 package.json 8-rw-rw-r-- 1 ubuntu ubuntu 370 Sep 29 12:15 README.md 9drwxrwxr-x 2 ubuntu ubuntu 4096 Sep 29 12:15 test10drwxrwxr-x 2 ubuntu ubuntu 4096 Sep 29 12:15 views对于Windows示例读者需要cd到dotnet-docker-samples\aspnetapp目录当中。Linux的示例是一个简单的Node.js Web应用。Windows示例是一个简单的ASP.NET Web应用。每个仓库中都包含一个名为Dockerfile的文件。Dockerfile是一个纯文本文件其中描述了如何将应用构建到Docker镜像当中。查看Dockerfile的全部内容。 1$ cat Dockerfile 2 3FROM alpine 4LABEL maintainernigelpoultonhotmail.com 5RUN apk add --update nodejs nodejs-npm 6COPY . /src 7WORKDIR /src 8RUN npm install 9EXPOSE 808010ENTRYPOINT [node, ./app.js]Windows示例中的Dockerfile内容会有所不同。但是这些区别在现阶段并不重要。关于Dockerfile的更多细节本书会在接下来的章节中进行详细介绍。现在只需要知道Dockerfile的每一行都代表一个用于构建镜像的指令即可。使用docker image build命令根据Dockerfile中的指令来创建新的镜像。示例中新建的Docker镜像名为test:latest。一定要在包含应用代码和Dockerfile的目录下执行这些命令。 1$ docker image build -t test:latest . 2 3Sending build context to Docker daemon 74.75kB 4Step 1/8 : FROM alpine 5latest: Pulling from library/alpine 688286f41530e: Pull complete 7Digest: sha256:f006ecbb824...0c103f4820a417d 8Status: Downloaded newer image for alpine:latest 9 --- 76da55c8019d10Snip11Successfully built f154cb3ddbd412Successfully tagged test:latest{注} Windows示例构建可能花费比较长的时间。构建时间长短是由构建过程中要拉取的镜像大小和复杂度决定的。一旦构建完成就可以确认主机上是否存在test:latest镜像。1$ docker image ls2REPO TAG IMAGE ID CREATED SIZE3Test latest f154cb3ddbd4 1 minute ago 55.6MB4...读者现在已经拥有一个新的Docker镜像其中包含了应用程序。从镜像启动容器并测试应用。Linux代码如下。1$ docker container run -d \2 --name web1 \3 --publish 8080:8080 \4 test:latest打开Web浏览器在地址栏中输入容器运行所在的Docker主机的DNS名称或者IP地址并在后面加上端口号8080。然后就能看到图4.1的Web页面。如果读者使用的是Windows示例或者Mac版Docker则需要将地址替换为localhost:8080或者127.0.0.1:8080如果读者使用的是Play with Docker需要单击终端界面上的8080超链接。图1.1 Linux系统测试应用Web界面Windows代码如下。1 docker container run -d \2 --name web1 \3 --publish 8080:80 \4 test:latest打开Web浏览器在地址栏中输入容器运行所在的Docker主机的DNS名称或者IP地址并在后面加上端口号8080然后就能看到图4.2的Web页面。图1.2 Windows系统测试应用Web界面如果读者使用的是Windows示例或者Mac版Docker则可参考上面的规则。读者已经成功将应用代码构建到了Docker镜像当中然后以容器的方式启动该镜像这个过程叫作“应用容器化”。1.3 本文小结在运维部分我们下载了Docker镜像启动容器并且登录到容器内部执行相应的命令最后停止容器并删除。在开发部分我们完成了简单应用的容器化过程从GitHub拉取应用源代码并且通过Dockerfile中的指令将应用代码构建到镜像之中。接着运行了该容器化应用。深入浅出Docker【英】Nigel Poulton奈吉尔 波尔顿扫码一键购在美国亚马逊有一本书的影响力超高的Docker入门书在操作系统分类中排行第一超越了众多实力派Docker书众多五星好评。也许你有所耳闻这本书就是《深入浅出Docker》。这是一本关于Docker的图书。这本书的宗旨是从零开始学习Docker因此你无须任何前置知识储备。如果你对Docker感兴趣希望了解Docker工作原理以及如何正确使用Docker则本书适合你。同时本书也可作为Docker认证工程师考试的参考图书。 欢迎留下您对本文的讨论以及在使用.NET容器化过程中的感悟。评论获点赞最多的前10位读者将获赠《深入浅出Docker》图书一本包邮。活动截止时间3.31 23点。相关文章ASP.NET Core 借助 K8S 玩转容器编排如何使用vs将asp.net core项目添加容器支持并发布docker镜像到私有dockerhub和添加k8s/helm管理.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com