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为用户提供的不仅限于一个工具。
虚拟机与容器的的区别 虚拟机运行在操作系统之上,容器会共享其所在主机的操作系统 Docker 容器的生命周期 Docker 容器的生命周期有以下五种状态 创建装填(Created) 运行状态(running Docker 容器的常见命令 > 启动一个新的容器 启动新容器的的命令格式为 docker [container] run [OPTIONS] IMAGE [COMMAND] [ARG...] )配额 –cpu-period 限制 CPU CFS(完全公平的调度程序)周期 –detach , -d 在后台运行容器并打印容器 ID –ip 设置 ipv4地址 –ip6 设置 ipv6 地址 ) –name 命名一个容器 > 创建一个新的 Docker 容器 创建一个新的 Docker 容器的命令格式为 docker [container] create [OPTIONS] IMAGE )配额 –cpu-period 限制 CPU CFS(完全公平的调度程序)周期 –detach , -d 在后台运行容器并打印容器 ID –ip 设置 ipv4地址 –ip6 设置 ipv6 地址
举个例子 NameSpace可以让当前进程只能看到当前Namespace里的进程,看不到宿主机创建的进程。并且运行容器的命令为1号进程。 再次证明容器也只是宿主机中的一个进程而已。 先拷贝一个文件系统出来作为我们容器的根文件系统 docker export 48ab2ddd04dc | tar -C . 43.71 -bash 容器被cgroup的情况 当然docker已经封装好了,直接调用以下命令即可实现上面CPU的限制 docker run -it --cpu-period=100000 --cpu-quota =20000 ubuntu /bin/bash 可以看到在/sys/fs/cgroup/cpu,cpuacct/docker目录下创建了该容器的目录,目录下面包含了资源限制文件 [root@k8s-worker1
本文结合理论与实战,先是从进程隔离、文件隔离、namespace、cgroups、libcontainer展开介绍容器的本质与概念,然后分析docker的技术架构,最后演示docker的常用操作。 而今天,我们就先从docker的原理开始。 微信图片_20190910094723.jpg 容器本质之进程隔离 1. 容器本质 容器本质上是一种进程隔离的技术。 Docker的发展状况 从goole热度上可以获取到docker的热度如下: ? 容器本质之Namespace 1. Namespace的隔离有6大分类: ? 每个进程都有自己的namespace的id。可以通过ls -l 来查看。 ? 关于6种Namespace的简介如下: Mount namespace 让容器看上去拥有整个文件系统,它与chroot相比,具有更好的安全性和扩展性。
什么是容器技术 云原生的基础就是容器化。可以说正是容器技术的快速发展,才推动了云原生的时代浪潮。 要想理解容器的本质,我们先来聊聊是容器技术。 简单来说,镜像就是把应用程序运行所依赖的环境、配置等打包成的一个文件;而仓库则是保存和管理这些镜像的地方。这两个概念我们后面的章节会详细展开,本节就先来说一下容器。 容器的本质 那么到底什么是容器呢? 我们结合 Docker 官方的图片来感性理解下: Docker 的 Logo 是一条小鲸鱼,其实它代表的是码头工人,上面运输的就是一个个标准化、可装卸、互相隔离的集装箱。 其实容器和集装箱做的是同样的事情。结合对集装箱的理解,我们尝试给容器下一个定义: 容器,英文 Container,本质就是对进程的封装。 我们看下 Docker 官方提供的一张对比图: 左边是虚拟机,它的核心就是 Hypervisor 虚拟化技术。 简单来说,就是在底层物理机的基础上,再虚拟化出的是硬件资源,并且在上面创建操作系统。
自 2013 年起,随着 Docker 的正式面世,容器技术迅速成为了基础技术领域中的热门。而在近两三年中,随着容器编排领域的混战结束,Kubernetes 已经成为了容器编排领域事实上的标准。 当 Kubernetes 使用 Docker 作为容器运行时,用来启动应用;当 Docker 容器规模变大时,自然是需要有容器编排工具进行管理的。 01 容器是什么 Docker 在大多数人眼中几乎是容器(Container)的代名词,即使是现在我也会常听到有人说“我有几个 Docker 跑 xx 服务” 类似这样的话,无疑 Docker 引领了容器的时代 03 使用 Docker 面临的问题 我们要正视 Docker 是一个已经 6 岁的项目了,自它 1.0 发布以来已经 5 年之久了,因此它在生产环境中已经得到了大量的实践和验证,虽然不可避免的也会存在一些历史遗留问题 扫码查看《Docker 核心知识必知必会》 ▼ 专栏介绍 我希望借由这个专栏,将 Docker 容器技术的本质和思想与我在开发和运维 Docker 过程中对其原理和实践经验的总结讲清楚,并将结合着实践和核心特性的原理
对于 Docker 等大多数 Linux 容器来说,Cgroups 技术是用来制造约束的主要手段; Namespace 技术则是用来修改进程视图的主要方法; 下面我们使用 C 语言和 Namespace ” 上面其实已经基本实现了一个容器,接下去我们实现一下 Docker 卷的基本原理(假设你已经知道卷是什么了)。 同理,在使用 Docker 的时候,其实也并没有一个真正的 Docker 容器运行在宿主机里面。 Docker 项目启动还是用户原来的应用进程,只是在创建进程的时候,Docker 为这个进程指定了它所需要启用的一组 Namespace 参数。 相比虚拟机的方式,本质是进程的容器则仅仅是在操作系统上划分出了不同的“运行环境”,从而使得占用资源更少,部署速度更快。 巨人的肩膀 1.
我们如果一个个去启动应用,当项目非常多时,就很难记住了,所有需要一个配置文件,负责实现对Docker容器集群的快速编排。 docker-compose 简介 Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。 一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。 Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。
上一篇我们从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 创建的容器处于启动状态 用docker create创建一个停止状态的容器 [root@docker ~]# docker create centos:6.7 Unable to find image ~]# 创建成功后,Docker会返回容器的ID,如上述中的:a4cca9f1f77695ef11912963ec60b15e2fb4663c50792583c2e4fe2c375a35b6。 ~]# 这里也可以验证docker ps 以及docker ps –a的区别 docker ps 显示的为正在运行的容器 docker ps –a 显示所有的容器 docker ps的其他参数: docker 查看容器日志 docker logs –f 容器名 可以查看容器的日志 参数: -tail 可以查看输入日志的行数 -f 将只需输入最新的日志 查看容器进程 docker top 容器名 可以查看容器中的进程
问题描述: 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结束,容器也就退出了
/weiyigeek/buysbox" Successfully signed docker.io/weiyigeek/buysbox:1.33.1-trust # 6.查看生成的根私有密钥和仓库密钥 Propagation: RW:true Source:/app/docker/volumes/0955b631512898189af6c65b47098f6a791733f8ad560830726105608ba675ff Propagation: RW:true Source:/app/docker/volumes/afab7f34d4fa4dbcfae33ceadc0bc8b17fbfb79abdeabecda6cbe30cd861bef6 5d8e597549062d7709b667457e278e33f15221cb5c8e112bcbb648b3bca59f04:RestartPolicyName=always,MaximumRetryCount=0 b28b6bd4264d9aad4eff7214df6d368c44b5c252a6d61bb7fd85ebc75ffdc957 :UTSMode= b28b6bd4264d9aad4eff7214df6d368c44b5c252a6d61bb7fd85ebc75ffdc957:UTSMode= 判断方法: 如果上述命令返回host
Docker容器内不能联网的6种解决方案 注:下面的方法是在容器内能ping通公网IP的解决方案,如果连公网IP都ping不通,那主机可能也上不了网(尝试ping 8.8.8.8) 1.使用--net: host选项 sudo docker run --net:host --name Ubuntu_bash -i -t ubuntu:latest /bin/bash 2.使用--dns选项 sudo docker 去掉“docker_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"”前的#号 4.不用dnsmasq vi /etc/NetworkManager/NetworkManager.conf 在dns=dnsmasq前加个#号注释掉 sudo restart network-manager sudo restart docker 5.重建docker0网络 pkill docker iptables -t nat -F ifconfig docker0 down brctl delbr docker0 docker -d 6.直接在docker内修改/etc/hosts
大家好,又见面了,我是你们的朋友全栈君。 在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。 1、attach命令 attach命令是Docker自带的命令,命令格式为: docker attach [–detach-keys[=[]]] [–no-stdin] [–sig-proxy[ 2、exec命令 Docker从1.3.0版本起提供了一个更加方便的exec命令,可以在容器内直接执行任意命令。 例如进入到刚创建的容器中,并启动一个bash: 可以看到,一个bash终端打开了,在不影响容器内其他应用的前提下,用户可以很容易与容器进行交互。 ,可以通过下面的命令获取: PID=$(docker inspect --format "{ { .State.Pid }}" ) 通过这个PID,就可以连接到这个容器: $ nsenter -
Docker容器内不能联网的6种解决方案 注:下面的方法是在容器内能ping通公网IP的解决方案,如果连公网IP都ping不通,那主机可能也上不了网(尝试ping 8.8.8.8) 1.使用–net: host选项 sudo docker run –net:host –name ubuntu_bash -i -t ubuntu:latest /bin/bash 2.使用–dns选项 sudo docker 去掉“docker_OPTS=”–dns 8.8.8.8 –dns 8.8.4.4″”前的#号 4.不用dnsmasq vi /etc/NetworkManager/NetworkManager.conf 在dns=dnsmasq前加个#号注释掉 sudo restart network-manager sudo restart docker 5.重建docker0网络 pkill docker iptables -t nat -F ifconfig docker0 down brctl delbr docker0 docker -d 6.直接在docker内修改/etc/hosts
二、管理Docker容器 2.1 启动和停止容器 启动和停止容器是使用 Docker 运行容器时常见的操作。 使用这些命令,你可以方便地控制 Docker 容器的启动和停止。 2.2 查看容器状态 要查看容器的状态,你可以使用 docker ps 命令。这个命令用于列出当前正在运行的容器。 四、Docker容器的部署与扩展 4.1 Docker Compose Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。 通过 Docker Compose,你可以轻松地管理多容器 Docker 应用程序的部署和运行,简化了容器编排和管理的过程,提高了开发和部署的效率。 4.2 使用Docker Swarm进行集群部署 Docker Swarm 是 Docker 官方提供的容器编排工具,它允许你将多个 Docker 主机组合成一个虚拟的容器集群,以便于部署、管理和扩展容器化应用程序
大家好,又见面了,我是你们的朋友全栈君。 什么是 Docker? Docker 是一种工具,它让容器创建,部署和运行应用程序变得更加容易。 容器使开发人员可以将应用程序与所需的所有部分(如库和其他依赖项)打包在一起,并将其作为一个包进行部署。 这样,借助容器,开发人员可以放心,该应用程序可以在任何其他Linux机器上运行,而不用管该机器的环境配置。 启动 MySQL 容器 创建一个 Docker Volume,Volume 是用来储存状态的,这里就是用来存储数据的。 如此一来,就算我们不小心移除了 MySQL 容器,数据依然会保留下来: $ docker volume create tinylearn-vol 复制代码 启动容器: $ docker run --name
Docker 架构: Docker 是一种容器实现方式,受到多家公司的支持,红帽在红帽 企业 Linux Atomic Host 平台中提供支持 Docker Hub 提供大量由社区开发的容器 Docker 采用 CS 架构: - 客户端:docker 命令负责与服务器通信,通过 RESTful API 操作 - 服务器端:docker 服务作为守护进程运行,承担创建、运行和下 载容器镜像的任务 Docker 内核: 容器由 Docker 从 Docker 格式的容器镜像创建,通过 Linux 内 核的若干功能相互隔离。 每个容器的 进程放入唯一的类别中,从而互相隔离 Docker 容器镜像: Docker 中每个容器由一系列层(layer)组成,组成虚拟文件系 统。 Docker 容器镜像具只读;添加的额外层会覆盖其内容,但不会更改。