SEO技术

SEO技术

Products

当前位置:首页 > SEO技术 >

深圳金溪区做网站和app开发的公司有哪些推荐?

96SEO 2026-02-20 07:43 0


它在1979年的时候就出现了#xff0c;被认为是最早的容器化技术之一。

它可以把一个进程的文件系统隔离起来。

2、The

#xff08;监狱#xff09;实现了操作系统级别的虚拟化#xff0c;他…Docker介绍

容器历史

就是常见的chroot命令的用法。

它在1979年的时候就出现了被认为是最早的容器化技术之一。

它可以把一个进程的文件系统隔离起来。

2、The

监狱实现了操作系统级别的虚拟化他是操作系统级别虚拟化技术的先驱之一。

2000年伴随FreeBSD4.0版的发布

3、Linux

使用添加到Linux内核的系统级别的虚拟化功能实现的专用虚拟服务器。

允许创建许多独立的虚拟专用服务器VPS这些虚拟专用服务器在单个物理服务器上全速同时运行从而有效地共享硬件资源。

VPS提供与传统Linux服务器几乎相同的操作系统环境。

可以在这样的VPS上启动所有服务例如ssh邮件Web和数据库服务器而无需或者在特殊情况下只需进行很少的修改就像在任何真实服务器上一样。

每个VPS都有自己的用户账户数据库和root密码并且与其他虚拟机服务器隔离但它们共享相同的硬件资源。

4、Solaris

也是操作系统级别的虚拟化技术专为X866和SPARC系统设计。

Solaris容器是系统资源控制和通过“区域”提供边界隔离的组合。

5、OpenVZ

是一种Linux中操作系统级别的虚拟化技术。

它允许创建多个安全隔离的Linux容器即VPS。

6、Process

Container的简写。

可以提供轻量级的虚拟化以便隔离进程和资源而且不需要提供指令解释机制以及全虚拟化的其他复杂性。

容器有效地将由单个操作系统管理的资源划分到孤立的组中以更好地在孤立的组之间平衡有冲突的资源使用需求。

Linux

Container

COntainer有点像chroot提供了一个拥有自己进程和网络空间的虚拟环境但又有别于虚拟机因为lxc是一种操作系统层次上的资源虚拟化。

8、Warden

在最初阶段Warden使用LXC作为容器运行时。

如今已被CloudFoundy取代。

9、LMCTFY

是Google的容器技术栈的开源版本。

Google的工程师一直在与docker的libertainer团队合作并将libertainerde核心概念进行抽象并移植到此项目中该项目的进展不明估计会被libcontainer取代。

10、Docker

是一个可以将应用及其依赖打包到几乎可以在任何服务器上运行的容器工具。

11、RKT

是Rocket的缩写他是一个专注安全和开放标准的应用程序引擎。

总上所述docker并不是第一个容器化技术但它确实最知名的一个。

Docker码头工人是一个开源项目诞生于2013年初最初是dotCloud公司后由于Docker开源后大受欢迎就将公司名改为Docker

Inc总部位于美国加州的旧金山内部的一个开源的PAAS服务的业余项目。

它基于Google公司推出的Go语言实现。

项目后来加入了Linux基金会遵从了Apache2.0协议项目代码在GitHub上进行维护。

Docker是基于Linux内核实现Docker是最早采用LXC技术LXC是Linux原生支持的容器技术可以提供轻量级的虚拟化可以说docker就是基于LXC发展起来的提供LXC的高级封装标准的配置方法在LXC的基础上docekr提供了一系列更强大的功能。

而虚拟化技术KVM基于模块实现后来Docker改为自己研发并开源的runc技术运行容器彻底抛弃了LXC。

Docker相比虚拟机的交付速度更快资源消耗更低Docker采用客户端/服务端架构使用远程API来管理和创建容器其可以轻松的创建一个轻量级的、可移植的、自给自足的容器docker的三大理念是build构建、ship运输、run运行Docker遵从Apache2.0协议并通过namespace及cgroup等来提供容器的资源隔离与安全保障等所以Docker容器在运行时不需要类似虚拟机空运行的虚拟机占用物理机6%~8%性能的额外资源开销因此可以大幅提高资源利用率总而言之Docker是一种用了新颖方式实现的轻量级虚拟机类似于VM但是在原理和应用上和VM的差别还是很大的并且Docker的专业叫法是应用容器Application

and

AppAnywhere即通过对应用组件的封装Packaging、分发Distribution、部署Deployment。

运行Runtime等生命周期的管理达到应用组件级别的“一次封装到处运行”。

这里的应用组件既可以是一个Web应用也可以是一套数据库服务甚至是一个操作系统。

将应用运行在Docker容器上可以实现跨平台跨服务器只需一次配置准备好相关的应用环境即可实现到处运行保证研发和生产环境的一致性解决了应用和运行环境的兼容性问题从而极大提升了部署效率减少故障的可能性。

统一基础设施环境-docker环境

传统虚拟机是虚拟出一个主机硬件并且运行一个完整的操作系统然后在这个操作系统上安装和运行软件容器内的应用直接运行在宿主机的内核之上容器并没有自己的内核也不需要虚拟硬件相当轻量化每个容器间是互相隔离每个容器内都有一个属于自己的独立文件系统独立的进程空间网络空降用户空间等所以在同一个宿主机上的多个容器之间彼此不会互相影响

容器和虚拟机比较

资源利用率更高开销更小不需要启动单独的虚拟机OS内核占用硬件资源可以将服务器性能压榨到极致虚机一般会有5%~20%的损耗容器运行基本无损耗所以生产中一台物理机只能运行数十个虚拟机但是一般可以运行数百个容器启动速度更快可以在数秒内完成启动占用空间更小容器一般占用的磁盘空间以MB为单位而虚拟机以GB集成性更好和CI/CD持续集成/持续部署相关技术结合性更好实现打报警箱发布测试可以一键运行做到自动化并快速的部署管理实现高效的开发生命周期

使用虚拟机是为了更好的实现服务运行环境隔离每个虚拟机都有独立的内核虚拟化可以实现不同操作系统的虚拟机但是通常一个虚拟机只运行一个服务很明显资源利用率比较低且造成不必要的性能损耗我们创建虚拟机的目的是为了运行应用程序比如Nginx、PHP、Tomcat等web程序使用虚拟机无疑带来了一些不必要的资源开销但是容器技术则基于减少中间运行环节带来较大的性能提升。

根据实验一个运行着Centos的KVM虚机启动后在不做优化的情况下虚机自己就占用100~200M内存。

此外用户应用运行在虚机里它对宿主机操作系统的调用就不可避免地要经过虚拟化软件的拦截和处理这本身又是一层性能损耗尤其对计算资源、网络和磁盘I/O的损耗非常大。

比如。

一台96G内存的物理服务器为了运行java程序的虚拟机一般需要分配4核8G的资源只能运行13台左右的虚机但是改为在docker容器上运行Java程序每个容器只需要分配4G内存即可同样的物理服务器就可以运行25个左右的容器运行数量相当于提高一倍可以大幅节省IT支出通常情况下至少可以节约一半以上的物理设备

Docker主机Host一个物理机或虚拟机用于运行Docker服务进程和容器也称为宿主机node节点Docker服务端ServerDocker守护进程运行Docker容器Docker客户端Client客户端使用docker命令或其他工具调用docker

APIDocker镜像Images镜像可以理解为创建实例使用的模板本质上就是一些程序文件的集合Docker仓库Registry保存镜像的仓库可以搭建私有仓库harborDocker容器Container容器是从镜像生成对外提供服务的一个或一组服务其本质就是将镜像中的程序启动后生成进程

Namespace

怎样保证每个容器都有不同的文件系统并且互不影响一个docker主进程内的各个容器都是其子进程那么如何实现同一个主进程下不同类型的子进程各个容器子进程间能相互通信内存数据吗每个容器怎么解决IP及端口分配的问题多个容器的主机名能一样吗每个容器都要不要有root用户怎么解决账户重名问题

namespace是Linux系统的底层概念在内核层实现即有一些不同类型的命名空间被部署在核内各个docker容器运行在同一个docker主进程并且共用同一个宿主机系统内核各docker容器运行在宿主机的用户空间每个容器都要有类似于虚拟机一样的相互隔离的运行空间但是容器技术是在一个进程内实现运行指定服务的运行环境并且还可以保护宿主机内核不受其他进程的干扰和影响如文件系统网络空间进城空间目前主要通过以下技术实现容器运行空间的相互隔离

隔离类型功能系统调用参数内核版本MNT

Namespacemount提供磁盘挂载点和文件系统的隔离能力CLONE_NEWNS2.4.19IPC

NamespaceInter

Communication提供进程间通信的隔离能力包括信号量消息队列和共享内存CLONE_NEWIPC2.6.19UTS

NamespaceUNIX

System提供内核主机名和域名隔离能力CLONE_NEWUTS2.6.19PID

Namespace

Identification提供进程隔离能力CLONE_NEWPID2.6.24Net

Namespacenetwork提供网络隔离能力包括网络设备网络栈端口等CLONE_NEWNET2.6.29User

Namespaceuser提供用户隔离能力包括用户和组CLONE_NEWUSER3.8

MNT

每个容器都要有独立的根文件系统有独立的用户空间以实现在容器里面启动服务并且使用容器的运行环境即一个宿主机是ubuntu的服务器可以在里面启动一个centos运行环境的容器并且在容器里面启动一个nginx服务此nginx运行时使用的运行环境就是centos系统里面。

IPC

一个容器内的进程通信允许一个容器内的不同进程内存、缓存等数据访问但是不能跨容器直接访问其他容器的数据。

UTS

包含了运行内核的名称、版本、底层体系结构类型等信息用于系统标识其中包含了主机名hostname和域名domainname它使得一个容器拥有属于自己主机名标识这个主机名标识独立于宿主机系统和其他上的机器。

PID

Linux系统中有一个PID为1的进程init/systemd是其他所有进程的父进程那么在每个容器内也要有一个父进程来管理下属的子进程那么多个容器的进程通PID

namespace进程隔离比如PID编号重复、容器内的主进程生成与回收子进程等

NET

每一个容器都类似于虚拟机一样有自己的网卡、监听端口、TCP/IP协议栈等Docker使用network

namespace启动一个vethX接口这样你的容器将拥有它自己的桥接IP地址通常是docker0而docker0实质就是Linux的虚拟网桥网桥是在OSI七层模型的数据链路层的网络设备通过mac地址对网络进行划分并且在不同网络直接传递数据。

User

各个容器内可能会出现重名的用户和用户组名称或重复的用户UID或者GID那么怎么隔离各个容器内的用户空间呢

User

Namespace允许在各个宿主机的各个容器空间内创建相同的用户名以及相同的用户UID和GID只是会把用户的作用范围限制在每个容器内即A容器和B容器可以有相同的用户名称和ID账户但是此用户的有效范围仅是当前容器内不能访问另外一个容器内的文件系统级相互隔离、互不影响、永不相见。

Control

Groups是Linux内核的一个功能最早由Google的工程师主要是Paul

Menage和Rohit

containers。

在2007年时因为在Linux内核中容器container这个名词有许多不同的意义为避免混乱被重命名为cgroup并且被合并到2.6.24版的内核中去。

自那以后又添加了很多功能。

如果不对一个容器做任何资源限制则宿主机会允许其占用无限大的内存空间有时候会因为代码bug程序会一直申请内存直到把宿主机内存占完为了避免此类的问题出现宿主机有必要对容器进行资源分配限制比如CPU、内存等。

Cgroups最主要的作用就是限制一个进程组能够使用的资源上限包括CPU、内存、磁盘、网络带宽等。

此外还能够对进程进行优先级设置资源的计量以及资源的控制比如将进程挂起和恢复等操作。

验证系统

Cgroups在内核层默认已经开启从Centos和Ubuntu不同版本对比显然内核较新的支持的功能更多。

Centos7.4

/boot/config-3.10.0-693.el7.x86_64CONFIG_CGROUPSy#

CONFIG_CGROUP_DEBUG

setCONFIG_CGROUP_FREEZERyCONFIG_CGROUP_PIDSyCONFIG_CGROUP_DEVICEyCONFIG_CGROUP_CPUACCTyCONFIG_CGROUP_HUGETLByCONFIG_CGROUP_PERFyCONFIG_CGROUP_SCHEDyCONFIG_BLK_CGROUPy#

not

setCONFIG_NETFILTER_XT_MATCH_CGROUPmCONFIG_NET_CLS_CGROUPyCONFIG_NETPRIO_CGROUPy[rootjk-k8s

~]#cgroups中内存模块

/boot/config-3.10.0-693.el7.x86_64CONFIG_MEMCGyCONFIG_MEMCG_SWAPyCONFIG_MEMCG_SWAP_ENABLEDyCONFIG_MEMCG_KMEMycgroups具体实现

blkio块设备IO限制cpu使用调度程序为cgroup任务提供CPU访问cpuacct产生cgroup任务的CPU资源报告cpuset如果是多核心的cpu这个子系统会为cgroup任务分配单独的cpu和内存devices允许或拒绝cgroup任务对设备访问freezer暂停和恢复cgroup任务memory设置每个cgroup的内存限制以及产生内存资源报告net_cls标记每个网络包以供cgroup方便使用ns命名空间子系统perf_event增加了对每group的检测跟踪的能力可以检测属于某个特定的group的所有线程以及运行在特定CPU上的线程

查看系统cgroups

/sys/fs/cgroup/cpu/docker/5a1b43275caa1f8c9fff9ea8ccd3813d4a25acf698f15a3ec5eacd77948833b5/cpuacct.usage109845268[rootjk-k8s

~]#[rootjk-k8s

/sys/fs/cgroup/memory/docker/5a1b43275caa1f8c9fff9ea8ccd3813d4a25acf698f15a3ec5eacd77948833b5/memory.limit_in_bytes9223372036854771712[rootjk-k8s

~]#

/sys/fs/cgroup/memory/docker/5a1b43275caa1f8c9fff9ea8ccd3813d4a25acf698f15a3ec5eacd77948833b5/memory.max_usage_in_bytes12566528[rootjk-k8s

~]#容器管理工具

可以提供轻量级的虚拟化功能以便隔离进程和资源包括一系列容器的管理工具软件如lxc-createlxc-startlxc-attach等但这技术功能不完善目前较少使用。

docker

docker相当于增强版的LXC功能更为强大和易用也是当前最主流的容器前端管理工具

docker先启动一个容器也需要一个外部模板也称为镜像docker的镜像可以保存在一个公共的地方共享使用只要把镜像下载下来就可以使用最主要的是可以在镜像基础之上做自定义配置并且可以再把其提交为一个镜像一个镜像可以被启动为多个容器。

docker的镜像是分层的镜像底层为库文件且只读层即不能写入也不能删除数据从镜像加载启动为一个容器后会生成一个可写层其写入的数据会复制到宿主机上对应容器的目录但是容器内的数据在删除容器后也会被随之删除。

pouch

https://github.com/alibaba/pouch

Pouch小袋子起源于2011年并于2017年11月19日上午在中国开源年会现场阿里巴巴正式开源了基于Apache2.0协议的容器技术Pouch。

Pouch是一款轻量级的容器技术拥有快速高效、可移植性高、资源占用少等特性主要帮助阿里更快的做到内部业务的交付同时提高超大规模下数据中心的物理资源利用率

目前的容器方案大多基于Linux内核提供的cgroup和namespace来实现隔离然后这样轻量级方案存在弊端

面对如此的内核现状阿里巴巴采取了三个方面的工作来解决容器的安全问题

增强容器的隔离维度比如网络带宽、磁盘使用量给内核提交patch修复容器的资源可见性问题cgroup方面的bug实现基于Hypervisor的容器通过创建新内核来实现容器隔离

Podman

虽然目前docker是管理Linux容器最好的耳工具注意没有之一但是podman的横空出现即将改变这一点

Podman即Pod

tool从名称上可以看出和kubernets的pod的密切联系不过就其功能来说简言之alias

docker

podman是centos8新集成的功能或许不就的未来会替代docker

Podman是一个为Kubernetes而生的开源的容器管理工具原来是CRI-O即容器运行时接口CRI和开放容器计划OCI项目的一部分后来被分离成一个单独的项目叫libpod。

其可在大多数Linux平台上使用它是一种无守护程序的容器引擎用于在Linux系统上开发管理和运行任何符合Open

Container

Podman提供了一个与docker兼容的命令前端Podman里面87%的指令都和docker

cli别名即“alias

podman”事实上podman使用的一些库也是docker的一部分。

Podman和docker不同之处

daemon这会产生一定的开销而podman不需要启动容器的方式不同

docker

来启动一个container。

这代表container的process进程不会是docker

cli

runtimerunc进行交互来创建container的所以container

process

–restart策略但是podman不支持docker需要使用root用户来创建容器这可能会产生安全风向尤其是当用户知道docker

–privileged选项时。

podman既可以由root用户运行也可以由非特权用户运行docker在Linux上作为守护进程运行扼杀了容器社区的创新。

如果要更改容器的工作方式则需要更改docker守护程序并将这些更改推送到上游。

没有守护进程容器基础结构更加模块化更容易进行更改。

podman的无守护进程架构更加灵活和安全。

快速部署短时间内可以部署成百上千个应用更快速交付到线上高效虚拟化不需要额外hypervisor支持基于Linux内核实现应用虚拟化相比虚拟机大幅提高性能和效率节省开支提高服务器利用率降低IT支持简化配置将运行环境打包保存至容器使用时直接启动即可环境统一将开发测试生产的应用运行环境进行标准化统一减少环境不一样带来的各种问题快速迁移和扩展可实现跨平台运行物理机、虚拟机、公有云等环境良好的兼容性可以方便将应用从A宿主机迁移到B宿主机甚至是A平台迁移到B平台更好的实现面向服务的架构推荐一个容器只运行一个应用实现分布的应用模型可以方便的进行横向扩展符合开发中高内聚低耦合的要求减少不同服务器之间的相互影响

多个容器共用宿主机的内核各应用之间的隔离不如虚拟机彻底由于和宿主机之间的进程也是隔离的需要进入容器查看和调试容器内进程等资源变得比较困难和繁琐如果容器内进程需要查看和调试需要在每个容器内都需要安装相应的工具这也造成存储空间的重复浪费

容器规范

OCI官网https://opencontainers.org

容器技术除了docker之外还有coreOS的rkt还有阿里的Pouch为了保证容器生态的标准性和健康可持续发展包括Linux基金会、Docker、微软、红帽、谷歌和IBM等公司在2015年6月共同成立了一个叫Open

Container

InitiativeOCI的组织其目的就是制定开放的标准的容器规范目前OCI一共发布了两个规范分别是runtime

spec和image

spec有了这两个规范不同的容器公司开发的容器只要兼容这两个规范就可以保证容器的可移植性和相互可操作性性。

容器runtime

runtime是真正运行容器的地方因此为了运行不同的容器runtime需要和操作系统内核紧密合作相互在支持以便为容器提供相应的运行环境

runtime类型

LXCLinux上早期的runtime在2013年docker刚发布的时候就是采用lxc作为runtimedocker把lxc复杂的容器创建与使用方式简化为docker自己的一套命令体系。

随着docker的发展原有的lxc不能满足docker的需求比如跨平台功能Libcontainer随着docker的不断发展重新定义容器的实现标准将底层实现都抽象化到Libcontainer的接口。

这就意味着底层容器的实现方式变成了一种可变的方案无论是使用namespace、cgroups技术抑或是使用systemd等其他方案只要实现了Lincontainer定义的一组接口docker都可以运行。

这也为docker实现全面的跨平台带来了可能。

runc早期libcontainer是docker公司控制的一个开源项目OCI的成立后docker把libcontainer项目移交给了OCI组织runc就是在libcontainer的基础上进化而来是目前docker默认的runtimerunc遵守OCI规范rkt是CoreOS开发的容器runtime也符合OCI规范所以使用rktruntime也可以运行docker容器

容器管理工具

管理工具连接runtime与用户对用户提供图形或命令方式操作然后管理工具将用户操作传递给runtime执行。

enginedocker

engine包含后台deamon和cli两部分大家经常提到的docker就是指的docker

rkt

容器定义工具允许用户定义容器的属性和内容以方便容器能够被保存、共享和重建。

Docker

image是docker容器的模板runtime依据docker

image创建容器

Dockerfile包含N个命令的文本文件通过dockerfile创建出docker

image

hubdocker官方的公共仓库已经保存了大量的常用镜像可以方便大家直接使用阿里云网易等第三方镜像的公共仓库Image

registrydocker官方提供的私有仓库部署工具无web管理界面目前使用较少Harborvmware提供自带web界面自带认证功能的镜像私有仓库目前有很多公司使用

容器编排工具

当多个容器在多个主机运行的时候单独管理容器是相当复杂而且很容易出错而且也无法实现某一台主机宕机后容器自动迁移到其他主机从而实现高可用的目的也无法实现动态伸缩功能因此需要有一种工具可以实现统一管理、动态伸缩、故障自愈、批量执行等功能这就是容器编排引擎

Docker

composedocker官方实现单机容器的编排工具Docker

swarmdocker官方开发的容器编排引擎支持overlay

networkMesosMarathonMesos是Apache下的开源分布式资源管理框架它被称为是分布式系统的内核。

Mesos最初是由加州大学伯克利分校的AMPLab开发的后在Twitter得到广泛使用。

通用的集群组员调度平台Mesos资源分配与marathon容器编排平台一起提供容器编排引擎功能KubernetesGoogle领导开发的容器编排引擎内部项目为Borg且其同时支持docker和CoreOS当前已成为容器编排工具的标准

容器网络

network仅支持管理单机的容器网络当多主机运行的时候需要使用第三方开源网络例如calico、flannel等

服务发现

容器的动态扩容特性决定了容器IP也会随之变化因此需要有一种机制开源自动识别并将用户请求动态转发到新创建的容器上Kubernetes自带服务发现功能需要结合kube-dns服务解析内部域名

容器监控

ps/top/stats查看容器运行状态另外可以使用prometheus、heapster等第三方监控工具监控容器的运行状态

数据管理

容器的动态迁移会导致其在不同的host之前迁移因此如何保证与容器相关的数据也能随之迁移或随时访问可以使用逻辑卷/存储挂载等方式解决

日志收集

logs但是容器内部的日志需要通过ELK等专门的日志收集分析和展示工具进行处理

Docker安装及基础命令介绍

docker目前支持多种操作系统的安装运行如CentosUbuntuRedhatDebianFedoraMacWindows在Linux系统上需要内核版本在3.10或以上

docker版本选择

docker版本号之前一直是0.x版本或1.x版本从2017年3月1号开始改为每个季度发布一次稳定版其版本号规则也统一变更为YY.MM例如20.10表示2020年10月发布的

docker之前没有区分版本但是2017年推出将docker更名为新的项目Mobygithub地址https://github.com/moby/moby

Moby项目属于Docker项目全新上游docker将是一个隶属于Moby的子产品而且之后的版本开始区分CEDocker

Community

Edition企业收费版,CE社区版和EE企业版都是每个季度发布一个新版本但是EE版提供后期安全维护1年而CE版是4个月。

安装和删除方法

官方文档https://docs.docker.com/engine/install/

阿里云文档https://developer.aliyun.com/mirror/docker-ce?spma2c6h.13651102.0.0.3e221b11guHCWE

Centos安装和删除docker

官方文档https://docs.docker.com/engine/install/centos/

CentOS

7的extras源虽然可以安装docker但包比较旧建议从官方源或镜像源站点下载安装docker

CentOS

docker已加载插件fastestmirrorLoading

mirror

mirrors.nju.edu.cn可安装的软件包docker.x86_64

2:1.13.1-209.git7d71120.el7.centos

extras下载rpm包安装

官方rpm包下载地址https://download.docker.com/linux/centos/7/x86_64/stable/Packages/

阿里镜像下载地址https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/

-rf

安装docker依赖三个yum源BaseExtrasdocker-cewget

/etc/yum.repos.d/CentOS-Base.repo

http://mirrors.aliyun.com/repo/Centos-7.repowget

http://mirrors.aliyun.com/repo/epel-7.repowget

/etc/yum.repos.d/docker-ce.repo

https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum

clean

docker-ce/usr/bin/docker-init/usr/bin/docker-proxy/usr/bin/dockerd/usr/lib/systemd/system/docker.service/usr/lib/systemd/system/docker.socket[rootcentos

~]#[rootcentos

docker-ce/usr/bin/docker-init/usr/bin/docker-proxy/usr/bin/dockerd/usr/lib/systemd/system/docker.service/usr/lib/systemd/system/docker.socket[rootcentos

~]#[rootcentos

docker-ce-cli/usr/bin/docker/usr/libexec/docker/cli-plugins/docker-app/usr/libexec/docker/cli-plugins/docker-buildx/usr/share/bash-completion/completions/docker/usr/share/doc/docker-ce-cli-20.10.17/usr/share/doc/docker-ce-cli-20.10.17/LICENSE/usr/share/doc/docker-ce-cli-20.10.17/MAINTAINERS/usr/share/doc/docker-ce-cli-20.10.17/NOTICE/usr/share/doc/docker-ce-cli-20.10.17/README.md/usr/share/fish/vendor_completions.d/docker.fish/usr/share/man/man1/docker-attach.1.gz/usr/share/man/man1/docker-build.1.gz/usr/share/man/man1/docker-builder-build.1.gz/usr/share/man/man1/docker-builder-prune.1.gz/usr/share/man/man1/docker-builder.1.gz/usr/share/man/man1/docker-checkpoint-create.1.gz/usr/share/man/man1/docker-checkpoint-ls.1.gz/usr/share/man/man1/docker-checkpoint-rm.1.gz/usr/share/man/man1/docker-checkpoint.1.gz/usr/share/man/man1/docker-commit.1.gz/usr/share/man/man1/docker-config-create.1.gz/usr/share/man/man1/docker-config-inspect.1.gz/usr/share/man/man1/docker-config-ls.1.gz/usr/share/man/man1/docker-config-rm.1.gz/usr/share/man/man1/docker-config.1.gz/usr/share/man/man1/docker-container-attach.1.gz/usr/share/man/man1/docker-container-commit.1.gz/usr/share/man/man1/docker-container-cp.1.gz/usr/share/man/man1/docker-container-create.1.gz/usr/share/man/man1/docker-container-diff.1.gz/usr/share/man/man1/docker-container-exec.1.gz/usr/share/man/man1/docker-container-export.1.gz/usr/share/man/man1/docker-container-inspect.1.gz/usr/share/man/man1/docker-container-kill.1.gz/usr/share/man/man1/docker-container-logs.1.gz/usr/share/man/man1/docker-container-ls.1.gz/usr/share/man/man1/docker-container-pause.1.gz/usr/share/man/man1/docker-container-port.1.gz/usr/share/man/man1/docker-container-prune.1.gz/usr/share/man/man1/docker-container-rename.1.gz/usr/share/man/man1/docker-container-restart.1.gz/usr/share/man/man1/docker-container-rm.1.gz/usr/share/man/man1/docker-container-run.1.gz/usr/share/man/man1/docker-container-start.1.gz/usr/share/man/man1/docker-container-stats.1.gz/usr/share/man/man1/docker-container-stop.1.gz/usr/share/man/man1/docker-container-top.1.gz/usr/share/man/man1/docker-container-unpause.1.gz/usr/share/man/man1/docker-container-update.1.gz/usr/share/man/man1/docker-container-wait.1.gz/usr/share/man/man1/docker-container.1.gz/usr/share/man/man1/docker-context-create.1.gz/usr/share/man/man1/docker-context-export.1.gz/usr/share/man/man1/docker-context-import.1.gz/usr/share/man/man1/docker-context-inspect.1.gz/usr/share/man/man1/docker-context-ls.1.gz/usr/share/man/man1/docker-context-rm.1.gz/usr/share/man/man1/docker-context-update.1.gz/usr/share/man/man1/docker-context-use.1.gz/usr/share/man/man1/docker-context.1.gz/usr/share/man/man1/docker-cp.1.gz/usr/share/man/man1/docker-create.1.gz/usr/share/man/man1/docker-diff.1.gz/usr/share/man/man1/docker-events.1.gz/usr/share/man/man1/docker-exec.1.gz/usr/share/man/man1/docker-export.1.gz/usr/share/man/man1/docker-history.1.gz/usr/share/man/man1/docker-image-build.1.gz/usr/share/man/man1/docker-image-history.1.gz/usr/share/man/man1/docker-image-import.1.gz/usr/share/man/man1/docker-image-inspect.1.gz/usr/share/man/man1/docker-image-load.1.gz/usr/share/man/man1/docker-image-ls.1.gz/usr/share/man/man1/docker-image-prune.1.gz/usr/share/man/man1/docker-image-pull.1.gz/usr/share/man/man1/docker-image-push.1.gz/usr/share/man/man1/docker-image-rm.1.gz/usr/share/man/man1/docker-image-save.1.gz/usr/share/man/man1/docker-image-tag.1.gz/usr/share/man/man1/docker-image.1.gz/usr/share/man/man1/docker-images.1.gz/usr/share/man/man1/docker-import.1.gz/usr/share/man/man1/docker-info.1.gz/usr/share/man/man1/docker-inspect.1.gz/usr/share/man/man1/docker-kill.1.gz/usr/share/man/man1/docker-load.1.gz/usr/share/man/man1/docker-login.1.gz/usr/share/man/man1/docker-logout.1.gz/usr/share/man/man1/docker-logs.1.gz/usr/share/man/man1/docker-manifest-annotate.1.gz/usr/share/man/man1/docker-manifest-create.1.gz/usr/share/man/man1/docker-manifest-inspect.1.gz/usr/share/man/man1/docker-manifest-push.1.gz/usr/share/man/man1/docker-manifest-rm.1.gz/usr/share/man/man1/docker-manifest.1.gz/usr/share/man/man1/docker-network-connect.1.gz/usr/share/man/man1/docker-network-create.1.gz/usr/share/man/man1/docker-network-disconnect.1.gz/usr/share/man/man1/docker-network-inspect.1.gz/usr/share/man/man1/docker-network-ls.1.gz/usr/share/man/man1/docker-network-prune.1.gz/usr/share/man/man1/docker-network-rm.1.gz/usr/share/man/man1/docker-network.1.gz/usr/share/man/man1/docker-node-demote.1.gz/usr/share/man/man1/docker-node-inspect.1.gz/usr/share/man/man1/docker-node-ls.1.gz/usr/share/man/man1/docker-node-promote.1.gz/usr/share/man/man1/docker-node-ps.1.gz/usr/share/man/man1/docker-node-rm.1.gz/usr/share/man/man1/docker-node-update.1.gz/usr/share/man/man1/docker-node.1.gz/usr/share/man/man1/docker-pause.1.gz/usr/share/man/man1/docker-plugin-create.1.gz/usr/share/man/man1/docker-plugin-disable.1.gz/usr/share/man/man1/docker-plugin-enable.1.gz/usr/share/man/man1/docker-plugin-inspect.1.gz/usr/share/man/man1/docker-plugin-install.1.gz/usr/share/man/man1/docker-plugin-ls.1.gz/usr/share/man/man1/docker-plugin-push.1.gz/usr/share/man/man1/docker-plugin-rm.1.gz/usr/share/man/man1/docker-plugin-set.1.gz/usr/share/man/man1/docker-plugin-upgrade.1.gz/usr/share/man/man1/docker-plugin.1.gz/usr/share/man/man1/docker-port.1.gz/usr/share/man/man1/docker-ps.1.gz/usr/share/man/man1/docker-pull.1.gz/usr/share/man/man1/docker-push.1.gz/usr/share/man/man1/docker-rename.1.gz/usr/share/man/man1/docker-restart.1.gz/usr/share/man/man1/docker-rm.1.gz/usr/share/man/man1/docker-rmi.1.gz/usr/share/man/man1/docker-run.1.gz/usr/share/man/man1/docker-save.1.gz/usr/share/man/man1/docker-search.1.gz/usr/share/man/man1/docker-secret-create.1.gz/usr/share/man/man1/docker-secret-inspect.1.gz/usr/share/man/man1/docker-secret-ls.1.gz/usr/share/man/man1/docker-secret-rm.1.gz/usr/share/man/man1/docker-secret.1.gz/usr/share/man/man1/docker-service-create.1.gz/usr/share/man/man1/docker-service-inspect.1.gz/usr/share/man/man1/docker-service-logs.1.gz/usr/share/man/man1/docker-service-ls.1.gz/usr/share/man/man1/docker-service-ps.1.gz/usr/share/man/man1/docker-service-rm.1.gz/usr/share/man/man1/docker-service-rollback.1.gz/usr/share/man/man1/docker-service-scale.1.gz/usr/share/man/man1/docker-service-update.1.gz/usr/share/man/man1/docker-service.1.gz/usr/share/man/man1/docker-stack-deploy.1.gz/usr/share/man/man1/docker-stack-ls.1.gz/usr/share/man/man1/docker-stack-ps.1.gz/usr/share/man/man1/docker-stack-rm.1.gz/usr/share/man/man1/docker-stack-services.1.gz/usr/share/man/man1/docker-stack.1.gz/usr/share/man/man1/docker-start.1.gz/usr/share/man/man1/docker-stats.1.gz/usr/share/man/man1/docker-stop.1.gz/usr/share/man/man1/docker-swarm-ca.1.gz/usr/share/man/man1/docker-swarm-init.1.gz/usr/share/man/man1/docker-swarm-join-token.1.gz/usr/share/man/man1/docker-swarm-join.1.gz/usr/share/man/man1/docker-swarm-leave.1.gz/usr/share/man/man1/docker-swarm-unlock-key.1.gz/usr/share/man/man1/docker-swarm-unlock.1.gz/usr/share/man/man1/docker-swarm-update.1.gz/usr/share/man/man1/docker-swarm.1.gz/usr/share/man/man1/docker-system-df.1.gz/usr/share/man/man1/docker-system-events.1.gz/usr/share/man/man1/docker-system-info.1.gz/usr/share/man/man1/docker-system-prune.1.gz/usr/share/man/man1/docker-system.1.gz/usr/share/man/man1/docker-tag.1.gz/usr/share/man/man1/docker-top.1.gz/usr/share/man/man1/docker-trust-inspect.1.gz/usr/share/man/man1/docker-trust-key-generate.1.gz/usr/share/man/man1/docker-trust-key-load.1.gz/usr/share/man/man1/docker-trust-key.1.gz/usr/share/man/man1/docker-trust-revoke.1.gz/usr/share/man/man1/docker-trust-sign.1.gz/usr/share/man/man1/docker-trust-signer-add.1.gz/usr/share/man/man1/docker-trust-signer-remove.1.gz/usr/share/man/man1/docker-trust-signer.1.gz/usr/share/man/man1/docker-trust.1.gz/usr/share/man/man1/docker-unpause.1.gz/usr/share/man/man1/docker-update.1.gz/usr/share/man/man1/docker-version.1.gz/usr/share/man/man1/docker-volume-create.1.gz/usr/share/man/man1/docker-volume-inspect.1.gz/usr/share/man/man1/docker-volume-ls.1.gz/usr/share/man/man1/docker-volume-prune.1.gz/usr/share/man/man1/docker-volume-rm.1.gz/usr/share/man/man1/docker-volume.1.gz/usr/share/man/man1/docker-wait.1.gz/usr/share/man/man1/docker.1.gz/usr/share/man/man5/Dockerfile.5.gz/usr/share/man/man5/docker-config-json.5.gz/usr/share/man/man8/dockerd.8.gz/usr/share/zsh/vendor-completions/_dockerDocker

命令帮助

官方文档https://docs.docker.com/reference/

docker命令是最常使用的docker客户端命令其后面可以加不同的参数以实现不同的功能

docker

指定管理员的资源对象类型较新的命令用法将命令按资源类型进行分类方便使用#

Commands

0197261a30bf81f1ee8e6a4dd2dea0ef95d67ccbrunc:Version:

1.1.3GitCommit:

v1.1.3-0-g6724737docker-init:Version:

0.19.0GitCommit:

0197261a30bf81f1ee8e6a4dd2dea0ef95d67ccb

版本runc

E66M:LPI3:YB2Z:LJKN:LNB2:P7Z3:6HYX:DSFF:KISM:SSJX:PVIF:B2ZM

宿主机

在docker安装启动后默认会生成一个名称为docker0的网卡且默认IP地址为172.17.0.1

Docker存储引擎

AUFS是一种UnionFs是文件级的存储驱动。

Aufs是之前的UnionFS的重新实现2006年由JunjiroOkajima开发所谓UnionFS就是把不同物理位置的中。

简单来说就是支持将不同目录挂载到一个虚拟文件系统下。

这种可以层层地叠加修改文件。

无论底下有多少都是只读的最上系统可写的。

当需要修改一个文件时AUFS常见该文件的一个副本使用CoW将文件从只读层复制到可写进行修改结果也保存在Docker中底下的只读层就是image可写层就是Container。

aufs被拒绝合并到主线Linux。

其代码被批评为“denseunreadableuncommented

密集、不可读、未注释”。

相反OverlayFS被合并到Linux内核中。

在多次尝试将aufs合并到主线内核失败后作者放弃了AUFS是docker18.06及更早版本的首选存储驱动程序在内核3.13上运行ubuntu14.04时不支持overlay2Overlay一种UnionFS文件系统Linux内核3.18后支持Overlay2Overlay的升级版到目前为止所有Linux发行版推荐使用的存储类型也是docker默认使用的存储引擎为overlay2需要磁盘分区支持d-type功能因此需要系统磁盘的额外支持相对AUFS来说Overlay2有以下优势更简单的设计从3.18开始就进入了Linux内核主线资源消耗更少devicemapper因为Centos7.2和RHEL7.2的之前版本内核版本不支持overlay2默认使用的存储驱动程序最大数据容量只支持100G且性能不佳当前较新版本的CentOS已经支持overlay2因此推荐使用overlay2另外此存储引擎已在Docker

Engine

18.09中弃用ZFSSun-2005/btrfsOracle-2007目前没有广泛使用VFS用于测试环境适用于无法使用copy-on-write时的情况。

此存储驱动程序的性能很差通常不建议用于生产

Docker官方推荐首选存储引擎为overlay2其次为devicemapper但是devicemapper存在使用空间方面的一些限制虽然可以通过后期配置解决但是官方依然推荐使用overlay2以下是生产故障示例https://www.cnblogs.com/youruncloud/p/5736718.html

docker服务进程

dockerd服务器程序被client直接访问其父进程为宿主机的systemd守护进程docker-proxy每个进程docker-proxy实现对应一个需要网络通信的容器管理宿主机和容器之间端口映射其父进程为dockerd如果容器不需要网络则无需启动containerd被dockerd进程调用以实现与runc交互containerd-shim真正运行容器的载体每个容器对应一个containerd-shim进程其父进程为containerd

1.dockerd通过grpc和containerd模块通信dockerd由libcontainerd负责和containerd进行交换docker和containerd通信socket文件/run/containerd/containerd.sock

2.containerd在docker启动时被启动然后containerd启动grpc请求监听containerd处理grpc请求根据请求做相应动作

3.若是runstart或是exec容器containerd拉起一个container-shim并进行相应的操作

4.container-shim被拉起后start/exec/create拉起runc进程通过exit、control文件和containerd通信通过父子进程关系和SIGCHLD监控容器中进程状态

5.在整个容器生命周期中container通过epoll监控容器文件监控容器事件

gRPC简介

gRPC是Google开发的一款高性能、开源和通用的RPC框架支持众多语言客户端

Docker

docker服务基于C/S结构可以实现基于本地和远程方式进行管理

Dockerd守护进程启动选项

tcp://host:portunix:///path/to/socket,fd://*

fd://socketfd#

tcp://host:portunix:///path/to/socket,fd://*

fd://socketfd#

docker客户端也可以使用环境变量DOCKER_HOST,代替

-H选项

DOCKER_HOSTtcp://docker-server:2375镜像管理

镜像结构和原理

镜像即创建容器的模板含有启动容器所需要的文件系统及所需要的内容因此镜像主要用于方便和快速的创建启动容器。

FS联合文件系统联合文件系统可以将几层结构就像普通Linux的和文件不同的Linux发行版如ubuntu

一般的镜像通常都比较小官方提供的Ubuntu镜像只有60M多点而CentOS基础镜像也只有200M左右一些其他版本的镜像甚至只有几M比如busybox

才1.22MAlpine镜像也只有5M左右。

镜像直接调用宿主机的内核镜像中提供rootfs也就是只需要包括最基本的命令配置文件和程序库等相关文件就可以了。

容器、镜像和父镜像关系

sha256:790711e34858c9b0741edffef6ed3d8199d8faa33f2870dea5db70f16384df79

Status:

docker.io/library/nginx:latest#

查看镜像分层历史

sha256:b692a91e4e1582db97076184dae0b2f4a7a86b68c4fe6f91affa50ae06369bf5,RepoTags:

[nginxsha256:790711e34858c9b0741edffef6ed3d8199d8faa33f2870dea5db70f16384df79],Parent:

,Comment:

2022-08-02T05:17:19.274343015Z,Container:

5f19bc2cd794cd60ec845cbed7a60c85003dc56f26ee807f9eea2480bc465b76,ContainerConfig:

{Hostname:

[PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin,NGINX_VERSION1.23.1,NJS_VERSION0.7.6,PKG_RELEASE1~bullseye],Cmd:

[/bin/sh,-c,#(nop)

sha256:0417134432daa8913f92f7bf71641a8fa7ab3405c91b717dde22c855e71eef4d,Volumes:

null,WorkingDir:

[/docker-entrypoint.sh],OnBuild:

null,Labels:

docker-maintnginx.com},StopSignal:

20.10.12,Author:

[PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin,NGINX_VERSION1.23.1,NJS_VERSION0.7.6,PKG_RELEASE1~bullseye],Cmd:

[nginx,-g,daemon

sha256:0417134432daa8913f92f7bf71641a8fa7ab3405c91b717dde22c855e71eef4d,Volumes:

null,WorkingDir:

[/docker-entrypoint.sh],OnBuild:

null,Labels:

docker-maintnginx.com},StopSignal:

amd64,Os:

/var/lib/docker/overlay2/65721405d33c804de8b1ce344e01ea1cb20a15b526846ddd0914236141d12a74/diff:/var/lib/docker/overlay2/769ff70d994c30f2c3aca1a752b6320d7908f4a7aebd56ef58557b9d39cb3170/diff:/var/lib/docker/overlay2/ecbbdc176f03365bcf157e7409d045d16173793abb43d908328c28aa5235af85/diff:/var/lib/docker/overlay2/14a39e34b10a24fab8c7dccff4a3fcd34bdede808fda2921fcb2c033b1871e92/diff:/var/lib/docker/overlay2/3826983a7f0fa4365113c866622eb0af797919100279ba1db6bdd352330e4699/diff,MergedDir:

/var/lib/docker/overlay2/7194cc85a5c2bf12f4d2fb0e2c57ff356c47981bda94be0e9bcf503391080797/merged,UpperDir:

/var/lib/docker/overlay2/7194cc85a5c2bf12f4d2fb0e2c57ff356c47981bda94be0e9bcf503391080797/diff,WorkDir:

/var/lib/docker/overlay2/7194cc85a5c2bf12f4d2fb0e2c57ff356c47981bda94be0e9bcf503391080797/work},Name:

overlay2},RootFS:

[sha256:92a4e8a3140f7a04a0e5a15793adef2d0e8889ed306a8f95a6cfb67cecb5f212,sha256:e3257a399753c995f54856b0cea3c2b6aa1a95d9a7b542668a46fa4eacf62d53,sha256:3a89c8160a43d70433241934b1d418f641e6d207a10b558b67f8aafdb15416b0,sha256:f91d0987b144553456431bcb8cc8ddf5d03362701bc2ffc128ce2bd57182defb,sha256:bdc7a32279ccdf5aba13d3e50b7b16103e03ff8ef27424ac1a33df24e5a9f602,sha256:b539cf60d7bb42871a005e949b550800b99fada0b1c1bca01654e8a506ba2138]},Metadata:

{LastTagTime:

0b71b9002c2056073a621264c914f1778296599761548ff1e34d39dc883ed029

drwxr-xr-x

19dee729285a1f8f34b15874db48c7b4b60f6041914f2cad9b1de169795de836

drwxr-xr-x

1c65531519b901e0508c411808f7dc2497a6549926bda748896f59aaddc4eed4

drwxr-xr-x

6387aff546d7c159c6e082ea910391bc9c331ff19f75c73d45780def09a8c989

drwxr-xr-x

75e6a412e4bda1a8b9e5690c6f8c218c0649ca965207ff15f4f2e114e859ec86

-rw-r--r--

b692a91e4e1582db97076184dae0b2f4a7a86b68c4fe6f91affa50ae06369bf5.json

drwxr-xr-x

e9bee565b6a50b23d35427abf3f6756a842c5d75d3c8e3d63f412cb3dae90409

-rw-r--r--

[{Config:b692a91e4e1582db97076184dae0b2f4a7a86b68c4fe6f91affa50ae06369bf5.json,RepoTags:[nginx:latest],Layers:[1c65531519b901e0508c411808f7dc2497a6549926bda748896f59aaddc4eed4/layer.tar,e9bee565b6a50b23d35427abf3f6756a842c5d75d3c8e3d63f412cb3dae90409/layer.tar,6387aff546d7c159c6e082ea910391bc9c331ff19f75c73d45780def09a8c989/layer.tar,75e6a412e4bda1a8b9e5690c6f8c218c0649ca965207ff15f4f2e114e859ec86/layer.tar,0b71b9002c2056073a621264c914f1778296599761548ff1e34d39dc883ed029/layer.tar,19dee729285a1f8f34b15874db48c7b4b60f6041914f2cad9b1de169795de836/layer.tar]}][rootcentos7

~]#

data/0b71b9002c2056073a621264c914f1778296599761548ff1e34d39dc883ed029

16K

data/19dee729285a1f8f34b15874db48c7b4b60f6041914f2cad9b1de169795de836

80M

data/1c65531519b901e0508c411808f7dc2497a6549926bda748896f59aaddc4eed4

12K

data/6387aff546d7c159c6e082ea910391bc9c331ff19f75c73d45780def09a8c989

12K

data/75e6a412e4bda1a8b9e5690c6f8c218c0649ca965207ff15f4f2e114e859ec86

8.0K

data/b692a91e4e1582db97076184dae0b2f4a7a86b68c4fe6f91affa50ae06369bf5.json

60M

data/e9bee565b6a50b23d35427abf3f6756a842c5d75d3c8e3d63f412cb3dae90409

4.0K

AUTOMATED使用第三方docker服务来帮助编译镜像可以在互联网上面直接拉取到镜像减少了繁琐的编译过程例查找centos镜像

[rootcentos7

https://github.com/corpusops/docker-images/

corpusops/centos

couchbase/centos-72-jenkins-core

Centos

couchbase/centos-69-sdk-nodevtoolset-build

Source

Alpine操作系统是一个面向安全的轻型Linux发行版。

它不同于通常Linux发行版Alpine采用了musl

libc

busybox以减小系统的体积和运行时资源消耗但功能上比busybox又完善的多因此得到开源社区越来也多的青睐。

在保持瘦身的同时Alpine还提供了自己的包管理工具apk可以通过https://pkgs.alpinelinux.org/packages

Alpine由非商业组织维护的支持广泛场景的Linux发行版它特别为资深/重度Linux用户而优化关注安全性能和资源效能。

Alpine镜像可以适用于更多常用场景并且是一个优秀的可以适用于生产的基础系统/环境。

Alpine

Linux发行版的这些优势。

相比于其他Docker镜像它的容量非常小仅仅只有5M左右且拥有非常友好的包管理机制。

官方镜像来自docker-alpine项目。

目前Docker官方已开始推荐使用Alpine替代之前的Ubuntu作为基础镜像环境。

这样会带来多个好处。

包括镜像下载速度加快镜像安全性提高主机之间的切换更方便占用更少磁盘空间等。

REPOSITORY

231MBAlpine官网https://www.alpinelinux.orgAlpine官方仓库https://github.com/alpinelinuxAlpine官方镜像https://hub.docker.com/_/alpine/Alpine官方镜像仓库https://github.com/gliderlabs/docker-alpineAlpine阿里云镜像仓库https://mirrors.aliyun.com/alpine/

alpine管理软件

https://mirrors.aliyun.com/alpine/v3.16/main

https://mirrors.aliyun.com/alpine/v3.16/community#

更新源

https://www.nginx.org/nginx-1.22.0-r1

installed

sha1:d21a96358a10b731f8847e6d32799efdc2a7f421

sha1:cbf596ddb3433a8e0d325f3c188bec9c1bb746b3

sha1:da38e2a0dded838afbe0eade6cb837ac30fd8046

sha1:9b85e5091018455091d7f135c4a160ad9487516a

etc/nginx/mime.types

sha1:44195d2ab691d6251a0ac0190aebf7a1c2eea05d

etc/nginx/nginx.conf

sha1:379c1e2a2a5ffb8c91a07328d4c9be2bc58799fd

sha1:cc2fcdb4605dcac23d59f667889ccbdfdc6e3668

sha1:b56312b641dffaa622d197625f4b867817824475

usr/sbin/nginx

sha1:7b2a4da1a14166442c10cbf9e357fa9fb53542ca

usr/share/nginx/http-default_server.conf

sha1:35db17c18ce0b9f84a3cc113c8a9e94e19f632b1

var/lib/nginx/logs

sha1:c3f02ca81f7f2c6bde3f878b3176f225c7781c7d

sha1:0510312d465b86769136983657df98c1854f0b60

var/lib/nginx/run

sha1:835b9dec419c01420e78602527a9fba8c463521c

sha1:c51a3f0e6de4eb802d5630941c3fd9e1d0efae4b

var/lib/nginx/html/index.htmlDebian(Ubuntu)建议安装的基础包

在很多软件官方提供的镜像都使用的是DebianUbuntu的系统比如nginxtomcatmysqlhttpd等但镜像内缺少很多常用的调试工具当需要进入容器内进行调试管理时可以安装以下常用工具包

apt

repository--disable-content-trust

Skip

:TAG:即版本号如果不指定:TAG则下载最新版镜像镜像下载说明

[rootcentos7

sha256:7d246653d0511db2a6b2e0436cfd0e52ac8c066000264b3ce63331ac66dca625

Status:

docker.io/library/hello-world:latest

注意镜像下载完成后会自动解压缩比官网显示的可能会大很多如centos8.1.1911下载时只有70M下载完后显示237M

例从docker官网下载镜像

docker镜像官方的下载站点是https://hub.docker.com/

从国内下载官方的镜像站点有时候会很慢因此可以更改docker配置文件添加一个加速器可以通过加速器达到加速下载镜像的目的。

国内有许多公司都提供了docker加速镜像比如阿里云腾讯云网易云等。

1.安装/升级Docker客户端

registry-mirrors:[https://docker.mirrors.ustc.edu.cn]

EOF#

网易云https://hub-mirror.c.163.com/

腾讯云https://mirror.ccs.tencentyun.comsystemctl

daemon-reload

由某特定的docker镜像的所有迭代版本组成的镜像仓库一个Registry中可以存在多个RepositoryRepository可分为“顶层仓库”和“用户仓库”Repository用户仓库名称一般格式为“用户名/仓库名”每个Repository仓库可以包含多个Tag每个标签对应一个镜像

镜像导出

save命令可以将本地镜像导出为一个tar文件然后复制到其他服务器进行导入使用

docker

centossha256:50752af5182c6cd5518e3e91d48f7ff0cba93d5d760a67ac140e2d63c4dd9efc

Deleted:

sha256:08d05d1d5859ebcfb3312d246e2082e46cb307f0e896c9ac097185f0b0b19e56

Deleted:

sha256:034f282942cd6c3abf9384601a57f080f8f75cc7f58527db8e07573d9d14ab46#

根据REPOSITORY名称删除镜像

centossha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177

Deleted:

sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6

Deleted:

sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59#

删除多个镜像

debiansha256:875e4e2bae4d7ff53fe7f3672b15630439479fd10da081477a14208122fe8f31

Deleted:

sha256:dd8bae8d259fed93eb54b3bca0adeb647fc07f6ef16745c8ed4144ada4d51a95

Deleted:

sha256:655ed1b7a4286ce965b8942644f665a3aeafac315f023b3d75fabdbd4be12dd0

Untagged:

ubuntusha256:34fea4f31bf187bc915536831fd0afc9d214755bf700b5cdb1336c82516d154e

Deleted:

sha256:df5de72bdb3b711aba4eca685b1f42c722cc8a1837ed3fbd548a9282af2d836d

Deleted:

sha256:629d9dbab5edeac7fa51f205839d7f9bb629a5e83548da3a183fb66c22fe7af7#

删除所有镜像

alpinesha256:bc41182d7ef5ffc53a40b044e725193bc10142a1243f395ee852a8d9730fc2ad

Deleted:

sha256:9c6f0724472873bb50a2ae67a9e7adcb57673a183cea8b06eb778dca859181b5

Deleted:

sha256:994393dc58e7931862558d06e46aa2bb17487044f670f310dffe1d24e4d1eec7

Untagged:

hello-worldsha256:7d246653d0511db2a6b2e0436cfd0e52ac8c066000264b3ce63331ac66dca625

Deleted:

sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412

Deleted:

sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359

[rootcentos7

tag可以给镜像打标签类似起别名但通常要遵守一定的命名规范才可以上传到指定的仓库

docker

仓库主机FQDN或IP[:端口]/项目名或用户名/image名字:版本#

TAG

默认为latest**总结**企业使用镜像及常见操作搜索、下载、导出、导入、删除

docker

visit:https://docs.docker.com/get-started/[rootcentos7

~]#

pseudo-TTY通常和-i一起使用注意对应容器必须运行shell才支持进入-d

后台运行默认前台运行--name

随机映射端口到内部容器开放的端口49000~49900--dns

list

no默认策略在容器退出时不重启容器no-failure在容器非正常退出时退出状态非0才会重启容器on-failure3在容器非正常退出时重启容器最多重启3次always在容器退出时总是重启容器unless-stopped在容器退出时总是重启容器但是不考虑在Docker守护进程启动时就已经停止的容器

**注意**容器启动后如果容器内没有前台运行的进程将自动退出停止

运行容器

sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc984380bc0118285c70fa8c9300Status:

Downloaded

alpine:latestdocker.io/library/alpine:latest[rootcentos7

~]#

启动容器在执行完shell命令就退出用于测试[rootcentos7

~]#

sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678Status:

Downloaded

busybox:latestdocker.io/library/busybox:latest[rootcentos7

~]#

大约在0.6版—–privileged选项被引入docker。

使用该参数container内的root拥有真正的root权限。

否则container内的root只是外部的一个普通用户权限。

privileged启动的容器可以看到很多host上的设备并且可以执行mount。

甚至允许你在docker容器中启动docker容器。

查看容器信息

sha256:0954cc1af252d824860b2c5dc0a10720af2b7a3d3435581ca788dff8480c7b32Status:

Downloaded

httpd:latestec9e58e706932e56509ce001191e7b52cd5f16b6b1ec25852a2947872aff3cff[rootcentos7

~]#

start|stop|restart|pause|unpause

容器ID#

容器名attach类似于vnc操作会在同一个容器的多个会话界面同步显示所有使用此方式进入容器的操作都是同步显示的且使用exit退出后容器自动关闭不推荐使用需要进入到有shell环境的容器

使用exec命令

在运行中的容器启动新进程可以执行单次命令及进入容器测试环境使用此方式使用exit退出容器还在运行推荐此方式

docker

nsenter命令需要通过PID进入到容器内部且退出后仍能正常运行不过需要事先使用docker

inspect

获取到容器的PID目前凡是使用较少此工具来自于until-linux包

安装nsenter命令

将nsenter命令写入到脚本进行调用方便进入容器看日志或排错

cat

docker_in(){NAME_ID$1PID$(docker

inspect

docker_in(){NAME_ID$1PID$(docker

inspect

容器启动后默认处于预定义的NAT网络中所以外部网络的主机无法直接访问容器中网络服务

docker

注意多个容器映射到宿主机端口不能冲突但容器内使用的端口可以相同

docker

方式5宿主机本机IP宿主机本地端口容器端口/协议默认为tcp协议

docker

cd1db7f176806254fdf3089f32fcbd0094ec376ea3d8d4e481093cad353d9d48

[rootcentos7

/var/lib/docker/containers/cd1db7f176806254fdf3089f32fcbd0094ec376ea3d8d4e481093cad353d9d48/

总用量

cd1db7f176806254fdf3089f32fcbd0094ec376ea3d8d4e481093cad353d9d48-json.log

drwx------

/var/lib/docker/containers/cd1db7f176806254fdf3089f32fcbd0094ec376ea3d8d4e481093cad353d9d48/hostconfig.json

PortBindings:{80/tcp:[{HostIp:,HostPort:80}]}

PortBindings

对应的是容器内部的80端口HostPort对应的是映射到宿主机的端口80修改此处为8000

PortBindings:{80/tcp:[{HostIp:,HostPort:8000}]}

[rootcentos7

容器需要有一个前台运行的进程才能保持容器的运行通过传递运行参数是一种方式另外也可以在构建镜像的时候指定容器启动时运行的前台命令

服务类如NginxTomcatApache但服务不能停命令类如tail

/etc/hosts主要用于测试环境注意

fc8dc5bee8367725a759f15417316a619b098af88f1ad7f7113fa314dd6e3f34

[rootcentos7

05a4c6863bcc9d7c4b9f0abeec2316a9cce0f0e3f2aeb37bfa57fcd2bcdf8d52

[rootcentos7

容器会自动将容器的ID加入自己的/etc/hosts文件中并解析成容器的IP

[rootcentos7

容器的dns服务器采用宿主机的dns地址可以用下面方式指定其他的DNS地址

--dnsx.x.x.x在/etc/docker/daemon.json

文件中指定

[https://docker.mirrors.ustc.edu.cn],dns:

[114.114.114.114,8.8.8.8],dns-search:

[rootcentos7

/etc/systemd/system/hello.service

[Unit]

wantedBymulti-user.target[rootcentos7

~]#

MYSQL_RANDOM_ROOT_PASSWORD[rootcentos7

~]#

ba743ba4068b36c7b2ff804decbb0c5f22aaa8ab0b20ce8bc4c4380ccc990674[rootcentos7

~]#

MYSQL_PASSWORDwppassDocker镜像制作和管理

Docker镜像说明

从镜像大小上来说一个比较小的镜像只有1M多点或者几M而内核文件需要几十M因此镜像里面是没有内核的镜像在被启动为容器后将直接使用宿主机的内核而镜像本身则只提供相应的rootfs即系统正常运行所必须的用户空间的文件系统比如/dev//proc/bin/etc等时空的而/boot当中保存的就是与内核相关的文件和目录。

为什么没有内核

由于容器启动和运行过程中是直接使用了宿主机的内核不会直接调用物理硬件所以不会涉及到硬件驱动因此也无需容器内拥有自己的内核和驱动。

而如果使用虚拟机技术对应每个虚拟机都有自己独立的内核。

Docker容器如果希望启动后能持续运行就必须有一个能前台持续运行的进程如果在容器中启动系统的服务如httpdphp-fpm等均为后台进程模式运行就导致docker在前台没有运行的应用这样的容器启动后会立即退出。

所以一般会将服务程序以前台方式运行对于有一些可能不知道怎么实现前台运行的程序只需要在你启动的该程序之后添加类似于tailtop这种可以前台运行的程序即可。

比较常用的方法如

tail

Docker镜像制作类似于虚拟机的镜像模板制作即按照公司的实际业务需求将需要安装的软件、相关配置等基础环境配置完成然后将其做成镜像最后再从镜像批量生成容器实例这样可以极大的简化相同环境的部署工作

Docker的镜像制作分为手动制作基于容器和自动制作基于Dockerfile企业通常都是基于Dockerfile制作镜像

docker

如果没有指定[REPOSITORY[:TAG]]REPOSITORY和TAG都为none

提交的时候标记TAG号生产中常用后期可以根据TAG标记创建不同版本的镜像以及创建不同版本的容器基于容器手动制作镜像步骤具体如下

Ubuntu

sha256:0b59f1b5b2b1dca5f0386098a558b09593f652761c8a40e8723abdba2a0b43ce

[rootcentos7

[/bin/httpd,-f,-v,-h,/data/html]

EXPOSE

sha256:4100f91eb2e4949651fa401949791c746e34ae65e35fdbf456aa3bd55d703c72[rootcentos7

~]#

5a68de75aa05b374faeef9e08de92ffa3679cfaa240700f6ff1614576e24f3c4

[rootcentos7

{{.NetworkSettings.Networks.bridge.IPAddress}}

httpd01

sha256:b83d0a45c90bbfc368b57629af1985ec3f6d4bf05b870650fd7b73eb72c9771a

[rootcentos7

ef52ca935dc26a7283bc5a9de537f8fb1540de81f12729356c011041744fb6b0基于官方镜像生成的容器制作tomcat镜像

[rootcentos7

sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324

Status:

38cedc776327713d0d3081ddc26f0097b4f2b5a0981cc08a9afdfc0056e24434

[rootcentos7

root38cedc776327:/usr/local/tomcat#

BUILDING.txt

root38cedc776327:/usr/local/tomcat#

webapps

root38cedc776327:/usr/local/tomcat#

webapps.dist/

root38cedc776327:/usr/local/tomcat#

webapps.dist/*

root38cedc776327:/usr/local/tomcat#

webapps

root38cedc776327:/usr/local/tomcat#

exit

sha256:399beff7540e7ade5ec2f34a794a3e972351dd66b2ccab1fb73604d7a1b3518f

[rootcentos7

基于Ubuntu的基础镜像利用apt安装手动制作nginx的镜像

启动容器[rootcentos7

查看ubuntu系统信息rootd35021705364:/#

cat

/etc/os-releaseNAMEUbuntuVERSION20.04.3

LTS

Fossa)IDubuntuID_LIKEdebianPRETTY_NAMEUbuntu

20.04.3

LTSVERSION_ID20.04HOME_URLhttps://www.ubuntu.com/SUPPORT_URLhttps://help.ubuntu.com/BUG_REPORT_URLhttps://bugs.launchpad.net/ubuntu/PRIVACY_POLICY_URLhttps://www.ubuntu.com/legal/terms-and-policies/privacy-policyVERSION_CODENAMEfocalUBUNTU_CODENAMEfocal#

apt

http://security.ubuntu.com/ubuntu

focal-security

http://archive.ubuntu.com/ubuntu

focal

http://security.ubuntu.com/ubuntu

amd64

http://archive.ubuntu.com/ubuntu

focal-updates

http://security.ubuntu.com/ubuntu

amd64

http://security.ubuntu.com/ubuntu

focal-security/main

http://archive.ubuntu.com/ubuntu

focal-backports

http://archive.ubuntu.com/ubuntu

focal/restricted

http://archive.ubuntu.com/ubuntu

focal/multiverse

http://security.ubuntu.com/ubuntu

amd64

http://archive.ubuntu.com/ubuntu

focal/main

http://archive.ubuntu.com/ubuntu

focal/universe

http://archive.ubuntu.com/ubuntu

amd64

http://archive.ubuntu.com/ubuntu

amd64

http://archive.ubuntu.com/ubuntu

focal-updates/main

http://archive.ubuntu.com/ubuntu

amd64

http://archive.ubuntu.com/ubuntu

amd64

http://archive.ubuntu.com/ubuntu

focal-backports/main

http://archive.ubuntu.com/ubuntu

focal/main

http://archive.ubuntu.com/ubuntu

focal/main

http://archive.ubuntu.com/ubuntu

focal/main

http://archive.ubuntu.com/ubuntu

focal/main

http://archive.ubuntu.com/ubuntu

focal/main

http://archive.ubuntu.com/ubuntu

focal/main

http://archive.ubuntu.com/ubuntu

focal/main

http://archive.ubuntu.com/ubuntu

focal/main

http://archive.ubuntu.com/ubuntu

focal-updates/main

http://archive.ubuntu.com/ubuntu

focal-updates/main

http://archive.ubuntu.com/ubuntu

focal-updates/main

http://archive.ubuntu.com/ubuntu

focal/main

http://archive.ubuntu.com/ubuntu

focal-updates/main

http://archive.ubuntu.com/ubuntu

focal-updates/main

http://archive.ubuntu.com/ubuntu

focal/main

http://archive.ubuntu.com/ubuntu

focal/main

http://archive.ubuntu.com/ubuntu

focal/main

http://archive.ubuntu.com/ubuntu

focal/main

http://archive.ubuntu.com/ubuntu

focal/main

http://archive.ubuntu.com/ubuntu

focal-updates/main

http://archive.ubuntu.com/ubuntu

focal-updates/main

http://archive.ubuntu.com/ubuntu

focal/main

http://archive.ubuntu.com/ubuntu

focal/main

http://archive.ubuntu.com/ubuntu

focal-updates/main

http://archive.ubuntu.com/ubuntu

focal/main

http://archive.ubuntu.com/ubuntu

focal-updates/main

http://archive.ubuntu.com/ubuntu

focal/main

http://archive.ubuntu.com/ubuntu

focal/main

http://archive.ubuntu.com/ubuntu

focal-updates/main

http://archive.ubuntu.com/ubuntu

focal-updates/main

4.1.0git191117-2ubuntu0.20.04.3

[162

http://archive.ubuntu.com/ubuntu

focal/main

http://archive.ubuntu.com/ubuntu

focal-updates/main

http://archive.ubuntu.com/ubuntu

focal-updates/main

http://archive.ubuntu.com/ubuntu

focal-updates/main

http://archive.ubuntu.com/ubuntu

focal-updates/main

http://archive.ubuntu.com/ubuntu

focal-updates/main

http://archive.ubuntu.com/ubuntu

focal-updates/main

http://archive.ubuntu.com/ubuntu

focal-updates/main

http://archive.ubuntu.com/ubuntu

focal-updates/main

http://archive.ubuntu.com/ubuntu

focal-updates/main

.../00-libbsd0_0.10.0-1_amd64.deb

...Unpacking

.../01-libcap2_1%3a2.32-1_amd64.deb

...Unpacking

.../02-libelf1_0.176-1.1build1_amd64.deb

...Unpacking

.../03-libmnl0_1.0.4-2_amd64.deb

...Unpacking

.../04-libxtables12_1.8.4-3ubuntu2_amd64.deb

...Unpacking

.../05-libcap2-bin_1%3a2.32-1_amd64.deb

...Unpacking

.../06-iproute2_5.5.0-1ubuntu1_amd64.deb

...Unpacking

.../07-libatm1_1%3a2.5.1-4_amd64.deb

...Unpacking

.../08-libexpat1_2.2.9-1ubuntu0.4_amd64.deb

...Unpacking

.../09-tzdata_2022a-0ubuntu0.20.04_all.deb

...Unpacking

.../10-libicu66_66.1-2ubuntu2.1_amd64.deb

...Unpacking

.../11-libpam-cap_1%3a2.32-1_amd64.deb

...Unpacking

.../12-libssl1.1_1.1.1f-1ubuntu2.16_amd64.deb

...Unpacking

.../13-libxml2_2.9.10dfsg-5ubuntu0.20.04.4_amd64.deb

...Unpacking

.../15-libpng16-16_1.6.37-2_amd64.deb

...Unpacking

.../16-libxau6_1%3a1.0.9-0ubuntu1_amd64.deb

...Unpacking

.../17-libxdmcp6_1%3a1.1.3-0ubuntu1_amd64.deb

...Unpacking

.../18-libxcb1_1.14-2_amd64.deb

...Unpacking

.../19-libx11-data_2%3a1.6.9-2ubuntu1.2_all.deb

...Unpacking

.../20-libx11-6_2%3a1.6.9-2ubuntu1.2_amd64.deb

...Unpacking

.../21-fonts-dejavu-core_2.37-1_all.deb

...Unpacking

.../22-fontconfig-config_2.13.1-2ubuntu3_all.deb

...Unpacking

.../23-libfreetype6_2.10.1-2ubuntu0.2_amd64.deb

...Unpacking

.../24-libfontconfig1_2.13.1-2ubuntu3_amd64.deb

...Unpacking

.../25-libjpeg-turbo8_2.0.3-0ubuntu1.20.04.1_amd64.deb

...Unpacking

.../26-libjpeg8_8c-2ubuntu8_amd64.deb

...Unpacking

.../27-libjbig0_2.1-3.1build1_amd64.deb

...Unpacking

.../28-libwebp6_0.6.1-2ubuntu0.20.04.1_amd64.deb

...Unpacking

.../29-libtiff5_4.1.0git191117-2ubuntu0.20.04.3_amd64.deb

...Unpacking

(4.1.0git191117-2ubuntu0.20.04.3)

...Selecting

.../30-libxpm4_1%3a3.5.12-1_amd64.deb

...Unpacking

.../31-libgd3_2.2.5-5.2ubuntu2.1_amd64.deb

...Unpacking

.../32-nginx-common_1.18.0-0ubuntu1.3_all.deb

...Unpacking

libnginx-mod-http-image-filter.Preparing

unpack

.../33-libnginx-mod-http-image-filter_1.18.0-0ubuntu1.3_amd64.deb

...Unpacking

.../34-libxslt1.1_1.1.34-4ubuntu0.20.04.1_amd64.deb

...Unpacking

libnginx-mod-http-xslt-filter.Preparing

unpack

.../35-libnginx-mod-http-xslt-filter_1.18.0-0ubuntu1.3_amd64.deb

...Unpacking

.../36-libnginx-mod-mail_1.18.0-0ubuntu1.3_amd64.deb

...Unpacking

.../37-libnginx-mod-stream_1.18.0-0ubuntu1.3_amd64.deb

...Unpacking

.../38-nginx-core_1.18.0-0ubuntu1.3_amd64.deb

...Unpacking

.../39-nginx_1.18.0-0ubuntu1.3_all.deb

...Unpacking

/usr/share/perl5/Debconf/FrontEnd/Dialog.pm

line

/usr/local/lib/x86_64-linux-gnu/perl/5.30.0

/usr/lib/x86_64-linux-gnu/perl5/5.30

/usr/share/perl5

/usr/lib/x86_64-linux-gnu/perl/5.30

/usr/share/perl/5.30

/usr/lib/x86_64-linux-gnu/perl-base)

/usr/share/perl5/Debconf/FrontEnd/Readline.pm

line

/usr/share/perl5/Debconf/FrontEnd/Dialog.pm

line

/usr/local/lib/x86_64-linux-gnu/perl/5.30.0

/usr/lib/x86_64-linux-gnu/perl5/5.30

/usr/share/perl5

/usr/lib/x86_64-linux-gnu/perl/5.30

/usr/share/perl/5.30

/usr/lib/x86_64-linux-gnu/perl-base)

/usr/share/perl5/Debconf/FrontEnd/Readline.pm

line

/usr/share/perl5/Debconf/FrontEnd/Dialog.pm

line

/usr/local/lib/x86_64-linux-gnu/perl/5.30.0

/usr/lib/x86_64-linux-gnu/perl5/5.30

/usr/share/perl5

/usr/lib/x86_64-linux-gnu/perl/5.30

/usr/share/perl/5.30

/usr/lib/x86_64-linux-gnu/perl-base)

/usr/share/perl5/Debconf/FrontEnd/Readline.pm

line

/usr/share/perl5/Debconf/FrontEnd/Dialog.pm

line

/usr/local/lib/x86_64-linux-gnu/perl/5.30.0

/usr/lib/x86_64-linux-gnu/perl5/5.30

/usr/share/perl5

/usr/lib/x86_64-linux-gnu/perl/5.30

/usr/share/perl/5.30

/usr/lib/x86_64-linux-gnu/perl-base)

/usr/share/perl5/Debconf/FrontEnd/Readline.pm

line

/usr/share/perl5/Debconf/FrontEnd/Dialog.pm

line

/usr/local/lib/x86_64-linux-gnu/perl/5.30.0

/usr/lib/x86_64-linux-gnu/perl5/5.30

/usr/share/perl5

/usr/lib/x86_64-linux-gnu/perl/5.30

/usr/share/perl/5.30

/usr/lib/x86_64-linux-gnu/perl-base)

/usr/share/perl5/Debconf/FrontEnd/Readline.pm

line

/usr/share/perl5/Debconf/FrontEnd/Dialog.pm

line

/usr/local/lib/x86_64-linux-gnu/perl/5.30.0

/usr/lib/x86_64-linux-gnu/perl5/5.30

/usr/share/perl5

/usr/lib/x86_64-linux-gnu/perl/5.30

/usr/share/perl/5.30

/usr/lib/x86_64-linux-gnu/perl-base)

/usr/share/perl5/Debconf/FrontEnd/Readline.pm

line

(4.1.0git191117-2ubuntu0.20.04.3)

...Setting

/etc/nginx/modules-enabled/*.conf;include

/etc/nginx/conf.d/*.conf;include

/etc/nginx/sites-enabled/*;rootd35021705364:/#

grep

/etc/nginx/sites-enabled/defaultroot

/var/www/html;#

/var/www/example.com;rootd35021705364:/#

echo

/var/www/html/index.htmlrootd35021705364:/#

exitexit#

nginx_ubuntu20.04:v1.18.0sha256:b33b57cff5d3c68c56b5826490ddcb0c9e7751f2d275a9d6d1e43d63764f78b0[rootcentos7

~]#

off;06098c8bc2ec93978167950adfa5e827c75174aba306337165813a9e950b1972[rootcentos7

~]#

Docker基于CentOS的基础镜像利用yum安装手动制作nginx的镜像

[rootcentos7

centos:centos7.7.1908centos7.7.1908:

Pulling

sha256:50752af5182c6cd5518e3e91d48f7ff0cba93d5d760a67ac140e2d63c4dd9efcStatus:

Downloaded

centos:centos7.7.1908docker.io/library/centos:centos7.7.1908[rootcentos7

~]#

/etc/localtime[root0b3db04f3a72

/]#

../usr/share/zoneinfo/Asia/Shanghai

/etc/localtime#

http://mirrors.aliyun.com/repo/Centos-7.repo[root0b3db04f3a72

/]#

http://mirrors.aliyun.com/repo/epel-7.repo[root0b3db04f3a72

/]#

/usr/share/nginx/html/index.html[root0b3db04f3a72

/]#

/usr/share/nginx/html/index.html#

提交为镜像#

commit命令在宿主机基于容器ID提交为镜像[rootcentos7

~]#

chensir/centos-nginx:1.16.1.v1sha256:3f649568eaca282c2ff0864d725bb0310862849e9393abfb14f49fa60d7071f7[rootcentos7

~]#

/usr/sbin/nginxdf983ecee256956f34af0ca6089331bd9bd1863ad24d35defef05c86e6cab5f2[rootcentos7

~]#

Dockerfile是一种被Docker程序解释执行的脚本由一条条的命令组成的没条命令对应Linux下面的一条命令Docker程序将这些DockerFile指令再翻译成真正的Linux命令其有自己的书写方式和支持的命令Docker程序读取DockerFile并根据指令生成Docker镜像相比手动制作的镜像方式DockerFile更能直观的展示镜像是怎么产生的有了DockerFile当后期有额外的需求时只要在之前的DockerFile添加或者修改响应的命令即可重新的Docker镜像避免了重复手动制作镜像的麻烦类似与shell脚本一样可以方便高效的制作镜像。

Docker守护程序Dockerfile逐一运行指令如有必要将每个指令的结果提交到新镜像然后最终输出新镜像的ID。

Docker守护程序将自动清理之前发送的上下文

RUN

按照业务类型或系统类型等方式划分创建目录环境方便后期镜像比较多的时候进行分类[rootcentos7

~]#

/data/dockerfile/{web/{nginx,apache,tomcat,jdk},system/{centos,ubuntu,alpine,debin}}[rootcentos7

~]#

/data/dockerfile//data/dockerfile/├──

system│

官方说明https://docs.docker.com/engine/reference/builder/

帮助man

每一行Dockerfile的指令开头指令不区分大小写但是惯例使用大写使用#开始作为注释每一行只支持一条指令没调指令可以携带多个参数指令按文件的顺序从上至下进行执行每个指令的执行会生成一个新的镜像层为了减少分层和镜像大小尽可能将多条指令合并成一条指令制作镜像一般可能需要反复多次每次执行Dockerfile都按顺序执行从头开始已经执行过的指令已经缓存不需要在执行如果后续有一行新的指令没执行过其往后的指令将会重新执行所以为加速镜像制作将最常变化的内容放下dockerfile的文件的后面

Dockerfile相关指令

ADDCOPYENVEXPOSEFROMLABELSTOPSIGNALUSERVOLUMEWORKDIRFROM指定基础镜像

FROM

就是指定基础镜像此指令通常必须放在Dockerfile文件第一个非注释行。

后续的指令都是运行于此基准镜像所提供的的运行环境

build会在docker主机上查找指定的镜像文件若不存在则会从docker

hub

registry上拉取所需的镜像文件。

如果找不到指定的镜像文件docker

build会返回一个错误信息

对于不同的软件官方都提供了相关的docker镜像比如nginx、redis、mysql、httpd、tomcat等服务类的镜像也有操作系统类如centos、ubuntu、debian等。

建议使用官方镜像比较安全。

FROM

指定镜像的平台比如linux/amd64,linux/arm64,or

windows/amd64tag

digest是可选项如果不指定默认为latest说明关于scrach镜像

FROM

所有镜像的起源镜像相当于object类参考链接https://hub.docker.com/_/scratch?tabdescriptionhttps://docs.docker.com/develop/develop-images/baseimages/该镜像是一个空的镜像可以用于构建busybox等超小镜像可以说是真正的从零开始构建属于自己的镜像该镜像在构建基础镜像例如Debian和busybox或超最小镜像仅包含一个二进制文件及其所需内容例如hello-world的上下文中最有用。

#

示例FROM

com.example.label-with-valuefooLABEL

version1.0LABEL

lines一个镜像可以有多个label还可以写在一行中即多个标签写法可以减少镜像的大小

多标签写法LABEL

20191024,org.label-schema.license:

CentOS

Image,org.label-schema.schema-version:

CentOS}RUN执行shell命令

RUN指令用来在构建镜像阶段需要执行FROM指定镜像所支持的shell命令。

注意RUN可以写多个每一个RUN指令都会建立一个镜像层所以尽可能合并成一条指令比如将多个shell命令通过连接一起成为一条指令

shell

来运行它这意味着此进程在容器中的PID不为1不能接受Unix信号因此当使用

docker

命令停止容器时此进程接收不到SIGTERM信号exec格式中的参数是一个JSON格式的数组其中executable为要运行的命令后面paramN为传递给命令的选项或参数然而此种格式指定的命令不会以

/bin/sh

来发起因此常见的shell操作如变量替换以及通配符(?,*)替换将不会进行不过如果要运行的命令依赖于shell特性的话可以将其替代换为类似下面的格式。

RUN

[/bin/bash,-c,executable,laram1]#

示例RUN

/usr/share/nginx/html/index.htmlRUN

[/bin/bash,-c,echo

/usr/share/nginx/html/index.html#

/appRUN

ENV可以定义环境变量和值会被后续指令ENVADDCOPYRUN等通过

KEY或

此格式只能对一个key赋值key之后的所有内容均会被视作其value的组成部分ENV

key

进行转义也可以通过对value加引号进行标识反斜杠也可用于读行ENV

key1value1

变量支持高级赋值格式${key:-word}${key:word}如果运行容器是需要修改变量可以执行下面通过基于exec机制实现

注意下面方式只影响容器运行时环境而不影响构建镜像的过程即只能覆盖

docker

可以是多个可以使用通配符通配符规则满足Go的filepath.Match规则必须是build上下文中的路径Dockerfile

结尾可以是绝对路径或者是WORKDIR指定的相对路径使用COPY指令源文件的各种元数据都会保留。

比如读、写、执行权限、文件变更时间等如果事先不存在它会被自动创建这包括其父

COPY

该命令可以认为是增强版的COPY不仅支持COPY还支持自动解包。

可以将复制指定的文件到容器中

ADD

可以是Dockerfile所在只复本身如果是一个URL下载后的文件权限自动设置为600如果为URL且不以/结尾则指定的文件将被下载并直接被创建如果以/结尾则文件名URL指定的文件将被直接下载并保存为/如果是一个本地文件系统上的打包文件如gzbz2xz它将被解包其行为类似

“tar

命令但是通过URL获取到的tar文件将不会自动展开如果有多个或间接或直接使用了通配符则必须是一个以/结尾的目录路径如果不以/结尾。

则被视作一个普通文件

CMD容器启动命令

一个容器中需要持续运行的进程一般只有一个CMD用来指定启动程序时默认执行的一个命令且其运行结束后容器也会停止所以一般CMD指定的命令为持续运行且为前台命令

如果docker

run没有指定任何的执行命令或者dockerfile里面也没有ENTRYPOINT那么开启容器时就会执行CMD指定的默认命令前面介绍过的RUN命令是在构建镜像执行的命令注意二者的不同之处每个Dockerfile只能有一条CMD命令。

如指定了多条只有最后一条被执行如果用户启动容器时用docker

run

使用exec执行推荐方式第一个参数必须是命令的全路径此种形式而不支持环境变量CMD

/bin/sh

run命令有参数那么参数全部都会作为ENTRYPOINT的参数如果docker

run后面没有额外的参数但是Dockerfile中的CMD里有即上面的第三种用法即Dockerfile中即有CMD也有ENTRYPOINT那么CMD的全部内容会作为ENYRTPOINT的参数如果docker

run后面有额外参数同时Dockerfile中既有CMD也有ENTRYPOINT那么docker

run后面的参数覆盖掉CMD参数内容最终作为ENTRYPOINT的参数可以通过docker

run

string参数在运行时替换注意string不要加空格使用CMD要在运行时重新写命令本身然后在后面才能追加运行参数ENTRYPOINT则可以运行时无需重写命令皆可以直接接收新参数每个Dockerfile中只能有一个ENTRYPOINT当指定多个时只有最后一个生效

ARG构建参数

ARG指令在build阶段指定变量和ENV不同的是容器运行时不会存在这些环境变量

ARG

FROM指令支持由第一个FROM之前的任何ARG指令声明的变量#

示例ARG

在FROM之前声明的ARG在构建阶段之外所以它不能在FROM之后的任何指令中使用。

要使用在第一个FROM之前声明的ARG的默认值请在构建阶段内使用没有值的SRG指令#

示例ARG

在容器中创建一个可以从本地主机或其他容器挂载的挂载点一般用来存放数据库和需要保存的数据等一般会将宿主机上的。

即使容器后期被删除次宿主机的为

/var/lib/docker/volumes/volume_id/_data

VOLUME

Dockerfile中的VOLUME实现的是匿名数据卷无法指定宿主机路径和容器目录的挂载关系通过docker

-fv

EXPOSE仅仅是声明容器打算使用什么端口而已并不会真正暴露端口即不会自动在宿主机进行端口映射

因此在启动容器时需要通过-P或-pDocker主机才会真正分配一个端口转发到指定暴露的端口才可使用

注意即使Dockerfile没有EXPOSE端口指令也可以通过docker

run

-p临时暴露容器内程序真正监听的端口所以EXPOSE相当于指定默认的暴露端口可以通过docker

run

说明protocol用于指定传输层协议可为tcp或udp二者之一默认为TCP协议#

示例EXPOSE

WORKDIR指定工作以后各层的当前如该目录不存在WORKDIR会自行创建

WORKDIR

可以使用多个WORKDIR指令后续命令如果参数是相对路径则会基于之前命令指定的路径WORKDIR

/aWORKDIR

可以用来配置当构建当前镜像的子镜像时会自动触发执行的命令但在当前镜像构建时并不会执行即延迟到子镜像构建时才执行

ONBUILD

如果基于image-A创建新的镜像image-B时新的Dockerfile中使用FROM

image-A指定基础竟像时会自动执行ONBUILD指令内容等价于在后面添加了两条指令。

FROM

image-A#

尽管任何指令都可以注册成为触发器指令但ONBUILD不能自我使用且不会触发FROM和MAINTAINER指令使用ONBUILD指令的镜像推荐在标签中注明例如

ruby:1.9-onbuild

如果基础镜像有健康检查指令使用这行可以屏蔽掉其健康检查指令HEALTHCHECK

NONE#

健康检查命令运行超时时间如果超过这个时间本次健康检查就被视为失败默认30秒--retries次数

当连续失败指定次数后则将容器状态视为

unhealthy默认3次--start-periodFDURATION

default0s#

/var/lib/spt/lists/*HEALTHCHECK

--interval5s

STOPSIGNAL指令设置将被发送到容器退出的系统调用信号。

该信号可以是与内核syscall表中的位置匹配的有效无符号数字也可以是SIGNAME格式的信号名称如SIGKILL

STOPSIGNAL

SHELL指令允许覆盖用于命令的shell形式的默认SHLL必须在Dockerfile中以JSON形式编写SHELL指令。

SHELL

[executable,parameters]在Linux上默认SHELL程序

[“/bin/sh”,“-c”]在Windows上默认SHELL程序为

SHELL指令在Windows上特别有用在Windows上有两个常用且往前不同的本机SHELL:cmd和powershell以及包括sh在内的备用shell

SHELL指令可以出现多次。

每个SHELL指令将覆盖所有先前的SHELL指令并影响所有后续的指令

.dockerignore文件

与.gitignore文件类似生成构建上下文时Docker客户端应忽略的文件和文件夹指定模式

.dockerignore使用Go的文件路径规则filepath.Match

匹配任何非分隔符字符序列?

除了README的md不排外排除所有md文件但不排除README-secret.md*.md!README*.mdREADME-secret.md#

除了所有README的md文件以外的md都排除*.mdREADME-sevret.md!README*.mddockerfile构建过程和指令总结

Dockerfile

从基础镜像运行一个容器执行一条指令对容器做出修改执行类似docker

commit的操作提交一个新的中间镜像层可以利用中间层镜像创建容器进项调试和排错再基于刚提交的镜像运行一个新容器执行Dockerfile中的下一条指令直至所有指令执行完毕

Dockerfile指令总结

BUILDRUNBOTHFROMCMDWORKDIRLABELVOLUMEUSERCOPYEXPOSEENVADDENTRYPOINTRUNONBUILD.dockerignore

构建镜像docker

-则从标准输入获取Dockerfile的内容-f,--file

string

Dockerfile文件名默认为PATH/Dockerfile--force-rm

总是删除中间层容器创建镜像失败时删除临时容器--no-cache

--quietfalse

不显示Dockerfile的RUN运行的输出结果--rmtrue

创建镜像成功时删除临时容器-t

注册名称/镜像名称:标签(标签默认为latest)Docker数据管理

容器数据管理介绍

Docker镜像由多个只读层叠加而成启动容器时Docker会加载只读镜像层并在镜像栈顶部添加一个读写层

如果运行中的容器修改了现有的一个已经存在的文件那该文件将会从读写层下面的只读层复制到读写层该文件的只读版仍然存在只是已经被读写层中该文件的副本所隐藏即“写时复制COW

copy

如果将正在运行中的容器修改生成了新的数据那么新产生的数据将会被复制到读写层进行持久化保存这个读写层也就是容器的工作目录也为写时复制COW机制

LowerDirimage镜像层即镜像本身只读UpperDir容器的上层可读写容器变化的数据存放在此处MergedDir容器的文件系统使用Union

FS联合文件系统将lowerdir和upperdir合并完成后给容器使用最终呈现给用户的统一视图WorkDir容器在宿主机的工作目录挂载后内容会被清空且在使用过程中其内容用户不可见

每个镜像层

有状态协议就是通信双方要记住双方并且共享一些信息。

而无状态协议的通信每次都是独立的与上一次的通信没什么关系。

左侧是无状态的http请求服务右侧为有状态下层为不需要存储的服务上层为需要存储的部分服务

容器数据持久保存方式

如果要将写入到容器的数据永久保存则需要建工人那个器中的数据保存到宿主机的指定目录

数据卷Data

Volume直接将宿主机推荐使用此种方式此方式较常用数据卷容器Data

Volume

Container间接使用宿主机空间数据卷容器是将宿主机的目录挂载至一个专门的数据卷容器然后让其他容器通过数据卷容器读写宿主机的数据此方式不常用

数据卷data

数据卷实际上就是宿主机上的目录或是文件可以被直接mount到容器当中使用

实际生产环境中需要针对不同类型的服务、不同类型的数据存储要求做相应的规划最终保证服务的可扩展性、稳定性以及数据的安全性

数据卷使用场景

数据库日志输出静态web页面应用配置文件多容器间目录或文件共享

数据卷是宿主机出问题上面容器会受影响当宿主机较多时不方便统一管理匿名和命名数据卷在容器启动时初始化如果容器使用的镜像在挂载点包含了数据会开呗到新的初始化的数据卷中

数据卷使用方法

指定宿主机路径充当挂载点docker自动指定宿主机的路径进行挂载命名卷指定数据卷的名称和容器路径的挂载关系

docker

命令的以下格式可以实现数据卷-v,--volume[host-src:]container-dest[:options]optionsro

匿名卷只指定容器内路径没有指定宿主机路径信息宿主句自动生成/var/lib/docker/vlumes/卷ID/_data路径#

run时也会自动创建卷docker

COMMANDCommands:createinspectlsprunerm#

inspect

在Dockerfile中创建的是匿名数据卷无法直接实现多个容器之间共享数据

数据卷容器最大的功能是可以让数据在多个docker容器之间共享

相当于先要创建一个后台运行的容器作为Server用于提供数据卷这个卷可以为其他容器提供数据存储服务其他使用此卷的容器作为client端但此方法不常使用

缺点依赖一个Server的容器所以此Server出了问题其他Client容器都会受影响

使用数据卷容器

将提供的容器Server删除已经运行的容器Client依然可以使用挂载的卷因为容器是通过挂载访问数据的但是无法创建新的卷容器客户端但是再把卷容器Server创建后即可正常创建卷容器Client此方式可以用于线上共享数据然后其他的容器分别挂载此容器的目录即可保证各容器之间的数据一致性

数据卷容器的Server和Client可以不使用同一个镜像生成

网络管理

docker容器创建后必不可少的要和其他主机或容器进行网络通信

Docker服务安装完成之后默认在每个宿主机会生成一个名称为docker0的网卡其IP地址都是172.17.0.1/16

每次新建容器后

宿主机多了一个虚拟网卡和容器的网卡组合成一个网卡比如137veth8ca6e42if136而在容器内的网卡名为136可以看出和宿主机的网卡之间的关联容器会自动获取一个172.17.0.0/16网段的随机地址默认从172.17.0.2开始第二次为172.17.0.3以此类推容器获取的地址并不固定每次容器重启可能会发生地址变化

默认情况下

此配置可以禁止同一个宿主机的容器之间通信不同宿主机之前的容器IP地址重复默认不能相互通信

[rootcentos7

/usr/lib/systemd/system/docker.serviceExecStart/usr/bin/dockerd

fd://

--containerd/run/containerd/containerd.sock

~]#

新建容器默认使用docekr0的网络配置可以修改默认指向自定义的网桥网络

查看默认网络[rootcentos7

BROADCAST,MULTICAST,UP,LOWER_UP

mtu

NO-CARRIER,BROADCAST,MULTICAST,UP

mtu

BROADCAST,MULTICAST,UP,LOWER_UP

mtu

NO-CARRIER,BROADCAST,MULTICAST,UP

mtu

/usr/lib/systemd/system/docker.serviceExecStart/usr/bin/dockerd

fd://

--containerd/run/containerd/containerd.sock

br0[rootcentos7

--containerd/run/containerd/containerd.sock

br0root

新建容器时docker会自动分配容器名称容器ID和IP地址导致容器名称容器ID和IP都不固定那么如何区分不同的容器实现和确定目标容器的通信呢解决方案是给容器起个固定的名称容器之间通过固定名称实现确定目标的通信

有两种固定名称

即在同一个宿主机上的容器之间可以通过自定义的容器名称相互访问比如一个业务前端静态页面是使用nginx动态页面使用的是Tomcat另外还需要负载均衡调度器如haproxy对请求调度至nginx和Tomcat的容器由于容器在启动的时候其内部IP地址是DHCP随机分配的而给容器起个固定的名称则是相对比较固定的因此比较适用于此场景

容器名称实现

自定义的容器名称可能后期会发生变化那么一旦名称发生变化容器内程序之间也必须要随之发生变化比如程序通过固定的容器名称进行服务调用但是容器名称发生变化之后再使用之前的名称肯定是无法成功调用每次都进行更改的话又比较麻烦因此可以使用自定义别名的方式解决即容器名称可以随意更改只要不更改别名即可

容器别名实现

nonebridgehostcontainernetwork-name

~]#

可以是以下值nonebridgehostcontainer:容器名或容器ID自定义网络名称bridge网络模式

bridge网络模式架构

bridge模式是docker的默认模式即不指定任何模式就是bridge模式也是使用比较多的模式此模式创建的容器会为每一个容器分配自己的网络IP等信息并将容器连接到一个虚拟网桥与外界通信。

可以和外部网络之间进行通信通过SNAT访问网络使用DNAT可以让容器被外部主机访问所以此模式也称为NAT模式

bridge网络模式特点

网络资源隔离不同宿主机的容器无法直接通信各自使用独立网络无需手动配置容器默认自动获取172.17.0.0/16的IP地址此地址可以修改可访问外网利用宿主机的物理网卡SNAT连接外网外部主机无法直接访问容器可以通过配置DNAT接收外网的访问性能较低因为可通过NAT望路转换带来更多的损耗端口管理繁琐每个容器必须手动指定唯一的端口容器产生端口冲突

~]#

adaac389304f7654edfab8612d6d82ec5b13b6e81331a296c98fa6c824eb79dd,Created:

2022-08-26T13:11:24.08809319808:00,Scope:

local,Driver:

{com.docker.network.bridge.default_bridge:

true,com.docker.network.bridge.enable_icc:

true,com.docker.network.bridge.enable_ip_masquerade:

true,com.docker.network.bridge.host_binding_ipv4:

0.0.0.0,com.docker.network.bridge.name:

br0,com.docker.network.driver.mtu:

1500},Labels:

/proc/sys/net/ipv4/ip_forward1[rootcentos7

~]#

/lib/systemd/system/docker.serviceExecStart/usr/bin/dockerd

fd://

--containerd/run/containerd/containerd.sock

~]#

d1f65af6a2d6d9f8e73cf830c47236f5df50c7d04690bde64f499a43c82328eb,Created:

2022-08-26T14:04:28.64935944308:00,Scope:

local,Driver:

{com.docker.network.bridge.default_bridge:

true,com.docker.network.bridge.enable_icc:

true,com.docker.network.bridge.enable_ip_masquerade:

true,com.docker.network.bridge.host_binding_ipv4:

0.0.0.0,com.docker.network.bridge.name:

docker0,com.docker.network.driver.mtu:

1500},Labels:

如果指定host模式启动的容器那么新创建的容器不会创建自己的虚拟网卡而是直接使用宿主的网卡和IP地址因此在容器里面查看到的IP信息就是宿主机的信息访问容器的时候直接使用宿主机IP容器端口即可不过容器内除网络以外的其他资源如文件系统、系统进程等仍然和宿主机保持隔离

此模式由于直接使用宿主机的网络无需转换网络性能最高但是个容器使用的端口不能相同适用于运行容器端口比较固定的业务

Host网络模式特点

指定共享宿主机网络网络性能无损耗网络故障排除相对简单各容器网络无隔离网络资源无法分别统计端口管理困难容易产生端口冲突不支持端口映射

none模式

在使用none模式后Docker容器不会进行任何网洛洛配置没有网卡没有IP

也没有路由因此默认无法与外界通信需要手动添加网卡配置IP等所以极少使用

none模式特点

使用此模式创建的容器需指定和一个已经存在的容器共享一个网络而不是和宿主机共享网络新创建的容器不会创建自己的网卡也不会配置自己的IP而是和一个被指定的已经存在的容器共享IP和端口范围因此这个容器的端口不能被指定容器的端口冲突除了网络之外的文件系统、进程信息等仍然保持相互隔离两个容器的进程可以通过lo网卡进行通信

Container模式特点

指定与宿主机网络隔离容器间共享网络空间适合频繁的容器间的网络通信直接使用对方的网络较少使用

自定义网络模式

除了以上的网络模式也可以自定义网络使用自定义的网段地址网关等信息

注意自定义网络内的容器可以直接通过容器名进行相互的访问而无需使用

-link

可以使用自定义网络模式实现不同集群应用的独立网络管理而互不影响而且在一个网络内可以直接利用容器名相互访问非常便利

自定义网实现

Docker仓库类似于yum仓库是用来保存镜像的仓库。

为了方便的管理和使用docker镜像可以将镜像集中保存至Docker仓库中将制作好的镜像push到仓库集中保存在需要镜像时从仓库中pull镜像即可。

官方阿里云等第三方仓库

私有云仓库组织内部搭建的仓库一般只为组织内部使用常使用下面软件搭建仓库

docekr

docker.io/xchensir/alpine:3.11-v1#

上传本地镜像至官网

docker.io/xchensir/alpine:3.11-v1私有云单机仓库Docker

Registry

Registry作为Docker的核心组件之一负责单主机的镜像内容的存储与分发客户端的docker

pull以及push命令都将直接与registry进行交互最初版本的registry由python实现由于设计初期在安全性性能以及API的设计上有着诸多缺陷该版本在0.9之后停止开发由新项目distribution新的docker

register被称为Distribution来重新设计并开发下一代registry新的项目由go语言开发所有的API底层存储方式系统架构都进行了全面的重新设计已解决上一代registry中存在的问题2016年4月registry2.0正式发布docker1.6版本开始支持registry2.0而八月份随着docker1.8发布docker

hub正式启用2.1版本registry全面替代之前版本registry新版registry对镜像存储格式进行了重新设计和旧版不兼容docker1.5和之前的版本无法读取2.0的镜像另外Registry2.4版本之后支持了回收站机制也就是可以删除镜像在2.4版本之前是不支持删除镜像的所以最好使用大于Registry2.4版本

官方文档地址

https://docs.docker.com/registry/

官方部署文档

https://github.com/docker/docker.github.io/blob/master/registry/deploying.md

搭建单机仓库

chensir:$2y$05$KP9hiJW3W5ZvwfTeWUctEuak6vHxsHOdJpMRoHRfYQnIXfmEsceOS[rootcentos7

~]#

REGISTRY_AUTH_HTPASSWD_REALMRegistry

Realm

REGISTRY_AUTH_HTPASSWD_PATH/auth/registry

registry:2.7.1

f2373f9e7c67bf628feb6222ff716cab115d63ffce9791179ef4797a00338145[rootcentos7

~]#

/lib/systemd/system/docker.service

fd://

--containerd/run/containerd/containerd.sock

--insecure-registry

https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin

Succeeded#

sha256:c04ecf7d8a544273ae7b7d1cda2f6c123a9690fc56c705dd5e16a20c65bba555

size:

sha256:c04ecf7d8a544273ae7b7d1cda2f6c123a9690fc56c705dd5e16a20c65bba555

Status:

Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器由VMware开源其通过添加一些企业必须的功能特性例如安全、标识和管理等扩展了开源Docker

Distribution。

作为一个企业级私有Registry服务器Harbor提供了更好的性能和安全。

提升用户使用Registry构建和运行环境传输镜像的效率。

Harbor支持安装在多个Registry节点的镜像资源复制镜像全部保存在私有Registry中确保数据和知识产权在公司内部网络中管控另外Harbor也提供了高级的安全特性诸如用户管理访问控制和活动审计等

vmware官方开源服务

https://github.com/goharbor/harbor

harbor官方网址

基于角色的访问控制用户与Docker镜像仓库通过“项目”进行组织管理一个用户可以对多个镜像仓库在同一命名空间project里有不同的权限镜像复制镜像可在多个Registry实例中复制同步。

尤其适合负载均衡高可用混合云和多云场景图形化用户界面用户可以通过浏览器来浏览检索当前Docker镜像仓库管理项目和命名空间AD/LDAP支Harbor可以集成企业内部已有的AD/LDAP用于鉴权认证管理国际化已拥有英文、中文、德文、日文和俄文的本地化版本RESTful

API提供给管理员对于Harbor更多的操控使得其它管理软件集成变得更容易部署简单提供在线和离线两种安装工具也可以安装到vSphere平台OVA方式虚拟设备

Harbor组成

proxy对应启动组件Nginx。

它是一个nginx反向代理代理Notary

client镜像认证、Docker

Service对应启动组件harbor-ui。

底层数据存储使用mysql数据库主要提供了四个子功能

UI一个Web管理页面APIHarbor暴露的API服务Auth用户认证服务decode后的token中的用户信息在这里进行认证auth后端可以接db、ldap、uaa三种认证实现Token服务负责根据用户在每个project中的role来为每一个docker

client发送给registry的请求没带tokenregistry会重定向请求到token服务创建token

Registry对应启动组件registry。

负责存储镜像文件和处理镜像的pull/push命令。

Harbor对镜像进行强制的访问控制Registry会将客户端的每个pull、push请求转发到token服务来获取有效的tokenAdmin

Service对应启动组件harbor-adminserver。

是系统的配置管理中心附带检查存储用量ui和job

Service对应启动组件harbor-jobservice。

负责镜像复制的工作他和registry通信从一个registry

pull镜像然后push到另一个registry并记录job_logLog

Collector对应启动组件harbor-log。

日志汇总组件通过docker的log-drive把日志汇总到一起DB对应启动组件harbor-db负责存储project、user、role、replication、image_scan、access等的metadata数据

安装Harbor

下载地址https://github.com/vmware/harbor/releases

环境准备四台机器

安装docker依赖三个yum源BaseExtrasdocker-ce

wget

/etc/yum.repos.d/CentOS-Base.repo

http://mirrors.aliyun.com/repo/Centos-7.repo

wget

http://mirrors.aliyun.com/repo/epel-7.repo

wget

/etc/yum.repos.d/docker-ce.repo

https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum

clean

https://github.com/docker/compose/releases/download/v2.10.2/docker-compose-linux-x86_64[rootcentos7

~]#

/usr/local/bin/docker-compose[rootcentos7

~]#

/usr/bin/docker-compose[rootcentos7

~]#

https://github.com/goharbor/harbor/releases/download/v2.6.0/harbor-offline-installer-v2.6.0.tgz[rootcentos7

~]#

harbor-offline-installer-v2.6.0.tgz

/apps/[rootcentos7

/apps/harbor/harbor.yml[rootcentos7

~]#

/apps/harbor/harbor.ymlhostname:

10.0.0.16

修改此行指向当前主机IPharbor_admin_password:

123456

修改此行指定harbor登录用户admin的密码默认用户/密码

admin/Harbor12345#

goharbor/harbor-jobservice:v2.6.0

/harbor/entrypoint.…

goharbor/harbor-registryctl:v2.6.0

/home/harbor/start.…

goharbor/registry-photon:v2.6.0

/home/harbor/entryp…

/lib/systemd/system/harbor.service[Unit]DescriptionHarborAfterdocker.service

systemd-resolved.serviceRequiresdocker.serviceDocumentationhttp://github.com/vmware/harbor[Service]TypesimpleRestarton-failureRestartSec5ExecStart/usr/bin/docker-compose

/apps/harbor/docker-compose.yml

upExecStop/usr/bin/docker-compose

/apps/harbor/docker-compose.yml

down[Install]WantedBymulti-user.target#

harbor]#

/apps/harbor/usr/bin/docker-compose

up[rootcentos7

/lib/systemd/system/docker.service

fd://

--containerd/run/containerd/containerd.sock

--insecure-registry

https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin

Succeeded#

--containerd/run/containerd/containerd.sock

--insecure-registry

修改images的名称不修改成指定格式无法将镜像上传到harbor仓库

格式为

https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin

Succeeded

10.0.0.16/chensir/busybox-chensir:v1.0

[rootcentos7

10.0.0.16/chensir/busybox-chensir:v1.0

The

[10.0.0.16/chensir/busybox-chensir]

c1cf1676e7d0:

sha256:c501ccda169599fb77102ad0c2e2568336eaccf9ad83c94aec0d6f28fb55c0a0

size:

在10.0.0.15的centos7主机上无需登录即可下载镜像

注下载前需修改docker的service文件加入harbor服务器的地址才可以下载

[rootcentos7

10.0.0.16/chensir/busybox-chensir:v1.0

Error

/lib/systemd/system/docker.service

[rootcentos7

10.0.0.16/chensir/busybox-chensir:v1.0

v1.0:

sha256:c501ccda169599fb77102ad0c2e2568336eaccf9ad83c94aec0d6f28fb55c0a0

Status:

10.0.0.16/chensir/busybox-chensir:v1.0

10.0.0.16/chensir/busybox-chensir:v1.0

[rootcentos7

/lib/systemd/system/docker.service

[rootcentos7

10.0.0.16/chensir/busybox-chensir

v1.0

/apps/harbor/install.sh实现harbor高可用

Harbor支持基于策略的Docker镜像复制功能这类似于MySQL的主从同步其可以实现不同的数据中心不同的运行环境之间同步镜像并提供友好的管理界面大大简化了实际运维中的镜像管理工作已经有很多互联网公司使用harbor搭建内网docker仓库的案例并且还有实现了双向复制功能

多个harbor需要登录管理页面新建相同的项目然后在系统管理仓库管理新建目标系统管理复制管理新建规则

互相之前配置

key..................................................................................writing

new

harbor.chensir.ink.csrGenerating

4096

key.............................................................................................................................................................................................................................................................................................................................................writing

new

harbor.chensir.ink.crtSignature

oksubject/CNca.chensir.inkGetting

Private

/apps/harbor/certs//apps/harbor/certs/├──

ca.crt├──

/apps/harbor/certs/harbor.chensir.ink.crtprivate_key:

/apps/harbor/certs/harbor.chensir.ink.key#

更新配置[rootcentos7

https://harbor.chensir.ink/v2/:

x509:

/etc/docker/certs.d/harbor.chensir.org/[rootcentos7

~]#

harbor.chensir.ink:/apps/harbor/certs/ca.crt

/etc/docker/certs.d/harbor.chensir.org/[rootcentos7

~]#

/etc/docker/certs.d//etc/docker/certs.d/└──

ca.crt1

当在宿主机启动较多容器的时候如果都是手动操作会觉得比较麻烦而且容易出错此时推荐使用docker单机编排工具docker-compose

docker-compose是docker容器的一种单机编排服务docker-compose是一个管理多个容器的工具比如可以解决容器之间的依赖关系就像启动一个nginx前端的时候会调用后端额Tomcat那就得先启动Tomcat但是启动Tomcat容器还需要依赖数据库那就还得启动数据库docker-compose可以用来解决这样的嵌套依赖关系并且可以替代docker命令对容器进行创建、启动和停止等手工的操作

因此如果说docker命令就像linux的命令docker-compose就像shell脚本可以自动的执行容器批量操作从而实现自动化的容器管理或者说docker命令相当于Ansible命令那么docker

compose文件就相当于ansible-playbook的yaml文件

docker-compose

项目是Docker官方开源项目负责实现对Docker容器集群的快速编排docker-compose将所管理的容器分为三层分别是工程project服务service以及容器Container

命令格式

指定compose模板文件默认为docker-compose.yml

--verbose

https://docs.docker.com/compose/compose-file/

docker-compose文件是一个yaml格式的文件所以注意行首的缩进很严格

docker-compose启动单各容器

docker-compose文件可以在任意目录没创建文件名为docker-compose.yml配置文件要注意前后的缩进

[rootcentos7

services:service-nginx-web:image:

nginxcontainer_name:

services:service-nginx-web:image:

nginx

同时启动多个同一镜像的容器不要指定容器名称否则会冲突expose:-

80-

service-nginx-web5docker-compose启动多个容器

[rootcentos7

services:service-nginx-web:image:

nginxcontainer_name:

指定数据卷将宿主机/data/nginx挂载到容器/apps/nginx/htmlexpose:-

80-

443:443service-tomcat-app1:image:

tomcatexpose:-

https://docs.docker.com/config/containers/resource_constraints/

默认情况下容器没有资源的使用限制可以使用主机内核调度程序允许的尽可能多的资源

Docker提供了控制容器使用资源的方法可以限制容器使用多少内存或CPU等在docker

其中许多功能都要求宿主机的内核支持要检查是否支持这些功能可以使用docker

info命令如果内核中的某项特性可能会在输出结尾处看到警告可参考

https://docs.docker.com/engine/install/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities

消除警告

对于Linux主机如果没有足够的内存来执行其他重要的系统任务将会抛出OOM随后系统会开始杀死进程已释放内存凡是运行在宿主机的进程都有可能被kill包括Dockerd和其他的应用程序如果重要的系统进程被kill会导致和该进程相关的服务全部宕机。

通常越消耗内存比较大的应用越容易被kill比如MySQL数据库java程序等

产生OOM异常时Dockerd尝试通过调整Docker守护程序上的OOM优先级来减轻这些风险以便它系统上的其他进程更不可能被杀死但是容器的OOM优先级未调整这使得单个容器被杀死的可能性比Docker守护程序或其他系统进程被杀死的可能性更大不推荐通过守护程序或容器上手动设置

oom优先级机制

1000值越高越容易被宿主机kill掉如果将该值设置为-1000则进程永远不会被宿主机

kernel

该设置的存在是为了和旧版的linux内核兼容/proc/PID/oom_score#

、存活时间uptime

time和oom_adj计算出的进程得分消耗内存越多得分越高容易被宿主机

kernel强制杀死查看oom相关值

dockerd/oom_score_adj-500容器的内存限制

Docker可以强制执行硬性内存限制即只允许容器使用给定的内存大小

Docker也可以执行非硬性内存限制即容器可以使用尽可能多的内存除非内核检测到主机上的内存不够用了

内存相关选项

https://docs.docker.com/config/containers/resource_constraints/

b,k,m,g

选项描述-m容器可以使用的最大物理内存硬限制此选项最小允许值为

4m4MB常用–memory-swap允许此容器交换到磁盘的内存量必须先用

对内存限制才可以使用详细说明如下–memory-swappiness设置容器使用交换分区的倾向性值越高表示越倾向于使用swap分区范围0-1000为能不用就不用100为能用就用–memory-reservation允许指定小于

–memory

的软限制当docker检测到主机上的争用或内存不足时会激活该限制如果使

–memory才能使其优先生效。

因为它是软限制所以不能保证容器不超过限制–kernel-memory容器可以使用的最大内核内存量最小为4m由于内核内存与用户空间内存隔离因此无法与用户空间内存直接交换因此内核内存不足的容器可能会阻塞宿主机资源这会对主机和其他容器或者其他服务进程产生影响因此不建议设置内核内存大小–oom-kill-disable默认情况下如果发生内存不足OOM错误则内核将终止容器中的进程。

要更改此行为请使用该

-m选项的容器上禁用OOM。

如果-m未设置该标志则主机可能会用完内存内核可能需要终止系统的进程以释放内存

[rootcentos7

net.ipv6.conf.all.stable_secret

sysctl:

net.ipv6.conf.default.stable_secret

sysctl:

net.ipv6.conf.docker0.stable_secret

sysctl:

net.ipv6.conf.eth0.stable_secret

sysctl:

后才会有意义。

使用swap可以让容器将超出限制部分的内存置换到磁盘上WARNING经常将内存交换到磁盘的应用程序会降低性能

--memory-swap

–memory-swap–memory功能正数S正数M容器可用内存总空间为S其中ram为Mswap为S-M若SM则无可用swap资源0正数M相当于未设置swapunsetunset正数M若主机Docker

2*M-1正数M若主机Docker

Host启用了swap则容器可使用最大至主机上所有swap空间

--memory-swap

--memory-swap都必须要设置--memory-swap表示你能使用的内存和swap分区大小的总和例如--memory300m--memory-swap1g那么该容器能够使用300m物理内存和700m

swap即--memory是实际物理内存大小值不变而swap的实际计算方式为--memory-swap---memory

--memory-swap

如果等于--memory的值并且--memory设置为正整数容器无权访问swap

--memory-swap

如果未设置如果宿主机开启了swap则容器的swap值最大为2*--memory即两倍物理内存大小例如如果--memory300m与--memory-swap没有设置改哦让其可以使用300m总的内存和600m交换空间但是并不准确在容器使用free命令所看到的的swap空间并不精确毕竟每个容器都可以看到具体大小宿主机的swap是有上限的而且不是所有容器看到的累计大小

--memory-swap

如果设置为-1如果宿主机开启了swap则容器可以使用主机上swap的最大空间注意在容器中执行free命令看到的是宿主机的内存和swap使用而非容器自身的swap使用情况

stress-ng压力测试工具

stress-ng是一个压力测试工具可以通过软件仓库进行安装也提供了docker版本容器

centos

lorel/docker-stress-ng假如一个容器未做内存使用限制则该容器可以利用到系统内存最大空间默认创建的容器没有做内存资源限制

[rootcentos7

上面命令是前台执行下面在另一个终端窗口执行可以看奥占用512M左右内存

[rootcentos7

/sys/fs/cgroup/memory/docker/c384505f559d799d9a20d0fbee95e131539778f3b0063829fdcf22226d435582/memory.limit_in_bytes

209715200#

/sys/fs/cgroup/memory/docker/c384505f559d799d9a20d0fbee95e131539778f3b0063829fdcf22226d435582/memory.limit_in_bytes

[rootcentos7

/sys/fs/cgroup/memory/docker/c384505f559d799d9a20d0fbee95e131539778f3b0063829fdcf22226d435582/memory.limit_in_bytes

314572800

通过echo命令可以改内存限制的值但是可以在原基础上增大内存限制缩小内存限制会报错

-bash:

/sys/fs/cgroup/memory/docker/9fd1ea32cc83788b3f223295d6976295fcb307b0adaf9b82ea883f1fba129c49/memory.limit_in_bytes

268435456#

/sys/fs/cgroup/memory/docker/9fd1ea32cc83788b3f223295d6976295fcb307b0adaf9b82ea883f1fba129c49/memory.soft_limit_in_bytes#

软限制不能高于硬限制#

/sys/fs/cgroup/memory/docker/memory.oom_control

oom_kill_disable

/sys/fs/cgroup/memory/docker/b0bccc1c29f7355073442a1d84270827a19dc38a9258eafb5b3f017e3378cae0/memory.oom_control

oom_kill_disable

/sys/fs/cgroup/memory/docker/容器ID/memory.memsw.limit_in_bytes容器的CPU限制

一个宿主机有几十个核心的CPU但是宿主机上可以同时运行成百上千个不同的进程用已处理不同的任务多进程共用一个CPU的核心为可压缩资源即一个核心的

CPU可以通过调整而运行多个进程但是同一个单位时间内只能有一个进程在CPU上运行那这么多的进程怎么在CPU上执行可调度的呢

Linux

CPU密集型的场景优先级越低越好计算密集型任务的特点是要进行大量的计算消耗CPU资源比如计算圆周率、数据处理、对视频频进行高清解码等等全靠CPU的运算能力。

IO密集型的场景优先级值高点设计到网络。

磁盘IO的任务都是IO密集型任务这类任务的特点是CPU消耗很少任务的大部分时间都在等IO操作完成因为IO的速度远远低于CPU和内存的速度比如Web应用高并发数据量大的动态网站来说数据库应该为IO密集型

CFS原理

queue中的每一个进程安排一个虚拟时钟vruntime。

如果一个进程得以执行随着时间的增长其vruntime将不断增大。

没有得到执行的进程vruntime不变而调度器总是选择vruntime跑得最慢的那个进程来执行。

这就是所谓的“完全公平”。

为了区别不同优先级的进程优先级高的进程vruntime增长得慢以至于它可能得到更多的运行机会。

CFS的意义在于在一个混杂着打来年计算型进程和IO交互进程的系统中CFS调度器相对其它调度器在对待IO交互进程要更加友善和公平。

默认情况下每个容器对主机的CPU周期的访问都是不受限制的。

可以设置各种约束以限制给定容器对主机CPU周期的访问。

大多数用户使用并配置默认的CFS调度程序。

在Docker1.13及更高版本中还可以配置realtime

scheduler

CFS是用于常规Linux进程的Linux内核CPU调度程序。

通过几个运行时标志可以配置对容器拥有的CPU资源的访问量。

使用这些设置时Docker会在主机上修改容器cgroup的设置

选项描述–cpus指定一个容器可以使用多少个可用的CPU核心资源。

例如如果主机有两个CPU如果设置了–cpus“1.5”则可以保证容器最多使用1.5个CPU如果是4核CPU那么还可以是4核心上每核用一点但是总计是1.5核心的CPU。

这相当于设置–cpu-period100000和–cpu-quota“150000”。

此设置可在Docker1.13及更高版本中可用目的是替代–cpu-period和–cpu-quota两个参数从而是配置更简单但是最大不能超过宿主机的CPU总核心数在操作系统看到的CPU超线程后的数值此项常用–cpu-period过时选项指定CPU

CFS调度程序周期必须与cpu-quta一起使用。

默认为100微秒。

大多数用户不会更改默认设置。

如果使用Docker1.13或更高版本请改用cpus–cpu-quota过时选项在容器上添加CPU

CFS配额计算方式为cpu-quota/cpu-period的结果值docker1.13及以上版本通常使用cpus设置此值–cpuset-cpus用于指定容器运行的CPU编号也就是所谓的CPU绑定。

如果一个或多个CPU则容器可以使用逗号分隔的列表或连字符分隔的CPU范围。

第一个CPU编号为0.有效值可能是0-3使用第一第二第三和第四CPU或1,3使用第二和第四CPU–cpu-shares用于设置cfs中调度的相对最大比例权重cpu-share的值越高的容器将会分得更多的时间片宿主机多核CPU总数为100%假如容器A为1024容器B为2048那么容器B将最大是容器A的可用CPU的两倍默认的时间片1024最大262144.这是一个软限制。

使用stress-ng测试CPU配置

/sys/fs/cgroup/cpu,cpuacct/docker/c1容器ID/cpu.shares

cat

/sys/fs/cgroup/cpu,cpuacct/docker/c2容器ID/cpu.shares

动态调整cpu

/sys/fs/cgroup/cpu,cpuacct/docker/容器ID/cpu.shares可视化图形工具Portainer

Portainer是一个可视化的容器镜像的图形管理工具利用Portainer可以轻松构建管理和维护Docker环境。

而且完全免费基于容器化的安装方式方便高效。

安装Portainer

sha256:444ade51d69d7fca889c7aa14525c459dba313a0e7ca79aee985e6c0749427de

Status:

docker.io/portainer/portainer-ce:latest

[rootcentos7

/var/run/docker.sock:/var/run/docker.sock

portainer_data:/data

7d62ec92aaaca24218d44b13155fb47fb752847a596a1f732b90167687a986c3浏览器访问

http://ip:9000

从tar包中的内容创建一个新的文件系统映像[对应export]info

显示系统相关系统inspect

移除一个或多个镜像[无容器使用该镜像才可删除否则需要删除相关容器才可继续

强制删除]run



SEO优化服务概述

作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。

百度官方合作伙伴 白帽SEO技术 数据驱动优化 效果长期稳定

SEO优化核心服务

网站技术SEO

  • 网站结构优化 - 提升网站爬虫可访问性
  • 页面速度优化 - 缩短加载时间,提高用户体验
  • 移动端适配 - 确保移动设备友好性
  • HTTPS安全协议 - 提升网站安全性与信任度
  • 结构化数据标记 - 增强搜索结果显示效果

内容优化服务

  • 关键词研究与布局 - 精准定位目标关键词
  • 高质量内容创作 - 原创、专业、有价值的内容
  • Meta标签优化 - 提升点击率和相关性
  • 内容更新策略 - 保持网站内容新鲜度
  • 多媒体内容优化 - 图片、视频SEO优化

外链建设策略

  • 高质量外链获取 - 权威网站链接建设
  • 品牌提及监控 - 追踪品牌在线曝光
  • 行业目录提交 - 提升网站基础权威
  • 社交媒体整合 - 增强内容传播力
  • 链接质量分析 - 避免低质量链接风险

SEO服务方案对比

服务项目 基础套餐 标准套餐 高级定制
关键词优化数量 10-20个核心词 30-50个核心词+长尾词 80-150个全方位覆盖
内容优化 基础页面优化 全站内容优化+每月5篇原创 个性化内容策略+每月15篇原创
技术SEO 基本技术检查 全面技术优化+移动适配 深度技术重构+性能优化
外链建设 每月5-10条 每月20-30条高质量外链 每月50+条多渠道外链
数据报告 月度基础报告 双周详细报告+分析 每周深度报告+策略调整
效果保障 3-6个月见效 2-4个月见效 1-3个月快速见效

SEO优化实施流程

我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:

1

网站诊断分析

全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。

2

关键词策略制定

基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。

3

技术优化实施

解决网站技术问题,优化网站结构,提升页面速度和移动端体验。

4

内容优化建设

创作高质量原创内容,优化现有页面,建立内容更新机制。

5

外链建设推广

获取高质量外部链接,建立品牌在线影响力,提升网站权威度。

6

数据监控调整

持续监控排名、流量和转化数据,根据效果调整优化策略。

SEO优化常见问题

SEO优化一般需要多长时间才能看到效果?
SEO是一个渐进的过程,通常需要3-6个月才能看到明显效果。具体时间取决于网站现状、竞争程度和优化强度。我们的标准套餐一般在2-4个月内开始显现效果,高级定制方案可能在1-3个月内就能看到初步成果。
你们使用白帽SEO技术还是黑帽技术?
我们始终坚持使用白帽SEO技术,遵循搜索引擎的官方指南。我们的优化策略注重长期效果和可持续性,绝不使用任何可能导致网站被惩罚的违规手段。作为百度官方合作伙伴,我们承诺提供安全、合规的SEO服务。
SEO优化后效果能持续多久?
通过我们的白帽SEO策略获得的排名和流量具有长期稳定性。一旦网站达到理想排名,只需适当的维护和更新,效果可以持续数年。我们提供优化后维护服务,确保您的网站长期保持竞争优势。
你们提供SEO优化效果保障吗?
我们提供基于数据的SEO效果承诺。根据服务套餐不同,我们承诺在约定时间内将核心关键词优化到指定排名位置,或实现约定的自然流量增长目标。所有承诺都会在服务合同中明确约定,并提供详细的KPI衡量标准。

SEO优化效果数据

基于我们服务的客户数据统计,平均优化效果如下:

+85%
自然搜索流量提升
+120%
关键词排名数量
+60%
网站转化率提升
3-6月
平均见效周期

行业案例 - 制造业

  • 优化前:日均自然流量120,核心词无排名
  • 优化6个月后:日均自然流量950,15个核心词首页排名
  • 效果提升:流量增长692%,询盘量增加320%

行业案例 - 电商

  • 优化前:月均自然订单50单,转化率1.2%
  • 优化4个月后:月均自然订单210单,转化率2.8%
  • 效果提升:订单增长320%,转化率提升133%

行业案例 - 教育

  • 优化前:月均咨询量35个,主要依赖付费广告
  • 优化5个月后:月均咨询量180个,自然流量占比65%
  • 效果提升:咨询量增长414%,营销成本降低57%

为什么选择我们的SEO服务

专业团队

  • 10年以上SEO经验专家带队
  • 百度、Google认证工程师
  • 内容创作、技术开发、数据分析多领域团队
  • 持续培训保持技术领先

数据驱动

  • 自主研发SEO分析工具
  • 实时排名监控系统
  • 竞争对手深度分析
  • 效果可视化报告

透明合作

  • 清晰的服务内容和价格
  • 定期进展汇报和沟通
  • 效果数据实时可查
  • 灵活的合同条款

我们的SEO服务理念

我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。

提交需求或反馈

Demand feedback