4 综管docker

  • 深入研究 Docker前,对Docker整体介绍
  • 本章含两部分内容。
    • 运维(Ops)视角。
    • 开发(Dev)视角。

  • 运维视角中,包括下载镜像、运行新的容器、登录新容器、在容器内运行命令,销毁容器。

  • 开发视角中,更多关注与应用相关的内容。
  • 本书会从 Github拉取一些应用代码,解释其
    中的 Dockerfile,将应用容器化,并在容器中运行它们。

  • 通过上面两部分,读者可从整体上理解 Docker究竟是什么,及主要组件之间是如何相互配合。

  • 本章主要目的是给读者一个宏观概念
  • 这样在后续章节中介绍更细节的内容时,读者能明白各部分之间是如何交互

  • 读者只需一个可连接到互联网的 Docker主机。
  • Docker节点可是Linux或Windows,
    • 笔记本上的虚拟机,
    • 公有云上的一个实例,数据中心的物理机
  • 只需要这个节点能运行 Docker并且连接到互联网
  • 例子涵盖 Linux和 Windows

  • 快速启动 Docker 的方式,是 Play With Docker(
  • 基于Web界面的 Docker环境,免费
  • 只需浏览器就可用(用Docker Hub账户登录)。
  • 我最喜欢的启动临时 Docker环境的方式。

4.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检测客户端和服务端是否都已成功运行,且可互相通信。

4 综管docker

  • Linux返回异常响应,则可尝试在命令加sudo。
  • 加上sudo之后命令正常运行,需当前用户加入到 docker用户组
    • 或给后面命令都加sudo

4.1.1镜像

  • Docker镜像理解为一个包含了OS文件系统和应用的对象。
  • 如果读者实际操作过,就会认为与虚拟机模板类似。
  • 虚拟机模板本质上是处于关机状态的虚拟机。
  • Docker世界中,镜像等价于未运行的容器。
    • 开发者可将镜像比作类

4 综管docker

  • 运行命令环境是刚完成 Docker安装的主机,或是 Play With Docker,那Docker主机中应当没有任何镜像,命令输出内容会如上

  • Docker主机上获取镜像的操作被称为拉取( pulling)。
  • 如果Linux,那拉取ubuntu:latest镜像;
  • 如果Windows,拉取 microsoft/powershell:nanoserver镜像

4 综管docker

  • 再次 docker image ls来查看刚拉取的镜像。

4 综管docker

  • 镜像的存储位置及镜像内部构成在后续的章节中介绍
  • 读者只需知道镜像包含基础操作系统
    • 应用程序运行所需的代码和依赖包
  • 刚才拉的ubuntu镜像有一个精简版的Ubuntu Linux文件系统
    • 包含部分 Ubuntu常用工具。
  • 拉取的 microsoft/ powershell 11镜像,
    • 则包含带有Powershell的 Windows Nano Server OS

  • 如果拉取如 nginx或microsoft/iis这样的应用容器
    • 则读者得到一个包含操作系统的镜像,
    • 且在镜像中还包括运行 Nginx或IIS所需代码

  • Docker的每个镜像都有唯一ID
  • 通过引用镜像的ID或名称来使用镜像。
  • 如果用户选择使用镜像ID,
    • 只需要输入ID开头的几个字符即可
    • Docker知道用户想引用的具体镜像是哪个

4.1.2容器

  • 目前已拥有一个拉取到本地的镜像,
  • docker container run从镜像来启动容器。

  • Linux中启动容器的命令

4 综管docker

  • Windows中启动容器的命令

4 综管docker

  • 每个实例中的提示符都发生了变化。
  • -it 会将 Shell 切换到容器终端
    • 现在已经位于容器内部

  • docker container run告诉Docker daemon启动新容器
  • -it告诉Docker开启容器的交互模式并将读者当前的Shell连接到容器终端
  • 用户想基于ubuntu: latest镜像启动容器
  • 用户想要在容器内部运行哪个进程。
  • Linux来说是运行 Bash Shell
  • Windows来说则是运行 Powershell

  • 容器内部运行ps查看当前正在运行的全部进程。

4 综管docker

  • Linux容器中仅含
  • 1:/bin/bash进程,该进程是通过 docker container run命令来通知容器运行。
  • 9:ps-e1f进程,査看当前运行中进程所使用的命令/程序。
  • 命令输出中展示的ps-elf进程存在一定的误导,
    • 因为这个程序在ps命令退出后就结束
  • 容器内长期运行的进程其实只有/bin/bash

  • Windows多,这是由 Windows操作系统工作方式决定的。
  • 进程比 Linux容器要多,
    • 与常见的 Windows服务器,其进程数量却是明显偏少

  • Ctrl-PQ,可在退出容器同时还保持容器运行。
  • 这样 Shell 就返回到 Docker主机终端。
  • 可通过查看Shel提示符

  • 现在已返回到 Docker主机的 Shell 提示符,再次运行ps

4 综管docker

  • 看到与容器相比, Docker主机中运行的进程数要多很多。
  • Windows容器中运行的进程要远少于 Windows主机, Linux容器中的进程数也远少于 Linux主机。

  • Ctrl-PQ来退出容器的
  • 在容器内部使用该操作可退出当前容器,但不杀死容器进程
  • docker container ls査看系统内全部处于运行状态的容器

4 综管docker

  • 输出显示只有一个运行中的容器。
  • 看到这个进程是7min之前创建的,且一直运行

4.1.3连接到运行中的容器

  • docker container exec命令,可将Shel连接到一个运行中的容器终端。
  • 之前示例中的容器仍在运行,所以下面的示例会创建到该容器的新连接。

4 综管docker

  • 容器名为“vigilant_brog"。
  • 替换为自己 Docker主机上运行中的容器名称或者ID。

4 综管docker

  • Shell提示符又发生了变化。
  • 此时已登录到容器内部

  • docker container exec< options>
    • <container- name or container-id>< command/app>
  • 将本地Shell连接到容器是通过-it参数实现。
  • 本例中使用名称引用容器,并且告诉 Docker运行 Bash Shell
  • 用十六进制ID也可

  • 再次用Ctrl-PQ退出容器。

  • Shell提示符应当退回到 Docker主机中。
  • docker container ls来确认容器仍处于运行状态。

4 综管docker

  • docker container stop和 docker container rm停止并杀死容器

4 综管docker

  • -a参数来确认容器已经被成功删除。
  • -a的作用是让 Docker列出所有容器,甚至包括那些处于停止状态的。

4 综管docker

4.2开发视角

  • 容器即应用!

  • 分析一份应用代码中的Dockerfile并将其容器化
    • 最终以容器的方式运行
  • 代码从本书配套资源或我Github主页

  • 基于Linux示演示
  • 两个示例中都容器化相同的Web应用代码,
  • 所以步骤也是一样

  • 进入到仓库文件目录

4 综管docker

  • 对Windows,
  • 需cd到 dotnet-docker-samples\aspnetapp

  • Linux示例是简单的Node.js Web应用
  • Windows示例是一个简单的 ASP.NET Web

  • 每个仓库中都含一个名为Dockerfile的文件
  • Dockerfile纯文本,
    • 描述如何将应用构建到 Docker镜像

4 综管docker

  • Windows中Dockerfile有不同
  • 这些区别在现阶段不重要。
  • Dockerfile接下来的章节中介绍。
  • 只需要知道 Dockerfile的每一行都代表一个用于构建镜像的指令

  • docker image build
  • 根据Dockerfile中的指令来创建新镜像
  • 新建的Docker镜像名test:latest
  • 要在包含应用代码和Dockerfile的目录下执行这些命令

4 综管docker

  • Windows示例构建花费比较长。
  • 构建时间长短是由构建过程中要拉取的镜像大小和复杂度决定

  • 构建完成,就可确认主机上是否存在test:latest镜像

4 综管docker

  • 现在已有一个新的 Docker镜像,其中包含应用程序。

  • 从镜像启动容器,并测试应用。

4 综管docker

  • 打开浏览器,输入容器运行所在的Docker主机的DNS名称或IP
  • 加端口号8080
  • 就能看到图4.1

4 综管docker

  • 如果用的是Windows或者Mac版Docker,则需将地址替换为1 localhost:8080
  • 或127.0.0.1:8080
  • 如果用Play with Docker,需单击终端界面上的8080超
    链接

4 综管docker

  • 打开浏览器,
  • 地址栏中输入容器运行所在的 Docker主机的DNS名称或者IP,
  • 并在后面加上8080,然后就能看到图4.2

4 综管docker

  • 如果读者使用的是 Windows示例或者Mac版 Docker,则可参考上面的规则。

  • 读者成功将应用代码构建到Docker镜像
  • 然后以容器的方式启动该镜像,
  • 叫“应用容器化”

4.3本章小结

  • 运维部分,下载Docker镜像,
    • 启动容器且登录到容器内部执行相应的命令,
    • 最后停止容器并删除。

  • 开发部分,完成简单应用的容器化过程
    • 从Github拉取应用源代码
    • 通过Dockerfile中的指令,将应用代码构建到镜像
    • 接着运行该容器化应用

  • 本章帮助读者更好地理解接下来的章节
    • 包括镜像与容器相关细节。