From 1d101330fd9b8f810614bdbc6f47d4d7f1ed4ed6 Mon Sep 17 00:00:00 2001 From: Baohua Yang Date: Thu, 11 Sep 2014 22:52:28 +0800 Subject: [PATCH] express refine --- README.md | 4 +- SUMMARY.md | 91 +++++++++++++------------ arch/internal.md | 2 +- container_security/README.md | 2 +- container_security/kernel_capability.md | 4 +- container_security/summary.md | 2 +- image/README.md | 10 +-- image/create.md | 9 +-- install/README.md | 2 +- install/centos.md | 16 +++-- install/ubuntu124.md | 4 +- install/ubuntu144.md | 20 ++++-- practice/README.md | 2 +- practice/supervisor.md | 4 +- why_use_docker/README.md | 44 ++++++------ why_use_docker/high_efficiency.md | 2 +- 16 files changed, 122 insertions(+), 96 deletions(-) diff --git a/README.md b/README.md index 1040e1e..59a8df3 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ Docker -- 从入门到实践 =============== -v0.1 +v0.11 [Docker] (docker.com)是个伟大的项目! @@ -16,4 +16,4 @@ v0.1 维护本书的Github项目: [https://github.com/yeasy/docker_practice](https://github .com/yeasy/docker_practice) -欢迎大家提交pull request。 \ No newline at end of file +欢迎大家提交pull request。 diff --git a/SUMMARY.md b/SUMMARY.md index 6057b9a..1565bda 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -1,53 +1,56 @@ -#目录 +# Summary + +* [Introduction](README.md) * [为什么要使用docker](why_use_docker/README.md) - - [快速交付应用程序](why_use_docker/fast_deployment.md) - - [更容易部署和扩展](why_use_docker/easy_deployment.md) - - [效率更高](why_use_docker/high_efficiency.md) - - [快速部署也意味着更简单的管理](why_use_docker/easy_management.md) + * [快速交付应用程序](why_use_docker/fast_deployment.md) + * [更容易部署和扩展](why_use_docker/easy_deployment.md) + * [效率更高](why_use_docker/high_efficiency.md) + * [快速部署也意味着更简单的管理](why_use_docker/easy_management.md) * [Docker的体系结构](arch/README.md) - - [内部组件](arch/internal.md) - - [image的工作原理](arch/image.md) - - [仓库](arch/repo.md) - - [容器](arch/container.md) - - [底层技术](arch/underly.md) + * [内部组件](arch/internal.md) + * [image的工作原理](arch/image.md) + * [仓库](arch/repo.md) + * [容器](arch/container.md) + * [底层技术](arch/underly.md) * [安装](install/README.md) - - [Ubuntu 14.04](install/ubuntu144.md) - - [Ubuntu 12.04](install/ubuntu124.md) - - [CentOS](install/centos.md) + * [Ubuntu](install/ubuntu144.md) + * [CentOS](install/centos.md) * [image介绍](image/README.md) - - [获取mage](image/get.md) - - [查找image](image/search.md) - - [下载image](image/download.md) - - [创建自己的image](image/create.md) - - [上传image](image/push.md) - - [移除本地image](image/rmi.md) + * [获取mage](image/get.md) + * [查找image](image/search.md) + * [下载image](image/download.md) + * [创建自己的image](image/create.md) + * [上传image](image/push.md) + * [移除本地image](image/rmi.md) * [网络介绍](network/README.md) - - [端口映射](network/port_mapping.md) - - [docker中的容器互联-linking系统](network/linking.md) + * [端口映射](network/port_mapping.md) + * [docker中的容器互联-linking系统](network/linking.md) * [高级网络配置](advanced_network/README.md) - - [快速配置](advanced_network/fast_config.md) - - [配置DNS](advanced_network/dns.md) - - [容器之间的通信](advanced_network/communication.md) - - [映射一个容器端口到宿主主机](advanced_network/port_mapping.md) - - [定制docker0](advanced_network/docker0.md) - - [创建自己的桥接](advanced_network/bridge.md) - - [Docker 如何连接到容器](advanced_network/how_connect.md) - - [工具和示例](advanced_network/example.md) - - [创建一个点到点连接](advanced_network/ptp.md) + * [快速配置](advanced_network/fast_config.md) + * [配置DNS](advanced_network/dns.md) + * [容器之间的通信](advanced_network/communication.md) + * [映射一个容器端口到宿主主机](advanced_network/port_mapping.md) + * [定制docker0](advanced_network/docker0.md) + * [创建自己的桥接](advanced_network/bridge.md) + * [Docker 如何连接到容器](advanced_network/how_connect.md) + * [工具和示例](advanced_network/example.md) + * [创建一个点到点连接](advanced_network/ptp.md) * [数据管理](data_management/README.md) - - [数据卷](data_management/volume.md) - - [数据卷容器](data_management/container.md) - - [备份、恢复、移动数据卷](data_management/management.md) + * [数据卷](data_management/volume.md) + * [数据卷容器](data_management/container.md) + * [备份、恢复、移动数据卷](data_management/management.md) * [容器安全](container_security/README.md) - - [内核名字空间](container_security/kernel_ns.md) - - [控制组](container_security/control_group.md) - - [守护进程安全](container_security/daemon_sec.md) - - [内核权限](container_security/kernel_capability.md) - - [其他内核安全特性](container_security/other_feature.md) - - [结论](container_security/summary.md) + * [内核名字空间](container_security/kernel_ns.md) + * [控制组](container_security/control_group.md) + * [守护进程安全](container_security/daemon_sec.md) + * [内核权限](container_security/kernel_capability.md) + * [其他内核安全特性](container_security/other_feature.md) + * [结论](container_security/summary.md) * [实战案例](practice/README.md) -- [部署本地仓库](practice/local_repo.md) -- [在Docker中使用 Supervisor来管理进程](practice/supervisor.md) -* [创建tomcat/weblogic集群](practice/tomcat.md) -* [多台物理主机之间的容器互联](practice/container_connect.md) -* [中小企业docker环境搭建](practice/environment.md) + * [部署本地仓库](practice/local_repo.md) + * [使用 Supervisor来管理进程](practice/supervisor.md) + * [创建tomcat/weblogic集群](practice/tomcat.md) + * [多台物理主机之间的容器互联](practice/container_connect.md) + * [中小企业docker环境搭建](practice/environment.md) +* [附:命令查询](command/README.md) + diff --git a/arch/internal.md b/arch/internal.md index 877b8f7..051e2d1 100644 --- a/arch/internal.md +++ b/arch/internal.md @@ -14,4 +14,4 @@ Docker registries 也叫docker仓库,它有公有仓库和私有仓库2种形 ###Docker containers 即docker容器,容器是从image镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。 -*image是只读的,container在启动的时候创建可写的一层作为最上层。 \ No newline at end of file +*image是只读的,container在启动的时候创建可写的一层作为最上层。 diff --git a/container_security/README.md b/container_security/README.md index 105a199..8f42d24 100644 --- a/container_security/README.md +++ b/container_security/README.md @@ -2,4 +2,4 @@ 评估docker的安全性时,主要考虑3个方面: * 由内核中namespace和cgruoups提供的容器的内在安全 * docker程序本身的抗攻击性 -加固内核安全性来影响容器的安全性 \ No newline at end of file +加固内核安全性来影响容器的安全性 diff --git a/container_security/kernel_capability.md b/container_security/kernel_capability.md index 73ca1d1..94da4c8 100644 --- a/container_security/kernel_capability.md +++ b/container_security/kernel_capability.md @@ -8,10 +8,10 @@ 这意味这大部分情况下,容器完全不需要“真正的”root权限。因此,容器可以运行一个减少的capabilities集,容器中的root也比“真正的root"拥有更少的capabilities,比如: * 完全禁止任何mount操作 -* 禁止直接访问宿主主机的socket +* 禁止直接访问宿主主机的socket * 禁止访问一些文件系统的操作,比如创建新的设备node等等 * 禁止模块加载 * 还有一些其他的 就算攻击者在容器中取得了root权限,他能做的破坏也少了,也不能获得主机的更高权限。 -然而这不会影响普通的web apps,恶意的用户会想各种办法来对你!默认情况下,docker丢弃了它需要的功能之外的其余部分。这里有一个白名单和黑名单,在 Linux manpages可以看到完整的清单列表。当然,你还可以启用你需要的额外capabilities。默认docker容器仅使用白名单的内capabilities。 \ No newline at end of file +然而这不会影响普通的web apps,恶意的用户会想各种办法来对你!默认情况下,docker丢弃了它需要的功能之外的其余部分。这里有一个白名单和黑名单,在 Linux manpages可以看到完整的清单列表。当然,你还可以启用你需要的额外capabilities。默认docker容器仅使用白名单的内capabilities。 diff --git a/container_security/summary.md b/container_security/summary.md index 933c6ed..ca0f897 100644 --- a/container_security/summary.md +++ b/container_security/summary.md @@ -1,2 +1,2 @@ ##结论 -docker容器默认还是比较安全的,特别是你如果注意在容器中使用非root权限来允许进程的话。你还可以添加额外的比如Apparmor, SELinux, GRSEC等你熟悉的加固方法。最后,如果你对其他容器系统中的安全特性感兴趣,你也可以在docker中实现它,毕竟,所有的东西都已经在内核中了。 \ No newline at end of file +docker容器默认还是比较安全的,特别是你如果注意在容器中使用非root权限来允许进程的话。你还可以添加额外的比如Apparmor, SELinux, GRSEC等你熟悉的加固方法。最后,如果你对其他容器系统中的安全特性感兴趣,你也可以在docker中实现它,毕竟,所有的东西都已经在内核中了。 diff --git a/image/README.md b/image/README.md index a5c2b63..b03a1eb 100644 --- a/image/README.md +++ b/image/README.md @@ -8,7 +8,7 @@ docker把下载的images存储到docker主机上,如果一个image不在主机 * 使用和管理本地主机上的images * 创建一个基础的images * 上传images到docker hub(公共images仓库) -* 列出本地主机上已经存在的images + 使用 docker images 显示本机上的images ``` @@ -30,13 +30,15 @@ ubuntu 10.04 3db9c44f4520 4 weeks ago 183 MB ubuntu lucid 3db9c44f4520 4 weeks ago 183 MB ``` -当我们启动一个使用这个image的容器时,docker会从docker hub下载它。在列出信息中,我们可以看到3个字段信息 +在列出信息中,可以看到几个字段信息 * 来自于哪个仓库,比如ubuntu * image的标记,比如 14.04 -* 它的ID号 +* 它的ID号(唯一) +* 什么时候被创建的 +* 镜像大小 -一个仓库可能有一个images的都个发行版,比如ubuntu,他们有10.04 12.04 12.10 13.04 14.04,每个发行版的标记都不同,可以使用tag命令来指定images +仓库中可能有同一个images的多个发行版,比如ubuntu镜像,就有10.04、12.04、12.10、13.04、14.04等发行版,每个发行版的标记都不同,可以使用tag信息来指定images 使用一个images的标记来启动容器 ``` $ sudo docker run -t -i ubuntu:14.04 /bin/bash diff --git a/image/create.md b/image/create.md index 632d611..5102f07 100644 --- a/image/create.md +++ b/image/create.md @@ -1,14 +1,15 @@ ##创建我们自己的images -别人的镜像虽然好,但不一定适合我们。我们可以对他们做一些改变,有2个方法: +别人的镜像虽然好,但不一定适合我们。 +我们可以对这些镜像做一些修改,有2个方法: ###第一个方法:使用docker commit 来扩展一个image 先使用image启动容器,更新后提交结果到新的image。 ``` $ sudo docker run -t -i training/sinatra /bin/bash root@0b2616b0e5a8:/# ``` -注意:记住容器的ID ,稍后我们还会用到 +注意:记住容器的ID ,稍后还会用到 -这里我们在容器中添加json gem +在容器中添加json和gem两个应用 ``` root@0b2616b0e5a8:/# gem install json ``` @@ -18,7 +19,7 @@ $ sudo docker commit -m="Added json gem" -a="Kate Smith" 0b2616b0e5a8 ouruser/si 4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c ``` -m 来指定提交的信息,跟我们使用的版本控制工具一样。 --a 可以指定我们更新的用户信息指定我们要从哪个容器ID来创建我们的副本,最后指定目标image的名字。 +-a 可以指定我们更新的用户信息,指定我们要从哪个容器ID来创建我们的副本,最后指定目标image的名字。 这个例子里面,我们指定了一个新用户,ouruser,使用了sinatra的image,最后指定了image的标记v2。 使用docker images来查看我们创建的新image。 diff --git a/install/README.md b/install/README.md index 2f353b8..33a8087 100644 --- a/install/README.md +++ b/install/README.md @@ -1,2 +1,2 @@ #安装 -官方网站上有各个linux发行版的安装指南,这里就写下centos和ubuntu的安装。 \ No newline at end of file +官方网站上有各个linux发行版的安装指南,这里介绍下centos和ubuntu的安装。 \ No newline at end of file diff --git a/install/centos.md b/install/centos.md index b37b1d2..0e5481d 100644 --- a/install/centos.md +++ b/install/centos.md @@ -1,15 +1,23 @@ ##centos6\7系列安装docker 使用EPEL软件仓库可以安装docker,版本必须在centos6 以后 -如果是centos6 +如果是centos6,用下面的命令安装 ``` #wget http://mirrors.hustunique.com/epel/6/i386/epel-release-6-8.noarch.rpm #rpm -ivhepel-release-6-8.noarch.rpm #yum install docker-io ``` -用上面这个命令安装就可以了 -centos7 直接安装就可以了 -如果之前的系统中存在docker这个软件,最好先删除掉这个包,一个老旧的包 + +centos7 直接通过系统命令安装: +``` +yum install docker-io +``` +如果之前的系统中存在docker这个软件,最好先删除掉这个包。 +``` +yum remove docker-io +``` + +安装之后启动docker服务并添加自动启动到系统服务。 ``` $ service docker start $ chkconfig docker on diff --git a/install/ubuntu124.md b/install/ubuntu124.md index 7fc3fdb..b9f43cd 100644 --- a/install/ubuntu124.md +++ b/install/ubuntu124.md @@ -1,4 +1,4 @@ -##Ubuntu12.04安装Docker +##Ubuntu(低版本)安装Docker 如果是更低版本的ubuntu ``` $ sudo apt-get update @@ -6,4 +6,4 @@ $ sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts- # reboot $ sudo reboot ``` -然后重复上面的步骤即可。 \ No newline at end of file +然后重复上面的步骤即可。 diff --git a/install/ubuntu144.md b/install/ubuntu144.md index b840629..774c927 100644 --- a/install/ubuntu144.md +++ b/install/ubuntu144.md @@ -1,4 +1,6 @@ -##Ubuntu 14.04 安装Docker +##Ubuntu 安装Docker + +###通过系统自带包安装 ``` $ sudo apt-get update $ sudo apt-get install docker.io @@ -8,12 +10,22 @@ $ sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io 如果使用操作系统自带包安装docker ,使用上面的办法,安装的版本是0.9.1 (不建议,因为1.0 生产版本已经发布,下面介绍安装方法) -如果要安装最新的docker版本,那么需要安装https支持 +###通过docker源安装最新版本 +如果要安装最新的docker版本,那么需要安装apt-get的https支持 ``` $apt-get install apt-transport-https $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 -$ sudo sh -c "echo deb https://get.docker.io/ubuntu docker main\ -> /etc/apt/sources.list.d/docker.list" +$ sudo sh -c "echo deb https://get.docker.io/ubuntu docker main /etc/apt/sources.list.d/docker.list" $ sudo apt-get update $ sudo apt-get install lxc-docker ``` + +###其它版本 +如果是低版本的ubuntu +``` +$ sudo apt-get update +$ sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring +# reboot +$ sudo reboot +``` +然后重复上面的步骤即可。 diff --git a/practice/README.md b/practice/README.md index 692771c..2e5351f 100644 --- a/practice/README.md +++ b/practice/README.md @@ -1 +1 @@ -#实战案例 \ No newline at end of file +#实战案例 diff --git a/practice/supervisor.md b/practice/supervisor.md index 1bf2f8e..fff71f2 100644 --- a/practice/supervisor.md +++ b/practice/supervisor.md @@ -1,4 +1,4 @@ -##在Docker中使用 Supervisor来管理进程 +##使用 Supervisor来管理进程 docker 容器在启动的时候开启单个进程,比如,一个ssh或则apache 的daemon服务。但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令方到一个启动脚本里面,启动的时候直接启动这个脚本,另外就是安装进程管理工具。. 本小节将使用进程管理工具supervisor来管理容器中的多个进程。使用Supervisor可以更好的控制、管理、重启我们希望运行的进程。在这里我们演示一下如何同时使用ssh和apache服务。 ###dockerfile @@ -51,4 +51,4 @@ $ sudo docker run -p 22 -p 80 -t -i test/supervisords 使用docker run来启动我们创建的容器。使用多个-p 来映射多个端口,这样我们就能同时访问ssh和apache服务了。 ###可以使用这个方法创建一个只有ssh服务基础image -之后创建image可以以这个image为基础来创建 \ No newline at end of file +之后创建image可以以这个image为基础来创建 diff --git a/why_use_docker/README.md b/why_use_docker/README.md index d08bfe8..4c92a81 100644 --- a/why_use_docker/README.md +++ b/why_use_docker/README.md @@ -1,22 +1,22 @@ -#为什么使用Docker -为什么要使用docker? -作为一种新兴的虚拟化方式,docker跟传统的虚拟化方式相比具有众多的优势。 - -docker的基础是Linux Container (LXC)。 -首先,我们来看Linux Container的发展过程。 -我们知道,传统的虚拟机通过在宿主主机中运行hypervisor来模拟一整套完整的硬件环境提供给虚拟机系统。虚拟机系统看到的环境是可限制的,也是彼此隔离的。 -这种直接的做法实现了对资源最完整的封装,但很多时候往往意味着系统资源的浪费。 -例如,以宿主机和虚拟机系统都为Linux系统为例,虚拟机中运行的应用其实可以利用宿主机系统中的运行环境。 - -我们知道,在操作系统中,包括内核、文件系统、网络、PID、UID、IPC、内存、硬盘、CPU等等,所有的资源都是应用进程直接共享的。 -要想实现虚拟化,除了要实现对内存、CPU、网络IO、硬盘IO、存储空间等的限制外,还要实现文件系统、网络、PID、UID、IPC等等的相互隔离。 -前者相对容易实现一些,后者则需要宿主机系统的深入支持。 -随着Linux系统对于名字空间功能的完善实现,程序员已经可以实现上面的所有需求,让某些进程在彼此隔离的名字空间中运行。大家虽然都共用一个内核和某些运行时环境(例如一些系统命令和系统库),但是彼此却看不到,都以为系统中只有自己的存在。这种机制就是Container(容器)。 - -而docker,正是在容器的基础上进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。 - -下面的图片比较了docker之所以能胜出传统虚拟化方式的原因。 - -![传统虚拟化](../images/virtualization.png) - -![Docker](../images/docker.png) \ No newline at end of file +#为什么使用Docker +为什么要使用docker? +作为一种新兴的虚拟化方式,docker跟传统的虚拟化方式相比具有众多的优势。 + +docker的基础是Linux Container (LXC)。 +首先,我们来看Linux Container的发展过程。 +我们知道,传统的虚拟机通过在宿主主机中运行hypervisor来模拟一整套完整的硬件环境提供给虚拟机系统。虚拟机系统看到的环境是可限制的,也是彼此隔离的。 +这种直接的做法实现了对资源最完整的封装,但很多时候往往意味着系统资源的浪费。 +例如,以宿主机和虚拟机系统都为Linux系统为例,虚拟机中运行的应用其实可以利用宿主机系统中的运行环境。 + +我们知道,在操作系统中,包括内核、文件系统、网络、PID、UID、IPC、内存、硬盘、CPU等等,所有的资源都是应用进程直接共享的。 +要想实现虚拟化,除了要实现对内存、CPU、网络IO、硬盘IO、存储空间等的限制外,还要实现文件系统、网络、PID、UID、IPC等等的相互隔离。 +前者相对容易实现一些,后者则需要宿主机系统的深入支持。 +随着Linux系统对于名字空间功能的完善实现,程序员已经可以实现上面的所有需求,让某些进程在彼此隔离的名字空间中运行。大家虽然都共用一个内核和某些运行时环境(例如一些系统命令和系统库),但是彼此却看不到,都以为系统中只有自己的存在。这种机制就是Container(容器)。 + +而docker,正是在容器的基础上进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。 + +下面的图片比较了docker之所以能胜出传统虚拟化方式的原因。 + +![传统虚拟化](../images/virtualization.png) + +![Docker](../images/docker.png) diff --git a/why_use_docker/high_efficiency.md b/why_use_docker/high_efficiency.md index fe44550..1a72dcc 100644 --- a/why_use_docker/high_efficiency.md +++ b/why_use_docker/high_efficiency.md @@ -1 +1 @@ -docker容器的运行不需要额外的hypervisor支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。 \ No newline at end of file +docker容器的运行不需要额外的hypervisor支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。