【Docker系列教程之三】Docker容器是如何工作的
在上一篇的文章中,我给大家主要介绍了一下 Docker
环境的搭建,简单的讲解了一下 Docker
架构,以及用 Docker
命令简单演示了一下如何拉去一个 images
镜像。本篇我们将剖析一下 Docker
容器是如何工作的,学习好Docker容器工作的原理,我们就可以自己去管理我们的容器了。
Docker架构
在上一篇文章的学习中,我们简单地讲解了Docker的基本架构。了解到了 Docker
使用的是 C/S
结构,即客户端/服务器体系结构。明白了 Docker
客户端与 Docker
服务器进行交互时, Docker
服务端负责构建、运行和分发 Docker
镜像。 也知道了 Docker
客户端和服务端可以运行在一台机器上,可以通过 RESTful
、 stock
或网络接口与远程 Docker
服务端进行通信。
我们从下图可以很直观的了解到Docker的架构:
Docker
的核心组件包括:
Docker Client
Docker daemon
Docker Image
Docker Registry
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、我们通过以下命令即可实现与远程服务器通信
docker -H 服务器IP地址 info
-H
是用来指定服务器主机, info
子命令用于查看 Docker
服务器的信息
Docker Image
在开篇那文【Docker系列教程之一】Docker入门中我已经提到过, Docker
镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。我们可将 Docker
镜像看成只读模板,通过它可以创建 Docker
容器。
镜像有多种生成方法:
从无到有开始创建镜像
下载并使用别人创建好的现成的镜像
在现有镜像上创建新的镜像
我们可以将镜像的内容和创建步骤描述在一个文本文件中,这个文件被称作 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容器是如何工作的相关推荐
- Docker系列之五:Docker 三剑客之 Docker Swarm
title: Docker系列之五:Docker 三剑客之 Docker Swarm categories: Docker tags: - Docker timezone: Asia/Shanghai ...
- Dojo mobile TweetView 系列教程之三——Tweets和Mentions视图
Dojo mobile TweetView 系列教程之三--Tweets和Mentions视图 分类: Javascript Dojo扩展 (dojox)2011-05-18 19:13 2211人阅 ...
- Docker系列(二): 搭建docker镜像仓库-Nexus、Harbor
Docker介绍及环境搭建参考: Docker系列一: docker介绍&&安装(含离线安装) Docker系列(二): 搭建docker镜像仓库-Nexus.Harbor Docke ...
- Docker系列教程15-Docker容器网络
原文:http://www.itmuch.com/docker/15-docker-network/ 本文是篇翻译.原文:https://docs.docker.com/engine/userguid ...
- Docker系列教程01-Centos7安装新版Docker教程(10步)
最近一直忙于开发,没有时间好好总结一下docker的知识.其实现在docker的教程已经很多很多了,但是很多系统的教程都是基于Ubuntu系统,因为官方推荐使用Ubuntu系统啊,原因在于Ubuntu ...
- TeamCity系列教程(一)-docker安装配置teamcity
作为CI持续集成的工具之一,相比Jenkins界面更友好,插件更多,功能大同小异,本次教程使用Docker环境 部署,所以要有Docker基础. 一.安装TeamCity服务端 这里说一下,TeamC ...
- Docker系列技术分享、容器技术和Docker
目录 什么是容器? 什么是Docker? 虚拟机和容器的区别? 容器会代替虚拟机吗? Docker带来的技术变革? 1. DevOps 2. 微服务 3. 云计算 什么是容器? 首先来看下什么是容器技 ...
- Docker系列技术分享(一) 容器技术和Docker
文章目录 什么是容器? 什么是Docker? 1. 解决了应用移植过程中环境一致性问题,提供标准化的软件打包.分发的能力 2. 独特的设计和封装,带来了体验上的变革. 虚拟机和容器的区别? Docke ...
- Docker系列教程09-使用Docker Hub管理镜像
为什么80%的码农都做不了架构师?>>> > 原文:<http://www.itmuch.com/docker/09-docker-docker-hub/> ...
最新文章
- 微信python天天学_刚学Python一礼拜!我就能模拟登录微信公众号!我是天才吧!...
- eolinker 相关
- pcb matrix ipc lp viewer软件中SMN、SMM、SML三个库的区别
- 通过GeoIP获取ip所属地 (国家,城市,时区,邮编,经纬度等)
- Intellij插件之JRebel
- 统计学习方法读书笔记7-K近邻习题
- 捷达vs7测试_没有大众车标的光环,捷达VS7显得更厚道,看看是不是你的菜
- Oracle数据库的安装及使用教程
- 咪咕音乐HTML代码,python3爬取咪咕音乐榜信息(附源代码)
- 2020 年全球移动 APT事件总结
- 【从嵌入式视角学习香山处理器】一、如何开始?(开发环境搭建)
- base64解码成16进制字符串--python3
- 学计算机考公务员可以做什么的,学计算机的考公务员将来干什么啊
- centos7 默认中文字体_centos7安装中文宋体
- 图片还原去遮挡_怎么去马赛克 还原图片去掉遮挡软件
- 如何进行小红书推广?小红书平台适合推广什么产品?
- Delphi开发OPC
- c语言搬山游戏,C语言实例:搬山游戏
- Centos7超详细服务器上安装配置教程
- 中大新华计算机科学与技术,专业评估|信息科学学院电子信息科学与技术、计算机科学与技术、软件工程、数字媒体技术专业评估考察会议举行...