第 一部分 Docker基础
- ]% | X" A0 a6 A9 c+ f0 y) r R& m) t7 I$ C$ t8 A
第 1章 Docker初探 3
) @- d8 G# m6 j( k9 f0 W3 Y! N. G Z5 O& o' j( v3 n
1.1 Docker是什么以及为什么用Docker 46 ~& T/ w" j1 C0 U
8 O' E1 ~$ Z/ E1.1.1 Docker是什么 4
8 q% V( Z, T) N M* B! Z: R2 O( ^- `- B
1.1.2 Docker有什么好处 6
! j. c4 e+ B; A9 @! b
- N8 K( ?* T: C2 E( |1.1.3 关键的概念 8$ v; R, j+ V$ M3 p( G
8 K( [4 J+ b7 M! M& v; s
1.2 构建一个Docker应用程序 10
+ ~% I4 Z- W& \/ p- T6 |& Y! B. p/ F+ x# |
1.2.1 创建新的Docker镜像的方式 11
/ B4 h1 y0 c3 d' Y ^1 k/ @( \- m* [( {; s) w# c
1.2.2 编写一个Dockerfile 111 \6 O$ G% J- Q7 E3 C' U0 u) n
7 r7 V& h. Y) [8 L1.2.3 构建一个Docker镜像 12
4 U; |1 L: |- A/ w9 t
" @4 ~6 F: y% `0 A* X1.2.4 运行一个Docker容器 14
3 D# k6 Z$ v+ z6 P
+ X2 ~1 [5 |. o. H& Q* y. H/ G7 y1.2.5 Docker分层 16# `, F8 S! W* c( f$ }
3 H. d& M" ~7 Z: h) T
1.3 小结 17
* m) A% D+ @' O3 ?) ^1 G
$ Q, t( g. R- I4 S r第 2章 理解Docker——深入引擎室 18
+ }. p& m% F5 F [ X" g E
4 ^; n9 t. Q6 ^2.1 Docker的架构 18: v7 _0 x* ^0 @3 q7 T2 a
2 s, P8 L' B; r: h& o2.2 Docker守护进程 20) z# @. a" G* i6 f7 N- p' A
" p% I) m9 G+ W0 x j1 b! R F技巧1 向世界开放Docker守护进程 20
6 P3 V) X) ^& V9 Y6 l% k; D! B# {, D5 l" f: X
技巧2 以守护进程方式运行容器 22
4 m1 L$ [( Z9 L1 O& Z5 j
; Q6 \2 ^% _: y# Q. h- K+ Y6 [技巧3 将Docker移动到不同分区 24
; p7 B5 H1 O! @* N+ E# h C U* X; D* V: y# c; A8 G; j# j% u1 L
2.3 Docker客户端 257 m6 S; B0 l1 Y; t# L
' D* R& r9 }4 q7 y% x
技巧4 使用socat监控Docker API流量 252 @ F% d' b/ ?: R2 B7 |% ~9 u
o: }6 O( m$ \+ {, D* j- P
技巧5 使用端口连接容器 28
! }% U6 F7 p# H* P/ }4 y9 g) \- S% x4 h( Z Q- E
技巧6 链接容器实现端口隔离 29
3 J" C' U- d# {: o5 q
- y) \, D, C+ ~$ p技巧7 在浏览器中使用Docker 31
% H |, c0 ?7 Y( `$ B
: R, B# x/ q6 W1 L1 s) ]2.4 Docker注册中心 33. f3 f* ]6 Z% h; v
( r# E" D/ ]5 H0 B- ^技巧8 建立一个本地Docker注册中心 34
J! _; z, h) U# r- Y* Z% s8 V) c" |* R" h% X$ Q
2.5 Docker Hub 34
3 j0 o, I: M* p, A0 G
, q1 _2 z2 ]6 H9 `; \$ w技巧9 查找并运行一个Docker镜像 35# n2 [$ x" K" t% k; f2 }5 ?
! q4 V- |5 E) d4 Y+ b; B- M2.6 小结 37
( k% p9 Z z3 w2 q. d& ?& |: ?' `" N' s/ q
第 二部分 Docker与开发" A6 u* {/ R7 g! W% L
/ K. U3 v5 J' `! L# e7 ~# H第3章 将Docker用作轻量级虚拟机 41) f/ N6 w+ {% U
& V2 {/ d+ c7 ]% b3.1 从虚拟机到容器 42
4 U( F; A& p, I6 K! G( B9 q5 M0 j7 o. z+ o; y! x3 w
技巧10 将虚拟机转换为容器 42 w& ~& A# g) [" Q% A
+ A, {: b8 N; f9 U3 @3 R技巧11 类宿主机容器 44
9 W" v) X8 l8 ]0 {
: X$ j, Z2 K6 K$ Z技巧12 将一个系统拆成微服务容器 46
! k6 w" y: f( m$ c( i6 l$ d; E! F# G0 `9 ^1 k2 c7 }$ f! [- u
3.2 管理容器的服务 49/ Z. m7 W5 |, ~0 l8 v+ ]: u- _
. C7 p! q, p* j, D8 F, g
技巧13 管理容器内服务的启动 507 q0 F3 ~4 |, ]5 G' W4 e, d* W
3 T _* h: Y' S L/ X! ?4 L3.3 保存和还原工作成果 52) {9 p4 T; ]; G/ J' Q% Z
0 @. _+ _0 B: B3 e技巧14 在开发中“保存游戏”的方式 52
. {$ b% r( {9 t9 h; R! d$ @0 J( I1 d
; u% {$ `. X1 @ L. i: @7 B技巧15 给Docker打标签 54- @9 }5 J9 I( g7 k0 j
+ e- I+ R4 r. z- [
技巧16 在Docker Hub上分享镜像 56
5 ]# r, u$ G9 {* `4 O5 ]0 W5 ^( O1 S2 j' H, x
技巧17 在构建时指向特定的镜像 58& j' T. }, G# T, n$ @
6 ?/ I0 N0 A$ P' I: ^# t! B/ H0 t3.4 进程即环境 59
7 _2 d% C( H2 D) R
: I5 @, X: Z6 }* e' Y+ I4 Z技巧18 在开发中“保存游戏”的方式 59
( I) {2 v7 @& R5 H) F
' ], x- |, G3 U% P$ N: o. b6 D3.5 小结 61" ` E* E: Q/ A6 T7 u C
& [3 `/ v' b' S' D第4章 Docker日常 625 F& ?* d/ ^# a; X+ g0 T7 w/ Z% L/ T
! F6 Z' }& R; _; ^: s; O, ]4.1 卷——持久化问题 62
, n9 v. V7 V; L+ R- D+ k2 f/ a% o# G" L+ ]0 [. H X$ T" `* T
技巧19 Docker卷——持久化的问题 63; Q3 t! G Y! a2 m
" n4 K6 h$ c# G% c3 B% @) e2 h& U' X技巧20 通过BitTorrent Sync的分布式卷 640 l- T$ m9 v$ w, K% x- J. o
5 L0 k2 w1 P" H6 r1 [
技巧21 保留容器的bash历史 66
% ~* @6 `" r# C! A& v: _# R9 z/ ?0 } S1 T5 P
技巧22 数据容器 688 s# w; C& Z. }/ a5 I! S, q, u
: V6 n5 l; J% Y& ]2 { D# L1 R
技巧23 使用SSHFS挂载远程卷 702 r/ r* j9 q1 ^" A
8 D! y2 @* v5 h9 h' T4 ~/ v技巧24 通过NFS共享数据 72: F+ z& B0 C7 S- |& T& F* r
- d# R/ q- ]6 h) | l% j3 h1 y技巧25 开发工具容器 75
. X. T) g7 H, a5 ]. B; q. |0 l3 O$ f# K. Y
4.2 运行容器 76 m6 I& `5 a1 a3 ^- J& ?
) n, h7 h( _$ ?( }' v* T
技巧26 在Docker里运行GUI 76- g9 p! l8 E8 F% t& f
$ h6 @/ d. ^, V- f, O& _
技巧27 检查容器 78
8 }% w% O: ~& C; P1 m, f
, P1 Y6 W7 q6 z7 a8 h* ^技巧28 干净地杀掉容器 80
4 [' b8 ^! q2 f1 g3 g+ \ C7 [9 m) I6 b* I/ M' r
技巧29 使用Docker Machine来置备Docker宿主机 81
( a$ L' z0 H: g/ Y& p& |) i$ y; R" \5 j
4.3 构建镜像 84
7 s9 j) i9 A9 Q7 ~
7 Y4 c( T; `, E; T6 u技巧30 使用ADD将文件注入到镜像 85
% d7 C3 m/ D$ r. H
2 @$ g4 o$ c9 _* m3 b8 b6 A技巧31 重新构建时不使用缓存 87
0 U. e) H2 H: u+ H( m% _8 m2 v7 x( ^9 w+ r6 g0 {0 x, ]' t: q/ U
技巧32 拆分缓存 89" k% [. o* s; l5 |
. G" ]9 s; ]( w7 ]- V1 m( ^* i
4.4 保持阵型 90
9 r& g/ F% T$ T8 N
( X% q% J* d* v. I* A) ?2 }: S8 v技巧33 运行Docker时不加sudo 90" F5 S5 V) _, s: ^! A K* Y9 K
* M( t9 V: C9 {" F1 m# X* C3 V技巧34 清理容器 91
" L9 X6 S& u [' B, P9 n) I( l& I) F) @+ b. |% l, T% k. h8 k# t
技巧35 清理卷 92
* O, J$ {( M6 \8 n7 w$ k5 k0 q
$ \7 w# l/ p/ e1 Y3 ]# z技巧36 解绑容器的同时不停掉它 94" s/ ]: P( W! M$ B' @
% t& V% j' m$ r! F2 V& p: i w技巧37 使用DockerUI来管理Docker守护进程 95
+ s; X4 W3 k( f8 X8 O8 \9 R
$ g2 L k" i* ~* L技巧38 为Docker镜像生成一个依赖图 96
% m1 k! G$ c( G2 l% S* R
+ K% M. t4 P4 R% ~ g
7 w# M! i7 ]4 h. F9 x9 k0 T8 W3 p Z5 a6 S" U- s4 z
技巧39 直接操作——对容器执行命令 97
- n% r, \# T: Z4 [" Z' N
+ [5 u8 M$ S, r! ?5 t W) K4.5 小结 993 N. h) L8 M8 d) A$ c1 Z/ |5 S* H# H
3 S7 v6 o5 Z: d
第5章 配置管理——让一切井然有序 100$ m ^" f- }. h8 H3 ?3 ^8 T
9 G" l, T8 @& g& g5.1 配置管理和Dockerfile 100
* N# F+ e- }1 M. y8 K- u% ^" Z8 L" O* u- D2 u5 i, Q5 K) n
技巧40 使用ENTRYPOINT创建可靠的定制工具 101; Q. M$ j4 Z0 Y; E+ [! d
3 r/ w q$ C h% P. p
技巧41 在构建中指定版本来避免软件包的漂移 1028 C% N" k. H, g J
' D8 D1 H2 z# x1 q) f* u( e
技巧42 用perl -p -i -e替换文本 104- T* A" t; F0 O: b* x+ i1 V
, {) g. p" U3 c3 S8 ?) S技巧43 镜像的扁平化 105. U3 f" W% E% K2 a. I7 |. o. _ e. o
; k% h6 d7 `* P0 ^) ~: `: U; a
技巧44 用alien管理外来软件包 107+ B( r w* F E2 @
( \# q/ ?; V; a0 v技巧45 把镜像逆向工程得到Dockerfile 109+ W: Q8 T- h) i. ^5 d$ ~: w
, y/ U3 I4 ?: p: C( l1 b* S
5.2 传统配置管理工具与Docker 112
5 g; t& f" M4 }9 M9 q
/ \1 l( U/ q, x; D8 y" z1 N技巧46 传统方式:搭配make和Docker 112 W" [* R4 x5 f; v9 C
_( g. m5 U, v技巧47 借助Chef Solo构建镜像 114( r, \8 m6 e8 o# r
2 ?) _) n2 ~6 b5 R m
技巧48 从源到镜像的构建 118
- u3 t/ K8 l' D! D( M
* G+ q4 V) ~# D2 b1 f8 g! Y5.3 小即是美 1231 R7 e# u% {' G9 n2 T$ a
+ l: p$ }0 C- h* L a8 r/ a
技巧49 保持构建镜像更小的Dockerfile技巧 123* G$ o6 Y& u8 _9 \% ?6 ?* F1 I
7 r% _0 Z' p9 D- ?7 q技巧50 让镜像变得更小的技巧 1268 ^- M. Y* W$ ?5 ^
/ Q+ T" N6 T* r# m- [; s技巧51 通过BusyBox和Alpine来精简Docker镜像 128
G. v1 X" u* G! c& y8 s x- x1 c3 d. `
技巧52 Go模型的小容器 129- J3 q% E- E! ]1 x+ `7 O& p" b
5 r& Z4 b* }# e( T
技巧53 使用inotifywait给容器瘦身 132
5 V3 E. V. ^0 I, n$ s9 A$ B
' g9 v3 v! R* K) W% F R1 ], t技巧54 大也可以美 134' M% s0 m W0 m( E, H: |7 i6 q3 `2 V$ z
6 _! L( r9 R7 B9 G7 u5.4 小结 136# q, w6 `1 Z* @1 J" ~1 k
0 Q+ z6 s3 U" l7 f* U; e) c' s2 W" Z第三部分 Docker与DevOps! v$ V2 z8 } L. A( z& e w0 V
: F+ c+ b4 p- Z- z/ w
第6章 持续集成:加快开发流水线 139
" ~1 [! M: c1 ? n6 J6 A. f3 y! G* ^7 ]% N- N. A2 ~" e7 L
6.1 Docker Hub自动化构建 139
2 H) o6 O) I& {; }9 ?' k
4 r* ^. q0 x& [7 ?; z技巧55 使用Docker Hub工作流 140
. h6 Q5 M1 N% a) E; j: l0 g
! K- `' j8 R/ ]9 A0 t* a; t6.2 更有效的构建 1430 }4 u* f- s; A. R
( B' z4 l3 N4 m/ x, B3 V技巧56 使用eatmydata为I/O密集型构建提速 143
7 C: j/ d6 X. T4 Z6 m0 t% B9 ^9 t7 u0 q
技巧57 设置一个软件包缓存用于加快构建速度 145
4 E( D* ^' M7 R. S
, N3 b u7 B! Z0 j7 _# K7 j( L5 Z2 f技巧58 在Docker内部运行Selenium测试 147
7 b+ A5 s( K) x+ k( r- j& o+ e" X: m
6.3 容器化CI过程 1512 s% x+ p& Q1 t
% x; q- }' d3 y) X9 \) b$ ]1 C技巧59 包含一个复杂的开发环境 151
7 k6 w! p. M0 w2 Y. o# i6 a
; g9 S. T( _8 q. ^) I技巧60 在一个Docker容器里运行Jenkins主服务器 156
$ D' [( A- v! S P6 o
2 Z0 O5 ?7 Q/ S* p; U技巧61 使用Jenkins的Swarm插件扩展CI 158( J! D5 M# B' C; Z( f
: M% h9 V$ q; `+ Y7 n
6.4 小结 161
% `+ ?) _- r$ M7 p0 k$ m" H* n' Y- X9 @4 a, i8 j
第7章 持续交付:与Docker原则完 美契合 162
' M; T) q6 o" D) o3 W' w
`, W' W- I$ x- L. o z7.1 在CD流水线上与其他团队互动 163. o j L5 ~" V+ [3 d( @
$ p8 o0 b+ E9 ?技巧62 Docker契约——减少摩擦 1632 @ D& K. I$ S+ K- B
/ h* g" J, y) w( ?7.2 推动Docker镜像的部署 165: i, a4 [ b; f$ A
. w6 o+ e6 ?- a$ s/ j, p技巧63 手动同步注册中心镜像 165: M2 V) N+ {2 ]" h T7 v" p0 ?
0 F# V2 p/ \, ?& t K6 e% X7 g6 C
技巧64 通过受限连接交付镜像 166
* C" l+ f8 ?- X/ \
6 O# d O% {3 @2 y8 R! `6 ], I技巧65 以TAR文件方式共享Docker对象 168, K! u2 ~7 t/ a
, o5 u7 E. u! v
7.3 为不同环境配置镜像 170- [7 m9 g5 a+ |
/ T3 n7 O. g- `* ^! a; T, N
技巧66 使用etcd通知容器 170
3 L, z$ y" M* c; z/ d/ d$ o
: q4 G2 \4 O! I7.4 升级运行中的容器 172
5 y+ V+ n q$ r4 R( P
. A1 Z! u7 D$ L' k6 _技巧67 使用confd启用零停机时间切换 173/ u4 k0 W% x& ^2 l6 j
; @$ y; F) h$ c7 c" @0 z7.5 小结 1773 r9 l& J3 f* V/ B6 O* _" J& s
5 O v! [- ]0 y; U+ o: P0 g第8章 网络模拟:无痛的现实环境测试 178
% r: h' l/ S9 n5 k9 |& ]/ d' { w K) c; S- S. @
8.1 容器通信——超越手工链接 178
- E; a3 @& K' O& L( n$ ~6 f* G/ c4 l' z; y; n
技巧68 一个简单的Docker Compose集群 178
: O# W4 b, k/ N8 v6 V1 U: K; \" r, |5 Y( n) D
技巧69 一个使用Docker Compose的SQLite服务器 182
9 h6 k8 V6 q+ r' R: C
, i F5 Z2 _( E7 p技巧70 使用Resolvable通过DNS查找容器 185
# O) v/ N9 z' a( B( S0 p' N6 R7 S d$ T- J" r5 g* C: p
8.2 使用Docker来模拟真实世界的网络 188. A8 l) |& A U4 I/ Y
; }& f k/ |( c1 p/ c* o4 m
技巧71 使用Comcast模拟有问题的网络 188; B+ h# Q& C7 Y2 ^
5 n/ [( a5 z# |: K% h+ T# I技巧72 使用Blockade模拟有问题的网络 191
7 L/ R4 g. I0 P% B) D3 O4 F4 |( V! I: ^/ O( D* G* y( n/ ]
8.3 Docker和虚拟网络 194
+ B9 Q0 ~; ?8 S K. s+ a" W+ f& C
. B7 H! d, {8 N6 V/ d7 V5 h/ k技巧73 使用Weave建立一个基底网络 195
% n" A4 f. e7 c, I, O D+ y/ M! i7 i9 F& ~ M) n/ L
技巧74 Docker的网络与服务功能 198* E9 q2 p, h( X$ h3 Q+ r
% V6 i: y h5 J o
8.4 小结 201( r* [$ a; O1 h d0 `
& `* p, M9 P% }% u, K0 C" E第四部分 生产环境中的Docker
, E6 w8 P# l5 U6 a) a2 z
" M' C& j# m7 z+ W' P; c第9章 容器编排:管理多个Docker容器 205% |2 e* g. S+ l; a6 k8 d% C% R
% E4 r( ?1 O) M/ ^
9.1 简单的单台宿主机 206/ L: J8 g: {" y/ u
) i9 `# g* i; d3 Z# s0 X技巧75 使用systemd管理宿主机上的容器 206
/ O; w* H: Y! u6 b9 K
- W4 @; S$ g) X k: N0 N2 v技巧76 使用systemd编排宿主机上的容器 210
! @! Z I2 r2 L3 r; b9 w! M
2 r4 X8 c' Z7 R7 N9.2 多宿主机Docker 212
3 ?7 q; v. U5 S0 I
6 _$ ]" v% I I2 k/ o6 u4 \% s技巧77 使用Helios手动管理多宿主机Docker 213
6 D2 o1 o! x# H, V8 w- q8 D/ A) N5 J4 S- A% \
技巧78 基于Swarm的无缝Docker集群 219
# J& B- _5 P% T8 Z: z! f, j: k+ U3 K5 i
技巧79 使用Kubernetes集群 222 v2 \4 J( F$ k
0 e2 |8 c+ V+ Q2 K) F4 E技巧80 在Mesos上构建框架 228
5 H# P1 t- p- A' U' {; M) c; M% ]' E' A" F
技巧81 使用Marathon细粒度管理Mesos 235
: e5 \& w) h: {$ l G/ ]' y$ Q' |! g3 T- @1 s( N/ i
9.3 服务发现:我们有什么 238
* x' {% w* @1 S; X; ]5 w0 d' E! A' B! O! G2 C$ b6 I
技巧82 使用Consul来发现服务 238+ W; z9 I, k1 j# k9 F) N0 h+ m4 J4 k
; a1 x& M' o& J! E技巧83 使用Registrator进行自动化服务注册 246
1 a" l9 _1 y- K& b9 H: ^- P, m/ z( c6 }; J
9.4 小结 2483 N& @: D( ]$ {- H' o" D. b M
4 ~) C4 e, R! s( {6 l. P/ h+ D6 X第 10章 Docker与安全 249
v% H& X8 h/ f( r5 _) V
; C. r% q+ M% ?2 i" a5 X10.1 Docker访问权限及其意味着什么 249
" z) H# G6 \) }: C# v. F7 G% s; y+ c8 z9 _. J7 a
10.2 Docker中的安全手段 250
. G, ]/ x/ S; x$ c3 r5 S
/ G/ p2 E" F8 o$ k& `技巧84 限制能力 251
# E& L. E7 X$ h6 V( \6 w; Y8 s- a% o: ?8 ]3 N# ^2 Q
技巧85 Docker实例上的HTTP认证 253' w9 Q% H' o2 S- {; p# C$ @
& ]9 Z( |, l n( t
技巧86 保护Docker API 2576 Z! V; f& z. G9 H& n5 B
4 _$ O, b3 R" l; f10.3 来自Docker以外的安全 260* P2 N6 ~/ o+ P* }+ }( R
) u- {$ F/ }+ e0 Z技巧87 OpenShift——一个应用程序平台即服务 260& T8 ]% X( i, V
3 p% b; y) g2 B3 \, c" J
技巧88 使用安全选项 269
9 ]9 U5 \! E+ B h* t! ]: f. {# d! j( q T
10.4 小结 275: P; a- v& t8 ^2 p, s
. B' X% d8 ]6 |! ] n9 B7 x9 a6 g+ |第 11章 一帆风顺——生产环境中的Docker以及运维上的考量 276
9 t0 n+ I/ ?) u8 V6 b; M) F3 ?" ^
/ i( d6 x( ~" H3 P Y# H9 S11.1 监控 276
. F+ d# i ^% Q$ @6 b$ _' q& n$ N* p5 W7 D$ j3 w: q
技巧89 记录容器的日志到宿主机的syslog 276+ o5 R+ K0 v3 U) T, |8 X, @( }
0 M- \3 \ f2 E8 T) |/ A* @) s4 v
技巧90 把Docker日志发送到宿主机的输出系统 279* _: f0 W6 D$ m* l; Q, ]# N
2 Y# F U5 w! R" W$ V0 O2 L
技巧91 使用cAdvisor监控容器 281
' V+ U/ Z. F* l) Z7 K+ O$ s! Y: G, ?2 n& N
# y& l! {; n; A! s6 b5 F11.2 资源控制 282
7 i4 d4 p- B2 e4 V8 c
) B7 b" J8 Q4 q6 i X0 A+ g* k技巧92 限制容器可以运行的内核 282 n9 n. v2 W+ J
- X1 M5 v( k0 ]3 r G
技巧93 给重要的容器更多CPU 2839 J0 D3 T$ e3 {1 P9 ?
% l& t0 m4 s5 v9 n, X) |" n' o) X
技巧94 限制容器的内存使用 285+ ]! p! O! D, t4 q) K' c8 s
) }' X& d0 k% b
- C8 _2 G' H3 G8 g: G W; n8 z
( J& I9 r- z4 `6 R, \
11.3 Docker的系统管理员用例 286. |/ J$ N) _6 I6 u* [. v
3 Q* ?" o7 T5 X* C6 O技巧95 使用Docker来运行cron作业 286
9 a; \9 K" t+ S; p7 \( b: P8 K' X, h! w) F! \ B) O
技巧96 通过“保存游戏”的方法来备份 289
* H/ \* }, `7 U8 x6 U( M( l! v5 K U3 u$ F
11.4 小结 291
. { L& B, |( v1 }
! B; v0 e: {& Y, U第 12章 Docker生产环境实践——应对各项挑战 292
q% k. X4 _ k9 b- k0 ]3 |& B0 Z7 q1 I" a0 w9 n: M0 v3 o# e
12.1 性能——不能忽略宿主机 2923 c$ h/ q% q1 l+ M; F) C2 X1 C
; H5 {9 N3 d* s! g% T. g$ u$ L$ o* F技巧97 从容器访问宿主机资源 292
" [ r7 W$ q% |# H5 r# P
8 @+ P* e& e! U+ {$ x' a技巧98 Device Mapper存储驱动和默认的容器大小 296" _- A$ o- T- _. \
5 ]% W( t3 a; Y
12.2 在容器出问题时——调试Docker 298' X8 R. }; N# E" R
7 W! g& R8 S3 d9 [, L. k7 s1 s技巧99 使用nsenter调试容器的网络 2981 N! V' o1 ?7 L' S4 Z. T/ E
, w/ N/ _/ V& n$ l! X7 _" u$ m技巧100 无须重新配置,使用tcpflow进行实时调试 301
# ` ~* B- i" G7 p/ O& q% R7 Y/ B4 d) }8 M3 n. o4 D
技巧101 调试在特定宿主机上出问题的容器 302* U# w6 |3 M: @4 S9 K' V* Y
- ?1 P: o( r/ Z) M12.3 小结 306 java8.com( Z' A* }4 X: _- Z3 Q6 |
. X- b. Z, \8 G: F$ M: c
附录A 安装并使用Docker 307$ x( L. d) E$ S% l4 j( K
4 u' v5 b! a X7 X
附录B Docker配置 311" j- F0 S7 p8 W9 @- r/ e
, q0 O8 G& v: J/ |8 h; P附录C Vagrant 313
3 z' g5 P- p6 p. V