首页 文章 精选 留言 我的

精选列表

搜索[磐石100],共10009篇文章
优秀的个人博客,低调大师

Docker 中如何连接多个 Container 协同工作 【已翻译100%】

在Docker使用部分我们接触到了通过网络端口来连接运行在Docker容器内的服务。这是同Docker容器内服务和应用互动的方法之一。在这一节中,我们将带你复习一下通过网络端口连接到Docker容器并给你介绍容器连接的概念。 网络端口映射刷新 在Docker的使用部分中,我们创建了一个运行Python Flask应用的容器。 $ sudo docker run -d -P training/webapp python app.py 注意:容器有一个内部网络和IP地址(还记得在使用Docker部分中我们曾使用docker的监控命令查看容器的IP地址)。Docker可以有各种不同的网络配置。你可以在这里看到Docker网络的更多相关信息。 当我们创建容器时,我们使用-P标志来自动映射任意网络端口到我们Docker主机上介于49000到49900之间的随机高位端口。随后,当我们运行docker ps时,我们会看到5000端口绑定到了49155端口上了。 $ sudo docker ps nostalgic_morse CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse 我们同样看到了怎样使用-P标志将一个容器端口绑定到一个指定端口。 $ sudo docker run -d -p 5000:5000 training/webapp python app.py 另外,我们发现这并不是一个好办法,因为它约束我们一个特定端口只能有一个容器. 还有一些其他的使用 -p 的方法。 默认的情况下 -p 会把container的Port绑到宿主机上的所有ip的该端口号上。 (译者:如果你的宿主机有多个IP, 每个IP的那个端口都会被绑到container的那个port上) 我们可以通过指定接口, 例如下面的例子, 端口就只绑定到了 localhost 上。 $ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py 这会吧container内部的5000端口绑定到宿主机的 127.0.0.1 的5000端口上去. 如果只指定了网络接口而没有指定端口号, 则container的端口会绑到这个网络接口上的一个随机端口上. $ sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py 我们还可以使用UDP $ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py 使用 docker port 可以查看当前的container的端口的绑定情况, 和特殊的端口的配置。 例如, 如果我们吧container的端口绑到了宿主机的 localhost, 我们输入 docker port 的时候输出会是: $ docker port nostalgic_morse 127.0.0.1:49155 注 -p 可以被多次使用用来吧多个container里的port绑定到宿主机上 Docker 容器链接 映射网络端口不是吧container彼此连接起来的唯一方法。Docker的linking系统允许你吧多个 container连接起来, 让他们彼此交互信息。Docker的linking会创建一种父子级别的关系。 父container可以看到他的子container提供的信息。 容器命名 Docker的linking系统依赖于container的名字。我们已经注意到了每个container都会被自动的 分配一个名字, 在本教程里大家可能已经熟悉了 nostalgic_morse 这个名字(译者:docker 自动分配的名字都是确实存在的词, 有些名字比较有意思 例如我的一个container就叫做tender einstein 温柔的爱因斯坦, 对于大多数情况, 这些名字绝对是考验你英语单词量的机会, 比如 backstabbing nobel, stoic carson). 我们可以自己对container命名. 命名有两个用处: 1.好记 比如命名一个承载web服务的container为web 2.container 之间可以互相引用, 例如一个 web container 使用一个 db container 通过 --name 可以给container命名, 例如: $ sudo docker run -d -P --name web training/webapp python app.py你可以看到我们启动了一个新的container, 启动的时候使用了 --name 命名这个container为 web。 我们可以通过命令 docker ps查看container的名字 $ sudo docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES aed84ee21bde training/webapp:latest python app.py 12 hours ago Up 2 seconds 0.0.0.0:49154->5000/tcp web 我们也可以用 docker inspect 查看container的名字. $ sudo docker inspect -f "{{ .Name }}" aed84ee21bde /web (译者: 上面那个乖乖的语法源于golang自带的模板语言) 注 Container的名字必须是唯一的。也就是说你只能命名一个container为 web。 要重新使用一个container的名字的时候必须把之前叫这个名字的container删除, 才能 再使用。删除container可以使用 docker rm. 还有个便利的方法就是在启动container的时候 使用 --rm 标记. 这样container停止的时候就会自动被删除。 (译者: 如果你使用过一段时间docker, 用docker ps -a 你可能会发现一大堆的已经停止了的container, 在很多的docker教程里, 在启动container的时候都会带上 --rm.) 容器链接 Links运行container之间发现彼此并且彼此间安全的通讯。使用 --link可以创建一个link. 让我们创建一个运行数据库的container。 $ sudo docker run -d --name db training/postgres 这里我们基于 training/postgres image创建了一个叫做 db 的container, 上面提供PostgreSQL 数据库服务. 现在让我们创建一个叫做 web的container, 并且把他和 db container连接到一起。 $ sudo docker run -d -P --name web --link db:db training/webapp python app.py 这个命令会吧 db 和 web 连接到一起 --link 的用法: --link name:alias 这里 name 是我们要连接的container的名字, alias 是一link的别名. 下面我们会看到如何使用这个 别名. 下面让我们用 docker ps 看看被连接到一起的container们。 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 349169744e49 training/postgres:latest su postgres -c '/usr About a minute ago Up About a minute 5432/tcp db aed84ee21bde training/webapp:latest python app.py 16 hours ago Up 2 minutes 0.0.0.0:49154->5000/tcp db/web,web 这里我们可以看到我们创建的两个分别叫 db 和 web 的container, 注意 web container 在name列里还显示了另外一个名字db/web。 这个名字告诉我们 web container 被连接到了 db container, 并且建立了一种父子关系。 linking到底有什么用呢?我们已经看到了link在两个container间创建了一个 父子 关系. 父container 这个例子里的 db 可以得到他的子container web上的信息. Docker是通过在 两个container建立了一个安全通道来实现的, 这样container就不用对外暴露端口了. 你可能已经注意到了 我们在启动 db container的时候没有使用 -p 或者 -P。 因为我们已经吧两个container通过 link连接起来了, 所以没必要通过端口暴露数据库的服务了. Docker通过下述两种方法吧子container里的信息暴露给父container: 环境变量 更新 /etc/host 文件 我们先看下docker设定的环境变量。 在 web containre里, 让我们运行 env 命令 列出所有的环境变量。 root@aed84ee21bde:/opt/webapp# env HOSTNAME=aed84ee21bde . . . DB_NAME=/web/db DB_PORT=tcp://172.17.0.5:5432 DB_PORT_5000_TCP=tcp://172.17.0.5:5432 DB_PORT_5000_TCP_PROTO=tcp DB_PORT_5000_TCP_PORT=5432 DB_PORT_5000_TCP_ADDR=172.17.0.5 . . . 注: 这些环境变量只是为第一个在container里的进程设置的。 类似的守护进程(例如 sshd) 会在新建子shell的时候抹除这些变量。 我们可以看到Docker创建了一些列的对于我们使用db很有用的环境变量。 每一个变量都以 DB 开头, 这个 DB 就是上面的那个别名。(译者: 为啥用别名这里就清楚了, image 不用知道其他container的名字, 只用在run的时候把名字映射为自己了解的就可以了) 如果我们起的别名是 db1 那么环境变量的名字的前缀就是 DB1_. 你可以使用这些环境 变量来配置你的应用程序来连接 dbcontainer 里的数据库。 连接是安全的、私有的 仅限于 web 和 db 之间。 除了环境变量之外Docker会把父container的IP添加到子container的/etc/hosts里。我们 看下一下 web container里的hosts文件: root@aed84ee21bde:/opt/webapp# cat /etc/hosts 172.17.0.7 aed84ee21bde . . . 172.17.0.5 db 我们可以看到, 有两个相关的host配置项。 第一个是给 web container 的, 名字 就是container的ID。 第二条吧父container的别名和父container的IP绑到了一起。我们 试着通过host的名字ping一下. **root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-pingroot@aed84ee21bde:/opt/webapp# ping dbPING db (172.17.0.5): 48 data bytes56 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.267 ms56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms** 注 上面第一个命令是用来安装ping的, 因为我们使用的container里没有安装。 我们可以使用这个host吧web服务和数据库服务连接到一起。 注 一个父container可以连接多个子container。 例如, 我们可以把多个web服务的container连接 到一个数据库container上

优秀的个人博客,低调大师

在 Docker 上建立多节点的 Hadoop 集群 【已翻译100%】

在上篇文章中你已经看到了在你的devbox创建一个单点Hadoop 集群是多么简单。 现在我们提高门槛,在Docker上创建一个多点hadoop集群。在开始前,确保你有最新的Ambari镜像: docker pull sequenceiq/ambari:latest 一行命令 一旦你得到了最新的镜像,你就可以启动Docker容器。我们已经创建了几个shell 函数来帮你输入Docker命令,从而避免输入像docker run [options] image [command]这样冗长的命令。 有了这些功能,创建3个节点的hadoop簇,只需要下面一行代码搞定: curl -Lo .amb j.mp/docker-ambari && . .amb && amb-deploy-cluster 默认参数值都是可以根据需要更改的,像是blueprint,簇大小,等等 … 在shellj.mp/docker-ambari功能函数的头文件有参数列表. 它是按照下面步骤来实现的: 在Docker (后台运行) 容器的守护进程上运行sambari-server start (记得还有 anambari-agent start) 运行sn-1 守护进程容器并用ambari-agent start连接到服务器 运行AmbariShell 以及其终端控制台 (监控子进程) AmbariShell 会把内置的多节点blueprint发送至 /api/v1/blueprintsREST API AmbariShell 依照blueprint的设置自动分配宿主信息 通过发送至/api/v1/clustersREST API的内容创建簇 自定义 如果你有自己定义好的脚本,可以放在 gist然后运行 AmbariShell. 先启动 AmbariShell: amb-start-cluster 2 amb-shell AmbariShell启动的前提: Ambari REST API 将帮助你建立多个hadoop端. host list blueprint add --url https://gist.githubusercontent.com/lalyos/xxx/raw/custum-blueprint.json cluster build --blueprint custom-blueprint cluster assign --hostGroup host_group_1 --host amb0.mycorp.kom cluster assign --hostGroup host_group_2 --host amb1.mycorp.kom cluster assign --hostGroup host_group_2 --host amb1.mycorp.kom cluster create AmbariShell 的 hint命令能帮助开发人员实现自动补全等功能. 自动补全包括: 补全命令行 (例如,没有这个帮助下 cluster命令是不可用的) 添加需要的参数 添加备选参数: --后加上 添加变参,像是参数名,宿主名等等 … 总结基本上我们开始使用Docker的时候就已经使用多端的hadoop功能了 – 笔记本上运行3到4簇面临的极限问题比 Sandbox VM少得多. 我们使用了docker的模式简化了hadoop的使用模式 – 可以在 LinkedIn找到我们关于Cloudbreak的最新进展 – 开源云端的Hadoop as a Service API应用并构建在 docker上. 希望本文能帮你简化你的开发流程 – 如有什么关于docker上使用hadoop问题,欢迎沟通.

优秀的个人博客,低调大师

远程执行 Android 设备上的代码 【已翻译100%】(2/2)

我设置好AP后,从13,119个标明有潜在漏洞的app中随机选了一些,把它们安装到接入了AP的一台Nexus 5(运行4.4.3)和一台三星XE700t(运行AOSP 4.2的x86平板)。我们只不过是启动每个App,做些简单的交互操作,就成功地在超过半数的应用中触发了远程代码执行,它们加载了通过中间人代理注入的恶意代码。 为了好玩,我们把注入到一个app中javascript代码反复修改,直到显示Bromium的标志替换了原有广告。 被扰乱而显示了Bromium标志的app的UI截屏。 全是广告惹得祸 通过查看TCP/IP包的轨迹,很快发现广告框架程序就是联合使用了addJavascriptInterface和非安全HTTP下载的罪魁祸首。在我们调查的框架程序中没有一个使用HTTPS,也就意味着任何使用这些框架程序的app在非安全地下载javascript时也易受到攻击。以往的研究显示有17%的app虽然使用了HTTPS,但用法不当,但这是另一回事了。 我们认真地检查了一些app,看看使用用了哪些广告框架。AdMob是用得最多的(通常也是更新最频繁的),但我们发现用到的大量框架仍然在不安全地使用addJavascriptInterface。在检查的app中,有超过80%的非付费app包含了至少一款广告框架。总体上讲,在识别的2140个app中出现了4190个广告框架。 问题有多严重? Google在Play Store上公布了所有app的大致下载量。仅就我们手工确认了存在漏洞的小部分用例,就有超过1.5亿的下载量。这并不是说就保证会有150,000,000部有漏洞的设备,因为一台设备可能安装多个不同的有漏洞的应用。但考虑到我们在分析中发现的比例——10%的app有潜在的风险,其中有50%的有风险的app被实地测试可以被攻击——这就存在非常多有漏洞的设备。 而且,别忘了有57%的Android设备运行在低于4.2的版本上。所以即使明天所有有漏洞的app和框架打上了基于4.2的补丁,仍然有超过一半的Android设备不能修复这个漏洞。 一旦你实现了远程代码的执行,结束之前在咖啡店所描述的灾难情形,不是什么大的进步。初始化一个匹配的root权限(不幸的是,相当一部分在安卓平台上),一个被损害的设备会变成某种中间人,它随后会进入任何网络。因此,攻击开始传播,举例来说,在自带移动设备的世界里,共同的wifi网络是那样地受欢迎。 合并设备分析器(Device Analyser)的数据 设备分析器(Device Analyser)是另外一个用于统计安卓设备的(数据)来源。其中的一项功能就是它追踪用户启动不同的应用的频繁程度。他们用足够地耐心去相互参照潜在缺陷应用的列表上的数据,给出了下面的结果: 每天每用户打开潜在缺陷应用的平均数量 过去一年左右的时间,设备分析器(Device Analyser)的数据显示设备的使用者们每天平均打开0.4-0.5个潜在漏洞的应用。或者换言之,平均一周内就有几次收到(漏洞)攻击。我们不能假设应用的版本比我们分析过存在漏洞的版本新,因此,当我们的示例数据已不再是最新版本,与图形对应也就表现为急剧下降。如果我们对最近的APK版本重新进行我们的分析,我们很有可能看到它仍在0.4分。DA( 设备分析器: Device Analyser)的数据是一个相当小的样本,让它去引导更多地关于安卓设备的结论,在整体上是困难的。 结论 我们发现,通过使用相对简单的中间人代理技术,无需特定的应用程序或设备可以远程运行有危害的应用程序,即使 Android设备安装了完全补丁。使用静态分析我们发现,相当大比例的应用很可能仍然脆弱,我们证实,通过随机测试超过一半的应用确实缺乏抵抗力。 因此,我们建议当连接到一个不可信的wi-fi无线网络时不要使用任何Android应用程序显示广告。 我们感谢Evozi提供他们的APK库,和剑桥大学的设备分析数据。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册