在上一篇的文章中,我给大家主要介绍了一下 Docker 环境的搭建,简单的讲解了一下 Docker 架构,以及用 Docker 命令简单演示了一下如何拉去一个 images 镜像。本篇我们将剖析一下 Docker 容器是如何工作的,学习好Docker容器工作的原理,我们就可以自己去管理我们的容器了。

Docker架构

在上一篇文章的学习中,我们简单地讲解了Docker的基本架构。了解到了 Docker 使用的是 C/S 结构,即客户端/服务器体系结构。明白了 Docker 客户端与 Docker 服务器进行交互时, Docker 服务端负责构建、运行和分发 Docker 镜像。 也知道了 Docker 客户端和服务端可以运行在一台机器上,可以通过 RESTful 、 stock 或网络接口与远程 Docker 服务端进行通信。

我们从下图可以很直观的了解到Docker的架构:

Docker 的核心组件包括:

  1. Docker Client

  2. Docker daemon

  3. Docker Image

  4. Docker Registry

  5. Docker Container

Docker 采用的是 Client/Server 架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。客户端和服务器可以运行在同一个 Host 上,客户端也可以通过 socket 或 REST API 与远程的服务器通信。可能很多朋友暂时不太理解一些东西,比如 REST API 是什么东西等,不过没关系,在后面的教程中会一一给大家讲解清楚。

Docker Client

DockerClient ,也称 Docker 客户端。它其实就是 Docker 提供命令行界面 (CLI) 工具,是许多 Docker 用户与 Docker 进行交互的主要方式。客户端可以构建,运行和停止应用程序,还可以远程与 Docker_Host进行交互。最常用的 Docker 客户端就是 docker 命令,我们可以通过 docker 命令很方便地在 host 上构建和运行 docker 容器。

Docker daemon

Dockerdaemon 是服务器组件,以 Linux 后台服务的方式运行,是 Docker 最核心的后台进程,我们也把它称为守护进程。它负责响应来自 DockerClient 的请求,然后将这些请求翻译成系统调用完成容器管理操作。该进程会在后台启动一个 APIServer ,负责接收由 DockerClient 发送的请求,接收到的请求将通过 Dockerdaemon内部的一个路由分发调度,由具体的函数来执行请求。

我们大致可以将其分为以下三部分:

  • Docker Server

  • Engine

  • Job

Docker Daemon的架构如下所示:

DockerDaemon 可以认为是通过 DockerServer 模块接受 DockerClient 的请求,并在 Engine 中处理请求,然后根据请求类型,创建出指定的 Job 并运行。 DockerDaemon 运行在 Dockerhost 上,负责创建、运行、监控容器,构建、存储镜像。

运行过程的作用有以下几种可能:

  • 向 DockerRegistry 获取镜像

  • 通过 graphdriver 执行容器镜像的本地化操作

  • 通过 networkdriver 执行容器网络环境的配置

  • 通过 execdriver 执行容器内部运行的执行工作

由于 DockerDaemon 和 DockerClient 的启动都是通过可执行文件 docker 来完成的,因此两者的启动流程非常相似。 Docker 可执行文件运行时,运行代码通过不同的命令行 flag 参数,区分两者,并最终运行两者各自相应的部分。

启动 DockerDaemon 时,一般可以使用以下命令来完成

docker --daemon = truedocker –ddocker –d = true

再由 docker 的 main() 函数来解析以上命令的相应 flag 参数,并最终完成 DockerDaemon 的启动。

下图可以很直观地看到 DockerDaemon 的启动流程:

默认配置下, Dockerdaemon 只能响应来自本地 Host 的客户端请求。如果要允许远程客户端请求,需要在配置文件中打开 TCP 监听。我们可以照着如下步骤进行配置:

1、编辑配置文件 /etc/systemd/system/multi-user.target.wants/docker.service ,在环境变量 ExecStart 后面添加 -H tcp://0.0.0.0,允许来自任意 IP 的客户端连接。

2、重启 Dockerdaemon

systemctl daemon-reloadsystemctl restart docker.service

3、我们通过以下命令即可实现与远程服务器通信

  1. docker -H 服务器IP地址 info

-H 是用来指定服务器主机, info 子命令用于查看 Docker 服务器的信息

Docker Image

在开篇那文【Docker系列教程之一】Docker入门中我已经提到过, Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。我们可将 Docker 镜像看成只读模板,通过它可以创建 Docker 容器。

镜像有多种生成方法:

  1. 从无到有开始创建镜像

  2. 下载并使用别人创建好的现成的镜像

  3. 在现有镜像上创建新的镜像

我们可以将镜像的内容和创建步骤描述在一个文本文件中,这个文件被称作 Dockerfile ,通过执行 docker build<docker-file> 命令可以构建出 Docker 镜像,在后续的教程中,我们会用一篇专门讨论这个问题。

Docker Registry

Dockerregistry 是存储 docker image 的仓库,它在 docker 生态环境中的位置如下图所示:

运行 docker push、 docker pull、 docker search时,实际上是通过 docker daemon 与 docker registry 通信。具体内容可以参看开篇那文【Docker系列教程之一】Docker入门

Docker Container

Docker 容器就是 Docker 镜像的运行实例,是真正运行项目程序、消耗系统资源、提供服务的地方。 DockerContainer 提供了系统硬件环境,我们可以使用 DockerImages 这些制作好的系统盘,再加上我们所编写好的项目代码, run 一下就可以提供服务啦。

Docker组件是如何协作运行容器

看到这里,我相信各位读者朋友们应该已经对Docker基础架构已经熟悉的差不多了,我们还记得上一篇我们运行的第一个容器吗?现在我们再通过hello-world这个例子来体会一下 Docker 各个组件是如何协作的。

容器启动过程如下:

  • Docker 客户端执行 docker run 命令

  • Dockerdaemon 发现本地没有 hello-world 镜像

  • daemon 从 DockerHub 下载镜像

  • 下载完成,镜像 hello-world 被保存到本地

  • Dockerdaemon 启动容器

具体过程可以看如下这幅演示图:

我们可以通过 docker images 可以查看到 hello-world 已经下载到本地

我们可以通过 docker ps 或者 docker container ls 显示正在运行的容器,我们可以看到, hello-world 在输出提示信息以后就会停止运行,容器自动终止,所以我们在查看的时候没有发现有容器在运行。

总结

通过本篇文章的讲解,我相信大家对 Docker 容器的工作流程已经非常清楚了,在后续的文章中,我会带大家了解 Dockerfile 的一些基本概念、如何构建一个镜像等相关内容。

转载于:https://www.cnblogs.com/blackCatFish/p/9807588.html

【Docker系列教程之三】Docker容器是如何工作的相关推荐

  1. Docker系列之五:Docker 三剑客之 Docker Swarm

    title: Docker系列之五:Docker 三剑客之 Docker Swarm categories: Docker tags: - Docker timezone: Asia/Shanghai ...

  2. Dojo mobile TweetView 系列教程之三——Tweets和Mentions视图

    Dojo mobile TweetView 系列教程之三--Tweets和Mentions视图 分类: Javascript Dojo扩展 (dojox)2011-05-18 19:13 2211人阅 ...

  3. Docker系列(二): 搭建docker镜像仓库-Nexus、Harbor

    Docker介绍及环境搭建参考: Docker系列一: docker介绍&&安装(含离线安装) Docker系列(二): 搭建docker镜像仓库-Nexus.Harbor Docke ...

  4. Docker系列教程15-Docker容器网络

    原文:http://www.itmuch.com/docker/15-docker-network/ 本文是篇翻译.原文:https://docs.docker.com/engine/userguid ...

  5. Docker系列教程01-Centos7安装新版Docker教程(10步)

    最近一直忙于开发,没有时间好好总结一下docker的知识.其实现在docker的教程已经很多很多了,但是很多系统的教程都是基于Ubuntu系统,因为官方推荐使用Ubuntu系统啊,原因在于Ubuntu ...

  6. TeamCity系列教程(一)-docker安装配置teamcity

    作为CI持续集成的工具之一,相比Jenkins界面更友好,插件更多,功能大同小异,本次教程使用Docker环境 部署,所以要有Docker基础. 一.安装TeamCity服务端 这里说一下,TeamC ...

  7. Docker系列技术分享、容器技术和Docker

    目录 什么是容器? 什么是Docker? 虚拟机和容器的区别? 容器会代替虚拟机吗? Docker带来的技术变革? 1. DevOps 2. 微服务 3. 云计算 什么是容器? 首先来看下什么是容器技 ...

  8. Docker系列技术分享(一) 容器技术和Docker

    文章目录 什么是容器? 什么是Docker? 1. 解决了应用移植过程中环境一致性问题,提供标准化的软件打包.分发的能力 2. 独特的设计和封装,带来了体验上的变革. 虚拟机和容器的区别? Docke ...

  9. Docker系列教程09-使用Docker Hub管理镜像

    为什么80%的码农都做不了架构师?>>>    > 原文:<http://www.itmuch.com/docker/09-docker-docker-hub/> ...

最新文章

  1. 微信python天天学_刚学Python一礼拜!我就能模拟登录微信公众号!我是天才吧!...
  2. eolinker 相关
  3. pcb matrix ipc lp viewer软件中SMN、SMM、SML三个库的区别
  4. 通过GeoIP获取ip所属地 (国家,城市,时区,邮编,经纬度等)
  5. Intellij插件之JRebel
  6. 统计学习方法读书笔记7-K近邻习题
  7. 捷达vs7测试_没有大众车标的光环,捷达VS7显得更厚道,看看是不是你的菜
  8. Oracle数据库的安装及使用教程
  9. 咪咕音乐HTML代码,python3爬取咪咕音乐榜信息(附源代码)
  10. 2020 年全球移动 APT事件总结
  11. 【从嵌入式视角学习香山处理器】一、如何开始?(开发环境搭建)
  12. base64解码成16进制字符串--python3
  13. 学计算机考公务员可以做什么的,学计算机的考公务员将来干什么啊
  14. centos7 默认中文字体_centos7安装中文宋体
  15. 图片还原去遮挡_怎么去马赛克 还原图片去掉遮挡软件
  16. 如何进行小红书推广?小红书平台适合推广什么产品?
  17. Delphi开发OPC
  18. c语言搬山游戏,C语言实例:搬山游戏
  19. Centos7超详细服务器上安装配置教程
  20. 中大新华计算机科学与技术,专业评估|信息科学学院电子信息科学与技术、计算机科学与技术、软件工程、数字媒体技术专业评估考察会议举行...

热门文章

  1. PHP 检查并创建多级目录
  2. 【转】使用手势对UIImageView进行缩放、旋转和移动
  3. 【译】Asp.Net 导出 Excel 数据的9种方案
  4. 【教程】win7下无需软件或adhoc补丁通过无线网卡搭建虚拟wifi网络
  5. 影响力-你为什么说是
  6. java基础—几种for循环编程思想
  7. webpack是什么?为什么要用webpack(一个小白的感想)
  8. Go之Channel
  9. Python数据挖掘和机器学习
  10. APIO/CTSC2017游记