image.png 先说结论:Docker容器的本质是一个特殊的进程。 学过操作系统的大家应该知道进程其实是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 其实在操作系统视角来看,处于运行时的Docker容器本身也是一个进程,只是这个进程比较特殊,下面我们就来说说他特殊在哪里 针对Linux容器来说,为了实现容器间资源隔离与限制,其对容器进程做了下面的处理 第一:其使用Linux提供的NameSpace技术来修改Docker容器进行时视图,实现每个容器有相互隔离的网络命名空间、进程空间等;比如你在Docker容器内查看进程列表,会发现容器自身是1号进程, 其并看不到操作系统视角的其他进程,比如每个docker容器看到的都是各自独立的文件系统,相互之间不会影响。 它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。 总结:针对Linux内核的容器,比如Docker容器来说,其本质是一个特殊的进程。
在前面以Docker项目为例,一步步剖析了Linux容器的具体实现方式。 这个重要假设,正是容器技术圈在Docker项目成功后不久,就迅速走向了“容器编排”这个“上层建筑”的主要原因: 作为云基础设施提供商,只要能够将用户提交的Docker镜像以容器的方式运行,就能成为容器生态图上的一个承载点 这就意味着,像Docker这样的“容器镜像”在Borg中是不存在的,Borglet组件也自然不需要像kubelet这样考虑如何同Docker进行交互、如何对容器镜像进行管理的问题,也不需要支持CRI、CNI 在“功能单位”划分上,容器却有着独到的“细粒度”优势: 毕竟容器的本质,只是一个进程而已 就是说,只要你愿意,那些原挤在同一VM里的各个应用、组件、守护进程,都可被分别做成镜像! 所以说,Kubernetes的本质,是为用户提供一个具有普遍意义的容器编排工具。 Kubernetes为用户提供的不仅限于一个工具。
举个例子 NameSpace可以让当前进程只能看到当前Namespace里的进程,看不到宿主机创建的进程。并且运行容器的命令为1号进程。 再次证明容器也只是宿主机中的一个进程而已。 先拷贝一个文件系统出来作为我们容器的根文件系统 docker export 48ab2ddd04dc | tar -C . cgroup的情况 当然docker已经封装好了,直接调用以下命令即可实现上面CPU的限制 docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu /bin/bash 可以看到在/sys/fs/cgroup/cpu,cpuacct/docker目录下创建了该容器的目录,目录下面包含了资源限制文件 [root@k8s-worker1 docker]
本文结合理论与实战,先是从进程隔离、文件隔离、namespace、cgroups、libcontainer展开介绍容器的本质与概念,然后分析docker的技术架构,最后演示docker的常用操作。 而今天,我们就先从docker的原理开始。 微信图片_20190910094723.jpg 容器本质之进程隔离 1. 容器本质 容器本质上是一种进程隔离的技术。 LXC提供了各种编程语言的 API 实现,包括 Python3、Python2、Lua、Go、Ruby 和 Haskell。 Docker的发展状况 从goole热度上可以获取到docker的热度如下: ? 容器本质之Namespace 1. 这也为Docker实现全面的跨平台带来了可能。 从上面的架构图中可以看到,docker daemon通过docker的execdriver和networkriver完成对容器及容器网络的创建。 3.
什么是容器技术 云原生的基础就是容器化。可以说正是容器技术的快速发展,才推动了云原生的时代浪潮。 要想理解容器的本质,我们先来聊聊是容器技术。 简单来说,镜像就是把应用程序运行所依赖的环境、配置等打包成的一个文件;而仓库则是保存和管理这些镜像的地方。这两个概念我们后面的章节会详细展开,本节就先来说一下容器。 容器的本质 那么到底什么是容器呢? 我们结合 Docker 官方的图片来感性理解下: Docker 的 Logo 是一条小鲸鱼,其实它代表的是码头工人,上面运输的就是一个个标准化、可装卸、互相隔离的集装箱。 其实容器和集装箱做的是同样的事情。结合对集装箱的理解,我们尝试给容器下一个定义: 容器,英文 Container,本质就是对进程的封装。 我们看下 Docker 官方提供的一张对比图: 左边是虚拟机,它的核心就是 Hypervisor 虚拟化技术。 简单来说,就是在底层物理机的基础上,再虚拟化出的是硬件资源,并且在上面创建操作系统。
对于 Docker 等大多数 Linux 容器来说,Cgroups 技术是用来制造约束的主要手段; Namespace 技术则是用来修改进程视图的主要方法; 下面我们使用 C 语言和 Namespace ” 上面其实已经基本实现了一个容器,接下去我们实现一下 Docker 卷的基本原理(假设你已经知道卷是什么了)。 同理,在使用 Docker 的时候,其实也并没有一个真正的 Docker 容器运行在宿主机里面。 Docker 项目启动还是用户原来的应用进程,只是在创建进程的时候,Docker 为这个进程指定了它所需要启用的一组 Namespace 参数。 相比虚拟机的方式,本质是进程的容器则仅仅是在操作系统上划分出了不同的“运行环境”,从而使得占用资源更少,部署速度更快。 巨人的肩膀 1.
1 docker pull docker.io/tramasoli/centos7-ssh 2 docker run -i -t --name centos7ssh docker.io/tramasoli /centos7-ssh /bin/bash 3 docker commit containerid centos7ssh-images 4 docker run -i -t --name centos7ssh centos7ssh-image /bin/bash 5 docker start centos7ssh 6 docker exec -i -t centos7ssh /bin/bash 容器间链接 --link redis:db 可以多个link --volumes-from 把容器内的所有卷都加入新创建的容器中 ?
有一项重要的参数 -v 目录挂载,就是让容器内部目录和宿主主机目录关联起来,这样就可以直接操作宿主主机目录而不用再操作具体容器了 比如在2中,我们要发布一个war包,是通过 sudo docker ,冒号前为宿主主机目录,冒号后为容器对应目录 执行上面的命令启动,这次启动就和上一篇文章中的启动日志有点差异了:差异就在容器启动时,tomcat加载了我们映射的宿主主机目录中的war包 xiaochangwei drwxrwxr-x 9 xiaochangwei xiaochangwei 4096 Dec 20 18:28 tomcat/ xiaochangwei@ubuntu:~/test$ 然后看容器的控制台 这样,我们就可以在宿主主机下根据不同的容器建立对应的便于记忆的目录路径,有发布需求的时候,直接将war包拷贝到宿主主机目录即可,容器叫什么名字,对应的容器的发布路径在哪里就与发布者无关了 下一篇文章我将讲解和 jekins集成,让代码编译好后自动部署到docker中 2015年11月写了一篇文章,是代码在jenkins中编译好后发布到远端tomcat的,可以参考下 http://www.cnblogs.com
这一节我们来稍微了解下docker原理性的东西 docker run -i -t ubuntu /bin/bash 输入上面这行命令,启动一个ubuntu容器时,到底发生了什么? 首先系统要有一个docker daemon的后台进程在运行,当刚才这行命令敲下时, 1. docker client(即:docker终端命令行)会调用docker daemon请求启动一个容器, 2. docker daemon会向host os(即:linux)请求创建容器 3. linux会创建一个空的容器(可以简单理解为:一个未安装操作系统的裸机,只有虚拟出来的CPU、内存等硬件资源) 4. 将镜像文件加载到容器中(即:裸机上安装好了操作系统,不再是裸机状态) 最后,我们就得到了一个ubuntu的虚拟机,然后就可以进行各种操作了。 如果在第4步检查本机镜像文件时,发现文件不存在,则会到默认的docker镜像注册机构(即:docker hub网站)去联网下载,下载回来后,再进行装载到容器的动作,即下图所示 ?
上一篇我们从linux 容器的诞生,与架构对docker 有了初步的了解,这个篇章我们将透过现象看本质,深入的探索Linux容器化与Docker 技术 的原理与本质。 Docker 是一种流行的容器化平台,它利用 Linux 内核中的 cgroups 和 namespaces 特性实现了轻量级的容器隔离。 Docker 的工作流程在 Docker 中,容器的创建和运行可以分为以下四个步骤:镜像获取 Docker 的镜像是一个文件系统层的集合,包含了应用程序运行所需的所有组件。 然后,Docker 会将容器进程切换到容器的网络命名空间中,以获得独立的网络接口和 IP 地址。 此外,Docker 还会挂载容器的文件系统层,并启动容器中定义的应用程序。
一、Docker容器的基本概念 1.1 Docker容器是什么? Docker容器是一种轻量级、可移植的虚拟化技术,用于打包、运输和运行应用程序及其所有依赖项。 1.2 Docker镜像与容器的关系 Docker镜像和容器之间有着密切的关系,它们是Docker技术中两个核心概念,相辅相成,共同构建了Docker容器化的环境。 Docker容器: Docker容器是Docker镜像的运行实例,它是一个独立的、可执行的进程,具有自己的文件系统、网络和进程空间。 工作原理: 当用户运行一个Docker容器时,Docker引擎会根据指定的镜像创建一个新的容器实例。 以下是一些Docker容器的主要特性: 轻量级: Docker容器与传统的虚拟机相比,具有更低的资源消耗和更快的启动时间。
容器的管理操作 容器常见的命令:查看、创建、启动、终止和删除 创建容器 docker create docker run 二者的区别在于docker create创建的容器处于停止状态,docker run 上述的两个标志就表示创建了一个交互shell,是创建交互容器的基本设置 3、--name表示为容器指定一个名字,如果不指定系统将随机产生一个名字 4、centos表示要使用的镜像,:6.7表示要用的linux ~]# 这里也可以验证docker ps 以及docker ps –a的区别 docker ps 显示的为正在运行的容器 docker ps –a 显示所有的容器 docker ps的其他参数: docker 查看容器日志 docker logs –f 容器名 可以查看容器的日志 参数: -tail 可以查看输入日志的行数 -f 将只需输入最新的日志 查看容器进程 docker top 容器名 可以查看容器中的进程 3 months ago 190.6 MB res和tag分别表示生成的镜像和标记 同时可以通过网络导入镜像 docker import url res:tag
问题描述: centos 启动一个容器添加了-d 参数,但是docker ps 或者docker ps -a查看却已经退出了 shell>docker run -d centos a44b2b88559b68a2221c9574490a0e708bff49d88ca21f9e59d3eb245c7c0547 shell>docker ps 退出原因 1、docker容器运行必须有一个前台进程, 如果没有前台进程执行,容器认为空闲,就会自行退出 2、容器运行的命令如果不是那些一直挂起的命令( 运行top ,tail、循环等),就是会自动退出 3、这个是 docker 的机制问题 解决方案 方案1: 网上有很多介绍,就是起一个死循环进程,让他不停的循环下去,前台永远有进程执行,那么容器就不会退出了,以 ,还占用一个终端 方案2: shell>docker run -dit centos /bin/bash 添加-it 参数交互运行 添加-d 参数后台运行 这样就能启动一个一直停留在后台运行的Centos shell>docker ps 容器运行起来了 进入容器的方法: 使用exec,不要使用attach命令 attach命令就是使用现有终端,如果你要退出容器操作,那么bash结束,容器也就退出了
大家好,又见面了,我是你们的朋友全栈君。 在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。 1、attach命令 attach命令是Docker自带的命令,命令格式为: docker attach [–detach-keys[=[]]] [–no-stdin] [–sig-proxy[ 2、exec命令 Docker从1.3.0版本起提供了一个更加方便的exec命令,可以在容器内直接执行任意命令。 例如进入到刚创建的容器中,并启动一个bash: 可以看到,一个bash终端打开了,在不影响容器内其他应用的前提下,用户可以很容易与容器进行交互。 通过exec命令对容器执行操作是最为推荐的方式。 3、nsenter 工具 在util-linux软件包版本2.23+中包含nsenter工具。
二、管理Docker容器 2.1 启动和停止容器 启动和停止容器是使用 Docker 运行容器时常见的操作。 四、Docker容器的部署与扩展 4.1 Docker Compose Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。 示例 Docker Compose 文件: 以下是一个简单的 Docker Compose 文件示例: version: '3' services: web: image: nginx: 例如: docker service create --name my-web-app --replicas 3 -p 8080:80 my-web-image 这个命令将创建一个名为 my-web-app 的服务,它由 my-web-image 镜像构建,并在集群中运行 3 个副本。
大家好,又见面了,我是你们的朋友全栈君。 什么是 Docker? Docker 是一种工具,它让容器创建,部署和运行应用程序变得更加容易。 容器使开发人员可以将应用程序与所需的所有部分(如库和其他依赖项)打包在一起,并将其作为一个包进行部署。 这样,借助容器,开发人员可以放心,该应用程序可以在任何其他Linux机器上运行,而不用管该机器的环境配置。 启动 MySQL 容器 创建一个 Docker Volume,Volume 是用来储存状态的,这里就是用来存储数据的。 如此一来,就算我们不小心移除了 MySQL 容器,数据依然会保留下来: $ docker volume create tinylearn-vol 复制代码 启动容器: $ docker run --name
搜索镜像 docker search 镜像名 --filter=stars=3: 列出点赞数不小于指定数值的镜像 --no-trunc: 显示完整的镜像描述 --automated: 只列出automated build类型的镜像 3. 保存改动为新的image docker commit -m 'fun' 2a2f3a5c960f fun-nginx 这段代码的含义是, 提交对docker容器所做的修改, 并起了一个名字叫fun. 查看容器日志 docker logs -f -t --tail 数字 容器ID -t: 是加入时间戳 -f: 跟随最新的日志打印 --tail 数字: 显示最多多少条 3. 查看容器内部的细节 docker inspect 容器ID docker容器内部是洋葱环,一层套一层. inspect就是查看容器内部的细节的 5.
Docker 架构: Docker 是一种容器实现方式,受到多家公司的支持,红帽在红帽 企业 Linux Atomic Host 平台中提供支持 Docker Hub 提供大量由社区开发的容器 Docker 采用 CS 架构: - 客户端:docker 命令负责与服务器通信,通过 RESTful API 操作 - 服务器端:docker 服务作为守护进程运行,承担创建、运行和下 载容器镜像的任务 Docker 内核: 容器由 Docker 从 Docker 格式的容器镜像创建,通过 Linux 内 核的若干功能相互隔离。 每个容器的 进程放入唯一的类别中,从而互相隔离 Docker 容器镜像: Docker 中每个容器由一系列层(layer)组成,组成虚拟文件系 统。 Docker 容器镜像具只读;添加的额外层会覆盖其内容,但不会更改。
一:什么是容器 如果容器理解为独立运行的一个或一组应用,以及它们的运行态环境。 而虚拟机则为可理解为跑在上面的应用。 二:创建容器 创建文件名为Dockerfile的空目录,将以下三个文件复制到其中。 #docker build -t friendlyhello . 3.查看新建镜像 新建的镜像在Docker 镜像registry中 #docker images 4.运行应用程序 运行该APP(应用程序 #docker container stop 1fa4ab2cf395 三:分享镜像 1.登录Docker 登录到本地计算机上公共的Docker注册表。 #docker tag friendlyhello john/get-started:part2 3.
docker run 使用镜像启动容器 docker ps 列出正在运行的容器 docker exec 在容器内执行另一个程序 docker stop 停止容器 docker start 将停止的容器再次启动 docker rm 删除容器 docker export 将容器内的文件系统导出 docker export -o rootfs.tar 容器ID 容器被停止后,docker ps命令就看不到该容器了 镜像的分层信息可以通过命令docker inspect 镜像名称获取,其中RootFs是对应的信息 >>> docker inspect b3log/siyuan ..... /diff:/var/lib/docker/overlay2/ed9ad4fb9d0f9bf3aea553c634e54fef89448cf43c5b662468d79f01cf41d0c3/diff: /var/lib/docker/overlay2/9db169e1ad2165f688e652ef06dfe9a3e465c31299f3c357a37a6919747efbc8/diff",