diff --git a/README.md b/README.md index 4ecc726..50128af 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ Docker —— 从入门到实践 =============== -v0.1.6 +v0.1.8 -[Docker](docker.com)是个伟大的项目,它彻底释放了虚拟化的威力! +[Docker](docker.com)是个伟大的项目,它让虚拟化变得前所未有的高效和轻松,彻底释放了虚拟化的威力! -本书最初源于[WaitFish](mailto:dwj_wz@163.com)的"Docker学习手册v1.0" pdf内容,后来,[yeasy](github.com/yeasy) +本书最初源于[WaitFish](mailto:dwj_wz@163.com)的"Docker学习手册v1.0" pdf内容。后来,[yeasy](github.com/yeasy) 根据最新Docker版本对内容进行了修订和重写,并增加了部分内容;与[WaitFish](mailto:dwj_wz@163.com)协商,将所有内容开源,采用互联网合作的方式进行创作和维护。 本书既适用于具备基础Linux知识的Docker初学者,也可供希望理解原理和底层实现的高级用户参考。同时,本书中给出的实践案例,可供在进行实际部署时借鉴。 @@ -16,6 +16,6 @@ v0.1.6 .com/yeasy/docker_practice)。 欢迎大家参与,提交pull request。 -另外,欢迎大家加入QQ群(341410255)一起交流学习,共同提高。 +另外,欢迎大家加入Docker QQ群(341410255)一起交流学习,共同提高。 本书发布时,docker的最新版本为1.20。 diff --git a/images/cmd_logic.dot b/_images/cmd_logic.dot similarity index 100% rename from images/cmd_logic.dot rename to _images/cmd_logic.dot diff --git a/images/cmd_logic.png b/_images/cmd_logic.png similarity index 100% rename from images/cmd_logic.png rename to _images/cmd_logic.png diff --git a/images/container_connect_topology.png b/_images/container_connect_topology.png similarity index 100% rename from images/container_connect_topology.png rename to _images/container_connect_topology.png diff --git a/images/cover.png b/_images/cover.png similarity index 100% rename from images/cover.png rename to _images/cover.png diff --git a/images/docker.png b/_images/docker.png similarity index 100% rename from images/docker.png rename to _images/docker.png diff --git a/images/docker0.png b/_images/docker0.png similarity index 100% rename from images/docker0.png rename to _images/docker0.png diff --git a/images/docker_arch.png b/_images/docker_arch.png similarity index 100% rename from images/docker_arch.png rename to _images/docker_arch.png diff --git a/images/enterprise_usage.png b/_images/enterprise_usage.png similarity index 100% rename from images/enterprise_usage.png rename to _images/enterprise_usage.png diff --git a/images/virtualization.png b/_images/virtualization.png similarity index 100% rename from images/virtualization.png rename to _images/virtualization.png diff --git a/advanced_network/README.md b/advanced_network/README.md index 01a266d..24db6e3 100644 --- a/advanced_network/README.md +++ b/advanced_network/README.md @@ -1,9 +1,10 @@ -#docker高级网络配置 -当docker启动时,会在主机上创建一个docker0的虚拟网卡。他随机挑选RFC1918私有网络中的一段地址给docker0。比如172.17.42.1/16,16位掩码的网段可以拥有65534个地址可以使用,这对主机和容器来说应该足够了。 -注意:本章介绍docker的高级网络配置,一般情况下你不需要知道这些也可以使docker正常工作。简单的网络配置和介绍请看第五章内容。 +#高级网络配置 +当Docker启动时,会在主机上创建一个docker0的虚拟网卡。他随机挑选RFC1918私有网络中的一段地址给docker0。比如`172.17.42.1/16`,16位掩码的网段可以提供65534个地址供使用,这对主机和容器来说应该足够了。 + +本章将介绍Docker的高级网络配置,一般情况下你不需要知道这些也可以使Docker正常工作。简单的网络配置和介绍请看第五章内容。 docker0 不是普通的网卡,他是桥接到其他网卡的虚拟网卡,容器使用它来和主机相互通信。当创建一个docker容器的时候,它就创建了一个对接口,当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包,它们是绑在一起的一对孪生接口。这对接口在容器中那一端的的名字是eth0,宿主主机端的会指定一个唯一的名字,比如vethAQI2QT这样的名字,这种接口名字不再主机的命名空间中。所有的veth*的接口都会桥接到docker0,这样docker就创建了在主机和所有容器之间一个虚拟共享网络。 -![Docker网络](../images/docker0.png) +![Docker网络](../_images/docker0.png) 接下来的部分将介绍在一些场景中,docker所有的网络定制配置。linux的原生命令将调整、补充、甚至替换docker默认的网络配置。 diff --git a/advanced_network/port_mapping.md b/advanced_network/port_mapping.md index a70959b..9be9937 100644 --- a/advanced_network/port_mapping.md +++ b/advanced_network/port_mapping.md @@ -13,7 +13,7 @@ MASQUERADE all -- 172.17.0.0/16 !172.17.0.0/16 ``` 当你希望容器接收外部连接时,你需要在docker run执行的时候就指定对应选项,第五章详细介绍了2种方法: -* 指定-P --publish-all=true|false 选项会映射dockerfile +* 指定-P --publish-all=true|false 选项会映射dockerfile 中expose的所有端口,主机端口在49000-49900中随机挑选。当你的另外一个容器需要学习这个端口时候,很不方便。 * 指定-p SPEC或则 --publish=SPEC,可以指定任意端口从主机映射容器内部 @@ -32,6 +32,6 @@ target prot opt source destination DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:80 ``` 注意: -* 这里看到docker映射了0.0.0.0.它接受主机上的所有接口地址。可以通过-p IP:host_port:container_port 或则 -p +* 这里看到docker映射了0.0.0.0.它接受主机上的所有接口地址。可以通过-p IP:host_port:container_port 或则 -p IP::port 来指定主机上的ip、接口,制定更严格的规则。 -* 如果你希望永久改变绑定的主机ip地址,可以 在dcoker 配置中指定--ip=IP_ADDRESS. 记得重启服务。 \ No newline at end of file +* 如果你希望永久改变绑定的主机ip地址,可以 在dcoker 配置中指定--ip=IP_ADDRESS. 记得重启服务。 diff --git a/arch/README.md b/arch/README.md index 882acb0..c8184cf 100644 --- a/arch/README.md +++ b/arch/README.md @@ -3,7 +3,7 @@ docker采用了C/S架构,包括client端和daemon端。 docker daemon作为server端接受来自client的请求,并处理这些请求(创建、运行、分发容器)。 client端和server端既可以运行在一个机器上,也可通过socket或者RESTful API来进行通信。 -![Docker基本架构](../images/docker_arch.png) +![Docker基本架构](../_images/docker_arch.png) Docker daemon一般在宿主主机后台运行,等待接收来自client端的消息。 diff --git a/command/README.md b/command/README.md index 911ae87..7d56308 100644 --- a/command/README.md +++ b/command/README.md @@ -163,6 +163,6 @@ docker的命令可以采用`docker-CMD`或者`docker CMD`的方式执行。两 docker-wait(1) 阻塞直到一个容器终止,然后输出它的退出符 -##一张图总结docker的命令周期 +##一张图总结Docker的命令 -![命令周期](../images/cmd_logic.png) +![命令周期](../_images/cmd_logic.png) diff --git a/introduction/README.md b/introduction/README.md index 8d08f08..6138a19 100644 --- a/introduction/README.md +++ b/introduction/README.md @@ -25,9 +25,9 @@ Docker的基础是Linux的容器技术(LXC)。 下面的图片比较了Docker和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。 -![传统虚拟化](../images/virtualization.png) +![传统虚拟化](../_images/virtualization.png) -![Docker](../images/docker.png) +![Docker](../_images/docker.png) ##为什么要使用docker? diff --git a/practice/container_connect.md b/practice/container_connect.md index 0388d67..b20ae47 100644 --- a/practice/container_connect.md +++ b/practice/container_connect.md @@ -1,7 +1,7 @@ ##多台物理主机之间的容器互联(暴露容器到真实网络中) docker 默认的桥接网卡是docker0。它只会在本机桥接所有的容器网卡,举例来说容器的虚拟网卡在主机上看一般叫做veth*** 而docker只是把所有这些网卡桥接在一起,如下: ``` -[root@opnvz ~]# brctl show +[root@opnvz ~]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.56847afe9799 no veth0889 veth3c7b @@ -10,17 +10,17 @@ docker0 8000.56847afe9799 no veth0889 在容器中看到的地址一般是像下面这样的地址: ``` root@ac6474aeb31d:~# ip a -1: lo: mtu 1500 qdisc noqueue state UNKNOWN group default +1: lo: mtu 1500 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever - inet6 ::1/128 scope host + inet6 ::1/128 scope host valid_lft forever preferred_lft forever 11: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 4a:7d:68:da:09:cf brd ff:ff:ff:ff:ff:ff inet 172.17.0.3/16 scope global eth0 valid_lft forever preferred_lft forever - inet6 fe80::487d:68ff:feda:9cf/64 scope link + inet6 fe80::487d:68ff:feda:9cf/64 scope link valid_lft forever preferred_lft forever ``` 这样就可以把这个网络看成是一个私有的网络,通过nat 连接外网,如果要让外网连接到容器中,就需要做端口映射,即-p参数(更多原理参见本文第六小节) @@ -28,7 +28,7 @@ root@ac6474aeb31d:~# ip a ###拓扑图 主机A和主机B的网卡一都连着物理交换机的同一个vlan 101,这样网桥一和网桥三就相当于在同一个物理网络中了,而容器一、容器三、容器四也在同一物理网络中了,他们之间可以相互通信,而且可以跟同一vlan中的其他物理机器互联。 -![物理拓扑图](../images/container_connect_topology.png) +![物理拓扑图](../_images/container_connect_topology.png) ###ubuntu示例 下面以ubuntu为例创建多个主机的容器联网: @@ -68,10 +68,10 @@ DOCKER_OPTS="-b=br0" ``` root@ubuntudocker:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -58b043aa05eb desk_hz:v1 "/startup.sh" 5 days ago Up 2 seconds 5900/tcp, 6080/tcp, 22/tcp yanlx +58b043aa05eb desk_hz:v1 "/startup.sh" 5 days ago Up 2 seconds 5900/tcp, 6080/tcp, 22/tcp yanlx root@ubuntudocker:~# brctl show bridge name bridge id STP enabled interfaces br0 8000.7e6e617c8d53 no em1 vethe6e5 ``` -这样就直接把容器暴露到你的物理网络上了,多台物理主机的容器也可以相互联网了。需要注意的是,这样就需要自己来保证容器的网络安全了。 \ No newline at end of file +这样就直接把容器暴露到你的物理网络上了,多台物理主机的容器也可以相互联网了。需要注意的是,这样就需要自己来保证容器的网络安全了。 diff --git a/practice/environment.md b/practice/environment.md index 96fd86e..ecec27e 100644 --- a/practice/environment.md +++ b/practice/environment.md @@ -2,7 +2,7 @@ docker对于中小企业来说,搭建paas没有那个精力,也没那个必要,用做个人的sandbox用处又小了点,个人认为作为中小企业可以用docker来标准化开发、测试、生产环境。 -![企业应用结构](../images/enterprise_usage.png) +![企业应用结构](../_images/enterprise_usage.png) docker占用资源小,在一台E5 128G内存的服务器服务器上部署100个容器都绰绰有余,可以单独抽一个容器或则直接在宿主物理主机上部署samba,利用samba的home分享方案将每个用户的home目录映射到开发中心和测试部门的windows机器上。可以针对项目组,由架构师搭建好一个标准的容器环境供项目组和测试部门使用,每个开发工程师可以拥有自己单独的容器,通过docker run -v 将用户的home目录映射到容器中。需要提交测试时,只需要将代码移交给测试部门,然后分配一个容器使用-v 加载测试部门的home目录启动即可。这样,在公司内部的开发、测试基本就统一了,不会出现开发提交的代码,测试 部门部署不了的问题。 diff --git a/practice/local_repo.md b/practice/local_repo.md index fd554db..9f17ff9 100644 --- a/practice/local_repo.md +++ b/practice/local_repo.md @@ -25,12 +25,12 @@ ubuntu 14.04 05ac7c0b9383 17 seconds ago ###创建私有仓库 官方指南称最简单的办法是 docker run -p 5000:5000 registry,如果被墙了,也无法下载该images。感谢CSDN,我有一个1M的腾讯云服务器,上面搭建了一个私有仓库大家可以使用 docker pull 203.195.193.251:5000/registry -到我的服务器下载 速度虽然慢点,但有保证! +到我的服务器下载 速度虽然慢点,但有保证! 另外的方法是使用刚才的创建的ubuntu来创建,官方有个docker仓库的源码地址 https://github.com/dotcloud/docker-registry 下载私有仓库的源码,可以根据上面的docker file来创建。 也可以参考: http://www.vpsee.com/2013/11/build-your-own-docker-private-regsitry-service/ - + ###在私有仓库上传、下载、搜索images 创建好自己的私有仓库之后,可以使用docker tag 一个镜像,然后push,然后在别的机器上pull下来就好了。这样我们的局域网私有docker仓库就搭建好了。 步骤如下: @@ -70,7 +70,7 @@ apt-get install curl ``` root ~ # apt-get install curl Reading package lists... Done -Building dependency tree +Building dependency tree Reading state information... Done The following NEW packages will be installed: curl @@ -93,15 +93,15 @@ root ~ # curl http://192.168.7.26:5000/v1/search ``` [root@opnvz ~]# docker pull 192.168.7.26:5000/test Pulling repository 192.168.7.26:5000/test -ba5877dc9bec: Download complete -511136ea3c5a: Download complete -9bad880da3d2: Download complete -25f11f5fb0cb: Download complete -ebc34468f71d: Download complete -2318d26665ef: Download complete +ba5877dc9bec: Download complete +511136ea3c5a: Download complete +9bad880da3d2: Download complete +25f11f5fb0cb: Download complete +ebc34468f71d: Download complete +2318d26665ef: Download complete [root@opnvz ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE 192.168.7.26:5000/test latest ba5877dc9bec 6 weeks ago 192.7 MB ``` -这样我们就可以在新的机器上使用这个images了! \ No newline at end of file +这样我们就可以在新的机器上使用这个images了!