脚本宝典收集整理的这篇文章主要介绍了Docker之Docker介绍,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
Docker是一个开源项目,诞生于2013年初,最初是dotCloud公司内部的一个开源的PAAS服务的业余项目。它是基于GOOGLE公司推出的Go语言实现。项目后来加入了Linux基金会,遵从了@R_512_378@协议,项目代码在GIThub上进行维护。
Docker是基于linux内核实现,docker最早采用LXC技术,LXC是linux原生支持的容器技术,可以提供轻量级的虚拟化,可以说docker就是基于LXC发展起来的,提供LXC的高级封装,标准的配置方法在LXC的基础上docker提供了一系列更强大的功能。而虚拟化技术KVM基于模块实现,后来docker改为自己研发并开源的runc技术运行容器,彻底抛弃了LXC。
Docker相比虚拟机的交付速度更快,资源消耗更低,Docker采用客户端/服务端架构,使用远程API来管理和创建容器,其可以轻松的创建一个轻量级的、可移植的、自给自足的容器,docker的三大理念是build、ship、run,docker遵从apache,并通过namespace级cgroup等来提供容器的资源隔离与安全保障等,所以Docker容器在运行时不需要类似虚拟机的额外开销,因此可以大幅度提高资源利用率,总而言之docker是一种用了新颖方式实现的轻量级虚拟机,类似于vm但是在原理上和vm的差别还是很大,并且docker的专业叫法是应用容器。
每个容器都要有独立的跟文件系统有独立的用户空间,以实现在容器里面启动服务并且使用容器的运行环境,即一个宿主机是ubuntu的服务器,可以在里面启动一个centos运行环境的容器并且在容器里启动一个nginx服务,此nginx运行时使用的运行环境就是centos系统的运行环境,但是在容器里面是不能访问宿主机资源,宿主机是使用了chroot技术把容器锁定到一个指定的运行目录里面。
例如: /VAR/lib/containerd/io.containerd.runtime.v2.task/moby/容器ID
一个容器的进行间通信,允许一个容器内的不同进程的数据访问,但是不能跨容器访问其它容器的数据。
UTS Namespace用于系统标识,其中包含了hostname和域名domainname,它使得一个容器用以数据自己hostname标识,这个主机名称独立于宿主机系统和其它的容器。
linux系统中,有一个PID为1的进程(init/systemd)是其它所有进程的父进程,那么在每个容器内也要有一个父进程来管理其下属的子进程,那么多个容器的进程通过PID Namespace进行隔离。
每一个容器都类似于虚拟机一样有自己的网卡、监听端口、TCP/IP协议栈等,Docker使用network namespace启动一个vethx接口,这样你的容器将拥有它自己的桥接ip地址,通常是docker0,而docker0实质就是linux的虚拟网桥,网桥是在OSI七层的数据链路层的网络设备,通过MAC地址对网络进行划分,并且在不同网络直接传递数据。
User Namespace允许在各个宿主机的各个容器空间内创建相同的用户名以及相同的用户UID和GID,只是会把用户的作用范围限制在每个容器内,即A容器和B容器可以有相同的用户名称和ID的账户,但是此用户的有效范围仅是当前容器内,不能访问另一个容器内的文件系统,即相互隔离、互补隔离、互补影响、用不相见。
Linux cgroups的全称是 linux control groups,它最主要的作用,就是限制一个进程组能够使用资源上限,包括CPU、内存、磁盘、网络带宽等。此外还能够对进程进行优先级设置,以及将进程挂起和恢复操作。
root@node01:~# cat /etc/issueUbuntu 20.04.3 LTS n l
root@node01:~# uname -r5.4.0-84-genericroot@node01:~# cat /boot/config-5.4.0-84-generic | grep CGROUPCONFIG_CGROUPS=yCONFIG_BLK_CGROUP=yCONFIG_CGROUP_WRITEBACK=yCONFIG_CGROUP_SCHED=yCONFIG_CGROUP_PIDS=yCONFIG_CGROUP_RDMA=yCONFIG_CGROUP_FREEZER=yCONFIG_CGROUP_HUGETLB=yCONFIG_CGROUP_DEVICE=yCONFIG_CGROUP_CPUACCT=yCONFIG_CGROUP_PERF=yCONFIG_CGROUP_BPF=y# CONFIG_CGROUP_DEBUG is not setCONFIG_SOCK_CGROUP_DATA=y# CONFIG_BLK_CGROUP_IOLATENCY is not setCONFIG_BLK_CGROUP_IOCOST=y
# CONFIG_BFQ_CGROUP_DEBUG is not setCONFIG_NETFILTER_XT_MATCH_CGROUP=mCONFIG_NET_CLS_CGROUP=mCONFIG_CGROUP_NET_PRIO=yCONFIG_CGROUP_NET_CLASSID=y
root@node01:~# cat /boot/config-5.4.0-84-generic | grep MEM |grep CGCONFIG_MEMCG=yCONFIG_MEMCG_SWAP=y# CONFIG_MEMCG_SWAP_ENABLED is not setCONFIG_MEMCG_KMEM=yCONFIG_SLUB_MEMCG_SysFS_ON=y
root@node01:~# ll /sys/fs/cgroup/
total 0
drwxr-xr-x 15 root root 380 Sep 11 22:56 ./
drwxr-xr-x 11 root root 0 Sep 11 22:56 ../
dr-xr-xr-x 6 root root 0 Sep 11 22:56 blkio/
lrwxrwxrwx 1 root root 11 Sep 11 22:56 cpu -> cpu,cpuacct/
dr-xr-xr-x 6 root root 0 Sep 11 22:56 cpu,cpuacct/
lrwxrwxrwx 1 root root 11 Sep 11 22:56 cpuacct -> cpu,cpuacct/
dr-xr-xr-x 3 root root 0 Sep 11 22:56 cpuset/
dr-xr-xr-x 6 root root 0 Sep 11 22:56 devices/
dr-xr-xr-x 4 root root 0 Sep 11 22:56 freezer/
dr-xr-xr-x 3 root root 0 Sep 11 22:56 hugetlb/
dr-xr-xr-x 6 root root 0 Sep 11 22:56 memory/
lrwxrwxrwx 1 root root 16 Sep 11 22:56 net_cls -> net_cls,net_prio/
dr-xr-xr-x 3 root root 0 Sep 11 22:56 net_cls,net_prio/
lrwxrwxrwx 1 root root 16 Sep 11 22:56 net_prio -> net_cls,net_prio/
dr-xr-xr-x 3 root root 0 Sep 11 22:56 perf_event/
dr-xr-xr-x 6 root root 0 Sep 11 22:56 pids/
dr-xr-xr-x 2 root root 0 Sep 11 22:56 rdma/
dr-xr-xr-x 6 root root 0 Sep 11 22:56 systemd/
dr-xr-xr-x 5 root root 0 Sep 11 22:56 unified/
容器技术除了docker之外,还有coreOS的rkt,还有阿里的Pouch,为了保证容器生态的标准性和健康可持续发展,包括linux基金会、docker、微软、红帽、谷歌和IBM等公司在2015年6月共同成立了一个叫open cintainer的组织,其目的就是制定开放的标准容器规范,目前OCI一共发布了两个规范,分别是runtime space和image format spec,有了这两个规范,不同的容器公司开发的容器只要兼容这两个规范,就可以保证容器的可移植性和相互操作性。
runtime是真正运行容器的地方,因此为了运行不同的容器runtime需要和操作系统内核紧密合作相互支持,以便为容器提供相应的运行环境。
目前主流的三种runtime:
OCI容器镜像主要包含以下内容:
参数:
管理工具连接runtime与用户,对用户提供图形或命令方式操作,然后管理工具将用户操作传递给runtime执行。
lxc是lxd的管理工具。
runc的管理工具是docker engine,docker engine包含后台deamon和cli两部分。
rkt的管理工具是rkt cli。
容器定义工具允许用户定义容器的属性和内容,以方便容器能够被保存、共享和重建。
Docker image:是docker容器的模板,runtime以及docker image创建容器。
Dockerfile:包含N个命令的文本文件,通过dockerfile创建出docker image。
ACI:与docker image类似,是coreOS开发的rkt容器的镜像格式。
统一保存镜像而且是多个不同镜像版本的地方,叫做镜像仓库。
image registry:docker官方提供的私有仓库部署工具。
Docker hub:docker官方的公共仓库,已经保存了大量常用镜像,可以方便大家直接使用。
harbor:vmware提供的自带web界面认证功能的镜像仓库,目前有很多公司使用。
容器编排引擎可以实现统一管理、动态伸缩、故障自愈、批量执行等功能。
Docker swarm:docker开发的容器编排引擎。
kubernetes:google开发的容器编排引擎,内部项目为borg,且同时支持docker和coreOS。
Mesos+Marathon:通用的集群组员调用平台,mesos(资源分配)与marathon(容器编排平台)一起提供容器编排引擎功能。
docker自带的网络docker network仅支持管理单机上的容器网络,当多主机运行的时候需要使用第三方开源网络,例如calico、flannel等。
容器的动态扩容特性决定了容器IP也会随之变化,因此需要有一种机制可以自动识别并将用户请求动态转发到新创建的容器上,kubernetes自带服务发现功能,需要结合kube-dns服务解析内部域名。
可以通过原生命令docker ps/top/stats查看容器运行状态,另外也可以使用heapster/prometheus等第三方监控工具监控容器的运行状态。
容器的动态迁移会导致其在不同的host之间迁移,因此如何保证与容器相关的数据也能随之迁移或随时访问,可以使用逻辑卷/储存挂载等方式解决。
docker原生的日志查看工具docker LOGs,但是容器内部的日志需要通过ELK等专门的日志收集分析和展示工具进行处理。
以上是脚本宝典为你收集整理的Docker之Docker介绍全部内容,希望文章能够帮你解决Docker之Docker介绍所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。