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

在上一篇的文章中,我给大家主要介绍了一下 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 = true

docker –d

docker –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-reload

systemctl 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

时间: 2024-08-05 16:18:31

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

Flux7 Docker 系列教程(一):Docker 简介

本系列教程翻译自 Flux7 Docker Tutorial Series,系列共有九篇,本文译自第一篇 Part 1: An Introduction.  该系列所有文章将参考其他学习资料翻译,也会加入自己的学习作为部分注解.如有错误,欢迎指正. Docker,一种新的容器化技术,因为轻量级和便携化而受到广泛关注.Docker 和 Java 一样,号称"一次构建,一次配置,即可到处运行"(build once, configure once and run anywhere).本篇文

Docker系列(二)---容器

创建容器 新建容器 方法一: [[email protected]]# docker run -it centos:6 echo "hello" hello 方法二: [[email protected]]# docker create -it centos:6 echo "hello" c97b4ca48ce2f2065230398c57955c9ab9a31a3af9301217a626a16471697451 使用方法二创建的容易处于停止状态,使用docker

【Docker系列教程之四】Dockerfile入门

在上一篇的文章中,我们把 Docker 容器的工作流程剖析的十分清楚了,我们大体可以知道 Docker 组件协作运行容器可以分为以下几个过程: Docker 客户端执行 docker run 命令 Dockerdaemon 发现本地没有我们需要的镜像 daemon 从 DockerHub 下载镜像 下载完成后,镜像被保存到本地 Dockerdaemon 启动容器 了解了这些过程以后,我们再来理解这些命令就不会觉得很突兀了,下面我来给大家讲讲 Docker 常用的一些命令操作吧. Docker常用

Docker系列:02.Docker基础使用

02.Docker基础使用 获取镜像: docker pull ubuntu 查找镜像:docker search ubuntu 查看镜像:docker images 删除镜像:docker rmi ubuntu,也可以用id,取前几位就行. 创建镜像:docker commit CONTAINER self:ubuntu CONTAINER为容器id 导出镜像:docker export xxxid > xxx.tar 导入镜像:docker import xxx.tar test/ubunt

Docker系列一:Docker的介绍和安装

Docker介绍 Docker是指容器化技术,用于支持创建和实验Linux Container.借助Docker,你可以将容器当做重量轻.模块化的虚拟机来使用,同时,你还将获得高度的灵活性,从而实现对容器的高效创建.部署和复制,并能将其从一个环境顺利迁移至另外一个环境. Docker官方网站:http://www.docker.com Github Docker 源码:https://github.com/docker/docker 基础特性: 基于C/S架构应用程序 模块化 层与镜像版本控制

Docker系列:第一讲.Docker简介与安装

什么是 Docker? Docker的英文翻译是"搬运工"的意思,他搬运的东西就是我们常说的集装箱Container,Container 里面装的是任意类型的 App,我们的开发人员可以通过 Docker 将App 变成一种标准化的.可移植的.自管理的组件,我们可以在任何主流的操作系统中开发.调试和运行. Docker和虚拟机有什么区别? 从概念上来看 Docker 和我们传统的虚拟机比较类似,只是更加轻量级,更加方便使,Docker 和虚拟机最主要的区别有一下几点: 虚拟化技术依赖的

Provisioning Services 7.8 入门系列教程之三 安装并配置 Provisioning Services

续Provisioning Services 7.8 入门系列教程之二 基础环境安装续 Provisioning Services 解决方案 Provisioning Services 流技术推送技术允许从单个共享磁盘映像实时地置备或重新置备计算机. 在这一过程中,管理员完全无需管理和修补各个系统, 所有映像管理均在主映像上完成. 每个系统的本地硬盘可以用来实现运行时数据缓存,在某些情况下,还可以完全从系统中移除,从而降低电力消耗.系统故障率和安全风险.Provisioning Services

docker系列-搭建本地registry容器的各种坑

总结的坑:a.关注daemon.json的书写格式.一句话可以错好几个点.b.tag要清楚的表示registry服务器的信息,才能push上传成功.不是可有可无的信息.c.tag中有版本号要清楚的写上.系统自动补全的是用latest. #################################################################### 搭建过程:前提:通过docker pull registry下载了registry 1.新建的/etc/docker/daem

Docker 系列五(Docker Compose 项目).

一.概念 Docker Compose 是官方编排项目之一,负责快速的部署分布式应用.它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML格式)来定义一种相关联的应用容器为一个项目. Docker  Compose 中有两个重要的概念: 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例.项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义. Docker Comp