电动三轮车外胎换外胎,看到以前外胎上型号是2.5-14怎么还有一个1.6-14到底哪个是的,我自己买来换!

T-14出来了要不咋们搞个新坦克吧,no no no,升级到M1A3够用了
现代战争中坦克已不再是主角,但坦克的重要地位依然无法撼动。基本上有战争的地方,坦克总会出现,如今美国军事力量遍布全球,坦克也跟随参与了美国的各种军事活动。M1系列主战坦克在80年代后历次美国对外大规模军事行动。M1艾布拉姆斯系列主站坦克属于第三代主战坦克,M1系列主战坦克家族主要有M1、M1A1及最新型号M1A2。
M1在设计上与美国之前的坦克截然不同,最终一款融入了大量当时的最新技术,包括当时尚未大量使用的复合装甲,以及燃气轮机的坦克代号XM-1,是一款融合了许多新技术的坦克战车。美国在新坦克上吸收了前代巴顿坦克家族的成功经验,不在追求XM-1是一款“完美”的坦克,其目标是一款可靠地具有升级潜力的平台,大量的采用了模块化设计,可以对火炮,装甲以及发动机等都是能够整体替换的,若有新的技术假如坦克上,只需将相对应的模块进行升级,不需要进行对整辆车的设计。在1981年M1坦克正式服役到现在的M1A2,其火炮装甲都行了升级,但整车大小、外形基本上都没有怎么改变。
在火力M1系列坦克从上105mm口径的主炮到现在的120mm主炮,从使用德国火炮的技术,到贫铀穿甲弹。由于贫铀的密度比钢铁的密度大,其动能更加强大,强大的火力,都是M1系列坦克最为卓著的骄傲。
在防御,M1除了更加紧致、被弹面积缩小之外,最重要的革新是在车头以及炮塔正面等最易受攻击的部位加装了复合装甲。从M1A1HA开始采用贫铀装甲,使其防护力达到了普通复合装甲的两倍。其贫铀装甲的技术,至今任是美国的高度机密。
在动力方面动力方面,M1并非使用一般坦克惯用的柴油机,而是一具AGT-1500燃气涡轮,能使用多种燃油,最大出力达1500匹马力,使得重达60吨的M1拥有27.5的超高单位功率,不仅拥有72km/hr的最大路速,加速度与越野机动力也是上一代主战坦克望尘莫及的。
M1系列坦克是经历的实战检验的坦克,在海湾战争中有23两M1和M1A1被命中或触雷,其中9辆M1彻底报废,M1A1没有一辆损失。值得一说的是9辆报废的M1坦克中有7辆是被友军误击。其原因是M1没有装备敌我识别系统。
在许多时候我们会看到埃及、沙特、科威特、伊拉克等国家的M1A1甚至M1A2坦克被击毁。其原因也很为都是降级版。毕竟像贫铀装甲这样的机密级设备,不会轻易交到其他人手里的。万一落到俄罗斯手里,或者中国手里怎么办。
M1系列主战坦克服役37年来作为参加的实战最多的坦克,其机动性强、火力精准强悍等优势完全见证了M1系列身为全球最佳主战坦克之一的地位。也正是应为此在俄罗斯推出跨时代的T-14主战坦克时,美国人想的不是去推出下一代坦克而是要将M1再次升级,升级为M1A3。硬是要唱一出廉颇老矣尚能饭否。
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
今日搜狐热点地下城与勇士5.7K添加评论分享收藏感谢收起赞同 1.2K154 条评论分享收藏感谢收起Docker详解
第1篇 容器技术与Docker概念
第一代运维:通过Shell脚本的方式使用SSH连接到所有服务器,然后执行相同的命令,并把日志保存起来归档;
第二代运维:使用Ansible、Puppet、SaltStack和Chef等出色的运维工具;但是其本质仍然是通过SSH或者类似SSH连接的方式连接到服务器来管理服务器集群,这意味着其实第二代运维和第一代运维并没有发生根本性的改变;
通过容器管理集群可以抛弃传统的“SSH+密钥”的连接方式来连接服务器,容器技术在上百台服务器上启动应用只需要一眨眼的时间;
第1章 容器技术
1.1 什么是容器
1.关于虚拟化
2.容器的定义
3.为什么使用容器
1.2 容器技术诞生的前世今生
1.容器技术起源
2. 容器技术的发展
1.3 容器的原理
容器技术的核心是Cgroup与namespace,在此基础上还有一些其他工具共同构成容器技术。容器本质上是宿主机上的进程。容器技术通过namespace实现资源的隔离,通过Cgroup实现资源的控制,通过rootfs实现文件系统的隔离,再加上容器引擎自身的特性来管理容器的声明周期;
1.从namespace说起
想要实现资源隔离,第一个想到的就是chroot命令。通过它可以实现文件系统的隔离,这是最早的容器技术。但是在分布式的环境下,容器必须要有独立的IP、端口和路由等,自然就有了网络隔离。同时,进程通信隔离、权限隔离等也都需要考虑到,因此基本上一个容器需要做到6项基本隔离;
系统调用参数
CLONE_NEWUTS
主机名与域名
CLONE_NEWIPC
信号量、消息队列和共享内存
CLONE_NEWPID
CLONE_NEWNET
网络设备、网络栈、端口等等
CLONE_NEWNS
挂载点(文件系统)
CLONE_NEWUSER
用户和用户组
对namespace的操作主要是通过clone()、setns()、unshare()这三个系统调用来完成的;
可以用来创建新的namespace,通过传入不同的参数,由clone创建出来的新的进程就位于新的namespace之中了;
将进程放置到已有的namespace中,docker exec命令的实现原理就是setns()
使用unshare()调用的进程会被放到新的namespace中
事实上,开发namespace的主要目的之一就是实现轻量级虚拟化服务,在同一个namespace下的进程可以彼此响应,而对外界隔离,这样在一个namespace下,进程仿佛处于一个独立的系统环境下,以达到容器的目的;
2.认识Cgroups
Cgroup是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如CPU,内存,I/O等)的机制。
目前,,Cgroup有一套进程分组框架,不同资源由不同的子系统控制。一个子系统就是一个资源控制器,比如CPU子系统就是控制CPU时间分配的一个控制器。子系统必须附加(attach)到一个层级上才能起作用,一个子系统附加到某个层级之后,这个层级上的所有控制族群(control groups)都受到这个子系统的控制;
3.容器的创建
系统调用clone()创建新进程,拥有自己的namespace;
#pid = clone(fun,stack,flags,clone_arg);
将pid写入到Cgroup子系统这样就受到Cgroups子系统的控制;
#echo$pid &/sys/fs/cgroup/cpu/tasks
通过pivot_root系统调用,使得进程进入到一个新的rootfs;
1.4 容器云
虽然Docker提供了较为便捷的操作方式,但是在开发、生产环境中,网络、存储、集群和高可用等问题层出不穷,仅凭借Docker是无法做到面面俱到的。于是从容器到容器云就成了容器技术的必然发展路径;
完整来讲,容器云是以容器为资源分隔和调度的基本单位,通过容器封装软件运行时环境,为用户提供一个集构建、发布和运行于一体的分布式应用平台。它与IaaS、PaaS等不同,容器云可以共享与隔离资源、编排与部署容器。这一点容器云和IaaS相似。但是容器云也可以渗透到应用支撑与运行时环境,这一点上与PaaS类似;
容器云并不是特指以Docker为基础的容器技术,使用其他的容器技术(CoreOS的Rocket项目)实现容器云也是可以的;
后来的微服务(Microservices)和Servleless可以说是在容器技术基础上的突破性进展。微服务在软件架构上可以将容器用于部署,微服务是一个相比标准Web服务超快的轻量级Web服务。
1.5 容器与Docker
Docker死一个开源的应用容器引擎,开发者可以打包应用以及依赖包到一个可移植的容器中,然后发布到主流的Linux/macOS/Windows机器上,实现虚拟化;
Docker是一个重新定义了程序开发测试、交付和部署过程的开放平台。在Docker的世界中,容器就是集装箱,我们的代码被打包到集装箱中;Docker就是集船坞、货轮、装卸、搬运于一体的平台,帮你把应用软件运输到世界各地,并迅速部署;
第2章 Docker简介
2.1 什么是Docker
1.Docker的历史
2.Docker的现状
3.Docker的未来
2.2 Docker的功能以及优缺点
1.Docker在解决什么
第一点:Docker解决了运行环境和配置、依赖等问题,使得软件发布迁移容易了很多;
第二点:更加轻量化的虚拟化,节省了虚拟机的性能损耗,却得到了和虚拟机差不多的隔离环境;
第三点:docker解决了软件调度分发的问题;
第四点:更高的资源利用率,docker结合微服务带来了一个希望,以极小的代价换取极大的资源利用率;
总结起来:Docker带来了更高效的服务部署、启动方式、简化配置,在容器中开发完成之后快速部署于各主流系统,解决了依赖的问题;对CPU、内存和文件系统的隔离使其成为可替代虚拟机技术的选项之一,机器资源利用率的提高,不需要为虚拟机一个环境而耗费大量的资源;
2.为什么选择Docker
Docker容器的启动可以实现秒级,比传统的虚拟机快很多;
其次,Docker对系统资源利用率很高,一台普通的主机上可以同时运行数千个Docker容器;
容器除了运行其中的应用之外,基本上不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量的小,传统虚拟机方式运行10个不同的应用就需要启动10个虚拟机,而Docker只需要启动10个隔离的应用即可;
开发人员使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码,这正是Docker可以做到的;
Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人计算机、服务器等。这种兼容性可以让用户把一个应用从一个平台上直接迁移到另外一个平台上。使用Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理;
3.Docker的缺点
Docker虽然日趋完善,但是在某些方面依旧存在着很明显的短板,最大的问题是安全性
Docker需要一个root权限的守护进程一直在主机上运行,不可避免的会出现安全漏洞;
Docker对namespace过分的信任,而namespace的攻击面比一般的Hypervisor要大
除此之外,Docker在网络方面还有很多不足;
2.3 Docker和虚拟机
1.Docker和虚拟机的区别
最明显的区别就是虚拟机需要安装操作系统才能执行应用程序,而Docker内不需要安装操作系统,而是在OS内的核心系统层打造虚拟机的执行环境。
2.Docker和虚拟机的优缺点
2.4 Docker和runC
1.libcontainer与runC
libcontainer是一个lib库,runC通过调用libcontainer包对namespaces、Cgroups、capabilities以及文件系统的管理和分配来隔离出来隔离的容器,相当于一个去除了例如镜像、Volume等高级特性的简化版的Docker;
runC的核心依旧是libcontainer;
2.runC的使用
3.runC原理
runC的核心依旧是libcontainer,所以runC实际上还是通过libcontainer的接口管理容器的;
2.5 Docker基本架构
Docker是一个构建、发布和运行分布式应用的平台,Docker平台由Docker Engine(运行环境+打包工具)、Docker Hub(API+生态系统)两部分组成。Docker的底层是各种OS以及云计算基础设施,而上层则是各种应用程序和管理工具,每层之间都是通过API进行通信的;
1. Docker Client介绍
Docker引擎可以直观的理解为就是在某一台机器上运行的Docker程序,实际上它是一个C/S结构的软件,有一个后台守护进程在运行,每次运行docker命令的时候,实际上都是通过RESTFul Remote API来和守护进程进行交互的,即使在同一台机器上也是如此;
2. Docker daemon介绍
0.9版本之后,Docker更加模块化,划分为4个二进制文件,分别是docker、container、docker-containerd-shim和docker-runc
划分开之后,守护进程与容器管理不再互相牵制,这也使得Docker支持热更新,更加的人性化;
3. Docker镜像
Docker镜像是Docker系统中的构建模块(Build Component),是启动一个Docker容器的基础。
Docker镜像采用分层的结构构建,最底层是bootfs,这是一个引导文件系统,一般用户很少会直接与其交互,在容器启动之后会自动的卸载bootfs,bootfs之上是rootfs,rootfs是Docker容器在启动的时候内部可见的文件系统,就是常见的”/”目录;
Docker镜像使用到了联合挂载技术和写时复制技术,利用这两项技术,Docker可以只在文件系统发生变化的时候才会把文件写到可读写层,一层层的叠加,这样不仅有利于版本的管理,还利用存储的管理;
4. Docker容器
在Docker的世界中,容器是一个核心,容器是一个基于Docker镜像创建,包含为了运行某一特定程序所有需要的OS、软件、配置文件和数据,是一个可以移植的运行单元;不过在宿主机看来,它只是一个简单的用户进程而已;
容器是从镜像创建的运行实例,它是独立的一个沙盒,很好的诠释了集装箱的概念;开发人员不用关心容器内部是什么应用,只管传输、运行即可,这是一种标准化的集装和运输方式;
5. Docker仓库
开发者想要构建一个镜像或者运行一个容器的时候,可在GitHub上拉取相关镜像;
除了官方的Registry,用户还可以搭建自己私有的Registry用来存储非公开的镜像;
第3章 安装Docker
3.1 Linux系统
1.一键安装脚本
2.Debian发行版
3.Ubuntu发行版
4. CenterOS/Fedora发行版
5.Arch Linux发行版
6. Suse/openSUSE发行版
3.2 Windows与Mac OS系统
1.在Windows上安装原生的Docker
2.在Mac OS上安装原生Docker
3.3 二进制安装
1.获取Linux二进制包
2.获取Max OS二进制包
3.获取Windows二进制包
4.树莓派安装Docker
第2篇 Docker基础知识
第4章 Docker基础
4.1 Docker基本操作
1.依附容器的docker attach命令
官方不推荐使用docker attach命令直接进入开启了交互模式的容器;
docker的主要功能是查看信息,容器内部操作有更加方便的docker exec命令;
注意:不要使用exit命令或者Ctrl+C退出,那样就是让Docker容器停止了,如果想要退出后还让Docker容器继续运行,可以使用Ctrl+P,然后使用Ctrl+Q命令,既可以退出容器的虚拟终端;
2.构建容器的docker build命令
docker build命令是构建镜像用的命令,build这个子命令的功能非常的强大,通过丰富的参数设置,可以控制镜像构建的各项细节,参数如下:
3.提交容器的docker commit命令
docker commit命令的主要功能是把当前容器提交打包为镜像,这一点可以联想到Git的操作,事实上Docker镜像就是使用Git式管理;
把docker commit作为镜像构建的一种方式不失为一种方法,但是一般情况下,更加推荐使用Dockerfile构建镜像;
4.复制文件到宿主机的docker cp命令
docker cp命令用于在宿主机和容器之间移动复制文件
5.创建容器的docker create命令
使用docker create创建容器之后可以使用docker start containerID的方式启动容器;
通常使用docker create命令的场景是为接下来的容器启动前做准备,应用场景不多,因为有其他的编排工具接管这项工作;
6. 查看容器变化的docker diff命令
Docker提供了一个非常强大的命令diff,可以列出容器内发生变化的文件和目录,
docker diff命令主要用于显示当前运行容器和镜像的不同,该命令和容器的状态无关,只是显示文件的差异;
7. 查看事件的docker events命令
docker events命令实时输出Docker服务端的事件,包括容器的创建、启动、关闭等;
docker events可以指定-f参数,过滤不必要的事情,得到更加精简的事件信息;
8. 进入容器的docker exec命名
docker exec主要用于进入容器的内部进行操作的一个重要命令,比attach命令更加强大,通过docker exec可以像使用SSH登录服务器一样操作容器,所以一般进入容器的命令是使用docker exec 而不是docker attach
-d :分离模式: 在后台运行
-i :交互模式
-t :分配一个TTY
-u 指定用户和用户组,格式:&name|uid[:&group|gid&]&
使用exec命令进入容器内部就如同进入到另一台机器一样,可以灵活操作,并且使用exit命令退出的时候,不会像attach那样导致容器停止,所以非常适合在容器内部操作,此外,每个docker exec命令都会分配一个不同的tty给用户,所以不会有冲突;
9. docker export
docker export命令用于导出本地存储的容器,和docker save类似(用于导出本地镜像)docker export导出的容器通常为tar包,方便传输到其他地方;
使用docker export命令导出的容器并不会压缩容器的大小;
可以使用docker提供的-o参数指定目标文件位置和名称,第二种方法是使用&符号指向目标文件;
10. 查看镜像历史的docker history命令
docker history命令用于显示镜像的历史,可以查看镜像的历史变化;
镜像历史在在一定的程度上反映了Dockerfile的内容;
11. 查看本地镜像的docker images命令
docker images用于查看本地存储的Docker镜像
-a 显示所有镜像,包括中间镜像(悬挂镜像)默认不显示;
-f:过滤显示
-q:只显示ID
12. 导入容器的docker import命令
用于导入容器,导入之后会变为镜像,用法和docker export命令相似;
可以通过网络地址直接导入
也可以通过管道导入
还可以通过本地tar包导入
甚至可以从目录导入
导入过程中使用--change还可以改变Dockerfile中的指令,使用--message可以添加commit信息;
13. docker info命令
docker info命令可以很详尽的看到Docker中的各项信息(容器数量,状态,镜像数量,服务版本,存储驱动,根目录,数据卷,插件,网络,安全,硬件信息等)
14. 查看各项详细信息的docker inspect命令
inspect有检查、检阅的意思,所有docker inspect命令的用途是检查容器或者镜像详细信息的一个命令,了解一个image或者Container的完整构建信息就可以通过该命令实现;
15. 杀死容器的docker kill命令
使用docker kill命令可以快速的杀掉容器的进程,常用在无法停止容器的时候,使用docker kill命令可以让一个无响应的容器停止;
16. 导出镜像docker load命令
docker load命令的作用是导出使用docker save导出的镜像,和export、import负责容器的导出导入类似,save、load负责镜像的导出和导入;
17. 登录仓库的docker login命令
docker login命令是一个登录到Registry的命令,Registry是Docker公司为了更加方便的镜像流通而设计的一种镜像仓库,用户可以在上面发布镜像和拉取镜像
18 登出仓库的docker logout命令
19 查看容器日志的docker logs命令
docker logs命令的功能是用于显示容器的日志,这一点和attach有点类似,不同的地方是在于attach可以相对输出更自由,用户可以定制输出内容,而logs则是根据容器命令输出信息,是无交互的;
20 管理网络的docker network命令
docker network命令有些特殊,如果说network是Docker的子命令,那么network还有自己的几个子命令,所以network子命令功能非常强大,并且更新的比较频繁
network create、connect、disconnect、ls、rm、inspect
使用docker network ls
可以查看本机的容器网络;
21 管理节点的docker node命令
docker node子命令同样有很多的子命令,它是一个集群管理的命令,使用该命令可以轻松的管理集群。
22 暂停容器的docker pause命令
docker pause命令会暂停容器内的所有进程,此时,通过docker stats可以观察到此时的资源使用情况是固定不变的,通过docker logs -f也观察不到日志的进一步输出;
23 查看容器端口的docker port命令
与docker ps的显示不同,该命令只会显示暴露的端口,对于未指定的未暴露端口不会显示;
24 查看本地容器信息的docker ps命令
docker ps命令显示当前正在运行的容器,通过相关的参数配合Linux命令可以实现灵活的操作;
25 拉取镜像的docker pull命令
该命令不仅可以拉取Docker Hub的镜像,还可以通过指定仓库地址拉取私有仓库镜像;
使用docker pull -a会把所有的标签都拉取到本地,使用--disable-content-trust=false会在拉取的时候校验镜像,保证传输的安全,默认是关闭的;
26 推送镜像的docker push命令
docker pull命令的作用是把本地的镜像推送到镜像仓库,如果不指定tag,会默认把该镜像的全部镜像都推送到仓库;
27 重命名容器的docker rename命令
该命令只能作用在容器上,镜像重命名可以使用docker tag命令
28 重启容器的docker restart命令
29 删除容器的docker rm命令
docker rm命令只能删除非运行状态的容器,添加了-f的参数之后,Docker会向指定容器发送SIGKILL使其停止然后删除该容器;
-l参数:删除容器与其他容器的关联,但是会保留该容器,涉及到容器之间的通信;
-v参数会删除容器的数据卷,默认是不会删除数据卷的,数据卷是挂载到容器的一个目录,它与容器的生命周期独立,不会应为容器的销毁为消失
30 删除镜像的docker rmi命令
该命令可以在后面接上多个镜像的名称,删除多个镜像;
删除镜像的时候,需要确保没有容器在使用该镜像,也就是没有容器使用该镜像启动的,才可以删除,否则会报错;
docker rmi 的-f参数,可以强制删除镜像,即便有容器正在使用镜像,但是这样只会删除镜像标签,不影响正在使用的容器,实际上只要容器还在运行,镜像就不会被真正的删除;,用户使用docker commit命令可以提交容器为镜像,可以恢复镜像;
31 运行容器的docker run命令
docker run命令是启动容器,在整个Docker命令中可以说是功能强大的一个子命令;
当运行docker run命令的时候,Docker会启动一个容器进程,并为这个进程分配其独占的文件系统,网络资源和以此进程为根进程的进程组。
在容易启动的时候,用户可以通过docker run命令重新定义镜像的配置,包括要运行程序、暴露的网络端口等,docker run命令可以覆盖docker build命令在构建镜像的时候的一些默认配置
32 导出镜像的docker save命令
后面可以接多个镜像名称,通过-o指定目标文件
33 搜索镜像的docker search命令
34管理服务的 docker service命令
docker service命令的作用是管理集群中的服务,需要与docker swarm配合使用,使用docker service的时候,主机必须是swarm的manager
35 启动容器的docker start命令
该命令的作用是启动一个或者多个停止状态的容器,docker start命令后面可以是容器名称,也可以容器ID;
36 查看容器状态的docker stats命令
docker stats命令可以查看任何状态下的容器状态,一般用来查看运行时候的容器对资源的使用情况。该命令输出的内容是实时更新的,取消查看的时候直接Ctrl+C即可;
37停止容器的docker stop命令
docker stop会向容器发送正常停止的信号,而docker kill命令会强制终止容器进程;
38 管理集群的docker swarm命令
docker swarm命令与前面的docker node、docker service命令共同组成集群管理;
Docker内置编排功能的命令和目前成熟的编排工具相比可能还略显弱势,但是毕竟它是Docker的原生态工具,占有得天独厚的优势;
39 设置镜像标签的docker tag命令
docker tag命令可以给镜像重命名,在Docker中镜像、容器、网络、数据卷等组件在运行的时候都会自动获取一个ID,这个ID是独一无二的,但是这个ID很长,不便于记忆,所以就有了tag的概念,给镜像打上标签,这样使用标签就可以找到相应的镜像了;
40 查看容器进程的docker top命令
docker top命令非常类似于Linux下的top命令,使用docker top &Container ID/Name&可以查看指定容器内正在运行的进程;
41 恢复暂停容器的docker unpause命令
docker unpause 命令可以恢复容器内的所有进程;
42 更新容器的docker update命令
对容器的设置更新时候可以使用docker update命令,使用的时候,容器不需要停止或者重启,注意:这里说的容器的设置是指容器启动的时候添加的参数,例如:docker run命令的时候设置的CPU限制,可以使用docker update命令取消;
docker update命令不能使用容器内部的应用程序重新读取程序的配置,例如,不能使用一个Nginx容器重新加载配置,如果需要重新加载Nginx则需要重启容器;
在docker update命令的参数汇总,大部分与docker run命令的参数相同,唯一不同的是--restart参数,添加该参数的时候不会立即修改容器的配置,而是在未来容器重启的时候生效;
43 查看Docker版本的docker version命令
44 管理数据卷的docker volume命令
docker volume命令用来管理数据卷,数据卷是容器数据持久化的一个组件,数据卷是Docker体系的一部分
docker volume ls命令可以查看本机的全部数据卷,因为数据卷与容器的生命周期完全独立,所以容器删除之后数据卷并不会删除,时间长了数据卷会越来越多,这个时候可以使用docker volume rm命令删除不需要的数据卷。
使用docker volume inspect可以查看数据卷的详细信息;
使用docker volume create可以创建一个数据卷
45 设置等待的docker wait命令
执行docker wait命令之后,该命令会hang在当前的终端,知道容器停止,此时,会打印出容器的退出码,该命令一般用在容器监控,异常捕获方面;
4.2 启动一个Docker容器
--rm表示容器退出之后,会自动的删除该容器,使用docker run命令的时候如果本地没有该镜像,那么会自动从Docker Hub中拉取镜像
docker run --rm hello-world
4.3 构建一个Docker镜像
第5章 Docker镜像
Docker最核心也是最基础的部分——镜像。Docker镜像是Docker整个体系中最基础的一部分,docker镜像是容器的初始状态,Docker镜像的构建和维护对容器的运行有着极大的影响,所以理解镜像的原理对Docker非常重要;
5.1 认识镜像
1.使用 docker pull拉取镜像
docker pull是非常方便的拉取指令,通过该命令可以拉取各个镜像仓库的镜像。要拉取一个镜像,最简单的格式就是docker pull &imagesName&,Docker会自动的从官方仓库搜寻匹配的镜像并开始拉取。一个标准并且完整的pull命令还应该包含标签格式如下:
docker pull &imagesName:tag&
对于私有仓库(私有仓库是一种用来托管因为各种原因不能放到官方仓库中的镜像库),还可以指定仓库的地址:
docker pull localhost:5000/&imagesName:tag&
2. 搜索镜像
docker search 命令的使用非常的简单,但是除了在终端下搜索镜像之外,可以使用Docker Hub的网站搜索镜像,还有一些第三方的镜像仓库也拥有不少的镜像资源;
3. 查看镜像信息
最简单的查看镜像信息的方法就是docker images命令,该命令可以查看本地存储的镜像,但是该命令只可以查看一些很简单的信息,例如镜像名称,标签、镜像ID、创建时间、大小等,更详细的命令一般是通过docker inspect命令来查看;
docker inspect命令还可以获取容器的信息;
docker inspect -f 可以过滤输出信息,以下的方式是把镜像信息输出为JSON格式:
docker inspect --format=’{{json.Config}}’ 镜像标签
5.2 创建镜像
镜像的创建是整个Docker工作流程的第一步:有了镜像才能运行容器。创建一个Docker镜像常见的有两种方法:一种方法是通过Dockerfile构建,另外一种是通过docker commit提交容器为镜像;
1.剖析 Hello World镜像
2. 从Dockerfile构建镜像
3.自动构建镜像
我们经常需要构建自己的镜像,而每一次的docker build与漫长的等待都非常耗费时间,而且面对一些大型镜像的编译工作还需要服务器有足够的硬件性能,这对于普通用户来讲都是一个门槛和负担;
因此可以使用Docker Hub来自动构建镜像,可以节省一笔服务器费用;
Docker Hub构建的时候会进入到一个队列中,并非立即构建,如果需要马上构建一个镜像,但是手头上并没有足够的机器构建,可以使用Docker Cloud;
除了Docker Hub,Docker公司的Docker Cloud也提供持续构建镜像的功能。
4. 提交容器为镜像
除了使用docker build命令构建镜像,还可以使用docker commit命令提交镜像,docker commit命令把当前容器提交打包为镜像,这样提交的镜像会保存容器内的数据,而且第三方无法获取镜像的Dockerfile,也就无法再构建一个完全一样的镜像出来,从这点上看,并不推荐使用docker commit命令提交镜像;
但是有时候需要使用docker commit命令来保存容器状态,因此这时候还是需要使用这个方法保存容器的;
5.3 导出和导入镜像
如果在两台主机之间需要传输镜像,办法是把镜像推送到仓库,然后让另外一台主机拉回来,但是这样有个中转,不仅麻烦还不安全,有时候并不希望镜像发布到互联网中,而是自己搭建私有镜像仓库显然不是两三个命令就可以完成的额,于是就需要一组可以导出和导入镜像的命令了;
1.导出镜像到本地文件系统
docker save命令可以导出镜像到本地文件系统;
2.从本地文件系统导入镜像
docker load命令可以加载一个导出的镜像包到本地仓库;
5.4 发布镜像
如果想发布镜像让更多的人使用的时候,就需要推送镜像到公共仓库了
1.发布镜像到Docker Hub
我们应该首先使用docker login命令登录到Docker Hub,然后使用docker push命令推送镜像到Docker Hub这个官方默认的仓库;
2. 给镜像打上标签
我们只能推送镜像到自己有管理权限的仓库,假设现有用户名为username的用户,想要推送一个user/image的镜像到Docker Hub;
最简单的就是给镜像重新打上标签,重新打上标签之后,镜像内容不变,只是名称改变了;
docker tag user/image username/image
这样就可以推送username/image到Docker Hub了
3. 发布到第三方镜像仓库
5.5 删除镜像
1.删除本地镜像
删除镜像的命令是docker rmi,删除镜像的时候如果不指定镜像的标签(tag),则会默认删除镜像的latest标签,可以在命令之后接上多个镜像的名称,删除多个镜像;
使用docker rmi命令删除镜像的时候,需要确保没有容器在使用该镜像,也就是没有容器是使用该镜像启动的,这样才可以删除,否则会报错;
2.删除仓库镜像
删除仓库镜像目前还没有Docker命令操作,不过可以通过API操作,一般第三方仓库都会提供可视化界面供用户删除镜像;
5.6 Docker镜像扩展
整个镜像的基础只是并不多,难点是在Dockerfile的书写上;
1.Docker镜像里面有什么
镜像包含着数据以及必要的元数据,这些数据就是层(layer),而元数据则是一些JSON文件,元数据是用来描述镜像的信息,包括数据之间的关系,容器配置信息等。
上面解压的镜像所显示的每一个层(layer)文件夹意味着它是由一句Dockerfile指令生成的。在构建的过程中,像RUN、COPY、ADD、CMD等指令都会生成一个新的镜像层,一个镜像就是不断的在上一个镜像层的基础上叠加上去的;
本地存储的镜像数据与层数据在image文件夹汇总是分开存储的,imagedb保存了本地全部镜像的元数据,而layerdb文件夹保存了本地镜像的全部镜像层;
2. Docker镜像的存储方式
前面说到的镜像内容与元数据是分开存储的,那么Docker是如何把这些内容整合然后把一个完整的镜像显示在用户面前的呢?
Docker daemon首先通过image的元数据得知全部layer的ID,再根据layer的元数据梳理出顺序,最后使用联合挂载技术还原容器启动所需要的rootfs和基本配置信息。运行的容器实际上就是在这些镜像层之上新建一个动态的层;
3. 联合挂载
联合挂载:会把多个目录挂载到同一个目录(甚至是对应不同的文件系统)下,并且对外显示这些目录的整合形态。Docker中使用的AUFS就是一种联合文件系统;
联合文件系统在日常计算机中有一个地方会经常使用到,那就是Linux系统的LiveCD,我们使用发行版的时候,一般都会有一个LiveCD供用户体验,其原理就是在原有的系统目录之上附加一层可读可写的文件层,任何文件改动都会被写入到这个文件层中,这种技术就是写时复制。关于写时复制的信息可以查看Overlay文件系统的资料;
4. Git 式管理
Docker通过把镜像分层使得层的复用成为可能,如两个镜像使用有几个镜像层是一样的,那么它们可以公用这些镜像层;
第6章 Dockerfile文件
构建镜像的两种方式:
使用Dockerfile构建镜像:
只需要通过Dockerfile就可以构建出一个一模一样的镜像;
使用docker commit提交镜像;
其他人只能通过Registry或者导出导入的方式来传输镜像,非常的不方便,并且很难确定镜像中有什么,也无法构建一个一模一样的镜像出来;
6.1 Dockerfile基本结构
Dockerfile,任何人拿到这份文件执行docker build命令都会生成相同功能的镜像。
为了让这样一份文本有更高的可读性以及通用性,文本结构很重要;
命令规则:
1.Dockerfile基础
Dockerfile:这个文件虽然可以命令为其他名字,但是一般情况下不推荐修改。Dockerfile这个文件名,除非同一个文件夹下有多个Dockerfile文件,此时可以使用Dockerfile.send 、Dockerfile.server等方式命名,构建的时候加上-f指定该文件即可;
2. Dockerfile的书写规则
默认的Dockerfile文件名字就是Dockerfile,不带后缀,首字母大写。一份标准的Dockerfile中应该包含指令、注释等内容,构建指令应该使得镜像尽量的干净,不留垃圾文件;
因为Docker构建过程是无交互的,所以整个构建过程需要保证命令集能够一直持续不断的执行下去。因此在书写Dockerfile过程中,需要注意命令是否能够自动执行,遇到交互节点是否可以自动的应答等;
因为Dockerfile构建过程是从上到下,所以书写Dockerfile的是时候需要考虑到后面的命令执行情况,并适当的调整指令的位置。
很多时候在完成构建之后,临时文件也保留在了镜像之中。因此在Dockerfile中一般在最后会写上清理系统的命令,以保证镜像的体积。值得注意的是:并不是删除文件之后镜像的体积一定会缩小,这需要根据Docker的存储特点和Dockerfile文件来判断;
有时候使用一条很长的命令,不要一行写到底,这样不容易阅读,遇到长命令的时候可以使用\符号来连接,遇到几个命令连在一起,还可以使用”\&&”的方式连接
3. 基础镜像信息和维护者信息
Dockerfile顶部可以使用注释的方式添加用途、用法、版本以及维护者的信息等;
6.2 Dockerfile指令
1.指定基础镜像的FROM指令
FROM指令表示将来构建的镜像是来自哪个镜像,也就是使用哪个镜像作为基础进行构建的。一般情况下Dockerfile都有基础镜像,FROM指令必须是整个Dockerfile第一句有效指令。
2.设置维护者信息的MAINTAINER指令
3.执行构建命令的RUN指令
RUN指令是用来在Docker的编译环境中运行指定命令。RUN会在shell或者exec的环境下执行命令;
4.执行镜像环境变量的ENV指令
ENV指令用来指定在执行docker run命令运行镜像的时候,自动设置的环境变量。这个环境变量可以在后续任何的RUN指令中使用,并在容器运行的时候保持,而且可以通过docker run命令的-e参数来修改环境变量:
ENV 指令语法:
ENV &key& &value&
5. 复制文件的COPY指令
COPY 指令用来将本地的文件或者文件夹复制到镜像的指定路径下;
6. 添加文件的ADD指令
ADD和COPY作用相似,但是实现不同。ADD指令可以从一个URL地址下载内容复制到容器的文件系统中,还可以将压缩打包格式解开后复制到指定的位置;
7.指定端口暴露的EXPOSE指令
EXPOSE指令用于标明这个镜像中的应用将会侦听某个端口,并且希望将这个端口映射到主机的网络界面上。但是为了安全,docker run命令如果没有带上响应的端口映射参数,Docker并不会将端口映射出去;
此外,EXPOSE端口是可以在多个容器之间通信,通过--links参数可以让多个容器通过端口连接在一起;
8.设置镜像启动命令的CMD指令
CMD提供了容器默认的执行命令,Dockerfile只允许使用一次CMD命令。使用多个CMD命令会抵消之前所有的指令,只有最后一个指令生效;一般来将,这个整个Dockerfile脚本的最后一条指令;
如果docker run命令后面出现与CMD指定的相同的命令,那么CMD会被覆盖;而ENTRYPOINT会把容器名后面的所有内容都当成参数传递给其指定的命令(不会对命令覆盖)。另外,CMD指令还可以单独作为ENTRYPOINT指令的可选参数,共同组合成一条完整的启动命令;
CMD与RUN指令的区别在于:RUN是在build成镜像的时候就运行的,先于CMD和ENTRYPOINT,CMD会在每次启动容器的时候运行,而RUN只是在创建镜像的时候执行一次,固话在image中;
9.设置接入点的ENTRYPOINT指令
ENTRYPOINT指令和CMD指令很类似。ENTRYPOINT相当于把镜像变成一个固定的命令工具,它一般是不可以通过docker run来改变的。而CMD是可以通过启动命令来修改内容的;
10.设置数据卷的VOLUME指令
VOLUME指令用来向基于镜像创建的容器添加数据卷(在容器中设置一个挂载点,可以用来让其他容器挂载或者让宿主机访问,以实现数据共享或者对容器数据的备份、恢复或者迁移)数据卷可以在容器之间共享和重用。数据卷的修改是立即生效的。数据卷的修改不会对更新镜像产生影。数据卷会一直存在,直到没有容器使用它(没有使用它也在宿主机上存在,但就不是数据卷了,和普通文件无异)。
VOLUME可以在docker run中使用。如果run命令中没有使用,则默认不会在宿主机挂载这个数据卷。如果Dockerfile中没有设置数据卷,在docker run中也是可以设置的。
在Dockerfile中声明数据卷有助于开发人员迅速定位需要保存数据的目录位置;
11.设置构建用户的USER指令
USER指定运行容器的时候的用户名或者UID(默认为root)。后续的RUN也会使用指定的用户;
USER指令可以在docker run命令中通过-u选项来覆盖
这条指令的应用场景在于,当服务不需要管理人员权限的时候,可以通过该命令指定运行的用户。指定的用户需要在USER指令之前创建;
12.设置工作目录的WORKDIR指令
WORKDIR指令指定RUN、CMD与ENTRYPOINT命令的工作目录;
语法如下:
同样,docker run可以通过-w标志在运行的时候覆盖指令指定的目录;
13.设置二次构建指令的ONBUILD指令
ONBUILD指定在构建镜像的时候并不执行,而是在它的子镜像中执行。
14.设置元数据的LABEL指令
LABEL指令添加元素据到镜像,每一个标签生成一个layer,所以尽量使用一个LABEL标签;
15.设置构建变量的ARG指令
ARG指令定义了一个变量,用户可以在构建的时候使用,效果和docker build --build-arg一样,可以在构建的时候设定参数,这个参数只会在构建的时候存在。
与ENV类似,不同的是ENV会在镜像构建结束之后依旧存在在镜像中,而ARG会在镜像构建结束之后消失;
16.设置停止信号的STOPSIGNAL指令
STOPSIGNAL指令允许用户定制化运行docker stop时候的信号。
STOPSIGNAL SIGKILL
基于这种方式构建的镜像,其启动同期在停止的时候会发送SIGKILL信号。这个指令适用于不能接受正常退出信号的容器;
17.检查镜像状态的HEALTHCHECK指令
这是一个健康检查指令,用来检查将来容器启动运行的时候是否正常。正常则会返回healthy,否则返回unhealthy;
18.设置命令执行环境的SHELL指令
在Docker构建的过程中,默认会使用/bin/sh作为shell环境。Windows下构建默认使用cmd作为shell环境。但是有时候需要在其他shell环境中执行RUN的内容,这时候就需要使用SHELL指令提醒Docker更换shell环境;
6.3 镜像构建实战
第7章 Docker仓库
7.1 官方仓库
1.Docker Hub登录与使用
2.Docker Hub与Docker Cloud
7.2 国内镜像仓库
7.3 私有仓库
如果没有公开仓库分享的需求,那么搭建一个私有仓库就非常的简单了,只需要运行一个容器就可以实现私有仓库的创建:
docker -run -d -p
--restart=always --name registry registry:2
1.搭建私有仓库
2.私有仓库的使用
向私有仓库推送镜像,必须先使用docker tag来给即将推送的镜像打标签,这是因为在docker images所显示的镜像,默认是从Docker Hub拉取下来的,推送的时候如果不指定仓库地址,Docker会默认推送到Docker Hub中;
3.私有仓库的安全性
7.4 Registry原理
1.Registry组成
Docker Registry有3个角色,分别是Index、Registry和Registry Client。
Index主要负责管理Docker Private Registry的用户信息以及认证权限,保存记录和更新用户信息,以及镜像校验信息。Index主要由控制单元、鉴权模块、数据库、健康检查模块和日志系统组成
Redistry:是镜像的仓库,然而它没有一个本地数据库,也不提供用户的身份认证,由S3、云文件和本地文件系统提供数据库的支持。此外,通过Index Auth service和Token方式进行身份的验证;
Docker充当Registry Client来负责维护推送和拉取的任务,以及客户端的授权;
2.Registry工作流程
Docker的第二个组件:Registry;
Registry为Docker镜像文件的分发和管理提供了便捷的方案;
第8章 Docker容器
8.1 容器基本操作
1.创建容器
docker create可以创建一个容器
2.启动容器
docker run新建容器并启动;
docker start启动一个已经存在的非运行状态的容器;
3.后台运行容器
后台运行容器需要添加-d参数,docker run -d
容器启动成功之后会返回一个唯一容器的id,通过docker ps命令可以看到正在运行的容器的基本信息。
使用docker logs可以查看容器的日志信息,这对于在后台运行的容器是非常重要的,有时候容器意外退出,可以通过docker logs命令来查看容器退出的原因;
4.自动重启容器
--restart=always
5.停止与杀死容器
6.删除容器
docker rm:只能删除已经停止的容器;
docker rm -f:可以删除正在运行的容器;
7.查看容器信息
docker inspect -f
8.2 进入容器内部
1.使用attach进入容器
docker attach属于Docker自带的命令,该命令依附在正在运行的容器。
docker attach 在实时查看容器日志信息等行为,是非常的方便的;
2.使用exec进入容器
docker exec命令用于进入容器内部进行操作,与attach原理不一样,docker exec命令可以想使用SSH登录服务器一样操作容器;
3.使用nsenter进入容器
nsenter是一个第三方工具,nsenter的功能远不止进入容器操作那么简单,它的名字已经解释了其原理Namespace Enter;
nsenter不仅可以进入容器中,还可以向正在运行的容器添加数据卷,这是原生Docker命令不支持的;
8.3 导出和导入容器
1.导出容器
导出容器是指把容器导出到一个归档文件中,不管容器处于运行还是停止的状态都可以导出容器。导出容器会把容器的可读可写的文件层也打包进去,但是不会把Volume的内容囊括进来;
docker export导出的容器属于快照一样,它会丢失原来镜像的历史记录与元数据,而docker save保存的镜像保留了全部信息;
2.导入容器
导入容器并非是把容器导入为容器,导入的容器会变成一个镜像,启动这个镜像才可以恢复容器。
8.4 容器结构
Docker容器是Docker镜像的运行态的体现。概括而言,就是在Docker镜像之上,运行进程。既然这样,容器的内部结构必定与镜像结构非常类似。
1.容器格式是什么
标准话的容器有两大特点:
操作标准化:
创建启动、停止容器使用一套标准,只要实现了接口都可以操作容器,还可以使用标准文件系统工具复制和创建容器快照,使用标准化网络工具进行下载和上传;
工业自动化:
一方面是交付流程,标准容器技术的软件分发可以达到工业级的交付标准,另一方面是容器自动化,与平台无关,实现标准接口就可以实现容器操作自动化;
2.容器内部结构
Docker容器的文件系统可以说大部分由Docker镜像来提供。容器是在镜像的文件层之上新建一层可读可写层,因此容器内部大部分是镜像的内容。
第9章 数据卷
9.1 数据卷是什么
为了可以保存数据,又不至于破坏镜像的可复现特性,Docker提出了数据卷的概念。
Docker的卷概念有两种,即数据卷和数据卷容器;
1.数据卷介绍
数据卷简单来讲就是一个目录,它是由Docker daemon挂载到容器中的,因此数据卷并不属于联合文件系统。也就是说数据卷里面的内容不会应为容器的删除而丢失;
2.数据卷容器介绍
如果想要让两个容器之间共享数据卷,最快的方法就是让它们挂载在一个目录下作为数据卷即可。但是有时候不能把数据保存在宿主机中,或者数据要备份、迁移等,保存在宿主机很不方便,于是就有了专门用来存放数据的数据卷容器;
数据卷容器并不需要运行任何应用,只是一个存放数据的容器,允许其他容器挂载就可以了。数据卷容器不是特指某一个具体的镜像启动的容器,事实上每一个容器都可以担任数据卷容器的功能;
需要注意的一个问题:不要运行数据容器,纯粹是浪费资源,只要数据卷容器存在,数据卷就不会消失,不管容器处于什么状态;
9.2 为容器挂载数据卷
1.挂载数据卷
在使用docker run或者docker create命令的时候,可以指定-v参数来添加数据卷,这个参数可以使用多次,这样就可以来挂载多个数据卷了。同时数据卷还可以使用Linux的软连接作为数据卷(受制于容器程序与真实目录的文件系统)
直接指定数据卷位置,在删除容器的时候,并不会删除数据卷,这样对于数据安全一些,但是也不方便管理,可以使用映射目录到指定目录下更容易管理;
docker run -d -v /vol:/vol --name=volume alpine
注意:数据卷的路径必须是绝对路径,另外删除容器的时候可以通过指定docker rm -v参数来删除数据卷;
2.挂载数据卷容器
3.数据卷挂载小结
9.3 备份、恢复、迁移数据卷
1.备份数据卷
最简单的备份情况是先创建一个临时容器,并挂载要备份的数据卷容器,在容器中执行压缩数据卷容器的文件,放到指定目录下即
2.迁移、恢复数据卷
9.4 容器数据卷扩展
Docker 的volume本质上是一个目录,而这个目录实际上是一个挂载点,在容器创建的时候这个挂载点会被挂载一个宿主机的目录,这个目录是以Volume ID为名的文件夹,也可以是启动参数中指定的目录。挂载之后容器与宿主机显示的目录会表现为同一个目录,独立于容器内的rootfs。
1.卷插件介绍
Docker传统的卷管理只能挂载本机目录到容器中,数据的备份、同步和迁移都是个难题,因此Docker社区中有不少卷插件:Flocker、Convoy、GlusterFS、Keywhiz、REX-Ray等;
2.Convoy的使用
3.Flocker的使用
第10章 网络管理
10.1 Docker网络管理
Docker目前对单节点的设备提供了映射容器端口到宿主机、容器互联两个网络服务。在集群部署上因为加入了Swarm,所以有了更好的网络支持。
1.端口映射
在Docker中容器默认是无法和外部进行通信的,需要在启动命令的时候加入对应的参数才允许容器与外界通信;
-P:Docker会随机映射一个端口至容器内部的开放端口;
-p:指定需要映射到本地的端口;
2.端口暴露
Docker有两种方式可以用来暴露端口:EXPOSE和--expose
这两种方式其实只是为其他命令提供所需要的元数据,或者只是告诉容器操作人员有哪些已知选择;
3.容器互联
端口映射的用途是宿主机与容器之间的通信,而容器互联是容器之间的通信;
容器互联的时候,容器必须有一个名字,也就是--name指定的值,或者是--rename指定的值;
容器互联的参数是--link,能够提供和端口映射几乎相同的功能,但是--link只能在容器之间使用。使用--link参数创建容器会使用容器的主机名和容器ID来更新自己的/etc/hosts文件;
--link会使得容器的环境变量发生变化,这样有助于迅速的建立连接;
--link参数在docker run中可以使用多次
10.2 Docker网络模式
1.none模式
none模式表示不为容器提供任何网络功能,启用该模式只需要在启动的时候添加--net=none即可。使用该命令会使容器完全失去网络功能,即便设置了网络参数;
手动为容器配置网络方式:
2.container模式
container模式表示与另外一个运行中的容器共享一个Network Namespace,共享意味着拥有相同的网络视图。
3.host模式
host网络模式之前有过简单的介绍,它可以与主机共享Root Network Namespace,容器有完整的权限操作主机的网络配置,处于安全配置,不推荐使用这种模式;
但是有时候必须使用这种模式,一个比较著名的情况就是Eclipse 的Che项目,这是一个未来版的Eclipse IDE,它基于Docker容器技术,为了有更好的体验,启动Eclipse Che的时候就必须使用host模式;
4.bridge模式
bridge模式是Docker模式的网络模式,属于一种NAT网络模型
5.overlay模式
overlay模式是Docker原生的跨主机多子网网络模型,当创建一个新的网络的时候,Docker会在主机上创建一个Network Namespace,Network Namespace内有一个网桥,网桥上有个一个vxlan接口,每个网络占用一个vxlan ID,当容器被添加到网络中的时候,Docker会分配一对veth网卡设备,与bridge类似,一端在容器里面,另一端在本地的Network Namespace上。
Overlay中有一个vxlan ID,它的值为256——1000之间,vxlan隧道会将每一个ID相同的网络沙盒连接起来实现一个子网。
10.3 Docker网络配置
1.Daemon网络参数
使用docker daemon网络参数可以设置网络配置;
docker client的网络参数主要是通过docker run的网络参数;
容器的结构在中存在一个初始化层,这个文件层中包括用于容器的主机名和DNS配置信息使用到的系统配置文件,如etc/hosts
etc/resolv.conf
/etc/hostname
启动容器的时候,在容器中使用mount命令可以查看这三个文件的挂载信息;
3.network命令
docker network ls:查看当前主机的网桥情况
docker network rm:删除一个网络
docker network create:创建一个网络
第3篇 Docker进阶实战
第11章 操作系统
Docker镜像一般都是基于某个系统镜像构建而来的,这个操作系统旨在为Docker容器提供环境的支持,所以选用合适的操作系统作为镜像的基础是容器稳定运行的一道保障;
11.1 Alpine发行版
Alpine Linux是一个社区开发的面向安全应用的轻量级Linux发行版。
1、小巧:基于Musl libc和busybox,和busybox一样小巧,最小的Docker镜像只有5MB;
2、安全:面向安全的轻量发行版;
3、简单:提供APK包管理工具,软件的搜索、安装、删除、升级都非常方便;
4、适合容器使用:由于小巧、功能完备,非常适合作为容器的基础镜像;
Alpine Linux镜像虽然小巧,但是提供了常见的Linux命令,并且其软件仓库也提供了丰富的软件扩展;
11.2 Busybox发行版
BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件。BusyBox 包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例grep、find、mount以及telnet。有些人将 BusyBox 称为 Linux 工具里的。简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Android 系统的自带的shell。
Busybox镜像比Alpine Linux体积更小,但是并没有提供包管理工具,所以在扩展上稍微麻烦一些;
【启动一个Busybox容器,并进入到容器内部】
run --rm -it busybox sh
虽然Busybox很小,但是扩展起来非常的麻烦,一般用来运行一些编译好的二进制文件;
11.3 Debian/Ubuntu发行版
Ubuntu近些年的粉丝越来越多,Ubuntu有着漂亮的用户界面,完善的包管理系统,强大的软件源支持,丰富的技术社区,Ubuntu还对大多数硬件有着良好的兼容性,包括最新的图形显卡等等。这一切让Ubuntu越来越向大众化方向发展。但别忘了:你所需要的只是一个简约、稳定、易用的服务器系统而已!
Ubuntu的图形界面固然漂亮,但这也决定了它最佳的应用领域是桌面操作系统而非服务器操作系统。如何你希望在学习Linux的过程中有个沉浸式的环境,那么Ubuntu的确不错:仅仅安装在自己的电脑中而非服务器中。从这一点来讲,Ubuntu并没有在VPS安装的操作系统选择之列,相信你也不会为了那数百M的驱动与宝贵的内存买单。
一般来说Debian作为适合于服务器的操作系统,它比Ubuntu要稳定得多。可以说稳定得无与伦比了。debian整个系统,只要应用层面不出现逻辑缺陷,基本上固若金汤,是个常年不需要重启的系统(当然,这是夸张了点,但并没有夸大其稳定性)。debian整个系统基础核心非常小,不仅稳定,而且占用硬盘空间小,占用内存小。128M的VPS即可以流畅运行Debian,而CentOS则会略显吃力。但是由于Debian的发展路线,使它的帮助文档相对于CentOS略少,技术资料也少一些。
11.4 CentOS/Fedora发行版
你会发现非常多的商业公司部署在生产环境上的服务器都是使用的CentOS系统,CentOS是从RHEL源代码编译的社区重新发布版。CentOS简约,命令行下的人性化做得比较好,稳定,有着强大的英文文档与开发社区的支持。与Redhat有着相同的渊源。虽然不单独提供商业支持,但往往可以从Redhat中找到一丝线索。相对debian来说,CentOS略显体积大一点。是一个非常成熟的Linux发行版。
CentOS和Fedora都是基于Redhat的Linux发行版。前者以兼容Redhat软件以及稳定的运行而著称,Fedora以新特性、新技术为著称,更多的体现实验性,主要面向个人用户;
CentOS基础镜像去除了很多常见的组件,使用过程中需要用户手动的添加;
因为Fedora的本地仓库缓存比CentOS大很多,构建镜像的时候切勿清理本地软件仓库缓存,否则,这也是增加镜像或者容器体积的一个重要因素;
11.5 CoreOS发行版
CoreOS是一个基于Linux 内核的轻量级操作系统,为了的基础设施建设而生,专注于自动化,轻松部署,安全,可靠,规模化。作为一个操作系统,CoreOS 提供了在应用容器内部署应用所需要的基础功能环境以及一系列用于服务发现和配置共享的内建工具。
CoreOS并不属于是Docker基础镜像的一种,这不是构建镜像用的系统,而是运行Docker(准确来说是容器)的系统;
11.6 RancherOS发行版
RancherOS旨在提供一种在生产环境中大规模运行Docker的最小最简答的方式。它只包含运行Docker必须的软件,其二进制下载包也只有20M
与CoreOS一样,RancherOS也并不属于是Docker基础镜像的一种,这不是构建镜像用的系统,而是运行Docker(准确来说是容器)的系统;
RancherOS中,一切都是由Docker管理的容器,RancherOS会启动两个Docker实例。一个称为系统Docker,是内核启动的第一个进程,还有一个用户Docker,主要负责创建容器,所有的用户容器都运行在用户Docker容器中,因此删除所有的用户容器并不会影响运行RancherOS服务的系统容器;
第12章 编排工具Compose
Docker Compose就是可以统一管理多个互相关联的容器;
简单来讲,Docker Compose是一个用来组装管理多容器应用的工具,它可以根据配置文件自动的构建、管理、编排一组容器,极大地方便用户对多容器的操作;
12.1 安装Docker Compose
1.二进制安装
2.使用Python pip安装
12.2 Compose命令基础
docker-compose主要是解析dcker-compose.yml然后发送给Docker Client去执行的;
在配置文件中可以配置多个容器,在设置Dockerfile路径的同时还可以指定Dockerfile的上下文路径;
1.指定配置文件
docker-compose -f
2.指定项目名称
docker-compose -p
3.Compose环境变量
环境配置文件.env,这是一个隐藏文件;
文件中可以设置Docker Compose的环境变量;
4.构建服务镜像的build命令
docker-compose build
--force-rm
--no-cahce
5.生成DBA包的bundle命令
6.检查配置语法的config命令
config命令用来检查docker-compose.yml文件是否有语法问题;如果有会返回错误原因;
7.创建服务容器的create命令
会创建所有服务所需要的容器,但是不会运行容器
8.清理项目的down命令
可以停止容器并删除包括容器、网络、数据卷等内容。也就是只要是通过up命令创建的东西,使用down命令都可以删除。此外,如果数据卷、网路等资源正在被服务使用,down命令会跳过这些组件;
9.查看事件的events命令
10.进入服务的exec命令
exec命令与docker exec命令类似,可以进入容器执行命令,不同的是docker-compose exec后面是服务名称而不是容器名称;
11.杀死服务容器的kill命令
12.查看服务容器日志的logs命令
13.暂停服务容器的pause命令
14查看服务容器端口状态的port命令.
15.查看项目容器的ps命令
可查看正在运行的服务容器
16.拉取项目镜像的pull命令
17.推送项目镜像的push命令
18.重启服务容器的restart命令
19.删除项目容器的rm命令
20.执行一次性命令的run命令
21.设置服务容器数量的scale命令
scale是一个可以设置服务容器启动个数的命令;
22.启动服务容器的start命令
23.停止服务容器的stop命令
24.取消暂停服务的unpause命令
25.启动项目的up命令
12.3 Compose配置文件
Docker Compose是使用YML文件来定义多个容器关系的,因此掌握docker-compose.yml文件的写法才能更好的书写配置文件,方便管理多容器应用。
Docker Compose实际上是把YML文件解析成Docker命令然后执行的,它通过定义解析容器依赖关系来按照顺序启动容器;
1.配置文件基础
Compose配置文件是一个YML格式的文件,它定义了包括(容器)、网络、数据卷在内的一些列项目组件。默认的Compose配置文件路径是./docker-compose.yml
使用配置文件定义的服务在启动的时候就像使用Docker client的docker run一样。
2.基本配置
一个标准的配置文件应该包括version、services、networks这三个部分,其中最关键的就是services和networks两个部分;
1.指定服务所使用的镜像:image
2.指定构建上下文:build
3.指定服务镜像启动命令:command
4.指定运行服务的容器名称:container_name
5.指定服务的依赖关系:depends_on
6.指定服务的DNS配置:dns
7.挂载临时目录:tmpfs
8.指定服务镜像的接入点:entrypoint
9.设置compose变量:env_file
10.设置环境变量:environment
11.指定端口暴露:expose
12.选择项目外的容器:external_links
13.扩展连接服务器的hosts列表:extra_hosts
14.添加元数据:labels
15.设置容器互联:links
16.配置服务日志:logging
17.指定进程空间:pid
18.设置服务容器的端口映射:ports
19.设置容器安全选项:security_opt
20.设置容器停止信息:stop_signal
21.设置容器数据卷:volumes
22.挂载数据卷容器:volumes_from
23.修改内核功能:cap_add、cap_droop
24.指定父级Cgroup:cgroup_parent
25.配置服务的设备映射:devices
26.设置服务扩展:extends
27.设置服务网络模式:network_mode
28.设置服务容器的网络:networks
29.其他标签
3.网络配置
4.配置扩展
12.4 Compose实战
1.部署Django
2.部署Rails
3.部署WordPress
第13章 Web服务器与应用
Web服务器是网络应用中最常见、最重要的一部分。使用Docker来运行常见的Web服务器,首先介绍官方镜像,有哪些版本,版本之间有什么差异,然后运行官方镜像即可。
再分别基于Alpine和Ubuntu构建Web服务器应用。
13.1 Apache服务器
Web服务器的Apache通常是指Apache HTTP Server。这是Apache软件基金会的一个开放源代码的网页服务器软件,可以在大多数计算机操作系统中运行,由于其跨平台的特性和安全性,被广泛的使用,是最流行的Web服务器软件之一;
1.官方镜像
2.运行官方镜像
3.基于Ubuntu构建Apache镜像
4.第三方优质镜像
除了官方镜像之外,有些开发者构建的镜像也非常优秀:
Webdevops的官方镜像,有生产环境经验
比官方镜像操作更加灵活
使用Alpine构建而来,体积小,功能齐全
13.2 Nginx服务器
Nginx和Apache一样是一种Web服务器,与Apache相比,它内存占用更小、稳定性更高。Nginx不采用每一个客户机一线程的设计模型,而是充分的利用使用异步逻辑,消减了上下文调度开销,所以并发服务能力更强,整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活;
1.官方镜像
2.运行官方镜像
3.构建Nginx镜像
4.第三方优质镜像
13.3 Tomcat服务器
1.官方镜像
Tomcat镜像比较特别,它与Apache和Nginx不同。Tomcat镜像自带了JRE运行环境,因此相当于Apache+PHP或者Nginx+PHP一样。使用Tomcat镜像可以直接挂数据卷运行Web应用,因此一个镜像运行不了不妨换一个,相当方便;
2.运行官方镜像
3.构建Tomcat镜像
13.4 其他Web服务器
1.Caddy服务器
是一个像 Apache, nginx, 或 lighttpd 的web服务器。
你要问nginx已经很好了,为什么要用caddy呢? 我觉得caddy最大的特点是用起来简单,
然后呢,它还有下面这些开箱即用的特性:
HTTP/2 全自动支持HTTP/2协议,无需任何配置。
Auto HTTPS Caddy 使用 Let's Encrypt 让你的站点全自动变成全站HTTPS,无需任何配置。当然你想使用自己的证书也是可以的。
Multi-core 因为caddy是golang写的,所以当然可以合理使用多核啦。
IPv6 完全支持IPv6环境.
WebSockets Caddy 对WebSockets有很好的支持.
Markdown 自动把md转成 HTML ,当然,我后续要给大家介绍更强大的hugo来干这个事情.
Logging Caddy 对log格式的定义很容易,更好的满足你日志收集的需求。
Easy Deployment 得益于go的特性,caddy只是一个小小的二进制文件,没有依赖,很好部署。
那么在什么场景下适合尝试使用caddy呢,我推荐从以下场景开始:
作为静态页面的webserver
转发 fastcgi 请求到 php-fpm 服务,比如替换apache或nginx作为wordpress的server
反向代理,管理多个站点
微服务的 API gateway ,我会专门写一篇文章。
有些在nginx上难以开发的需求,为caddy写插件太方便了。
2.WebLogic服务器
WebLogic是美国公司出品的一个application server,确切的说是一个基于JAVAEE架构的,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和的Java。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。
第14章 数据库
14.1 MySQL数据库
1.官方镜像的剖析与使用
2.构建自己的MySQL镜像
14.2 PostgreSQL数据库
1.官方镜像的使用
2.官方镜像的剖析
3.构建PostgreSQL镜像
4.数据备份与导入
14.3 Redis数据库
1.官方镜像的使用
2.构建自己的Redis镜像
14.4 MongoDB数据库
1.官方镜像的使用
2.构建自己的MongoDB镜像
1.在容器中使用SQLite
2.构建自己的MariaDB镜像
3.使用Docker部署Oracle XE数据库
第15章 编程语言
15.1 C/C++语言
15.2 Golang语言
15.3 Java语言
1.官方镜像library/openjdk
2.基于Alpine构建Java镜像
3.Tomcat服务器
4.下一代集成开发环境——Eclipse Che
15.4 JavaScript(Node.js)语言
1.官方镜像library/node
2.vue.js框架
3.Express框架
4.浏览器里的IDE——Cloud9-IDE
5.基于Alpine构建Node.js镜像
15.5 PHP语言
15.6 Python语言
15.7 Swift语言
1.构建Swift镜像
2.Kitura框架
第16章 Docker API简介
16.1 认识Docker API
1.RESTful介绍
2.开启socket
3.使用curl
4.使用Postman
16.2 Docker Remote API介绍
16.3 其他API
2.Trusted Registry API介绍
第17章 私有仓库
17.1 Docker Registry介绍
1.部署Docker Registry
2.私有仓库push和pull
3.配置Registry
4.添加Docker Hub Mirror功能
17.2 认证与前端
1.设置反代理
2.为私有仓库添加认证服务
3.为私有仓库添加可视化界面
17.3 企业级私有仓库Harbor
1.Harbor配置详解
2.配置HTTPS
3.使用Compose启动Harbor
17.4 私有仓库前端授权工具Portus
1.一键部署Portus
2.手动配置
3.启动Portus
第18章 集群网络
18.1 Swarm集群
1.认识Swarm
1.认识Swarm
2.建立跨主机网络
3.在跨主机网络上部署应用
4.Swarm集群负载
2.建立跨主机网络
1.Weave介绍
2.Flannel介绍
3.Pipwork介绍
3.在跨主机网络上部署应用
1.Etcd介绍
2.Consul介绍
4.Swarm集群负载
1.Kubernetes介绍
2.Mesos Shipyard介绍
18.2 第三方网络管理工具
1.Weave介绍
2.Flannel介绍
3.Pipwork介绍
18.3 第三方服务发现
1.Etcd介绍
2.Consul介绍
18.4 第三方集群管理
1.Kubernetes介绍
2.Mesos Shipyard介绍
第19章 Docker安全
19.1 Docker安全机制
1.Daemon安全
2.容器与镜像安全
19.2 Docker资源控制
2.限制内存
4.文件系统防护
5.镜像瘦身神器 Docker Slim
6. 强制访问控制工具SELinux或者AppArmor
Docker网络详解-二
Docker技术剖析--docker介绍以及安装配置详解
Docker入门与实战讲解
docker配置文件详解
docker安全最佳实践概述
使用docker inspect获取数据卷信息遇到的一点问题
Docker学习笔记(一)基本原理及概念
Docker完全解析 二、Docker镜像
非常详细的Docker学习教程
Docker 架构详解 - 每天5分钟玩转容器技术(7)
没有更多推荐了,

我要回帖

更多关于 自行车外胎 的文章

 

随机推荐