部分 基础篇
' _, e0 I7 U, w% _4 K第1章 初识Docker 1
' `+ c9 D6 Z9 G$ P9 b1.1 虚拟化 2
- x" [/ z) T$ S9 S$ i+ u/ _1.1.1 虚拟化技术 2
1 e6 G1 C+ t0 F! I- U( l; ~1.1.2 虚拟化的分类 4
) J3 V9 ]+ C8 E5 |1.2 容器技术与Docker 6. A( o4 m7 k, q: r" N/ f( x
1.2.1 容器技术 6
8 b# ?8 t3 d. M1 h, W9 V1.2.2 Docker简介 84 r* B+ u d) B- Z4 v$ ?. F
1.2.3 改变世界的发明 10+ n. V5 a0 s% ?# W
1.3 Docker的安装 10; F% ~, R6 G( l: c( W' K
1.3.1 在Ubuntu中安装Docker 11( }0 [# b5 o8 ^8 W- ?+ `& a
1.3.2 在CentOS中安装Docker 12
& u9 p2 i2 Y* x3 Q' ^, @1.3.3 在Windows中安装Docker 13
$ ^# E9 j# x9 S3 s# @1.3.4 在Mac OS中安装Docker 15) j2 E6 Y8 L! E; m! \, k' v# R* E
1.3.5 在其他系统中安装Docker 167 w8 g' g; z3 M- o+ f7 {
1.4 Docker的优势 17
& V9 R: Z- [: K# c+ o- }; T; r. B7 N1.4.1 革命性的虚拟化方案 17
$ k( v% O- O$ ^: y# n6 ~- A1.4.2 高效的容器技术 18( P- }" L( p4 p
1.4.3 社区的力量 19# q1 l2 ~% S3 \2 L& {, x
1.5 Docker的应用场景 20
7 w5 n/ q0 Y' ?4 G: m0 Z+ o) ]1.5.1 超短时间部署运行 20
) ]! L4 U- U; Q+ d8 G: D ?0 P1.5.2 节约迁移时间 21
$ F8 k* [- v" T9 G* T1.6 本章小结 212 j C- y" b0 d1 C$ D3 g& h
第2章 镜像与仓库 227 s1 j: R: _: T9 l% {' i4 n+ k
2.1 镜像的概念 227 h/ t- S4 f( Y; o( w$ k( j- D
2.1.1 联合文件系统 22- F1 y4 G) c. K$ c2 K) `- z0 a. C
2.1.2 Docker中的镜像 23
7 p) b7 F7 K/ w: ?) g7 G6 K2.1.3 镜像的分层结构 24
* b: P3 F) z1 n" U0 m& g2.1.4 镜像的写时复制 25" V. a( }+ m5 d _* }" j
2.2 使用和管理镜像 26
. w. T9 W( f3 ^$ W( H- Q g2.2.1 获取镜像 26
( K/ i$ Y/ [4 h! b2.2.2 列出镜像 28
- t8 ~( W* B v' B% }+ ~2.2.3 获得镜像的详细信息 28
y+ l$ ?: [5 D% b, D' X2.2.4 删除镜像 31
+ H' {2 }; b: j6 V" r2.2.5 镜像的迁移 32
! E7 K% @* M! J. e0 l8 @) T5 j0 N( h2.3 Docker Hub 337 m/ _. i: J! O9 P+ F
2.3.1 镜像仓库 33$ ~- y6 r* j" l, P
2.3.2 Docker Hub 34
! b1 [ x; W: h% ?. I8 t% g A2.3.3 注册Docker Hub账号 35 }! N Y1 m i/ V8 d
2.3.4 搜索镜像 36" q% I2 g7 g' C9 o$ |
2.3.5 共享自动构建镜像 386 a* F2 d0 ?: H, ]
2.4 搭建私有仓库 40; b7 f0 {# j$ \! I- s
2.4.1 镜像分发服务 40
) V" J" i4 `4 a2.4.2 Docker Registry HTTP API 41
G# x" H9 `, e# Y( I2.4.3 部署私有仓库 42, ]6 d. m) p, L7 d0 H
2.5 本章小结 44! l3 {5 F/ x4 i1 s7 r- c: d3 M
% L- T4 O, ]# \& Y* h: c第3章 管理和使用容器 45* B3 N' B* G7 |) t! Q8 u, k% }& Z) |
3.1 管理容器 45
! ]4 @+ o6 p) ~5 J3.1.1 创建容器 45
0 N) e: O2 ~2 M1 Y; s" q, R' v& A; L: ]3.1.2 容器的启动过程 48
# v4 @# i7 M# q4 }; h6 @. p3.1.3 列出容器 492 C, _% J$ R- G. e1 u
3.1.4 容器的命名 51
3 b- @( U4 M2 u6 m3.1.5 启动和停止 52: I+ ?/ c' b1 ^! x: r( n
3.1.6 暂停和恢复 53! D/ `5 G5 L! _& D7 x% T
3.1.7 重启容器 54
* Y; R) t8 C5 S. B2 p N! c+ M3.1.8 删除容器 556 ]% r5 N) U% Z' N3 V4 H. x1 ], f: X
3.2 连接到容器 55
1 l+ h# }2 _$ f: a. P1 V1 u5 \3.2.1 查看进程信息 56
$ r% ]0 Z$ Y, ?- V1 A" H3.2.2 查看容器信息 56
. X# S5 i$ r; T, t! E3.2.3 容器日志 62
3 s% |5 s: }$ D8 K3.2.4 衔接到容器 63( \1 ], Z! @6 s) Q% O
3.2.5 在容器中执行命令 64
( U1 P. J& s# R2 n: H3.3 容器的保存与迁移 65
. X) f* n/ a& w3.3.1 提交容器更改 65
% n' @: q$ [' q X, Y) L3.3.2 容器的导入/导出 684 B& t. u$ ^+ R# ]- v
3.4 本章小结 701 C( l! c' ~+ i* X
第4章 数据卷与网络 71) f6 J" F4 N ]* s/ J
4.1 数据卷 710 Q% b* b: N- r3 M* X/ I3 H
4.1.1 关于数据卷 71
1 C. ]8 T* X2 J4 @# Q4 g0 l( Z4.1.2 数据卷的特点 72
b& B" |- p2 M2 Q7 U+ F, I4.1.3 创建数据卷 73& j- m8 Z* m' c0 g9 W3 S+ E& {9 ~
4.1.4 挂载数据卷 74& F3 N9 G$ W6 l2 X( l
4.1.5 删除数据卷 76- {. ?4 u W3 X* p5 w6 I/ W2 s
4.2 数据卷容器 77
7 b3 }) s$ Y& s7 x( H) Z0 `+ g4.2.1 关于数据卷容器 77
* p6 h9 f6 Y* W, s. u& a2 T4.2.2 创建数据卷容器 78
# X" ?7 Q0 M- x4.2.3 连接数据卷容器 79
8 [- S: X/ g5 d1 U4 T8 C4.2.4 数据卷的迁移 80& L" _3 _ G4 @- W' @$ W/ C
4.3 网络基础 82; E% \& h2 s6 J4 h# P( u
4.3.1 网络简介 82
6 ]( V: e: y4 e& `1 [4.3.2 查看网络配置 83
; u6 e, E9 H, X- I6 p. z4.4 网络访问 85
- S2 M* H U( p" ~5 g1 I0 P4.4.1 宿主机端口映射 85
, w( g3 i5 i% U1 |, y$ f4.4.2 容器连接 871 ]2 J! Y, R5 _ ]& K0 Z
4.5 本章小结 90) d8 G7 E& j5 B7 j* E1 ?5 Q
第5章 制作镜像 91
' M8 }& a. X) T9 D5.1 了解Dockerfile 91
; ]" U1 u4 l; h7 l- ~0 W5.1.1 Dockerfile简介 92- B3 J. R0 ?8 t7 w" @) l
5.1.2 使用Dockerfile创建镜像 94% l/ l1 u3 `' d% \3 F
5.2 基础指令 968 s2 |2 L& t. r/ M: a: @; Q3 B
5.2.1 FROM 97, f9 l/ j) b* w
5.2.2 MAINTAINER 97
* b8 O# N+ c K5.3 控制指令 97- y, c+ l6 u' O( N6 n" {1 H
5.3.1 RUN 973 E* H5 I1 i8 ~, f6 r7 I8 `% D
5.3.2 WORKDIR 99
' W+ w$ F) U4 r) q5.3.3 ONBUILD 99 W: f; t. D& a$ h9 m8 c. a
5.4 引入指令 100
# W7 a5 j8 b% [* j- O5.4.1 ADD 100* `2 ^8 A+ c! f4 q
5.4.2 COPY 102% Y; \1 b- }; H- }5 |7 q
5.5 执行指令 1025 A3 |( c1 p% K4 e. M) {0 N
5.5.1 CMD 102 y+ F7 h+ i9 ~( A" l! R( ?
5.5.2 ENTRYPOINT 104
/ c8 q# Q, j" G4 U* Q5.6 配置指令 107
! g- X) {0 } S3 i5.6.1 EXPOSE 108
1 }; B0 g. \4 C2 a+ ?3 t5.6.2 ENV 1089 v- z8 ~+ l/ k3 C' U0 H
5.6.3 LABEL 109% ]6 }% L( P* h a2 `+ U9 |8 _
5.6.4 USER 110
* r, U7 p) ^8 o% E" I' ]5.6.5 ARG 111* M1 s+ I8 M z
5.6.6 STOPSIGNAL 112
" j" P4 V$ |3 s2 w v4 x/ r! m/ `. \5.6.7 SHELL 113
: }7 @( N5 x( \3 ?3 v# t" K0 M+ \% _5.7 特殊用法 113% s2 @! {, \: Y5 B5 e/ E$ G' v$ S/ }
5.7.1 环境变量 1135 P# E9 `7 e. g
5.7.2 指令解析 114: | i7 y/ \/ c3 P+ f
5.7.3 忽略文件 116
3 d& V2 Z( L5 W9 B; f2 @# j# A# ?1 ~! N5.8 本章小结 117/ M" W1 Z# N, ^+ J* }% D% G
第二部分 实践篇) y' E( Q+ ]& K" H; M' m
第6章 SSH服务 118/ w* a7 f# e6 d$ s
6.1 在Docker中使用SSH 118
3 L) `0 R& _* X1 Y6.1.1 SSH简介 119- | i& r7 `" N5 q3 q
6.1.2 SSH使用方法简介 119$ W/ u3 z! ]& S0 g: z( y. n
6.1.3 数据卷管理容器 1210 P. L1 Q! T* V* e
6.1.4 使用SSH服务容器 122
/ `0 E8 T: W0 j' r6.2 构建SSH服务镜像 1242 E0 ]8 H" @1 d) \% M0 e/ c/ t; H
6.2.1 构建方式比较 1243 R+ a: g. i$ Y& M
6.2.2 通过提交构建 125
( d& n3 A' O" s1 V: l% o3 i- ^/ E6.2.3 使用Dockerfile构建 127. `; y# \: e% }# N0 f* {8 I
6.3 本章小结 131
7 {8 a; \6 z S: ~) f2 `3 a第7章 Web服务器 132) ~8 R6 Y) t4 Y( O2 O
7.1 Web服务简介 132
# F5 K) D* B/ T+ I+ E: S7.1.1 万维网与网站 1329 `' ]; _* N1 i5 F; j! R8 }1 v
7.1.2 Web服务 133/ h; a/ H2 t3 T' A; F
7.1.3 Web服务程序 135
! C% u0 ]( M: e( z5 V, I7.2 Apache 1358 z) G1 ~+ A7 W: y* k* y$ R! I
7.2.1 Apache简介 135
0 C; }6 S+ U5 Z T0 I9 |7.2.2 安装Apache 1360 k9 G4 w L/ V# j3 s
7.2.3 构建Apache镜像 139; d( f: `6 y+ ]8 n' C% ~' @
7.2.4 测试Apache容器 142
+ _0 \# Q2 j: h/ M; p; ^7.3 Nginx 143" ?: I1 h6 h- x! u
7.3.1 关于Nginx 143) M+ k2 G X3 D: P5 a
7.3.2 安装Nginx 144
1 Y0 n9 B! @9 W' C9 C$ |9 k7.3.3 构建Nginx镜像 146
* {4 O- H. f* x x* R& ]7.3.4 测试Nginx镜像 148: t; n! D4 r& D4 h4 B/ {; ^" C
7.4 Tomcat 148
; \* N7 ?6 A- D! v$ t7.4.1 Tomcat简介 1494 s) D4 n- w# p: X& ?9 s$ U
7.4.2 安装Tomcat 1497 m% _) l2 B2 T u1 v
7.4.3 构建Tomcat镜像 152
) S# g2 N' H2 M6 J$ o7.5 本章小结 153$ m, M( t& G2 g2 a# ~
第8章 数据库程序 155; C Z0 b6 f$ |5 M! z2 l
8.1 MySQL 155
) c- W B& P* l \7 S8.1.1 MySQL简介 156
, [) B1 V. u6 [8 L5 h6 W8.1.2 安装MySQL 156& @: B& x& d) Q# b, K* j
8.1.3 构建MySQL镜像 162
" O& Q- l% E% P$ T+ X7 h/ `8.1.4 测试MySQL容器 164
% E) \& E" F. L4 r% H8.2 MongoDB 166
1 Z ^" W8 T( B& k. n8.2.1 MongoDB简介 166" `: @0 _- ~* V1 J" q: }1 _* k
8.2.2 安装MongoDB 167
* t' Q* d( u) `6 v3 u1 l/ Y8.2.3 构建MongoDB镜像 1719 f) j+ ?$ }' u
8.2.4 测试MongoDB容器 1737 T, j8 [2 z) h2 t0 ^
8.3 本章小结 176+ K- [! N3 I# L; J
第9章 缓存工具 177) G4 }% ?% k) }$ _3 {
9.1 Memcached 178* [8 V# Q m9 e W* k2 ~* ~9 F
9.1.1 Memcached简介 178
4 H/ r6 p# B' U, C9.1.2 安装Memcached 179
- w) q+ W. ^; r8 O F9.1.3 构建Memcached镜像 1846 q* |* n) E) X7 u! F4 T
9.1.4 测试Memcached容器 186
* g/ d' {5 V- X# |# l9.2 Redis 188
% D* [7 U" ?: r. e9 o9.2.1 Redis简介 188
7 e3 ^; G! E4 S+ |' b: O j9.2.2 安装Redis 188# Y: r" @8 x: w; B3 Z+ F
9.2.3 构建Redis镜像 193+ Y" E: y9 T$ ^
9.2.4 测试Redis容器 195
" `6 v7 _" i) ?9.3 本章小结 196# w% ^2 w- L4 g+ u4 I c
第10章 动态处理程序 197
% ~ g1 x8 ^7 v# V% H10.1 Java 197
) g0 Y0 `+ h6 V# p7 x5 N3 |10.1.1 Java简介 198
9 V" w$ l4 A, J0 }. T10.1.2 安装Java 1980 g1 `! R3 q2 U% `, H) E" T
10.1.3 构建Java镜像 204$ r, c* N& e4 d( H% f" b
10.1.4 测试Java容器 206
4 C! t4 \; Y3 r4 }10.2 PHP 207
* ^) K# K) h( g$ x. z- a2 y10.2.1 PHP简介 207! P+ v& P; A% T
10.2.2 安装PHP 208
1 M# S3 W1 r- ^0 [# \10.2.3 构建PHP镜像 214
9 v. s. E0 p4 _4 [" g) J* c10.2.4 测试PHP容器 216; O: A8 l& V& H4 u. A1 r. n Z# p
10.3 Python 217
; v. D7 s! b( y6 y. A l9 J' R10.3.1 Python简介 217
# g0 D. d( s! N4 w1 i10.3.2 安装Python 218
5 M% ~: r$ N- y5 c/ z10.3.3 构建Python镜像 223( L4 j+ A- d3 P0 L
10.3.4 测试Python容器 224
! H1 G1 j! m4 F' k2 V D- U8 D10.4 Node.js 225
+ j+ y9 A3 g1 M; A9 S L1 r8 @8 F; {10.4.1 Node.js简介 225+ e: V4 Y6 i# }) n, \
10.4.2 安装Node.js 226
3 j* g% \; w3 W8 r7 H9 u10.4.3 构建Node.js镜像 228; s, r) r, p) z, P+ K) U
10.4.4 测试Node.js容器 230
6 ~5 ?+ N& f4 n. l. U10.5 本章小结 2314 I* }, O6 Q. z8 g
第11章 综合演练 232
. ?: _! l' c+ O: r7 k" p- [11.1 演练目标 232
% `% P; ^+ W* ], Q; i& C. R! Q* l5 q3 [& q11.1.1 目标概述 232
5 D9 ?- h9 j# A, A2 @" V+ j- K11.1.2 代码编写 233
% G' A' H; X, Q( g% U3 M# g) V11.2 环境搭建 237
U% I/ B k5 F [; H0 f- J6 u11.2.1 准备镜像 237
& j- L( g6 @, E: A( B' Z11.2.2 程序配置 239
B; Q" w& E( u5 G/ i3 G5 t+ B11.3 项目运行 248
# R! c7 e5 e# t. @7 o1 Q11.3.1 启动容器 248
( K/ |3 r* }% T+ y# o9 [11.3.2 测试项目 2496 w$ S+ f5 K5 y& r
11.4 本章小结 253
7 r4 U8 E3 q" h: S9 M P( o第三部分 提高篇! K" G% B2 I) J! K8 N( q
第12章 网络进阶 254
3 x# M7 {) L" n9 C# |0 v12.1 网络实现 254/ M. G! G6 e9 W: m' x+ U9 U
12.1.1 容器网络基础 255
- \& z8 J$ J8 ]3 ?" i; I r. v$ k12.1.2 网络模型 2575 e5 i( ]- t7 \$ t" N
12.2 Docker中的网络 2586 `8 }/ g7 a# k
12.2.1 默认网络 258
8 P" {1 D! Q5 V* Z- ?" T12.2.2 自定义网络 261
( w# M/ s% K( ~+ o12.2.3 容器与外部通信 262
5 B+ N( q/ ?; y4 x3 Y' D12.2.4 容器间通信 2647 E# t* R- ]6 {7 M! d$ O8 o3 Y
12.3 网络实践 265/ }) O( A( j$ B
12.3.1 管理容器网络 2650 K; g: R) V# d, D
12.3.2 容器连接网络 267
2 u# ` N1 U4 D! b7 k. R+ Y! w12.3.3 配置docker0网桥 269
9 X# K3 |: Z8 ~* [1 p ~+ W12.3.4 自定义网桥 2715 i2 T/ P2 E! S. P+ K* C5 L1 \5 [
12.3.5 配置DNS 271
" `4 r A4 F; t% m12.3.6 使用IPv6 273
0 g7 V" {/ u! W* f) n12.4 本章小结 2741 g- v8 r, P! }6 c& F! t
第13章 安全加固 275- @( y6 K) I: L$ x
13.1 深入理解Docker安全 275) e( T/ {% q, G( |1 [7 D8 i
13.1.1 命名空间隔离 276- }) j) z0 V" y- B2 V: @. S
13.1.2 资源控制组 277# k# |4 Y* _1 j3 k: E
13.1.3 内核能力机制 277; @4 i' p) B9 ?" |6 K$ X2 \
13.2 资源使用限制 278
" G- v7 o" O" l: Q7 y: f13.2.1 通过控制组限制 2786 L' V1 J- F; |
13.2.2 通过ulimit限制 280
" X/ |8 |' v0 X$ [ ?( j; J/ g. s13.2.3 网络访问限制 280
& n$ F5 f- P8 R* t. G# M# B, i/ I3 u13.3 校验与监控 281: S. O+ _7 S9 Z; i* \* \( Z8 g. x
13.3.1 镜像签名 281
# U0 j, {& X. ~7 U7 l- Q( F13.3.2 运行状态监控 283
( V3 t1 [# J! P1 K13.4 联级防护 284
' Y! P( u; i8 }, |/ o& D- W& N13.4.1 组合虚拟化 284 O4 t$ V) ]2 A" k. `
13.4.2 文件系统安全 284
5 q( E( p0 d7 n- q) \! l& S13.5 内核安全技术 285' H& u1 c% N, m
13.5.1 Capability 286
/ G/ h0 Q. N( |% Q13.5.2 SELinux 2873 @( _" r A1 f" \4 k
13.5.3 AppArmor 288
- ^+ L8 W& _: \/ O# h13.6 本章小结 2899 [" h" S* G5 H" G
第14章 Docker API 2904 j0 R+ [0 [, W! ]
14.1 关于Docker API 290
+ m& q& [3 F3 m5 @( J: S14.1.1 通用操作接口 290
+ O6 D, G& M* F0 [. e14.1.2 关于RESTful 291
: t* M3 E# M% l- v; B: S14.1.3 Docker API的优势 292; S9 Z; X' j' y* H7 X% o6 i
14.1.4 Docker API的分类 293
0 Y7 ~: @3 p3 e$ L) j) A- I. d0 j14.2 使用Docker Remote API 293
( i; r- B! @7 Y W% n: Y14.2.1 关于Docker Remote API 294
. C8 o' i$ ~, P! u, }14.2.2 Docker Remote API的版本 299
0 @6 k. ^0 f9 |14.2.3 通过Remote API列出容器 300
; d" P u3 V, c, g14.2.4 通过Remote API列出镜像 3025 I6 Q8 l l2 L' N9 f
14.3 使用Docker Registry API 303; x, Q- u( y# b- d! g* o
14.3.1 关于Docker Registry API 304" h1 B# G/ f6 T: _8 i; W/ x/ k
14.3.2 Docker Registry API的主要功能 3042 s# F# s: V5 r) Y5 {
14.3.3 Docker Registry API的版本 305) h! X U3 `- ~* n5 E; i P% V9 Q
14.3.4 通过Registry API拉取镜像 306
/ O; i, n4 }0 v2 a; u14.3.5 通过Registry API推送镜像 307. K* j$ K/ q$ @( e. O% N4 O
14.4 本章小结 309$ k% I A2 V& ?
第15章 管理工具 3103 u1 g/ {1 F6 |+ F
15.1 Docker Compose 310' A. C9 X. j, a% M" ?
15.1.1 Docker Compose简介 311, ]9 q! u @$ m* z$ k
15.1.2 安装Docker Compose 313
% ^5 j4 n: K0 M" x7 x: s15.1.3 Docker Compose配置文件 314
+ k* Q5 @: z5 l+ l" o7 a15.1.4 常用的Docker Compose命令 315
3 u7 I7 G: q! n" R/ k, [8 H15.2 Docker Machine 318
& i- x- j9 w" S/ c15.2.1 Docker Machine简介 318
8 q/ K z: n/ q S- m8 P- f15.2.2 安装Docker Machine 320
8 e- M4 H) |' S15.2.3 Docker Machine常见命令 321
* G/ J0 K, V6 @' C2 |9 D" X15.3 Docker Swarm 322
6 R9 X) }7 }* D2 D3 v15.3.1 Docker Swarm简介 322
: f" {! c; V% }5 b) Q- h; H15.3.2 Docker Swarm结构 323( Q- q, ^/ s: b
15.3.3 使用Docker Swarm 323, j8 j4 x9 L1 v4 m- o& n& N5 R" b
15.3.4 Docker Swarm常见命令 325
9 k% z$ |/ B- }5 B: Q* U% M3 X15.4 本章小结 327/ v4 _$ m' L4 P9 J9 b2 H" |4 E
第16章 Docker的技术架构 328
- H8 S4 ~1 r/ c16.1 命名空间 328
0 }8 F" I2 o% M6 Z" _0 i2 {" ]16.1.1 关于Linux命名空间 3282 u5 l# D- v# _5 G; Q$ J: j
16.1.2 命名空间的系统调用 329, M3 e: i0 r2 C/ B
16.1.3 命名空间的分类 330
! K7 x8 T' N( I/ H16.2 控制组 332 java8.com
! a3 Q+ Y: P* z) ?- \( ^& [16.2.1 关于Linux控制组 332) ? @3 e9 @+ h ]
16.2.2 Cgroups的组成 3337 }9 \7 Z" U3 Q4 O
16.2.3 容器与控制组 334
$ l0 j2 P2 D4 c7 r16.3 联合文件系统 3363 \, W* o7 {( o* F- M7 g3 S
16.3.1 关于UFS 336
) d9 X7 q. v |2 p) B* x16.3.2 Docker中的UFS 337% i# K: I7 t0 W7 I) t: X
16.4 Docker Engine架构 338
0 Y( ^6 \3 {! R$ ^16.4.1 Docker Engine的组成结构 338# x' y2 ~( B0 K5 H% q1 e/ A
16.4.2 Docker Daemon 339
! o/ G/ L- w! ^% _8 I5 \" k16.4.3 Docker CLI 342
1 H7 E4 U6 x, r. P+ q; V$ r# S0 e16.5 本章小结 344
) V1 e) Q$ v z6 D" a4 R