前言 xiii2 M" f' }3 M9 o$ B, q
% J9 _+ R) a- i$ x) ~1 |, Y* U. w第1 章 Docker 入门 1
" [4 }% B: ]. `' l! D4 \* A
* F1 M# k" T1 U. I }$ H) A1.0 简介 1
: U! H% v% T6 K* ?+ S1 `
' N1 U0 Q: S/ {! n# |1.1 在Ubuntu 14.04 上安装Docker 23 a" d; H" w2 G
7 B) @& k7 A+ @( c; W9 D3 H
1.2 在CentOS 6.5 上安装Docker 3' ?0 _* [/ R4 [; \
" o6 ~# {) P6 h$ e
1.3 在CentOS 7 上安装Docker 4, X* o- y2 }( }2 U7 _) S4 }
8 i/ J- B4 @4 E1 v$ j0 S1.4 使用Vagrant 创建本地Docker 主机 4* A5 R: A( U& g, _
0 z5 O. | W8 R5 F1.5 在树莓派上安装Docker 6
- y% O. R& h) `; n& C# m5 A" Y
. D( u% Y- G Z$ B @7 ]1.6 在OS X 上通过Docker Toolbox 安装Docker 7
% c5 X9 q. P6 l" A: ?9 M4 e9 b; g, g0 E1 D
1.7 在OS X 上通过Boot2Docker 安装Docker 9
$ ] |# H, w# w: @* A. y" h- ]8 @- t: r8 V2 N
1.8 在Windows 8.1 台式机上运行Boot2Docker 13
$ p1 s, }% w5 H4 e+ a/ z1 x( l2 M* |: a6 U4 P& O! g t+ o& n
1.9 使用Docker Machine 在云中创建Docker 主机 14
& V# w& C$ f% ~2 w7 N
5 ~) P/ d: t3 k1 M+ |& j1 X1.10 使用Docker 实验版二进制文件 18
; R0 |" Q y0 S5 m2 K& T
) @0 A# E- Y" i; c& V5 i0 T Z1.11 在Docker 中运行Hello World 18
$ a* H, h& K; T, F( T" k7 r. h+ _; U3 x3 _1 J9 I# U
1.12 以后台方式运行Docker 容器 20
$ Z8 B. d4 m3 w; K7 g+ N* k( }# y& ?/ M
1.13 创建、启动、停止和移除容器 21
3 e/ _' W9 T$ C) F
o, j4 d/ z7 K* Z) Z1.14 使用Dockerfile 构建Docker 镜像 22
7 _: O" V. E# E; w3 a" e
4 g# Z& H# H5 W8 P- H2 y1.15 在单一容器中使用Supervisor 运行WordPress 24
& \2 u/ `! E$ a6 ]+ m9 Y6 {, J7 ]
1.16 使用两个链接在一起的容器运行WordPress 博客程序 26
% h# }4 n: C5 p8 j$ \0 A; [0 j: |
1.17 备份在容器中运行的数据库 28# E4 v& t1 r# a* t
7 ^% Z. d2 v' O4 |9 S* n1.18 在宿主机和容器之间共享数据 30' Y8 N" Z' r. {9 N' W5 m+ W
+ c# K- V$ G1 L! ]
1.19 在容器之间共享数据 319 o8 ~ t+ L$ C5 I3 {
5 x1 q+ p: }% ?5 }* Y: @ j
1.20 对容器进行数据复制 32
& m3 K% Y/ t4 ]& |+ v- N. H3 Z5 M# k9 R3 }! e
第2 章 创建和共享镜像 34/ `; q$ k& T! O5 j1 D' s, T, Q
: n `( I3 m4 g/ `- }2.0 简介 34
* P0 |, S2 m) a0 l4 K. R% R* j ^; n; Z+ g/ K4 T! K
2.1 将对容器的修改提交到镜像 35
* }5 a0 A6 F* Q6 n+ i/ ~* }- h( t- w# X0 J T# V8 i
2.2 将镜像和容器保存为tar 文件进行共享 36* C7 A; Z7 c. ?) S
% Q. Y3 l; s2 D# D, S$ W+ K. ^5 c, S2.3 编写你的个Dockerfile 37
8 | c2 h; G. m" h9 b1 O
* |2 J3 `& v! q. _! _ P/ B/ {2.4 将Flask 应用打包到镜像 40
4 p/ d0 I, i8 ], L' P
h: m r9 K' S6 ]2.5 根据实践优化Dockerfile 42" O; T/ I5 H: G% d2 U5 }( f5 t# H+ O$ ]
8 q7 x' p" l z/ J8 w2.6 通过标签对镜像进行版本管理 43
9 ], P# f3 N+ O6 d( }# v) d: y7 E0 G4 E6 y1 p; m
2.7 使用Docker provider 从Vagrant 迁移到Docker 45
9 j2 @% F5 f1 h/ t
/ X N( N3 X/ z. p- y2.8 使用Packer 构建Docker 镜像 47' B% w* _9 \ p- h$ Y# Z. @7 M
( v ? v7 M. W$ ^, {& p2.9 将镜像发布到Docker Hub 50% \' `: Q! x$ X: u6 E" ]
2 a4 B9 y w0 _( P( V' M1 `2 F
2.10 使用ONBUILD 镜像 53
m" H5 d6 S8 ~. U
% |) l7 M, k/ {- I" b+ N" B2.11 运行私有registry 541 U0 {5 \" I6 b5 D/ A
8 J0 u$ h8 c" X9 X5 L
2.12 为持续集成/部署在Docker Hub 上配置自动构建 56
( _+ q) G; [* m6 F/ w# ~ y7 ^& Z0 M
2.13 使用Git 钩子和私有registry 建立本地自动构建环境 60& o c% u9 c# T0 @
: _5 p- W* E+ a2.14 使用Conduit 进行持续部署 61
8 Y! Z& J7 ~. v# _4 s1 V8 A) B# V" `: f9 x9 U. h- h& O
第3 章 Docker网络 63
1 G% q. W$ K% u
, F' z, [7 K$ X% W8 F3.0 简介 63
7 b. v& w+ Q$ K
, {2 q% C% A) Z" ~2 c& q& e/ P3.1 查看容器的IP地址 643 G: ~: {! Y* u$ w' l
% Z9 F7 }( ~) P! o: u3.2 将容器端口暴露到主机上 658 }9 A7 B/ v( S/ m# m" T
: z- {8 c; Y4 y5 n3.3 在Docker中进行容器链接 67; d9 _( ]1 I+ b& D
6 @' ], r T& I0 {8 y
3.4 理解Docker容器网络 69
. F/ w4 _% `) w$ Q- K% y' i4 ?0 Q
" N2 K$ Y$ k" v. G3.5 选择容器网络模式 72
: z1 Z& s. l& W% Z+ ~
- D: Y0 l0 r' E6 O3.6 配置Docker 守护进程iptables 和IP 转发设置 74( A+ N0 F u( S! G) i1 W4 w
A) B; o/ G2 h- l! y" E# @
3.7 通过Pipework 理解容器网络 75
& e6 r+ a D- k
& P* ^6 w d7 s3.8 定制Docker 网桥设备 80
3 o5 A7 B" N, W! P( ~( I6 C
- v I- O _- [3.9 在Docker 中使用OVS 81& K$ O V0 D1 Y9 x9 j$ X( `
" `& M( r4 N, F6 t2 Q( v- Z$ z6 g2 B h3.10 在Docker 主机间创建GRE 隧道 83# Y5 o5 C7 }; j% u! a! i# y1 U( s
0 U H2 h8 K: C3.11 在Weave 网络上运行容器 85
A7 ^; D _# n1 ?9 i
/ C+ x" t9 W9 F7 `8 z5 Z$ K3.12 在AWS 上运行Weave 网络 87' I, f% s- X9 V, J" t( z5 \
) ]* U7 v" }; `
3.13 在Docker 主机上部署flannel 覆盖网络 89
1 Y) g6 p& B/ |" `: u s; J8 R3 ] b% a; C/ i" Z
3.14 在多台Docker 主机中使用Docker Network 905 L! X b* ]7 e3 _" Q. k. _2 P
6 F( B: [- z* H/ P( K) k! W3.15 深入Docker Network 命名空间配置 94% s6 X! M$ k: L" E, q j# N
/ m. _' ?- d4 {8 D+ {4 _
第4 章 开发和配置Docker 96. d! B9 {1 v) h( S( W
6 c7 z0 F5 x5 m" M0 A( h8 f4.0 简介 96
) S" ~/ u! Z1 W- O9 M! W0 [& p( ~/ s, a8 ?1 u y
4.1 管理和配置Docker 守护进程 97. _6 U; O5 V6 [0 {# u U
" Q" ^+ D+ w; S* b) t4.2 从源代码编译自己的Docker 二进制文件 98
0 W( w! V9 D, s7 B! `6 |
% }! V' b; U* W3 c4.3 为开发Docker 运行Docker 测试集 100' T/ Z( O' h, o# O/ m
$ r5 x! ^0 @. ?# @" ^( F8 s O% \; N
4.4 使用新的Docker 二进制文件替换当前的文件 1012 S. n- a. \. M3 b# L; y% E5 b S
' D' s# x3 h. N" g8 J$ s
4.5 使用nsenter 1029 R5 H" i. K4 @
9 w0 b7 T5 R: R7 h& C" Q( ]% f
4.6 runc 简介 104( m! L# ~& H _/ ~
( b+ J; n$ s3 |& X5 ~
4.7 远程访问Docker 守护进程 106
U, W* G. l) w- P- w% a$ f0 p3 G6 v0 S, c+ V3 A% |
4.8 通过Docker 远程API 完成自动化任务 107
6 A7 S- p6 i$ i, D. r$ M8 j( s: }. ?2 u- [& a" E3 y x4 U9 r
4.9 从远程安全访问Docker 守护进程 109& F" }& k2 r2 k
; k. \' m. I, g6 `
4.10 使用docker-py 访问远程Docker 守护进程 111 M7 |8 z) U" O1 h _ g
; U: t% Z' ?+ b# m$ _% @4.11 安全使用docker-py 113- y9 D$ T% C6 c7 P6 m. c
3 e9 V0 U; R: c; H3 a" [2 _4.12 更改存储驱动程序 113
7 X9 Y8 u! u2 t! t
# p4 y: {( b( w2 H1 N: H第5 章 Kubernetes 116
0 _% W7 k: |6 W% K2 q0 B% z6 n1 V4 g/ p4 r. R( `1 t
5.0 简介 116: `8 ~4 ?8 R0 L2 v" u) w5 W; z
3 I7 ?2 Y5 l' `( B. A
5.1 理解Kubernetes 架构 118( C% B4 Q4 Z& @4 B& y
$ F1 c% y, e/ ^% o/ t- \3 ]5.2 用于容器间连接的网络pod 1202 y4 T* a. {! b! m1 R1 V( F2 o, z( A
: W1 V* g/ v6 P% _: L- m
5.3 使用Vagrant 创建一个多节点的Kubernetes 集群 1211 s8 |' B6 w, v; z5 q
9 J# o3 k4 D7 e
5.4 在Kubernetes 集群上通过pod 启动容器 124
) V. R& s+ r! q( [5 W3 r
. G( \0 e$ W2 U, b* m% g( _# k5.5 利用标签查询Kubernetes 对象 1269 T- p9 p4 w3 v/ _/ F+ R
9 z8 S( e* n& T! b2 m; ~5.6 使用replication controller 管理pod 的副本数 127' q0 R0 T; c+ V+ c9 V) l: s
- j* e& b; E" A9 ~- |
5.7 在一个pod 中运行多个容器 129
. D: ? ^- z, H( l7 h2 f1 P8 \, O) W/ j
5.8 使用集群IP 服务进行动态容器链接 131
5 i. @$ F7 V9 D/ f* N3 X( L" E. ~7 Z5 V$ E$ ^2 a
5.9 使用Docker Compose 创建一个单节点Kubernetes 集群 1359 h0 M, m8 o: v4 t( x8 L( o7 n: f
3 v* w' E/ z4 g5.10 编译Kubernetes 构建自己的发布版本 139
/ _5 o K5 V' A1 n# D, l" w
" h5 j R6 M/ [2 R. w5.11 使用hyperkube 二进制文件启动Kubernetes 组件 141
9 H8 p+ m9 \ P N" f
* V* C5 B }2 D: X5.12 浏览Kubernetes API 1425 j' L8 T- f6 P' ?3 e
" z+ s( @- z( J9 c/ \( S5.13 运行Kubernetes 仪表盘 146
9 U& M# x$ s! w
U0 q# k% h. c' u( m; |5.14 升级老版本API 147, v; ?- \) R. r" Y W' B7 u
4 H, |" O8 m+ @; p0 x5.15 为Kubernetes 集群添加身份验证支持 149; Q# @ R! j, r
8 c& q+ C6 {- |$ x
5.16 配置Kubernetes 客户端连接到远程集群 150- i _4 X& f+ C. ?. z
, `. R9 A8 j/ k$ e% ~) \0 M2 V第6 章 为Docker 优化的操作系统 152: P3 [# N! i6 s; ~( Q2 ?
2 c, p1 O' R$ F) I! M
6.0 简介 1521 z3 F1 z6 A" ?; X! { V
/ T4 O. D F: d2 Y7 n, n
6.1 在Vagrant 中体验CoreOS Linux 发行版 153) s+ a$ N7 r- n, B5 o1 e' Y8 O
7 C5 u! j& c6 `* n. |7 b, p4 N+ l6.2 使用cloud-init 在CoreOS 上启动容器 155) L/ U# v9 d: n1 B H: @7 I
# ~" o% ]9 t* f' P
6.3 通过Vagrant 启动CoreOS 集群,在多台主机上运行容器 157
2 e# h; I' G* x* ^
0 Q p3 {# Z6 |# ~, \6.4 在CoreOS 集群上通过fleet 启动容器 160
' } v9 I; ~! _9 w/ V* j& L }. Z" I1 b
6.5 在CoreOS 实例之间部署flannel 覆盖网络 162) v- Z4 c- p5 O" {# n
( l5 k+ n W4 t/ P0 C8 v6.6 使用Project Atomic 运行Docker 容器 164
1 Y$ D1 ]! D0 ?: j; {% f1 u" Z, R* j9 b. `+ @+ P3 A
6.7 在AWS 上启动Atomic 实例运行Docker 165# n, S2 ?+ K8 M0 u( F# D) {3 h$ V3 S
* u0 H" S4 A2 u! [9 R
6.8 快速体验在Ubuntu Core Snappy 上运行Docker 167
! [2 `; @& q' A% E5 _' N. w7 d5 k5 x# {( o$ C
6.9 在AWS EC2 上启动Ubuntu Core Snappy 实例 1696 S, T G# x4 B; U# c/ N
$ q( ]$ P5 D' ^, i6.10 在RancherOS 中运行Docker 容器 173
g& i3 ^' Q5 x& \
. |' z+ m6 O3 N' F( O第7 章 Docker 生态环境:工具 175
; c0 [! t0 r4 \ K& s
* t6 g: y4 u T% n& ?. A7.0 简介 175
9 l' ^, Z0 J* }: c$ o, g; Q5 y' ^/ G& V
7.1 使用Docker Compose创建WordPress站点 176
7 ^& F# o/ V! v8 ~( G
7 S0 o/ r0 W& ?% N7.2 使用Docker Compose在Docker上对Mesos和Marathon进行测试 179
' q5 U9 \6 T8 m. ^- M3 j1 {; g4 _1 Q
7.3 在Docker Swarm 集群上运行容器 181
( D7 f* m' U2 _
& g- g1 O [0 y7.4 使用Docker Machine创建跨云计算服务提供商的Swarm集群 183
6 l+ ^% m. Y* c- o4 |% E; C! c0 m8 {/ ~5 [2 U ]
7.5 使用Kitematic UI 管理本地容器 185
& P9 O# `2 X- ]% `. D: y: S; H& D( E' {# |' x! c, `0 k
7.6 使用Docker UI 管理容器 187
% \: S+ F4 \% t7 k) G: ]
* p8 P# r. z% B3 b% Y3 i6 ~' F7.7 使用Wharfee 交互式shell 189
6 E3 d% \8 I) e, e: q0 g$ E
* a1 @- L5 d, }' {7 Y, V/ o/ c7.8 使用Ansible 的Docker模块对容器进行编排 190, P$ @- O1 Y' N' i
( M) G/ D7 s2 {$ n
7.9 在Docker主机集群中使用Rancher管理容器 193
2 T) v' \% z4 k' j( P
8 z/ H) H5 t9 ~& U4 q' R2 R7.10 使用Lattice 在集群中运行容器 196# a! t K. E5 Y+ Y$ k
* |) C, W8 O+ ?
7.11 通过Apache Mesos 和Marathon 运行容器 198
5 Y/ N! g" x+ O5 {! c2 M6 R! V/ i+ B! w4 x
7.12 在Mesos 集群上使用Mesos Docker 容器化 202
) t9 r2 X+ x9 q5 C
) D9 c2 x8 {: j' x( {& w7.13 使用registrator 发现Docker 服务 204' v0 K( E' U Z
* H+ k/ z, }# Y$ f4 j& V- s" [! Q
第8 章 云计算中的Docker 208) c' @! b" o+ h/ p r
1 G& |! b6 F8 d8.0 简介 208
5 s* N a/ e4 [' c G& d$ y9 z/ ~7 \/ l
8.1 在公有云中运行Docker 209/ f7 K+ y) [2 A1 ]* U. E' ?
% h5 N' ]1 ?- f4 m1 B( L# f+ s5 p8.2 在AWS EC2 上启动Docker 主机 212
* l0 S4 \' J; A, W7 i
% ?4 b$ u4 M8 B" `8.3 在Google GCE 上启动Docker 主机 215
3 i0 U4 s2 F" _0 Y1 P( q7 y i W% `7 T2 {) V
8.4 在Microsoft Azure 上启动Docker 主机 218' v1 E- }+ {" M9 X9 r# U
+ j# D+ `; {8 Q) t" }8 a: S
8.5 在AWS 上使用Docker Machine 启动Docker 主机 220
2 x8 f7 `8 }; Y3 @, k8 o2 i# C5 k x# e# \, o7 }- i5 [
8.6 在Azure 上使用Docker Machine 启动Docker 主机 222
4 P C" S* p/ V! C) Y& L0 a7 J. [ L+ Z0 w: c% f7 ~ |' q$ F1 d
8.7 在Docker 容器中运行云服务提供商的CLI 224
! ]9 X4 N( T% b8 X4 n* x' C! q2 |, }0 n5 I$ g. N
8.8 使用Google Container registry 存储Docker 镜像 226
5 u( a: o5 x. d* w |% M- V+ a; o; ^* s/ p+ V% Z
8.9 在GCE Google-Container 实例中使用Docker 229
7 C: @$ N& {5 d& x* K, R* r9 E8 ?3 X+ F% M" j
8.10 通过GCE 在云中使用Kubernetes 2312 W* R( B! u# B5 g
: Y" {/ \9 l4 N; ?8.11 配置使用EC2 Container Service 234
& z# x: q4 j( i9 k3 d) F" S: Y1 ], _# @
8.12 创建一个ECS 集群 237
. u. P+ M: \; z8 i) g
6 B5 w# K) S0 Y; o8.13 在ECS 集群中启动Docker 容器 240
& l* m7 X0 t7 I6 H Z# @" k' h2 T5 \+ u
8.14 利用AWS Beanstalk 对Docker 的支持在云中运行应用程序 244
* N) r9 T0 l6 u- L3 j* i# D+ i: C4 S
/ c' H7 g' X5 y6 R) o+ |& k第9 章 监控容器 248
1 H# k( R$ ^; ~) k* X, c6 b, Y5 I- w$ i1 V! e& k4 L* ^
9.0 简介 248
9 ]' |9 @3 R9 s5 o! X) t
3 m& E3 n6 c7 b& F; q) k9 b9.1 使用docker inspect 命令获取容器的详细信息 2497 i7 K1 D# S9 R+ B
1 u0 S. r: Z8 x! \( s, Q" D. b7 U9.2 获取运行中容器的使用统计信息 251
3 K# H% d% Z9 |/ Z+ I- E% z h
/ ?# D0 [9 p9 o5 u: L, D6 C9.3 在Docker 主机上监听Docker 事件 252" V& @: D; V/ Z7 [# {, t( f
. i6 B! ]* K2 V$ x
9.4 使用docker logs 命令获取容器的日志 254
# S! Z' x$ c5 F% c5 S% b1 V( n) m I
9.5 使用Docker 守护进程之外的日志记录驱动程序 2541 z j$ U; ^. w
8 e" Y2 X( D& V& U& g
9.6 使用Logspout 采集容器日志 257
8 h/ \3 g& D6 Q; H/ e3 n' x7 B) j8 _+ p
9.7 管理Logspout 路由来存储容器日志 259
8 W, x. B' ]+ o5 n: R: C& K( A$ [) U% K5 E& M
9.8 使用Elasticsearch 和Kibana 对容器日志进行存储和可视化 261
* g" R. G" M7 Y/ H
0 I- t2 ^# y3 F4 y0 ?7 H2 a$ l9.9 使用Collectd 对容器指标进行可视化 262+ h8 H. x: [. G, o
: B2 h. c. |* P
9.10 使用cAdvisor 监控容器资源使用状况 267
% M5 ?8 a5 \9 _1 _* E+ G$ F
* g# j* q5 t; M) N. I1 W9.11 通过InfluxDB、Grafana 和cAdvisor 监控容器指标 269
) Q, t" `6 d+ m+ l1 e+ S' q d' W F% Q5 G) l- R/ v0 P$ t+ |: a" p
9.12 使用Weave Scope 对容器布局进行可视化 270
1 l9 k7 w/ o1 N5 D$ a. k% s
; u5 M3 b1 B$ s: _! S# L第10 章 应用用例 272* I* L9 `4 K1 z6 ?& N6 m+ V
- {5 I9 Q$ ^, a2 k' D7 d0 I- M1 U0 C10.0 简介 272
3 m0 r. |) |$ X* y0 ?6 Q1 U
3 S- F/ ] K7 q D' [8 r' i$ @10.1 CI/CD:构建开发环境 273
9 r% E# t0 J) h# f
) J: i3 \& ~0 U' [10.2 CI/CD:使用Jenkins 和Apache Mesos 构建持续交付工作流 276
, W* r6 G; n7 g2 T* B) V# k) J, T {" z. k6 E( W" |' Q/ z1 O
10.3 ELB:使用confd 和registrator 创建动态负载平衡器 2803 l+ }% L. ~) w' q5 v P" Z" B& Z
4 ?9 C& s) y! X8 k. c/ ?
10.4 DATA:使用Cassandra 和Kubernetes 构建兼容S3 的对象存储 286. F5 i" Y. Y( }: r) o
java8.com: n/ e% w$ T" T
10.5 DATA:使用Docker Network 构建MySQL Galera 集群 290
- f) v( j; P' Q" _) S2 _$ c3 E4 O7 n, A2 l
10.6 DATA:以动态方式为MySQL Galera 集群配置负载平衡器 292
7 V; | B+ ?+ x" B: b- s7 O4 y3 z' V$ u
10.7 DATA:构建Spark 集群 294
$ P, L4 S% i: j0 m7 P$ X: r
# b9 p4 \5 h. E关于作者 298
2 b6 \ k# y; R0 R2 p% ^* H0 i9 m* h x4 O9 L8 k- n% d
关于封面 298
5 L$ j3 ^5 g; r
' n- D( F1 y. Y% ]
% @* d* H" ^2 z W# K! N( r" x