容器技术

Docker入门

北城余情 提交于 2019-12-04 00:50:25
原文地址:http://dockone.io/article/8350 在计算机技术日新月异的今天, Docker 在国内发展的如火如荼。特别是在一线互联网公司 Docker 的使用是十分普遍的,甚至成为了一些企业面试的加分项,不信的话看看下面这张图。 这是我在某招聘网站上看到的招聘 Java 开发工程师的招聘要求,其中有一条熟悉 Docker 成为了你快速入职的加分项,由此可见熟悉 Docker 在互联网公司的地位之重要。 市面上已经有很多优秀的 Docker 教程,但是很多原理性的东西,笔者认为那些教程对初学者而言还是很难理解,感觉没有说清楚(笔者自己都觉得挺懵逼的)。为了让初学者少走弯路,我将以我的学习经历以及作为一个 CTF 的角度,编写此套教程,来带大家去了解并熟练运用 Docker 。 Docker 是什么? 说了这么多, Docker 到底是个什么东西呢?我们在理解 Docker 之前,首先得先区分清楚两个概念,容器和虚拟机。 可能很多读者朋友都用过虚拟机,而对容器这个概念比较的陌生。我们用的传统虚拟机如 VMware , VisualBox 之类的需要模拟整台机器包括硬件。 每台虚拟机都需要有自己的操作系统,虚拟机一旦被开启,预分配给它的资源将全部被占用。 每一台虚拟机包括应用,必要的二进制和库,以及一个完整的用户操作系统。

docker资源隔离实现方式

和自甴很熟 提交于 2019-12-03 22:43:38
默认情况下,一个容器没有资源限制,几乎可以使用宿主主机的所有资源。 docker提供了控制内存、cpu、block io。但是实际上 主要是namespace和cgroup控制资源的隔离 。 Docker的隔离性 主要运用Namespace 技术 。传统上Linux中的PID是唯一且独立的,在正常情况下,用户不会看见重复的PID。然而在Docker采用了Namespace,从而令相同的PID可于不同的Namespace中独立存在。如,A Container 之中PID=1是A程序,而B Container之中的PID=1同样可以是A程序。虽然Docker可透过Namespace的方式分隔出看似是独立的空间,然而Linux内核(Kernel)却不能Namespace,所以即使有多个Container,所有的system call其实都是通过主机的内核处理,这便为Docker留下了不可否认的安全问题。 namespace(命名空间)可以隔离哪些 文件系统需要是被隔离的 网络也是需要被隔离的 进程间的通信也要被隔离 针对权限,用户和用户组也需要隔离 进程内的PID也需要与宿主机中的PID进行隔离 容器也要有自己的主机名 有了以上的隔离,我们认为一个容器可以与宿主机和其他容器是隔离开的。 恰巧Linux 的namespace可以做到这些。 使用Namespace进行容器的隔离有什么缺点呢?

Spring之IOC原理及代码详解

前提是你 提交于 2019-12-03 22:00:24
一、什么是IOC   引用 Spring 官方原文:This chapter covers the Spring Framework implementation of the Inversion of Control (IoC) [1] principle. IoC is also known as dependency injection (DI). It is a process whereby objects define their dependencies, that is, the other objects they work with, only through constructor arguments, arguments to a factory method, or properties that are set on the object instance after it is constructed or returned from a factory method. The container then injects those dependencies when it creates the bean. This process is fundamentally the inverse, hence the name Inversion of

Dubbo 全链路追踪日志的实现

社会主义新天地 提交于 2019-12-03 21:35:21
微服务架构的项目,一次请求可能会调用多个微服务,这样就会产生多个微服务的请求日志,当我们想要查看整个请求链路的日志时,就会变得困难,所幸的是我们有一些集中日志收集工具,比如很热门的ELK,我们需要把这些日志串联起来,这是一个很关键的问题,如果没有串联起来,查询起来很是很困难,我们的做法是在开始请求系统时生成一个全局唯一的id,这个id伴随这整个请求的调用周期,即当一个服务调用另外一个服务的时候,会往下传递,形成一条链路,当我们查看日志时,只需要搜索这个id,整条链路的日志都可以查出来了。 现在以dubbo微服务架构为背景,举个栗子: A -> B -> C 我们需要将A/B/C/三个微服务间的日志按照链式打印,我们都知道Dubbo的RpcContext只能做到消费者和提供者共享同一个RpcContext,比如A->B,那么A和B都可以获取相同内容的RpcContext,但是B->C时,A和C就无法共享相同内容的RpcContext了,也就是无法做到链式打印日志了。 那么我们是如何做到呢? 我们可以用左手交换右手的思路来解决,假设左手是线程的ThreadLocal,右手是RpcContext,那么在交换之前,我们首先将必要的日志信息保存到ThreadLocal中。 在我们的项目微服务中大致分为两种容器类型的微服务,一种是Dubbo容器,这种容器的特点是只使用spring容器启动

Docker底层原理介绍

纵饮孤独 提交于 2019-12-03 21:25:40
1.docker介绍 1.1什么是docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。 1.2docker能解决什么问题 1.2.1高效有序利用资源 机器资源有限; 单台机器得部署多个应用; 应用之间互相隔离; 应用之间不能发生资源抢占,每个应用只能使用事先注册申请的资源。 1.2.2一次编译,到处运行 类似于java代码,应用及依赖的环境构建一次,可以到处运行。 1.2.docker底层原理介绍 1.2.1Linux的namespace和cgroup简单理解 namespace:类似于JAVA的命名空间 controll groups : controll (system resource) (for) (process)groups 1.2.2Linux中的namespace 在Linux系统中,可以同时存在多用户多进程,那么对他们的运行协调管理,通过进程调度和进度管理可以解决,但是,整体资源是有限的,怎么把有限的资源(进程号、网络资源等等)合理分配给各个用户所在的进程? image Linux Namespaces机制提供一种资源隔离方案。PID,IPC,Network等系统资源不再是全局性的

docker搭建环境的时候常用的命令有哪些

独自空忆成欢 提交于 2019-12-03 20:35:56
1.docker搭建环境的时候常用的命令有哪些 docker如果要删除镜像,现在停止container docker ps 查询正在运行的镜像 docker stop +containerid 停止后再删除 docker images 查看镜像 docker rmi +image id指定镜像删除 删除所有镜像 docker rmi `docker images -q` 连接我们的 docker 主机 docker-machine ssh default 查看文件路径 进入到 docker 主机中,也就是终端显示docker@default:~$的情况,输入命令 mount 进入共享目录 cd /文件名 ls 查看目录下文件和文件夹 docker部署微服务 用docker toolbox 开始进去的是我们主机 -->docker 主机 -->容器 创建容器: 确保在docker主机 管理员登入:sudo passwd sudo su 进入管理员模式 执行构建命令: docker build -t second . 创建文件 touch 创建文件目录 mkdir 删除文件 rm-文件名 复制文件 cp /docker_use/Dockerfile . #docker_use 是共享文件夹路径 . 复制到当前目录 添加了两个IP ifconfig eth1:0 192.168.99

云原生存储和云存储有什么区别?

亡梦爱人 提交于 2019-12-03 19:44:32
作者 | 李鹏(壮怀) 阿里云智能事业群高级技术专家 导读 :新的企业负载/智能工作负载容器化、迁云、存储方面遇到的性能、弹性、高可用、加密、隔离、可观测性以及生命周期等方面的问题,不但需要存储产品层次的改进,更需要在云原生的控制/数据平面的改进,推进云原生存储和云存储的演进。本文将介绍一下问题场景,探讨可行的解决方案,最终得出云原生存储以及云存储目前可以做什么和未来还需要做什么。 引言 最近有幸参加了由 Infra Meetup 联合 Kubernetes & Cloud Native Meetup 共同组织的面向云原生持久化应用的 Meetup,结合最近对云存储、开源存储、云原生存储的思考,对云原生存储到底是什么,需要做些什么,云原生存储未来挑战是什么,做了更多的反思和梳理,一家之言,分享了几个初步观点。 随着云原生应用对可迁移性、扩展性和动态特性的需求,相应的,对云原生存储也带来了密度、速度、混合度的要求,所以对云存储基本能力又提出了在效率、弹性、自治、稳定、应用低耦合、GuestOS 优化、安全等方面的诉求。 云原生现状 容器和云原生计算被企业快速接纳 Forrester 预测:到 2022 年, 全球组织/公司在生成环境运行容器化应用,从今天不足 30% 的比例将大幅度提升到超过 75%,企业应用容器化的趋势势不可挡。 另一方面,根据 IDC

java web牛刀小试之spring

扶醉桌前 提交于 2019-12-03 16:49:30
一、Spring 框架 1.1 Spring 框架模块组成: 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory ,它是工厂模式的实现。 BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。 Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。 Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。 Spring ORM:Spring

Docker的基本组成部分

ε祈祈猫儿з 提交于 2019-12-03 13:12:41
Docker Client 客户端 Docker是C/S架构的程序,docker的客户端向服务器端(也就是Docker的守护进程)发出请求,守护进程处理完所有的工作并返回结果;docker客户端向服务器端的访问既可以在本地也可以通过远程来访问; <ignore_js_op> 通过docker客户端执行各种命令,客户端会将这些命令发送给守护进程,守护进程执行的结果还会传回给客户端,使我们可以通过客户端来查看命令运行的结果 Docker Daemon 守护进程 Docker Image 镜像 <ignore_js_op> 镜像是docker容器的基石,容器基于镜像启动和运行,镜像好比容器的源代码,保存了启动容器的各种条件;接下来我们来深层理解一下docker的镜像: docker是一个层叠的只读文件系统,它的最低端是一个文件引导系统(bootfs),很像典型的linux引导文件系统; docker用户几乎永远不会和引导文件有交互,实际上当一个容器启动后,它将被移动到内存中,而引导文件系统将会被卸载; docker镜像的第二层是rootfs文件系统,它位于系统文件引导层之上;root文件系统可以是一种或者多种的操作系统,如ubuntu或centos,在传统的Linux引导过程中,root文件系统会最先以只读的方式被加载,当引导结束并完成了完整性检查后,它才会切换为读写模式

普通Java类获取spring 容器的bean的5种方法

拜拜、爱过 提交于 2019-12-03 12:21:31
普通Java类获取spring 容器的bean的5种方法 方法一:在初始化时保存ApplicationContext对象 方法二:通过Spring提供的工具类获取ApplicationContext对象 方法三:继承自抽象类ApplicationObjectSupport 方法四:继承自抽象类WebApplicationObjectSupport 方法五:实现接口ApplicationContextAware 常用的5种获取spring 中bean的方式总结: 方法一:在初始化时保存ApplicationContext对象 ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml"); ac.getBean("beanId"); 说明:这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。 方法二:通过Spring提供的工具类获取ApplicationContext对象 import org.springframework.web.context.support.WebApplicationContextUtils; ApplicationContext ac1 = WebApplicationContextUtils