为了账号安全,请及时绑定邮箱和手机立即绑定

请问一下docker可以 同时安装多个应用吗?

/ 猿问

请问一下docker可以 同时安装多个应用吗?

墨色风雨 2019-09-02 19:06:07

docker 同时安装多个应用吗


查看完整描述

3 回答

?
慕田峪7331174

Docker最核心的特性之一,就是能够将任何应用包括Hadoop打包到Docker镜像中。这篇教程介绍了利用Docker在单机上快速搭建多节点Hadoop集群的详细步骤。作者在发现目前的HadooponDocker项目所存在的问题之后,开发了接近最小化的Hadoop镜像,并且支持快速搭建任意节点数的Hadoop集群。一.项目简介GitHub:kiwanlau/hadoop-cluster-docker直接用机器搭建Hadoop集群是一个相当痛苦的过程,尤其对初学者来说。他们还没开始跑wordcount,可能就被这个问题折腾的体无完肤了。而且也不是每个人都有好几台机器对吧。你可以尝试用多个虚拟机搭建,前提是你有个性能杠杠的机器。我的目标是将Hadoop集群运行在Docker容器中,使Hadoop开发者能够快速便捷地在本机搭建多节点的Hadoop集群。其实这个想法已经有了不少实现,但是都不是很理想,他们或者镜像太大,或者使用太慢,或者使用了第三方工具使得使用起来过于复杂。下表为一些已知的HadooponDocker项目以及其存在的问题。我的项目参考了alvinhenrick/hadoop-mutinode项目,不过我做了大量的优化和重构。alvinhenrick/hadoop-mutinode项目的GitHub主页以及作者所写的博客地址如下:GitHub:Hadoop(YARN)MultinodeClusterwithDocker博客:Hadoop(YARN)MultinodeClusterwithDocker下面两个表是alvinhenrick/hadoop-mutinode项目与我的kiwenlau/hadoop-cluster-docker项目的参数对比:可知,我主要优化了这样几点:更小的镜像大小更快的构造时间更少的镜像层数更快更方便地改变Hadoop集群节点数目另外,alvinhenrick/hadoop-mutinode项目增加节点时需要手动修改Hadoop配置文件然后重新构建hadoop-nn-dn镜像,然后修改容器启动脚本,才能实现增加节点的功能。而我通过shell脚本实现自动话,不到1分钟可以重新构建hadoop-master镜像,然后立即运行!本项目默认启动3个节点的Hadoop集群,支持任意节点数的Hadoop集群。另外,启动Hadoop,运行wordcount以及重新构建镜像都采用了shell脚本实现自动化。这样使得整个项目的使用以及开发都变得非常方便快捷。开发测试环境操作系统:ubuntu14.04和ubuntu12.04内核版本:3.13.0-32-genericDocker版本:1.5.0和1.6.2小伙伴们,硬盘不够,内存不够,尤其是内核版本过低会导致运行失败。二.镜像简介本项目一共开发了4个镜像:serf-dnsmasqhadoop-basehadoop-masterhadoop-slaveserf-dnsmasq镜像基于ubuntu:15.04(选它是因为它最小,不是因为它最新)安装serf:serf是一个分布式的机器节点管理工具。它可以动态地发现所有Hadoop集群节点。安装dnsmasq:dnsmasq作为轻量级的DNS服务器。它可以为Hadoop集群提供域名解析服务。容器启动时,master节点的IP会传给所有slave节点。serf会在container启动后立即启动。slave节点上的serfagent会马上发现master节点(masterIP它们都知道嘛),master节点就马上发现了所有slave节点。然后它们之间通过互相交换信息,所有节点就能知道其他所有节点的存在了。(EveryonewillknowEveryone)。serf发现新的节点时,就会重新配置dnsmasq,然后重启dnsmasq。所以dnsmasq就能够解析集群的所有节点的域名啦。这个过程随着节点的增加会耗时更久,因此,若配置的Hadoop节点比较多,则在启动容器后需要测试serf是否发现了所有节点,DNS是否能够解析所有节点域名。稍等片刻才能启动Hadoop。这个解决方案是由SequenceIQ公司提出的,该公司专注于将Hadoop运行在Docker中。参考这个演讲稿。hadoop-base镜像基于serf-dnsmasq镜像安装JDK(OpenJDK)安装openssh-server,配置无密码SSH安装vim:介样就可以愉快地在容器中敲代码了安装Hadoop2.3.0:安装编译过的Hadoop(2.5.2,2.6.0,2.7.0都比2.3.0大,所以我懒得升级了)另外,编译Hadoop的步骤请参考我的博客。如果需要重新开发我的hadoop-base,需要下载编译过的hadoop-2.3.0安装包,放到hadoop-cluster-docker/hadoop-base/files目录内。我编译的64位hadoop-2.3.0下载地址:closed.若ssh失败,请稍等片刻再测试,因为dnsmasq的dns服务器启动需要时间。测试成功后,就可以开启Hadoop集群了!其实你也可以不进行测试,开启容器后耐心等待一分钟即可!6.开启Hadoop./start-hadoop.sh上一步ssh到slave2之后,请记得回到master啊!运行结果太多,忽略,Hadoop的启动速度取决于机器性能.7.运行wordcount./run-wordcount.sh运行结果:inputfile1.txt:HelloHadoopinputfile2.txt:HelloDockerwordcountoutput:Docker1Hadoop1Hello2wordcount的执行速度取决于机器性能.四.N节点Hadoop集群搭建步骤1.准备工作参考第二部分1~3:下载镜像,修改tag,下载源代码注意,你可以不下载serf-dnsmasq,但是请最好下载hadoop-base,因为hadoop-master是基于hadoop-base构建的。2.重新构建hadoop-master镜像./resize-cluster.sh5不要担心,1分钟就能搞定你可以为resize-cluster.sh脚本设不同的正整数作为参数数1,2,3,4,5,63.启动容器./start-container.sh5你可以为resize-cluster.sh脚本设不同的正整数作为参数数1,2,3,4,5,6这个参数呢,最好还是得和上一步的参数一致:)这个参数如果比上一步的参数大,你多启动的节点,Hadoop不认识它们..这个参数如果比上一步的参数小,Hadoop觉得少启动的节点挂掉了..4.测试工作参考第三部分5~7:测试容器,开启Hadoop,运行wordcount请注意,若节点增加,请务必先测试容器,然后再开启Hadoop,因为serf可能还没有发现所有节点,而dnsmasq的DNS服务器表示还没有配置好服务




查看完整回答
反对 回复 2019-09-07
?
达令说

一种方案为Haproxy+etcd+confd,采用松散式的组织结构,但各个组件之间的通讯是非常严密的,且扩展性更强,定制也更加灵活。

一、架构优势

约定由Haproxy+etcd+confd+Docker构建的基础服务平台简称“HECD” 架构,整合了多种开源组件,看似松散的结构,事实上已经是一个有机的整体,它们互相联系、互相作用,是Docker生态圈中最理想的组合之一,具有以下优势:

  • 自动、实时发现及无感知服务刷新; 

  • 支持任意多台Docker主宿机; 

  • 支持多种APP接入且打散至不分主宿机; 

  • 采用Etcd存储信息,集群支持可靠性高; 

  • 采用Confd配置引擎,支持各类接入层,如Nginx; 

  • 支持负载均衡、故障迁移; 

  • 具备资源弹性,伸缩自如(通过生成、销毁容器实现); 

  • 二、架构说明

  • 在HECD架构中,首先管理员操作Docker Client,除了提交容器(Container)启动与停止指令外,还通过REST-API方式向Etcd(K/V)存储组件注册容器信息,包括容器名称、主宿机IP、映射端口等。Confd配置组件会定时查询Etcd组件获取最新的容器信息,根据定义好的配置模板生成Haproxy配置文件Haproxy.cfg,并且自动reload haproxy服务。用户在访问业务服务时,完全没有感知后端APP的上线、下线、切换及迁移,达到了自动发现、高可用的目的。详细架构图见图1-1。

    图1-1 平台架构图

    为了方便大家理解各组件间的关系,通过图1-2进行架构流程梳理,首先管理员通过Shell或API操作容器,下一步将容器信息注册到Etcd组件,Confd组件会定时查询Etcd,获取已经注册到Etcd中容器信息,最后通过Confd的模板引擎生成Haproxy配置,整个流程结束。

    图1-2架构流程图

    了解架构流程后,我们逐一对流程中各组件进行详细介绍。

    1、Etcd介绍

    Etcd是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现。

  • 简单:支持 curl 方式的用户 API (HTTP+JSON) 

  • 安全:可选 SSL 客户端证书认证 

  • 快速:单实例可达每秒 1000 次写操作 

  • 可靠:使用 Raft 实现分布式

  • 2、Confd介绍

    Confd是一个轻量级的配置管理工具。通过查询Etcd,结合配置模板引擎,保持本地配置最新,同时具备定期探测机制,配置变更自动reload。

    3、Haproxy介绍

    HAProxy是提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。(来源百科) 三、架构部署

    平台环境基于Centos6.5+Docker1.2构建,其中Etcd的版本为etcd version 0.5.0-alpha,Confd版本为confd 0.6.2,Haproxy版本为HA-Proxy version 1.4.24。下面对平台的运行环境、安装部署、组件说明等进行详细说明,环境设备角色表如下:


    1、组件安装

    1.1 Docker安装

    SSH终端登录192.168.1.22服务器,执行以下命令:

  • # yum -y install docker-io   


  • # service docker start   


  • # chkconfig docker on  

  • 1.2 Haproxy、confd安装

    SSH终端登录192.168.1.20服务器,执行以下命令:


  • 1、haproxy   


  • # yum –y install haproxy   


  • 2、confd   


  • # wget https://github.com/kelseyhightower/confd/releases/download/v0.6.3/confd-0.6.3-linux-amd64  


  • # mv confd /usr/local/bin/confd   


  • # chmod +x /usr/local/bin/confd   


  • # /usr/local/bin/confd -version   


  • confd 0.6.2  

  • 1.3 Etcd安装   

    SSH终端登录192.168.1.21服务器,执行以下命令: 

  • # yum -y install golang   


  • # mkdir -p /home/install && cd /home/install   


  • # git clone https://github.com/coreos/etcd  


  • # cd etcd   


  • # ./build   


  • # cp bin/etcd /bin/etcd   


  • # /bin/etcd -version   


  • etcd version 0.5.0-alpha  

  • 2、组件配置   

  • 2.1 Etcd配置

    由于etcd是一个轻量级的K/V存储平台,启动时指定相关参数即可,无需配置。 

  • # /bin/etcd -peer-addr 192.168.1.21:7001 -addr 192.168.1.21:4001 -data-dir /data/etcd -peer-bind-addr 0.0.0.0:7001 -bind-addr 0.0.0.0:4001 &  


  • 由于etcd具备多机支持,参数“-peer-addr”指定与其它节点通讯的地址;参数“-addr”指定服务监听地址;参数“-data-dir”为指定数据存储目录。    

  • 由于etcd是通过REST-API方式进行交互,常见操作如下:   

    1) 设置(set) key操作  


  • # curl -L http://192.168.1.21:4001/v2/keys/mykey-XPUT -d value="this is awesome"   


  • {"action":"set","node":{"key":"/mykey","value":"this is awesome","modifiedIndex":28,"createdIndex":28}} 

  • 2) 获取(get) key信息

  • # curl -L http://192.168.1.21:4001/v2/keys/mykey  


  • {"action":"get","node":{"key":"/mykey","value":"this is awesome","modifiedIndex":28,"createdIndex":28}}  

  • 3) 删除key信息 

  • # curl -L http://192.168.1.21:4001/v2/keys/mykey-XDELETE         {"action":"delete","node":{"key":"/mykey","modifiedIndex":29,"createdIndex":28},"prevNode":{"key":"/mykey","value":"this is awesome","modifiedIndex":28,"createdIndex":28}}   更多操作API见https://github.com/coreos/etcd/blob/master/Documentation/api.md。 

  • 2.2 Confd+Haproxy配置  

    由于Haproxy的配置文件是由Confd组件生成,要求Confd务必要与haproxy安装在同一台主机上,Confd的配置有两种,一种为Confd资源配置文件,默认路径为“/etc/confd/conf.d”目录,另一种为配置模板文件,默认路径为“/etc/confd/templates”。具体配置如下:    

    创建配置文件目录 

  • # mkdir -p /etc/confd/{conf.d,templates}


  • (1)配置资源文件   

  • 详细见以下配置文件,其中“src”为指定模板文件名称(默认到路径/etc/confd/templates中查找);“dest”指定生成的Haproxy配置文件路径;“keys”指定关联Etcd中key的URI列表;“reload_cmd”指定服务重载的命令,本例中配置成haproxy的reload命令。    

    【/etc/confd/conf.d/ haproxy.toml】 


  • [template]  


  • src = "haproxy.cfg.tmpl"  


  • dest = "/etc/haproxy/haproxy.cfg"  


  • keys = [  


  •  "/app/servers",  


  • ]  


  • reload_cmd = "/etc/init.d/haproxy reload"  


  • (2)配置模板文件  

  • Confd模板引擎采用了Go语言的文本模板,更多见http://golang.org/pkg/text/template/,具备简单的逻辑语法,包括循环体、处理函数等,本示例的模板文件如下,通过range循环输出Key及Value信息。   

    【/etc/confd/templates/haproxy.cfg.tmpl】 


  • global  


  •        log 127.0.0.1 local3  


  •        maxconn 5000  


  •        uid 99  


  •        gid 99  


  •        daemon  


  •  


  • defaults  


  •        log 127.0.0.1 local3  


  •        mode http  


  •        option dontlognull  


  •        retries 3  


  •        option redispatch  


  •        maxconn 2000  


  •        contimeout  5000  


  •        clitimeout  50000  


  •        srvtimeout  50000  


  •  


  • listen frontend 0.0.0.0:80  


  •        mode http  


  •        balance roundrobin  


  •        maxconn 2000  


  •        option forwardfor  


  •        {{range gets "/app/servers/*"}}  


  •        server {{base .Key}} {{.Value}} check inter 5000 fall 1 rise 2  


  •        {{end}}  


  •  


  •        stats enable  


  •        stats uri /admin-status  


  •        stats auth admin:123456  


  •        stats admin if TRUE  


  • (3)模板引擎说明  

  • 本小节详细说明Confd模板引擎基础语法与示例,下面为示例用到的KEY信息。 

  • # curl -XPUT http://192.168.1.21:4001/v2/keys/app/servers/backstabbing_rosalind-d value="192.168.1.22:49156"   


  • # curl -XPUT http://192.168.1.21:4001/v2/keys/app/servers/cocky_morse-d value="192.168.1.22:49158"   


  • # curl -XPUT http://192.168.1.21:4001/v2/keys/app/servers/goofy_goldstine-d value="192.168.1.22:49160"   


  • # curl -XPUT http://192.168.1.21:4001/v2/keys/app/servers/prickly_blackwell-d value="192.168.1.22:49162"1、base   

  • 作为path.Base函数的别名,获取路径最后一段。 {{ with get "/app/servers/prickly_blackwell"}}server {{base .Key}} {{.Value}} check {{end}}


  • prickly_blackwell 192.168.1.22:49162


  • 2、get

    返回一对匹配的KV,找不到则返回错误。   

    {{with get "/app/servers/prickly_blackwell"}}key: {{.Key}}value: {{.Value}} {{end}}

  • /app/servers/prickly_blackwell 192.168.1.22:49162  


  • 3、gets  

  • {{range gets "/app/servers/*"}}{{.Key}} {{.Value}}{{end}} 

  • /app/servers/backstabbing_rosalind 192.168.1.22:49156  


  • /app/servers/cocky_morse 192.168.1.22:49158  


  • /app/servers/goofy_goldstine 192.168.1.22:49160  


  • app/servers/prickly_blackwell 192.168.1.22:49162


  • 4、getv

  • 返回一个匹配key的字符串型Value,找不到则返回错误。  

    {{getv "/app/servers/cocky_morse"}}

  • 192.168.1.22:49158  


  • 5、getvs

  • 返回所有匹配key的字符串型Value,找不到则返回错误。

    {{range getvs "/app/servers/*"}}value: {{.}}{{end}} 

  • value: 192.168.1.22:49156  


  • value: 192.168.1.22:49158  


  • value: 192.168.1.22:49160  


  • value: 192.168.1.22:49162  


  • 6、split

  • 对输入的字符串做split处理,即将字符串按指定分隔符拆分成数组。{{ $url := split (getv "/app/servers/cocky_morse") ":" }}host: {{index $url 0}}port: {{index $url 1}}

  • host: 192.168.1.22  


  • port: 49158  


  • 7、ls

  • 返回所有的字符串型子key,找不到则返回错误。 {{range ls "/app/servers/"}}subkey: {{.}} {{end}}

  • subkey: backstabbing_rosalind  


  • subkey: cocky_morse  


  • subkey: goofy_goldstine  


  • subkey: prickly_blackwell  


  • 8、lsdir

  • 返回所有的字符串型子目录,找不到则返回一个空列表。 {{range lsdir "/app/"}}subdir: {{.}} {{end}}

  • subdir: servers


  • (4)启动confd及haproxy服务

  • 下面为启动Confd服务命令行,参数“interval”为指定探测etcd的频率,单位为秒,参数“-node”为指定etcd监听服务主地址,以便获取容器信息。 


  • # /usr/local/bin/confd -verbose -interval 10 -node '192.168.1.21:4001' -confdir /etc/confd > /var/log/confd.log &  


  • # /etc/init.d/haproxy start  




查看完整回答
反对 回复 2019-09-07
?
慕码人2483693

1. 下载 Kitematic首先,我们需要从 github 仓库 中下载 Windows 操作系统可用的最新的 Kitematic 发行版。我们用下载器或者 web 浏览器下载了它的可执行 EXE 文件。下载完成后,我们需要双击可执行应用文件。

双击应用文件之后,会问我们一个安全问题,我们只需要点击 OK 按钮,如下图所示。

2. 安装 Kitematic
下载好可执行安装程序之后,我们现在就可以在我们的 Windows 操作系统上安装 Kitematic了。安装程序现在会开始下载并安装运行 Kitematic 需要的依赖软件,包括 Virtual Box 和 Docker。如果已经在系统上安装了 Virtual Box,它会把它升级到最新版本。安装程序会在几分钟内完成,但取决于你网络和系统的速度。如果你还没有安装 Virtual Box,它会问你是否安装 Virtual Box 网络驱动。建议安装它,因为它用于 Virtual Box 的网络功能。

所需的依赖 Docker 和 Virtual Box 安装完成并运行后,会让我们登录到 Docker Hub。如果我们还没有账户或者还不想登录,可以点击 SKIP FOR NOW 继续后面的步骤。

如果你还没有账户,你可以在应用程序上点击注册(Sign Up)链接并在 Docker Hub 上创建账户。
完成之后,就会出现 Kitematic 应用程序的第一个界面。正如下面看到的这样。我们可以搜索可用的 docker 镜像。

3. 部署 Nginx Hello World 容器
现在,成功安装完 Kitematic 之后,我们打算部署容器。要运行一个容器,我们只需要在搜索区域中搜索镜像。然后点击 Create 按钮部署容器。在这篇教程中,我们会部署一个小的包含了 Hello World 主页的 Nginx Web 服务器。为此,我们在搜索区域中搜索 Hello World Nginx。看到了容器信息之后,我们点击 Create 来部署容器。

镜像下载完成之后,它会自动部署。我们可以查看 Kitematic 部署容器的命令日志。我们也可以在 Kitematic 界面上预览 web 页面。现在,我们通过点击预览在 web 浏览器中查看我们的 Hello World 页面。

如果我们想切换到命令行接口并用它管理 docker,这里有个称为 Docker CLI 的按钮,它会打开一个 PowerShell,在里面我们可以执行 docker 命令。

现在,如果我们想配置我们的容器并执行类似更改容器名称、设置环境变量、指定端口、配置容器存储以及其它高级功能的任务,我们可以在容器设置页面做到这些。

总结
我们终于成功在 Windows 操作系统上安装了 Kitematic 并部署了一个 Hello World Ngnix 服务器。推荐下载安装 Kitematic 最新的发行版,因为会增加很多新的高级功能。由于 Docker 运行在 64 位平台,当前 Kitematic 也是为 64 位操作系统构建。它只能在 Windows 7 以及更高版本上运行。



查看完整回答
反对 回复 2019-09-07

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信