47.大数据之旅——java分布式项目08--Docker(tomcat,Nginx,redis镜像部署)

版权声明:版权归零零天所有,若有转载请注明出处。 https://blog.csdn.net/qq_39188039/article/details/86604103

Docker


介绍
Docker是dotCloud公司开源的一款产品。dotCloud公司是2010年新成立的一家公司,主要基于PaaS(Platform as a Service,平台即服务)平台为开发者提供服务。在PaaS平台下,所有的服务环境已经预先配置好了,开发者只需要选择服务类型、上传代码就可对外服务,不需要花费大量的时间搭建服务和配置环境。dotCloud的PaaS平台已经做得足够好了,它支持几乎所有主流的Web编程语言和数据库,可以让开发者随心所欲地选择自己需要的编程语言、数据库和编程框架,而且它的设置非常简单,每次编码后只需要运行一条命令就能把整个网站部署上去;并且利用多层次平台的概念,理论上,它的应用可以运行在各种类型的云服务上。两三年下来,虽然DotCloud也在业界获得不错的口碑,但由于整个PaaS市场还处于培育阶段,dotCloud公司表现得不温不火,没有出现爆发性的增长。

2013年,dotCloud的CEO Solomon Hykes决定把dotCloud内部使用的Container容器技术单独拿出来开源。2013年3月发布Docker的V0.1版本,并且基本保持每月一个版本的迭代速度,到了8月,Docker已经足够火爆,并广受好评,各种各样的技术论坛和技术峰会都开始热烈讨论与推荐Docker,这时Docker才只发布到V0.6版本。

随着Docker的流行,越来越多的优秀开发者加入Docker社区参加开发。随着Docker在业界的知名度越来越高,到了2013年10月,dotCloud公司索性更名为Docker股份有限公司,工作的重心也从PaaS平台业务转向全面围绕Docker来开发。到了2014年1月,Docker公司完成融资,雅虎联合创始人杨致远也参与跟投。

好多公司纷纷把Docker应用到生产环境。其中,美国奢饰品电商Gilt的CTO说:“使用Docker以后,突然之间,传统方式中的各种问题都消失了,我们接下来要考虑如何进一步提高软件生产效率,让软件开发更加安全和创新。这种转变太不可思议了!”

千呼万唤,到了2014年6月9日,Docker终于发布了V1.0版,并举办了DockerCon2014大会,大会上来自Google、IBM、RedHat、Rackspace等公司的核心人物均发表了主题演讲,纷纷表示支持并加入Docker的阵营。Docker的CTO Solomon Hykes充满雄心壮志地说:“我们能把互联网升级到下一代!”Google的基础架构部副总裁Eric Brewer也附和道:“容器技术曾是Google的基础,我们和Docker联手,把容器技术打造为所有云应用的基石。”

Google自2004年就开始使用容器技术,目前他们每周要启动超过20亿个容器,每秒钟新启动的容器就超过3000个,在容器技术方面有大量的积累。曾相继开源了Cgroup和Imctfy这两个重量级项目。Google对Docker的支持力度非常大,不仅把Imctfy先进之处融入Docker中,还把自己的容器管理系统(kubernetes)也开源出来。

2014年8月,不缺钱的Docker再次融资,融资超4千万美元,估值达到4亿美元。
所有的云计算大公司,如Azure、Google和亚马逊等都在支持Docker技术,这实际上也让Docker成为云计算领域的一大重要组成部分。

2014年10月15日,Azure副总裁Jason Zander宣布了微软与Docker的合作伙伴关系;2014年11月5日,Google发布支持Docker的产品DockerGoogle Container Engine;2014年11月13日,Amazon发布支持Docker的产品AWS Container Service。至此,几个重要的云计算大公司都已经支持Docker技术,这不仅让Docker成为云计算领域的一个重要级成员,也让Docker成为云应用部署的事实上的标准。

2014年12月,Docker发布了Docker集群管理工具Machine和Swarm,标志着Docker开始突破一个标准的容器框架,打造属于Docker自己的集群平台和生态圈。

2015年4月,Docker公司宣布完成了9500万美元的D轮融资。
2015年10月,Docker收购Tutum,Tutum本身已经实现对亚马逊网络服务(AWS)、Digital Ocean、微软的Azure等主流云服务商的良好支持。

2016年1月,Docker官方计划全面支持自身的Alpine Linux,使用它构建的基础镜像最小只有5M。
截至2016年3月,Docker在Github上收获29962个关注(star)、8437个拷贝(Fork),在Github所有项目中排第7位,在云平台管理领域排名第一,远远超Openstack项目的1316个关注、768个拷贝。

Docker为什么火
Docker从诞生到现在,短短两年时间,已经成为开源社区最火爆的项目,作为一个开源的应用容器引擎,让开发者可以打包他们的应用及依赖环境到一个可移植的镜像中,然后发布到任何运行有Docker引擎的机器上。它集版本控制、克隆继承、环境隔离等特性于一身,提出一整套软件构建、部署和维护的解决方案,可以非常方便地帮助开发人员,让大家可以随心所欲地使用软件而又不会深陷到环境配置中。

Docker的应用
1.小A是一名资深码农,作为新招聘实习生的导师,小A要给实习生的开发机装一套和自己开发机一样的运行环境,不仅要安装Nginx、Java、Mysqld和一些依赖库等,还要修改相关的配置文件。结果花了一天时间,小A也没把实习生的开发环境搞定。

2.小B是一名QA测试工程师,他按开发给的文档、部署的服务,测试出一大堆问题,通过和开发的沟通,发现是开发和测试环境不一致引起的。

3.小C作为一名业务运维工程师,同时维护开发、测试、生产三套环境,经常在不同环境下装相同的包,做大量重复工作。

4.小D同时在为三个项目开发功能模块,他要不停地修改他的开发环境为适应在三个项目间开发、联调测试。

5.小E发现服务器被入侵过,他想知道什么文件被篡改过。

6.小G新上线一个游戏,游戏火爆超预期,需要紧急扩容,花了一两个小时才完成扩容,期间用户体验很卡,流失不少潜在用户。

7.小M的一个机房要裁撤了,该机房的数千个应用都要迁移到其他机房,小M觉得这项工作非常庞大,半年时间都未必能完成。

对Docker技术的总结
按照官方的说法,Docker是一个开源的应用容器引擎。这种技术主要解决了软件部署的平台依赖问题。

比如Ubuntu的软件包在Centos下可能就运行不起来。和Java虚拟机类似,Docker使用容器引擎解决平台依赖问题,它在每台宿主机上都启动一个Docker的守护进程,守护进程屏蔽了与具体平台相关的信息,对上层应用提供统一的接口。这样,Docker化的应用,就可以在多个平台下运行,Docker会针对不同的平台,解析给不同平台下的执行驱动、存储驱动和网络驱动去执行。

Java曾提出“Write Once,Run Anywhere”,而Docker则提出了“Build once,Run anywhere,Configure once,Run anything”

Docker把应用打包成一个镜像,镜像带有版本控制功能,应用的每次修改迭代就对应镜像的一个版本,制作好的镜像可以发布到镜像仓库,分享给别人;也可以直接从镜像仓库下载别人制作好的应用,不做任何修改,即可运行起来。

Docker架构


如果把Docker当作一个独立的软件来看,它就是用Golang写的开源程序,采用C/S架构,包含Docker Server和Docker Client,源代码托管在
https://github.com/docker/docker 上。

Docker主要由两部分组成:Docker镜像仓库和Docker程序。拿iPhone做类比的话,Docker镜像仓库相当于iPhone的Appstore(应用商店),Docker程序相当于iPhone的iOS手机操作系统。

Docker镜像仓库
官方Docker仓库地址为
https://hub.docker.com 上面的应用非常丰富,下面是部分截图
在这里插入图片描述
注:如果从国外下载镜像,可能会比较慢甚至是拒绝连接,所以可以选择国内的docker镜像下载

DaoCloud:https://account.daocloud.io
阿里云:https://dev.aliyun.com/search.html
希云:http://csphere.cn/hub/
时速云:https://hub.tenxcloud.com/
灵雀云:https://hub.alauda.cn/
网易蜂巢:https://c.163.com/

Docker程序
Docker本身是一个单机版的程序,它运行在Linux操作系统之上,属于用户态程序,通过一些接口和内核交互。

Docker工作流程
我们知道了Docker的构成,那么该如何使用Docker呢?
首先,要在Linux服务器上安装Docker软件包,并启动Docker Daemon守护进程。然后,就可以通过Docker Client端发送各种指令,Docker Daemon守护进程执行完指令,向Client端返回结果。
假如要启动一个新的Docker镜像app1(名字是随便起的),它的工作流程大致如下图:

在这里插入图片描述
1)Docker Client向Daemon发送启动app1指令。
2)Docker安装完成后,最开始是没有app1这个镜像的,Docker Daemon就发请求给Docker的官方镜像仓库,在仓库中搜索app1。
3)如果找到app1这个镜像,就把它下载到我们的服务器上。
4)Docker Daemon根据app1的镜像启动一个容器进程。
5)把启动app1是否成功的结果返回给Docker Client。

Docker的镜像和容器概念


Docker的分层和写时拷贝策略,解决了包含操作系统的应用程序比较大的问题。但我们知道,主流的虚拟机(KVM、Xen、VMWare、VirtualBox等)一般比较笨重,除了虚拟机本身运行要消耗大量的系统资源(CPU、内存等)外,启动一个虚拟机也需要花费数分钟,如何把虚拟机做到轻量化呢?

以OpenVZ、VServer、LXC为代表的容器类虚拟机,是一种内核虚拟化技术,与宿主机运行在相同Linux内核,不需要指令级模拟,性能消耗非常小,是非常轻量级的虚拟化容器,虚拟容器的系统资源消耗和一个普通的进程差不多。Docker就是使用LXC(后来又推出libcontainer)让虚拟机变得轻量化。

docker有两个最核心的概念:镜像(image)和容器(container),如下图所示。
在这里插入图片描述
在仓库中的应用都是以镜像的形式存在的,把镜像从Docker仓库中下拉到本机,以这个镜像为模板启动应用,就叫容器。容器以镜像为基础,同时又为镜像提供了一个标准的和隔离的执行环境。

在Docker的世界里,镜像和容器是它的两大核心概念,几乎所有的指令和文档都是围绕这两个概念展开的。

CentOS7环境准备


实现步骤:
1.下载CentOS7 的iso镜像
2.新建虚拟机并安装镜像
3.安装完毕后,配置虚拟机的ip
进入目录:cd /etc/sysconfig/network-scripts/
在这里插入图片描述
然后对ifcfg-ens33文件进行编辑
执行: vi ifcfg-ens33
配置示例:

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=ec1fae9c-2bd7-4422-995c-1e55321b3e69
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.234.120
GATWAY=192.168.234.1
NETMASK=255.255.255.0
DNS1=192.168.234.1

4.重启让配置立即生效
执行:reboot

5.执行:ip addr
查看ip是否生效

6.为了后续访问方便,可以关闭防火墙
执行:systemctl stop firewalld.service
(启动防火墙 ,把stop变为start即可)

7.查看防火墙是否关闭
执行: iptables -L

出现如下显示,则说明防火墙已关闭

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination     
 

Docker安装及使用


Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。

使用 yum 安装(CentOS 7下)
Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
通过 uname -r 命令查看你当前的内核版本

[root@runoob ~]# uname -r 

安装 Docker
Docker 软件包和依赖包已经包含在默认的 CentOS-Extras 软件源里,安装命令如下:

1.[root@runoob ~]# yum -y install docker

在这里插入图片描述

Docker-CentOS6.5镜像


在这里插入图片描述

Dockerfile


概念介绍
Docker镜像通常是通过Dockerfile来创建的,Dockerfile提供了镜像内容的定制,同时也体现了层级关系的建立。

常用编辑指令
在这里插入图片描述
通过DockerFile自定义镜像
实现步骤:
1.进入 /usr/local/src/目录,创建docker目录(注意
2.在docker目录下创建Dockerfile 文件(注意名字不能写错)
3.编写Dockerfile
配置示例:
FROM index.alauda.cn/tutum/centos:6.5
注:此处用的是灵雀云的镜像

4.创建镜像
执行:docker build -t jt-centos6.5:0.0.1 ./
在这里插入图片描述

Dockefile配置jdk镜像


实现步骤:
1.准备好CentOS基础镜像,因为我们要基于这个镜像来安装JDK
2.上传JDK的安装包
3.编写DockerFile

编写示例:
FROM index.alauda.cn/tutum/centos:6.5

#install jdk1.8
ADD jdk-8u51-linux-x64.tar.gz /usr/local/src
ENV JAVA_HOME=/usr/local/src/jdk1.8.0_51
ENV PATH= J A V A H O M E / b i n : JAVA_HOME/bin: PATH
ENV CLASSPATH=.: J A V A H O M E / l i b / d t . j a r : JAVA_HOME/lib/dt.jar: JAVA_HOME/lib/tools.jar

4.创建镜像
执行:docker build -t jt-centos-jdk:0.0.1 ./
在这里插入图片描述
在这里插入图片描述

Dockfile配置tomcat镜像


实现步骤:
1.上传tomcat安装包
2.编写Dockfile
编写示例:
FROM jt-centos-jdk:0.0.1

#install jdk1.8
ADD jdk-8u51-linux-x64.tar.gz /usr/local/src
ENV JAVA_HOME=/usr/local/src/jdk1.8.0_51
ENV PATH= J A V A H O M E / b i n : JAVA_HOME/bin: PATH
ENV CLASSPATH=.: J A V A H O M E / l i b / d t . j a r : JAVA_HOME/lib/dt.jar: JAVA_HOME/lib/tools.jar

#install tomcat7
ADD apache-tomcat-7.0.55.tar.gz /usr/local/src
ENV CATALINA_HOME /usr/local/src/apache-tomcat-7.0.55
ENV PATH= P A T H : PATH: CATALINA_HOME/bin
#把tomcat的8080端口暴露出去
EXPOSE 8080
CMD ["/usr/local/src/apache-tomcat-7.0.55/bin/catalina.sh",“run”]

3.创建镜像
docker build -t tomcat:0.0.1 ./

4.启动容器
docker run -d -p 8080:8080 --name jt-tomcat tomcat:0.0.1

Redis镜像的使用


实现步骤:
1.拉取redis的镜像
执行:docker pull redis:3.2.8
(docker pull redis #拉取最后版本的redis)

或者也可以指定某镜像提供商来拉取,比如:
执行:docker pull daocloud.io/library/redis:3.2.8

2.启动一个Redis实例
[root@localhost docker]# docker run -d --name redis7000 -p 7000:6379 redis:3.2.8

3.可以查看容器进程信息
执行:docker ps
在这里插入图片描述
4.通过jedis代码来访问
代码示例:

@Test
public void testConnect_Set(){
Jedis jedis=new Jedis("192.168.234.121",7000);
jedis.set("name","tom"); 
 
jedis.close();
}
 

Nginx镜像的使用


在这里插入图片描述

Docker常用指令总结


在这里插入图片描述

Docker容器和虚拟机的区别


容器与虚拟机是互补的。

虚拟机是用来进行硬件资源划分的完美解决方案,它利用了硬件虚拟化技术来实现对资源的彻底隔离;而容器则是操作系统级别的虚拟化,利用的是内核的Cgroup和Namespace特性,此功能完全通过软件来实现,仅仅是进程本身就可以与其他进程隔离开,不需要任何辅助。

Docker容器与主机共享操作系统内核,不同的容器之间可以共享部分系统资源,因此容
更少。而虚拟机会独占分配给自己的资源,几乎不存在资源共享,各个虚拟机实例之间近乎完全隔离,因此虚拟机更加重量级,也会消耗更多的资源。我们可以很轻松地在一台普通的Linux机器上运行100个或者更多的Docker容器,而且不会占用太多系统资源;而在单台机器上不可能创建100台虚拟机,因为每一个虚拟机实例都会占用一个完整的操作系统所需要的所有资源。

另外,Docker容器启动很快,通常是秒级甚至是毫秒级启动。而虚拟机的启动虽然会快于物理机器,但是启动时间也是在数秒至数十秒的量级。

因此,可以根据需求的不同选择相应的隔离方式。

如果需要资源完全隔离并且不考虑资源消耗,可以选择使用虚拟机;

而若是想隔离进程并且需要运行大量进程实例,则应该选择Docker容器。

容器技术


一般来说,容器技术主要包括Namespace和Cgroup这两个内核特性。

容器=cgroup+namespace+rootfs+容器引擎(用户态工具)

其中各项的功能分别为:
Cgroup:资源控制。
Cgroup是control group的简写,属于Linux内核提供的一个特性,用于限制和隔离一组进程对系统资源的使用,这些资源主要包括CPU、内存、block I/O和网络带宽。

Namespace:访问隔离。作用是使得每个进程彼此之间独立(相互不可见),从而做到访问隔离

rootfs:文件系统隔离。

容器引擎:生命周期控制。
目前市场上所有Linux容器项目都包含以上组件。
在这里插入图片描述
libvirt是一套免费、开源的支持Linux下主流虚拟化工具的C函数库

Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。

libcontainer:是Docker的容器引擎,负责管理docker容器的生命周期。

上一篇 46.大数据之旅——java分布式项目07

猜你喜欢

转载自blog.csdn.net/qq_39188039/article/details/86604103