From 39ef881ace959c35fd8a2b94996a2d15b578e74e Mon Sep 17 00:00:00 2001 From: Charles Date: Sun, 21 Sep 2014 20:27:40 +0800 Subject: [PATCH 1/3] Fixed the wrong Chinese character --- cases/tomcat.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cases/tomcat.md b/cases/tomcat.md index 1bb8b16..c50b697 100644 --- a/cases/tomcat.md +++ b/cases/tomcat.md @@ -68,8 +68,8 @@ docker run -d -v -p 206:22 -p 7005:8080 -v /home/data:/opt/data --name tm3 tomca * 部署一个集群应用程序,只需要安装一次应用到集群上即可 缺点是: * docker配置复杂了 -* 没办法自动扩展集群的计算容量,如需添加节点,需要在administrator上先创建节点,然后再配置心的容器supervisor启动脚本,然后再启动容器 -另外种方法是将所有的程序都安装在adminiserver上面,需要扩展的时候,启动多个节点即可,它的优点和缺点和上一中方法恰恰相反。(目前我使用这种方式来部署开发和测试环境) +* 没办法自动扩展集群的计算容量,如需添加节点,需要在administrator上先创建节点,然后再配置新的容器supervisor启动脚本,然后再启动容器 +另外种方法是将所有的程序都安装在adminiserver上面,需要扩展的时候,启动多个节点即可,它的优点和缺点和上一种方法恰恰相反。(目前我使用这种方式来部署开发和测试环境) ``` docker run -d -v -p 204:22 -p 7001:7001 -v /home/data:/opt/data --name node1 weblogic /usr/bin/supervisord docker run -d -v -p 205:22 -p 7002:7001 -v /home/data:/opt/data --name node2 weblogic /usr/bin/supervisord From 5d00f5476b0a2c34682cd9180caa4bd6edc4ecbf Mon Sep 17 00:00:00 2001 From: Charles Date: Sun, 21 Sep 2014 20:48:49 +0800 Subject: [PATCH 2/3] Fixed the wrong Chinese character --- cases/container_connect.md | 2 +- cases/environment.md | 2 +- cases/supervisor.md | 2 +- security/control_group.md | 2 +- security/daemon_sec.md | 4 ++-- security/kernel_capability.md | 2 +- security/kernel_ns.md | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cases/container_connect.md b/cases/container_connect.md index b20ae47..6b0c30d 100644 --- a/cases/container_connect.md +++ b/cases/container_connect.md @@ -24,7 +24,7 @@ root@ac6474aeb31d:~# ip a valid_lft forever preferred_lft forever ``` 这样就可以把这个网络看成是一个私有的网络,通过nat 连接外网,如果要让外网连接到容器中,就需要做端口映射,即-p参数(更多原理参见本文第六小节) -如果在企业内部应用,或则做多个物理主机的集群,可能需要将多个物理主机的容器组到一个物理网络中来,那么就需要将这个网桥桥接到我们指定的网卡上。 +如果在企业内部应用,或者做多个物理主机的集群,可能需要将多个物理主机的容器组到一个物理网络中来,那么就需要将这个网桥桥接到我们指定的网卡上。 ###拓扑图 主机A和主机B的网卡一都连着物理交换机的同一个vlan 101,这样网桥一和网桥三就相当于在同一个物理网络中了,而容器一、容器三、容器四也在同一物理网络中了,他们之间可以相互通信,而且可以跟同一vlan中的其他物理机器互联。 diff --git a/cases/environment.md b/cases/environment.md index 6450e37..7edb479 100644 --- a/cases/environment.md +++ b/cases/environment.md @@ -7,7 +7,7 @@ ![企业应用结构](../_images/enterprise_usage.png) -Docker占用资源小,在一台E5 128G内存的服务器上部署100个容器都绰绰有余,可以单独抽一个容器或则直接在宿主物理主机上部署samba,利用samba的home分享方案将每个用户的home目录映射到开发中心和测试部门的windows机器上。 +Docker占用资源小,在一台E5 128G内存的服务器上部署100个容器都绰绰有余,可以单独抽一个容器或者直接在宿主物理主机上部署samba,利用samba的home分享方案将每个用户的home目录映射到开发中心和测试部门的windows机器上。 针对某个项目组,由架构师搭建好一个标准的容器环境供项目组和测试部门使用,每个开发工程师可以拥有自己单独的容器,通过`docker run -v` 将用户的home目录映射到容器中。需要提交测试时,只需要将代码移交给测试部门,然后分配一个容器使用`-v` 加载测试部门的home目录启动即可。这样,在公司内部的开发、测试基本就统一了,不会出现开发部门提交的代码,测试部门部署不了的问题。 diff --git a/cases/supervisor.md b/cases/supervisor.md index cb08b36..6e7a5a1 100644 --- a/cases/supervisor.md +++ b/cases/supervisor.md @@ -1,5 +1,5 @@ ##使用 Supervisor来管理进程 -docker 容器在启动的时候开启单个进程,比如,一个ssh或则apache 的daemon服务。但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令方到一个启动脚本里面,启动的时候直接启动这个脚本,另外就是安装进程管理工具。 +docker 容器在启动的时候开启单个进程,比如,一个ssh或者apache 的daemon服务。但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令方到一个启动脚本里面,启动的时候直接启动这个脚本,另外就是安装进程管理工具。 本小节将使用进程管理工具supervisor来管理容器中的多个进程。使用Supervisor可以更好的控制、管理、重启我们希望运行的进程。在这里我们演示一下如何同时使用ssh和apache服务。 diff --git a/security/control_group.md b/security/control_group.md index c6aeee1..4a801f8 100644 --- a/security/control_group.md +++ b/security/control_group.md @@ -1,4 +1,4 @@ ##控制组 控制组是LXC容器的另外一个关键组件,由它来实现资源的审计和限制。他们提供了很多有用的特性,还可以用来确保每个容器可以公平分享主机的内存、CPU、磁盘IO等资源,更重要的是,它可以保证当一个容器耗尽其中一个资源的时候不会连累主机宕机。 -尽管他们不阻止容器之间相互访问、处理数据和进程,但他们在防止拒绝服务攻击方面是必不可少的。在多用户的平台比如共有或则私有的PaaS上更加重要,当某些应用程序表现不好的时候,可以保证一直的uptime和性能。控制组始于2006年,从2.6.24之后被引入。 +尽管他们不阻止容器之间相互访问、处理数据和进程,但他们在防止拒绝服务攻击方面是必不可少的。在多用户的平台比如共有或者私有的PaaS上更加重要,当某些应用程序表现不好的时候,可以保证一直的uptime和性能。控制组始于2006年,从2.6.24之后被引入。 diff --git a/security/daemon_sec.md b/security/daemon_sec.md index 73fed2b..1e06c8e 100644 --- a/security/daemon_sec.md +++ b/security/daemon_sec.md @@ -1,5 +1,5 @@ ##Docker Daemon Attack Surface -运行一个容器或则应用程序意味着运行一个Docker 服务。Docker服务要求root权限,所以你需要了解一些重要的细节。 +运行一个容器或者应用程序意味着运行一个Docker 服务。Docker服务要求root权限,所以你需要了解一些重要的细节。 首先,确保只有可信的用户可以访问docker服务,因为这会直接导致很严重的后果。因为,Docker允许你在主机和容器之间共享文件夹,这就容易让容器突破资源限制。比如当你在启动容器的时候将主机的/映射到容器的/host目录中,那么容器就可以对主机做任何更改了。这听起来很疯狂?不过,你要知道几乎所有虚拟机系统都有在物理主机和虚拟机之间共享资源的限制,所以需要你自己来考虑这一层的安全性。 @@ -7,7 +7,7 @@ 因此,REST API在docker0.5.2之后使用unix socket替代了绑定在127.0.0.1上的tcp socket(后者容易遭受跨站脚本攻击)。现在你可以使用增强的unix sockt权限来限制对控制socket的访问。 -你依然可以将REST API发布到http服务上。不过一定要小心确认这里的安全机制,确保只有可信的网络或则vpn或则受保护的stunnel和ssl认证可以对REST API进行访问。还可以使用https和认证HTTPS and certificates. +你依然可以将REST API发布到http服务上。不过一定要小心确认这里的安全机制,确保只有可信的网络或者vpn或者受保护的stunnel和ssl认证可以对REST API进行访问。还可以使用https和认证HTTPS and certificates. 最近改进的linux namespace将很快可以实现使用非root用户来运行全功能的容器。这解决了因在容器和主机共享文件系统而引起的安全问题。 Docker的终极目标是改进2个安全特性: diff --git a/security/kernel_capability.md b/security/kernel_capability.md index c46e564..5aff970 100644 --- a/security/kernel_capability.md +++ b/security/kernel_capability.md @@ -5,7 +5,7 @@ 这对容器的安全有很多好处,通常的服务器需要允许一大堆root进程,通常有ssh cron syslogd;模块和网络配置工具等等。容器则不同,因为大部分这种人物都被容器外面的基础设施处理了: * ssh可以被主机上ssh服务替代 -* 硬件管理也无关紧要,容器中也就无需执行udevd或则其他类似的服务 +* 硬件管理也无关紧要,容器中也就无需执行udevd或者其他类似的服务 * 网络管理也都在主机上设置,除非特殊需求,ifconfig、route、ip也不需要了。 这意味这大部分情况下,容器完全不需要“真正的”root权限。因此,容器可以运行一个减少的capabilities集,容器中的root也比“真正的root"拥有更少的capabilities,比如: diff --git a/security/kernel_ns.md b/security/kernel_ns.md index dfd6e2a..bceefcb 100644 --- a/security/kernel_ns.md +++ b/security/kernel_ns.md @@ -3,7 +3,7 @@ Docker容器和LXC容器很相似,他们提供的安全特性也差不多。 名字空间提供了最初也是最直接的隔离,在容器中运行的进程不会被运行在主机上的进程和容器发现,他们之间相互影响也就小了。 -每个容器都有自己的网络堆栈,他们不能访问其他容器的sockets接口。不过,如果在主机系统上做了相应的设置,他们还是可以像跟主机交互一样的和其他容器交互通信。当你指定公共端口或则使用links来连接2个容器时,他们就可以相互通信了。(相互ping、udp、tcp都没问题,也可以根据需要设定更严格的策略)从网络架构上来看,所有的容器通过主机的网桥接口相互通信,就像物理机器通过物理交换机通信一样。 +每个容器都有自己的网络堆栈,他们不能访问其他容器的sockets接口。不过,如果在主机系统上做了相应的设置,他们还是可以像跟主机交互一样的和其他容器交互通信。当你指定公共端口或者使用links来连接2个容器时,他们就可以相互通信了。(相互ping、udp、tcp都没问题,也可以根据需要设定更严格的策略)从网络架构上来看,所有的容器通过主机的网桥接口相互通信,就像物理机器通过物理交换机通信一样。 内核提供的名字空间和私有网络的代码有多成熟? From 96b199aae27994cb89e751cbd85affea91a57f5d Mon Sep 17 00:00:00 2001 From: Charles Date: Sun, 21 Sep 2014 20:50:55 +0800 Subject: [PATCH 3/3] Fixed the wrong Chinese character 2 --- cases/container_connect.md | 2 +- cases/environment.md | 2 +- cases/supervisor.md | 2 +- security/control_group.md | 2 +- security/daemon_sec.md | 4 ++-- security/kernel_capability.md | 2 +- security/kernel_ns.md | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cases/container_connect.md b/cases/container_connect.md index b20ae47..6b0c30d 100644 --- a/cases/container_connect.md +++ b/cases/container_connect.md @@ -24,7 +24,7 @@ root@ac6474aeb31d:~# ip a valid_lft forever preferred_lft forever ``` 这样就可以把这个网络看成是一个私有的网络,通过nat 连接外网,如果要让外网连接到容器中,就需要做端口映射,即-p参数(更多原理参见本文第六小节) -如果在企业内部应用,或则做多个物理主机的集群,可能需要将多个物理主机的容器组到一个物理网络中来,那么就需要将这个网桥桥接到我们指定的网卡上。 +如果在企业内部应用,或者做多个物理主机的集群,可能需要将多个物理主机的容器组到一个物理网络中来,那么就需要将这个网桥桥接到我们指定的网卡上。 ###拓扑图 主机A和主机B的网卡一都连着物理交换机的同一个vlan 101,这样网桥一和网桥三就相当于在同一个物理网络中了,而容器一、容器三、容器四也在同一物理网络中了,他们之间可以相互通信,而且可以跟同一vlan中的其他物理机器互联。 diff --git a/cases/environment.md b/cases/environment.md index 6450e37..7edb479 100644 --- a/cases/environment.md +++ b/cases/environment.md @@ -7,7 +7,7 @@ ![企业应用结构](../_images/enterprise_usage.png) -Docker占用资源小,在一台E5 128G内存的服务器上部署100个容器都绰绰有余,可以单独抽一个容器或则直接在宿主物理主机上部署samba,利用samba的home分享方案将每个用户的home目录映射到开发中心和测试部门的windows机器上。 +Docker占用资源小,在一台E5 128G内存的服务器上部署100个容器都绰绰有余,可以单独抽一个容器或者直接在宿主物理主机上部署samba,利用samba的home分享方案将每个用户的home目录映射到开发中心和测试部门的windows机器上。 针对某个项目组,由架构师搭建好一个标准的容器环境供项目组和测试部门使用,每个开发工程师可以拥有自己单独的容器,通过`docker run -v` 将用户的home目录映射到容器中。需要提交测试时,只需要将代码移交给测试部门,然后分配一个容器使用`-v` 加载测试部门的home目录启动即可。这样,在公司内部的开发、测试基本就统一了,不会出现开发部门提交的代码,测试部门部署不了的问题。 diff --git a/cases/supervisor.md b/cases/supervisor.md index cb08b36..6e7a5a1 100644 --- a/cases/supervisor.md +++ b/cases/supervisor.md @@ -1,5 +1,5 @@ ##使用 Supervisor来管理进程 -docker 容器在启动的时候开启单个进程,比如,一个ssh或则apache 的daemon服务。但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令方到一个启动脚本里面,启动的时候直接启动这个脚本,另外就是安装进程管理工具。 +docker 容器在启动的时候开启单个进程,比如,一个ssh或者apache 的daemon服务。但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令方到一个启动脚本里面,启动的时候直接启动这个脚本,另外就是安装进程管理工具。 本小节将使用进程管理工具supervisor来管理容器中的多个进程。使用Supervisor可以更好的控制、管理、重启我们希望运行的进程。在这里我们演示一下如何同时使用ssh和apache服务。 diff --git a/security/control_group.md b/security/control_group.md index c6aeee1..4a801f8 100644 --- a/security/control_group.md +++ b/security/control_group.md @@ -1,4 +1,4 @@ ##控制组 控制组是LXC容器的另外一个关键组件,由它来实现资源的审计和限制。他们提供了很多有用的特性,还可以用来确保每个容器可以公平分享主机的内存、CPU、磁盘IO等资源,更重要的是,它可以保证当一个容器耗尽其中一个资源的时候不会连累主机宕机。 -尽管他们不阻止容器之间相互访问、处理数据和进程,但他们在防止拒绝服务攻击方面是必不可少的。在多用户的平台比如共有或则私有的PaaS上更加重要,当某些应用程序表现不好的时候,可以保证一直的uptime和性能。控制组始于2006年,从2.6.24之后被引入。 +尽管他们不阻止容器之间相互访问、处理数据和进程,但他们在防止拒绝服务攻击方面是必不可少的。在多用户的平台比如共有或者私有的PaaS上更加重要,当某些应用程序表现不好的时候,可以保证一直的uptime和性能。控制组始于2006年,从2.6.24之后被引入。 diff --git a/security/daemon_sec.md b/security/daemon_sec.md index 73fed2b..1e06c8e 100644 --- a/security/daemon_sec.md +++ b/security/daemon_sec.md @@ -1,5 +1,5 @@ ##Docker Daemon Attack Surface -运行一个容器或则应用程序意味着运行一个Docker 服务。Docker服务要求root权限,所以你需要了解一些重要的细节。 +运行一个容器或者应用程序意味着运行一个Docker 服务。Docker服务要求root权限,所以你需要了解一些重要的细节。 首先,确保只有可信的用户可以访问docker服务,因为这会直接导致很严重的后果。因为,Docker允许你在主机和容器之间共享文件夹,这就容易让容器突破资源限制。比如当你在启动容器的时候将主机的/映射到容器的/host目录中,那么容器就可以对主机做任何更改了。这听起来很疯狂?不过,你要知道几乎所有虚拟机系统都有在物理主机和虚拟机之间共享资源的限制,所以需要你自己来考虑这一层的安全性。 @@ -7,7 +7,7 @@ 因此,REST API在docker0.5.2之后使用unix socket替代了绑定在127.0.0.1上的tcp socket(后者容易遭受跨站脚本攻击)。现在你可以使用增强的unix sockt权限来限制对控制socket的访问。 -你依然可以将REST API发布到http服务上。不过一定要小心确认这里的安全机制,确保只有可信的网络或则vpn或则受保护的stunnel和ssl认证可以对REST API进行访问。还可以使用https和认证HTTPS and certificates. +你依然可以将REST API发布到http服务上。不过一定要小心确认这里的安全机制,确保只有可信的网络或者vpn或者受保护的stunnel和ssl认证可以对REST API进行访问。还可以使用https和认证HTTPS and certificates. 最近改进的linux namespace将很快可以实现使用非root用户来运行全功能的容器。这解决了因在容器和主机共享文件系统而引起的安全问题。 Docker的终极目标是改进2个安全特性: diff --git a/security/kernel_capability.md b/security/kernel_capability.md index c46e564..5aff970 100644 --- a/security/kernel_capability.md +++ b/security/kernel_capability.md @@ -5,7 +5,7 @@ 这对容器的安全有很多好处,通常的服务器需要允许一大堆root进程,通常有ssh cron syslogd;模块和网络配置工具等等。容器则不同,因为大部分这种人物都被容器外面的基础设施处理了: * ssh可以被主机上ssh服务替代 -* 硬件管理也无关紧要,容器中也就无需执行udevd或则其他类似的服务 +* 硬件管理也无关紧要,容器中也就无需执行udevd或者其他类似的服务 * 网络管理也都在主机上设置,除非特殊需求,ifconfig、route、ip也不需要了。 这意味这大部分情况下,容器完全不需要“真正的”root权限。因此,容器可以运行一个减少的capabilities集,容器中的root也比“真正的root"拥有更少的capabilities,比如: diff --git a/security/kernel_ns.md b/security/kernel_ns.md index dfd6e2a..bceefcb 100644 --- a/security/kernel_ns.md +++ b/security/kernel_ns.md @@ -3,7 +3,7 @@ Docker容器和LXC容器很相似,他们提供的安全特性也差不多。 名字空间提供了最初也是最直接的隔离,在容器中运行的进程不会被运行在主机上的进程和容器发现,他们之间相互影响也就小了。 -每个容器都有自己的网络堆栈,他们不能访问其他容器的sockets接口。不过,如果在主机系统上做了相应的设置,他们还是可以像跟主机交互一样的和其他容器交互通信。当你指定公共端口或则使用links来连接2个容器时,他们就可以相互通信了。(相互ping、udp、tcp都没问题,也可以根据需要设定更严格的策略)从网络架构上来看,所有的容器通过主机的网桥接口相互通信,就像物理机器通过物理交换机通信一样。 +每个容器都有自己的网络堆栈,他们不能访问其他容器的sockets接口。不过,如果在主机系统上做了相应的设置,他们还是可以像跟主机交互一样的和其他容器交互通信。当你指定公共端口或者使用links来连接2个容器时,他们就可以相互通信了。(相互ping、udp、tcp都没问题,也可以根据需要设定更严格的策略)从网络架构上来看,所有的容器通过主机的网桥接口相互通信,就像物理机器通过物理交换机通信一样。 内核提供的名字空间和私有网络的代码有多成熟?