rename images directory to _images
|
@ -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。
|
||||
|
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 100 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
@ -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默认的网络配置。
|
||||
|
|
|
@ -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. 记得重启服务。
|
||||
* 如果你希望永久改变绑定的主机ip地址,可以 在dcoker 配置中指定--ip=IP_ADDRESS. 记得重启服务。
|
||||
|
|
|
@ -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端的消息。
|
||||
|
|
|
@ -163,6 +163,6 @@ docker的命令可以采用`docker-CMD`或者`docker CMD`的方式执行。两
|
|||
docker-wait(1)
|
||||
阻塞直到一个容器终止,然后输出它的退出符
|
||||
|
||||
##一张图总结docker的命令周期
|
||||
##一张图总结Docker的命令
|
||||
|
||||
![命令周期](../images/cmd_logic.png)
|
||||
![命令周期](../_images/cmd_logic.png)
|
||||
|
|
|
@ -25,9 +25,9 @@ Docker的基础是Linux的容器技术(LXC)。
|
|||
|
||||
下面的图片比较了Docker和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
|
||||
|
||||
![传统虚拟化](../images/virtualization.png)
|
||||
![传统虚拟化](../_images/virtualization.png)
|
||||
|
||||
![Docker](../images/docker.png)
|
||||
![Docker](../_images/docker.png)
|
||||
|
||||
|
||||
##为什么要使用docker?
|
||||
|
|
|
@ -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: <LOOPBACK,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
|
||||
1: lo: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,UP,LOWER_UP> 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
|
||||
```
|
||||
这样就直接把容器暴露到你的物理网络上了,多台物理主机的容器也可以相互联网了。需要注意的是,这样就需要自己来保证容器的网络安全了。
|
||||
这样就直接把容器暴露到你的物理网络上了,多台物理主机的容器也可以相互联网了。需要注意的是,这样就需要自己来保证容器的网络安全了。
|
||||
|
|
|
@ -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目录启动即可。这样,在公司内部的开发、测试基本就统一了,不会出现开发提交的代码,测试 部门部署不了的问题。
|
||||
|
|
|
@ -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了!
|
||||
这样我们就可以在新的机器上使用这个images了!
|
||||
|
|