-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathdocker.txt
1080 lines (968 loc) · 39.1 KB
/
docker.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1.1 Docker是什么以及为什么用Docker 4
1.1.1 Docker是什么 4
1.1.2 Docker有什么好处 6
1.1.3 关键的概念 8
1.2 构建一个Docker应用程序 10
1.2.1 创建新的Docker镜像的方式 11
1.2.2 编写一个Dockerfile 11
1.2.3 构建一个Docker镜像 12
1.2.4 运行一个Docker容器 14
1.2.5 Docker分层 16
1.3 小结 17
第 2章 理解Docker——深入引擎室 18
2.1 Docker的架构 18
2.2 Docker守护进程 20
技巧1 向世界开放Docker守护进程 20
技巧2 以守护进程方式运行容器 22
技巧3 将Docker移动到不同分区 24
2.3 Docker客户端 25
技巧4 使用socat监控Docker API流量 25
技巧5 使用端口连接容器 28
技巧6 链接容器实现端口隔离 29
技巧7 在浏览器中使用Docker 31
2.4 Docker注册中心 33
技巧8 建立一个本地Docker注册中心 34
2.5 Docker Hub 34
技巧9 查找并运行一个Docker镜像 35
2.6 小结 37
第 二部分 Docker与开发
第3章 将Docker用作轻量级虚拟机 41
3.1 从虚拟机到容器 42
技巧10 将虚拟机转换为容器 42
技巧11 类宿主机容器 44
技巧12 将一个系统拆成微服务容器 46
3.2 管理容器的服务 49
技巧13 管理容器内服务的启动 50
3.3 保存和还原工作成果 52
技巧14 在开发中“保存游戏”的方式 52
技巧15 给Docker打标签 54
技巧16 在Docker Hub上分享镜像 56
技巧17 在构建时指向特定的镜像 58
3.4 进程即环境 59
技巧18 在开发中“保存游戏”的方式 59
3.5 小结 61
第4章 Docker日常 62
4.1 卷——持久化问题 62
技巧19 Docker卷——持久化的问题 63
技巧20 通过BitTorrent Sync的分布式卷 64
技巧21 保留容器的bash历史 66
技巧22 数据容器 68
技巧23 使用SSHFS挂载远程卷 70
技巧24 通过NFS共享数据 72
技巧25 开发工具容器 75
4.2 运行容器 76
技巧26 在Docker里运行GUI 76
技巧27 检查容器 78
技巧28 干净地杀掉容器 80
技巧29 使用Docker Machine来置备Docker宿主机 81
4.3 构建镜像 84
技巧30 使用ADD将文件注入到镜像 85
技巧31 重新构建时不使用缓存 87
技巧32 拆分缓存 89
4.4 保持阵型 90
技巧33 运行Docker时不加sudo 90
技巧34 清理容器 91
技巧35 清理卷 92
技巧36 解绑容器的同时不停掉它 94
技巧37 使用DockerUI来管理Docker守护进程 95
技巧38 为Docker镜像生成一个依赖图 96
技巧39 直接操作——对容器执行命令 97
4.5 小结 99
第5章 配置管理——让一切井然有序 100
5.1 配置管理和Dockerfile 100
技巧40 使用ENTRYPOINT创建可靠的定制工具 101
技巧41 在构建中指定版本来避免软件包的漂移 102
技巧42 用perl -p -i -e替换文本 104
技巧43 镜像的扁平化 105
技巧44 用alien管理外来软件包 107
技巧45 把镜像逆向工程得到Dockerfile 109
5.2 传统配置管理工具与Docker 112
技巧46 传统方式:搭配make和Docker 112
技巧47 借助Chef Solo构建镜像 114
技巧48 从源到镜像的构建 118
5.3 小即是美 123
技巧49 保持构建镜像更小的Dockerfile技巧 123
技巧50 让镜像变得更小的技巧 126
技巧51 通过BusyBox和Alpine来精简Docker镜像 128
技巧52 Go模型的小容器 129
技巧53 使用inotifywait给容器瘦身 132
技巧54 大也可以美 134
5.4 小结 136
第三部分 Docker与DevOps
第6章 持续集成:加快开发流水线 139
6.1 Docker Hub自动化构建 139
技巧55 使用Docker Hub工作流 140
6.2 更有效的构建 143
技巧56 使用eatmydata为I/O密集型构建提速 143
技巧57 设置一个软件包缓存用于加快构建速度 145
技巧58 在Docker内部运行Selenium测试 147
6.3 容器化CI过程 151
技巧59 包含一个复杂的开发环境 151
技巧60 在一个Docker容器里运行Jenkins主服务器 156
技巧61 使用Jenkins的Swarm插件扩展CI 158
6.4 小结 161
第7章 持续交付:与Docker原则完 美契合 162
7.1 在CD流水线上与其他团队互动 163
技巧62 Docker契约——减少摩擦 163
7.2 推动Docker镜像的部署 165
技巧63 手动同步注册中心镜像 165
技巧64 通过受限连接交付镜像 166
技巧65 以TAR文件方式共享Docker对象 168
7.3 为不同环境配置镜像 170
技巧66 使用etcd通知容器 170
7.4 升级运行中的容器 172
技巧67 使用confd启用零停机时间切换 173
7.5 小结 177
第8章 网络模拟:无痛的现实环境测试 178
8.1 容器通信——超越手工链接 178
技巧68 一个简单的Docker Compose集群 178
技巧69 一个使用Docker Compose的SQLite服务器 182
技巧70 使用Resolvable通过DNS查找容器 185
8.2 使用Docker来模拟真实世界的网络 188
技巧71 使用Comcast模拟有问题的网络 188
技巧72 使用Blockade模拟有问题的网络 191
8.3 Docker和虚拟网络 194
技巧73 使用Weave建立一个基底网络 195
技巧74 Docker的网络与服务功能 198
8.4 小结 201
第四部分 生产环境中的Docker
第9章 容器编排:管理多个Docker容器 205
9.1 简单的单台宿主机 206
技巧75 使用systemd管理宿主机上的容器 206
技巧76 使用systemd编排宿主机上的容器 210
9.2 多宿主机Docker 212
技巧77 使用Helios手动管理多宿主机Docker 213
技巧78 基于Swarm的无缝Docker集群 219
技巧79 使用Kubernetes集群 222
技巧80 在Mesos上构建框架 228
技巧81 使用Marathon细粒度管理Mesos 235
9.3 服务发现:我们有什么 238
技巧82 使用Consul来发现服务 238
技巧83 使用Registrator进行自动化服务注册 246
9.4 小结 248
第 10章 Docker与安全 249
10.1 Docker访问权限及其意味着什么 249
10.2 Docker中的安全手段 250
技巧84 限制能力 251
技巧85 Docker实例上的HTTP认证 253
技巧86 保护Docker API 257
10.3 来自Docker以外的安全 260
技巧87 OpenShift——一个应用程序平台即服务 260
技巧88 使用安全选项 269
10.4 小结 275
第 11章 一帆风顺——生产环境中的Docker以及运维上的考量 276
11.1 监控 276
技巧89 记录容器的日志到宿主机的syslog 276
技巧90 把Docker日志发送到宿主机的输出系统 279
技巧91 使用cAdvisor监控容器 281
11.2 资源控制 282
技巧92 限制容器可以运行的内核 282
技巧93 给重要的容器更多CPU 283
技巧94 限制容器的内存使用 285
11.3 Docker的系统管理员用例 286
技巧95 使用Docker来运行cron作业 286
技巧96 通过“保存游戏”的方法来备份 289
11.4 小结 291
第 12章 Docker生产环境实践——应对各项挑战 292
12.1 性能——不能忽略宿主机 292
技巧97 从容器访问宿主机资源 292
技巧98 Device Mapper存储驱动和默认的容器大小 296
12.2 在容器出问题时——调试Docker 298
技巧99 使用nsenter调试容器的网络 298
技巧100 无须重新配置,使用tcpflow进行实时调试 301
技巧101 调试在特定宿主机上出问题的容器 302
12.3 小结 306
附录A 安装并使用Docker 307
附录B Docker配置 311
附录C Vagrant 313
第1章 从容器到容器云 2
1.1 云计算平台 2
1.2 容器,新的革命 3
1.3 进化:从容器到容器云 7
第2章 Docker 基础 8
2.1 Docker的安装 8
2.2 Docker操作参数解读 9
2.3 搭建你的第一个Docker应用栈 16
2.3.1 Docker集群部署 16
2.3.2 第一个Hello World 17
2.3.3 开发、测试和发布一体化 27
第3章 Docker核心原理解读 28
3.1 Docker背后的内核知识 28
3.1.1 namespace资源隔离 28
3.1.2 cgroups资源限制 45
3.2 Docker架构概览 53
3.2.1 Docker daemon 54
3.2.2 Docker client 54
3.2.3 镜像管理 54
3.2.4 execdriver、volumedriver、graphdriver 55
3.2.5 network 55
3.3 client和daemon 56
3.3.1 client模式 56
3.3.2 daemon模式 58
3.3.3 从client到daemon 64
3.4 libcontainer 67
3.4.1 libcontainer的工作方式 69
3.4.2 libcontainer实现原理 70
3.4.3 使用runC与libcontainer进行交互 75
3.5 Docker镜像管理 77
3.5.1 什么是Docker镜像 77
3.5.2 Docker镜像关键概念 80
3.5.3 Docker镜像构建操作 81
3.5.4 Docker镜像的分发方法 84
3.6 Docker存储管理 87
3.6.1 Docker镜像元数据管理 87
3.6.2 Docker存储驱动 89
3.7 Docker数据卷 99
3.7.1 数据卷的使用方式 100
3.7.2 数据卷原理解读 105
3.8 Docker网络管理 108
3.8.1 Docker网络基础 108
3.8.2 Docker daemon网络配置原理 116
3.8.3 libcontainer网络配置原理 119
3.8.4 传统的link原理解析 125
3.8.5 新的link介绍 127
3.9 Docker与容器安全 129
3.9.1 Docker的安全机制 129
3.9.2 Docker安全问题 135
3.9.3 Docker安全的解决方案 139
第4章 Docker 高级实践技巧 151
4.1 容器化思维 151
4.1.1 SSH服务器的替代方案 151
4.1.2 Docker内应用日志管理方案 152
4.1.3 容器化思维及更多 153
4.2 Docker高级网络实践 153
4.2.1 玩转Linux networknamespace 154
4.2.2 pipework原理解析 159
4.2.3 pipework跨主机通信 165
4.2.4 OVS划分VLAN 170
4.2.5 OVS隧道模式 174
4.3 Dockerfile最佳实践 187
4.3.1 Dockerfile的使用 187
4.3.2 Dockerfile实践心得 191
4.4 Docker容器的监控手段 193
4.4.1 Docker容器监控维度 194
4.4.2 容器监控命令 195
4.4.3 常用的容器监控工具 197
4.5 容器化应用构建的基础:高可用配置中心 201
4.5.1 etcd经典应用场景 201
4.5.2 etcd实现原理 206
第二部分 Docker云平台解读
第5章 构建自己的容器云 222
5.1 再谈云平台的层次架构 222
5.2 从小工到专家 225
第6章 专注编排与部署:三剑客与Fleet 230
6.1 编排小神器Fig/Compose 230
6.1.1 再谈容器编排与部署 230
6.1.2 Compose原理:一探究竟 233
6.2 跨平台宿主环境管理工具Machine 237
6.2.1 Machine与虚拟机软件 237
6.2.2 Machine与IaaS平台 238
6.2.3 Machine小结 239
6.3 集群抽象工具Swarm 240
6.3.1 Swarm简介 240
6.3.2 试用Swarm 241
6.3.3 Swarm集群的多种创建方式 243
6.3.4 Swarm对请求的处理 245
6.3.5 Swarm集群的调度策略 245
6.3.6 Swarm集群高可用(HA) 246
6.3.7 Swarm与Machine 247
6.3.8 Swarm小结 248
6.4 编排之秀Fleet 248
6.4.1 旧问题新角度:Docker distro 249
6.4.2 Fleet的原理剖析 252
第7章 专注应用支撑和运行时:Flynn和Deis 258
7.1 Flynn,一个小而美的两层架构 258
7.1.1 第0层:容器云的基础设施 259
7.1.2 第1层:容器云的功能框架 259
7.1.3 Flynn体系架构与实现原理 260
7.2 谈谈Deis与Flynn 270
7.2.1 应用发布上的比较 271
7.2.2 关于Deis的一些思考 273
第8章 一切皆容器:Kubernetes 274
8.1 Kubernetes是个什么样的项目 274
8.2 Kubernetes的设计解读 275
8.2.1 一个典型案例:Guestbook 275
8.2.2 pod设计解读 277
8.2.3 replication controller设计解读 288
8.2.4 service的设计解读 294
8.2.5 新一代副本控制器replica set 306
8.2.6 Deployment 307
8.2.7 DaemonSet 312
8.2.8 ConfigMap 312
8.2.9 Job 317
8.2.10 Horizontal Pod Autoscaler 318
8.3 Kubernetes核心组件解读 320
8.3.1 Kubernetes的整体架构 320
8.3.2 APIServer 321
8.3.3 scheduler 328
8.3.4 controller manager 338
8.3.5 kubelet 346
8.3.6 kube-proxy 352
8.3.7 核心组件协作流程 362
8.4 Kubernetes存储核心原理 366
8.4.1 volume设计解读 366
8.4.2 volume实现原理分析 367
8.4.3 volume使用案例 368
8.4.4 persistent volume 371
8.5 Kubernetes网络核心原理 372
8.5.1 单pod单IP模型 373
8.5.2 pod和网络容器 374
8.5.3 实现Kubernetes的网络模型 377
8.6 Kubernetes多租户管理与资源控制 381
8.6.1 namespace设计解读 381
8.6.2 Kubernetes用户认证机制 385
8.6.3 Kubernetes用户授权机制 387
8.6.4 Kubernetes多维资源管理机制admission control 390
8.7 Kubernetes高级实践 402
8.7.1 应用健康检查 402
8.7.2 高可用性 405
8.7.3 日志 408
8.7.4 集成DNS 410
8.7.5 容器上下文环境 412
8.8 Kubernetes未来动向 414
8.8.1 Ubernetes 414
8.8.2 petSet 415
8.8.3 performance 417
8.8.4 rescheduler 417
8.8.5 OCI标准 419
8.9 不要停止思考 419
第三部分 附录
附录A Docker的安装 424
附录B 阅读Docker源代码的神兵
利器 432
附录C 快速熟悉开源项目 441
附录D cgroups的测试与使用 444
附录E cgroups子系统配置参数介绍 448
附录F Kubernetes的安装 453
第1 章 微服务架构概述 2
1.1 什么是微服务 2
1.2 为什么要使用微服务 9
1.3 微服务架构设计原则 15
1.4 从单体到微服务 21
第2 章 微服务中的技术选型 26
2.1 服务治理 27
2.2 服务网关 35
2.3 服务注册发现 43
2.4 配置中心 51
2.5 请求链路追踪 57
第3 章 Service Mesh 64
3.1 初识Service Mesh 64
3.2 Service Mesh 的发展过程 66
3.3 主流的Service Mesh 框架 73
第4 章 Docker 技术简介 75
4.1 Docker 是什么 75
4.2 Docker 的作用 77
4.3 Docker 的生态圈 86
4.4 微服务与Docker 89
第二部分 Docker 架构与生态 93
第5 章 Docker 技术架构 94
5.1 Docker 的进程模型 94
5.2 容器的本质 104
5.3 Docker 容器的运行时模型 111
第6 章 Docker 逻辑架构 113
6.1 Docker Registry 的技术选型 114
6.2 Harbor 的部署 115
第7 章 Docker 网络架构 120
7.1 Docker 的单机网络模式 120
7.2 Docker 的集群网络模式 126
第8 章 Docker 安全架构 135
8.1 Docker 安全问题 135
8.2 Docker 安全措施 138
第9 章 Docker 与DevOps 148
9.1 DevOps 概要 148
9.2 Docker 容器的代码挂载机制 149
9.3 Docker 与服务发现 150
9.4 Dockerfile 怎么写 164
9.5 Docker 与日志 172
9.6 Docker 与监控 176
9.7 Docker 与CI/CD 182
9.8 Docker 给运维团队带来的挑战 184
第10 章 容器编排 186
10.1 容器编排概述 186
10.2 容器编排技术选型 189
10.3 Kubernetes 实战 197
10.4 Docker Swarm 实战 210
第三部分 Docker 落地之路 221
第11 章 企业级Docker 容器云架构 222
11.1 宏观系统视角下的架构 222
11.2 容器云平台逻辑架构图 223
第12 章 基于Rancher 的容器云管理平台 226
12.1 Rancher 概述 226
12.2 Rancher 的安装 227
12.3 Rancher 对IaaS 的管理 228
12.4 Rancher 下多租户多环境的管理 236
12.5 Rancher 对SaaS 的管理 240
12.6 Rancher 对容器的管理 242
12.7 Rancher 的L2-FLAT 网络 248
12.8 Rancher 的服务治理 249
第13 章 微服务与Docker 化实战 258
13.1 整体架构鸟瞰 258
13.2 基于log-pilot 的日志收集 261
13.3 基于Zabbix 的容器监控 263
13.4 简单的DevOps 架构图 264
13.5 推进方案和成本 266
第 1章 容器发展之路 2
1.1 落后的旧时代 2
1.2 你好,VMware! 2
1.3 虚拟机的不足 3
1.4 你好,容器! 3
1.5 Linux容器 3
1.6 你好,Docker! 4
1.7 Windows容器 4
1.8 Windows容器vs Linux容器 4
1.9 Mac容器现状 5
1.10 Kubernetes 5
1.11 本章小结 6
第 2章 走进Docker 7
2.1 Docker—简介 7
2.2 Docker公司 7
2.3 Docker运行时与编排引擎 8
2.4 Docker开源项目(Moby) 9
2.5 容器生态 10
2.6 开放容器计划 11
2.7 本章小结 12
第3章 Docker安装 13
3.1 Windows版Docker(DfW) 13
3.2 Mac版Docker(DfM) 17
3.3 在Linux上安装Docker 19
3.4 在Windows Server 2016上安装Docker 21
3.5 Docker引擎(Engine)升级 22
3.5.1 在Ubuntu 16.04上升级Docker CE 23
3.5.2 在Windows Server 2016上升级Docker EE 24
3.6 Docker存储驱动的选择 25
3.6.1 Device Mapper配置 26
3.6.2 让Docker自动设置direct-lvm 26
3.6.3 手动配置Device Mapper的direct-lvm 28
3.7 本章小结 28
第4章 纵观Docker 29
4.1 运维视角 29
4.1.1 镜像 30
4.1.2 容器 31
4.1.3 连接到运行中的容器 34
4.2 开发视角 35
4.3 本章小结 38
第二部分 Docker技术
第5章 Docker引擎 40
5.1 Docker引擎—简介 40
5.2 Docker引擎—详解 41
5.2.1 摆脱LXC 41
5.2.2 摒弃大而全的Docker daemon 42
5.2.3 开放容器计划(OCI)的影响 43
5.2.4 runc 43
5.2.5 containerd 43
5.2.6 启动一个新的容器(示例) 44
5.2.7 该模型的显著优势 45
5.2.8 shim 45
5.2.9 在Linux中的实现 46
5.2.10 daemon的作用 46
5.3 本章小结 46
第6章 Docker镜像 48
6.1 Docker镜像—简介 48
6.2 Docker镜像—详解 48
6.2.1 镜像和容器 49
6.2.2 镜像通常比较小 49
6.2.3 拉取镜像 49
6.2.4 镜像命名 51
6.2.5 镜像仓库服务 51
6.2.6 镜像命名和标签 52
6.2.7 为镜像打多个标签 54
6.2.8 过滤docker image ls的输出内容 55
6.2.9 通过CLI方式搜索Docker Hub 56
6.2.10 镜像和分层 57
6.2.11 共享镜像层 60
6.2.12 根据摘要拉取镜像 61
6.2.13 镜像散列值(摘要) 63
6.2.14 多层架构的镜像 63
6.2.15 删除镜像 65
6.3 镜像—命令 67
6.4 本章小结 67
第7章 Docker容器 68
7.1 Docker容器—简介 68
7.2 Docker容器—详解 69
7.2.1 容器vs虚拟机 69
7.2.2 虚拟机的额外开销 71
7.2.3 运行的容器 71
7.2.4 检查Docker daemon 71
7.2.5 启动一个简单容器 72
7.2.6 容器进程 74
7.2.7 容器生命周期 75
7.2.8 优雅地停止容器 78
7.2.9 利用重启策略进行容器的自我修复 78
7.2.10 Web服务器示例 80
7.2.11 查看容器详情 82
7.2.12 快速清理 82
7.3 容器—命令 83
7.4 本章小结 84
第8章 应用的容器化 85
8.1 应用的容器化—简介 85
8.2 应用的容器化—详解 86
8.2.1 单体应用容器化 86
8.2.2 生产环境中的多阶段构建 95
8.2.3 最佳实践 98
8.3 应用的容器化—命令 100
8.4 本章小结 101
第9章 使用Docker Compose部署应用 102
9.1 使用Docker Compose部署应用—简介 102
9.2 使用Docker Compose部署应用—详解 103
9.2.1 Docker Compose的背景 103
9.2.2 安装Docker Compose 103
9.2.3 Compose文件 105
9.2.4 使用Docker Compose部署应用 107
9.2.5 使用Docker Compose管理应用 110
9.3 使用Docker Compose部署应用—命令 115
9.4 本章小结 116
第 10章 Docker Swarm 117
10.1 Docker Swarm—简介 117
10.2 Docker Swarm—详解 118
10.2.1 Swarm的初步介绍 118
10.2.2 搭建安全Swarm集群 119
10.2.3 Swarm服务 125
10.2.4 故障排除 133
10.3 Docker Swarm—命令 134
10.4 本章小结 135
第 11章 Docker网络 136
11.1 Docker网络—简介 136
11.2 Docker网络—详解 137
11.2.1 基础理论 137
11.2.2 单机桥接网络 140
11.2.3 多机覆盖网络 146
11.2.4 接入现有网络 146
11.2.5 服务发现 152
11.2.6 Ingress网络 153
11.3 Docker网络—命令 156
11.4 本章小结 156
第 12章 Docker覆盖网络 157
12.1 Docker覆盖网络—简介 157
12.2 Docker覆盖网络—详解 157
12.2.1 在Swarm模式下构建并测试Docker覆盖网络 158
12.2.2 工作原理 164
12.3 Docker覆盖网络—命令 168
12.4 本章小结 168
第 13章 卷与持久化数据 169
13.1 卷与持久化数据—简介 169
13.2 卷与持久化数据—详解 169
13.2.1 容器与非持久数据 170
13.2.2 容器与持久化数据 170
13.2.3 在集群节点间共享存储 175
13.3 卷与持久化数据—命令 176
13.4 本章小结 176
第 14章 使用Docker Stack部署应用 177
14.1 使用Docker Stack部署应用—简介 177
14.2 使用Docker Stack部署应用—详解 178
14.2.1 简单应用 178
14.2.2 深入分析Stack文件 180
14.2.3 部署应用 186
14.2.4 管理应用 191
14.3 使用Docker Stack部署应用—命令 193
14.4 本章小结 194
第 15章 Docker安全 195
15.1 Docker安全—简介 195
15.2 Docker安全—详解 196
15.2.1 Linux安全技术 197
15.2.2 Docker平台安全技术 201
15.3 本章小结 212
第 16章 企业版工具 213
16.1 企业版工具—简介 213
16.2 企业版工具—详解 214
16.2.1 Docker EE引擎 214
16.2.2 Docker通用控制平面(UCP) 216
16.2.3 Docker可信镜像仓库服务(DTR) 227
16.3 本章小结 233
第 17章 企业级特性 234
17.1 企业级特性—简介 234
17.2 企业级特性—详解 234
17.2.1 基于角色的权限控制(RBAC) 235
17.2.2 集成活动目录 239
17.2.3 Docker内容信任机制(DCT) 241
17.2.4 配置Docker可信镜像仓库服务(DTR) 243
17.2.5 使用Docker可信镜像仓库服务 244
17.2.6 提升镜像 247
17.2.7 HTTP路由网格(HRM) 250
17.3 本章小结 253
附录A 安全客户端与daemon的通信 255
附录B DCA考试 265
附录C 延伸 270
第1章 初识Docker与容器 3
1.1 什么是Docker 3
1.2 为什么要使用Docker 6
1.3 Docker与虚拟化 8
1.4 本章小结 9
第2章 核心概念与安装配置 10
2.1 核心概念 10
2.2 安装Docker引擎 11
2.2.1 Ubuntu 环境下安装 Docker 12
2.2.2 CentOS 环境下安装 Docker 14
2.2.3 通过脚本安装 15
2.2.4 macOS环境下安装 Docker 15
2.2.5 Windows环境下安装Docker 23
2.3 配置 Docker 服务 26
2.4 推荐实践环境 27
2.5 本章小结 27
第3章 使用Docker镜像 28
3.1 获取镜像 28
3.2 查看镜像信息 30
3.3 搜寻镜像 32
3.4 删除和清理镜像 33
3.5 创建镜像 35
3.6 存出和载入镜像 36
3.7 上传镜像 37
3.8 本章小结 38
第4章 操作Docker容器 39
4.1 创建容器 39
4.2 停止容器 44
4.3 进入容器 46
4.4 删除容器 47
4.5 导入和导出容器 48
4.6 查看容器 49
4.7 其他容器命令 50
4.8 本章小结 52
第5章 访问 Docker 仓库 53
5.1 Docker Hub 公共镜像市场 53
5.2 第三方镜像市场 55
5.3 搭建本地私有仓库 56
5.4 本章小结 58
第6章 Docker数据管理 59
6.1 数据卷 59
6.2 数据卷容器 60
6.3 利用数据卷容器来迁移数据 62
6.4 本章小结 62
第7章 端口映射与容器互联 63
7.1 端口映射实现容器访问 63
7.2 互联机制实现便捷互访 64
7.3 本章小结 67
第8章 使用Dockerfile创建镜像 68
8.1 基本结构 68
8.2 指令说明 70
8.2.1 配置指令 71
8.2.2 操作指令 74
8.3 创建镜像 75
8.3.1 命令选项 76
8.3.2 选择父镜像 77
8.3.3 使用.dockerignore文件 77
8.3.4 多步骤创建 78
8.4 最佳实践 79
8.5 本章小结 80
第二部分 实战案例
第9章 操作系统 83
9.1 BusyBox 83
9.2 Alpine 85
9.3 Debian/Ubuntu 86
9.4 CentOS/Fedora 88
9.5 本章小结 89
第10章 为镜像添加SSH服务 90
10.1 基于commit命令创建 90
10.2 使用Dockerfile创建 93
10.3 本章小结 95
第11章 Web服务与应用 96
11.1 Apache 96
11.2 Nginx 100
11.3 Tomcat 104
11.4 Jetty 108
11.5 LAMP 109
11.6 持续开发与管理 111
11.7 本章小结 114
第12章 数据库应用 115
12.1 MySQL 115
12.2 Oracle Database XE 117
12.3 MongoDB 118
12.4 Redis 124
12.5 Cassandra 126
12.6 本章小结 129
第13章 分布式处理与大数据平台 130
13.1 Hadoop 130
13.2 Spark 133
13.3 Storm 136
13.4 Elasticsearch 140
13.5 本章小结 141
第14章 编程开发 142
14.1 C/C++ 142
14.2 Java 146
14.3 Python 149
14.3.1 使用Python官方镜像 150
14.3.2 使用PyPy 151
14.3.3 使用 Flask 151
14.3.4 相关资源 154
14.4 JavaScript 154
14.4.1 使用Node.js 154
14.4.2 相关资源 158
14.5 Go 158
14.6 本章小结 161
第15章 容器与云服务 162
15.1 公有云容器服务 162
15.1.1 AWS 162
15.1.2 Google Cloud Platform 163
15.1.3 Azure 164
15.1.4 腾讯云 165
15.1.5 阿里云 165
15.1.6 华为云 166
15.1.7 UCloud 167
15.2 容器云服务 168
15.3 阿里云容器服务 172
15.4 时速云介绍 174
15.5 本章小结 175
第16章 容器实战思考 176
16.1 Docker 为什么会成功 176
16.2 研发人员该如何看待容器 177
16.3 容器化开发模式 178
16.4 容器与生产环境 180
16.5 本章小结 182
第三部分 进阶技能
第17章 核心实现技术 185
17.1 基本架构 185
17.2 命名空间 187
17.3 控制组 191
17.4 联合文件系统 193
17.5 Linux网络虚拟化 195
17.6 本章小结 197
第18章 配置私有仓库 199
18.1 安装Docker Registry 199
18.2 配置TLS证书 201
18.3 管理访问权限 202
18.4 配置Registry 205
18.5 批量管理镜像 211
18.6 使用通知系统 214
18.7 本章小结 217
第19章 安全防护与配置 218
19.1 命名空间隔离的安全 218
19.2 控制组资源控制的安全 219
19.3 内核能力机制 219
19.4 Docker服务端的防护 221
19.5 更多安全特性的使用 221
19.6 使用第三方检测工具 222
19.6.1 Docker Bench 222
19.6.2 clair 223
19.7 本章小结 224
第20章 高级网络功能 225
20.1 启动与配置参数 225
20.2 配置容器DNS和主机名 227
20.3 容器访问控制 228
20.4 映射容器端口到宿主主机的实现 229
20.5 配置容器网桥 231
20.6 自定义网桥 232
20.7 使用OpenvSwitch网桥 233
20.8 创建一个点到点连接 235
20.9 本章小结 236
第21章 libnetwork插件化网络功能 237
21.1 容器网络模型 237
21.2 Docker网络命令 238
21.3 构建跨主机容器网络 241
21.4 本章小结 243
第四部分 开源项目
第22章 Etcd—高可用的键值数据库 247
22.1 Etcd简介 247
22.2 安装和使用Etcd 248
22.3 使用客户端命令 253
22.3.1 数据类操作 255
22.3.2 非数据类操作 258
22.4 Etcd集群管理 260
22.4.1 构建集群 260
22.4.2 集群参数配置 263
22.5 本章小结 264
第23章 Docker三剑客之Machine 265
23.1 Machine简介 265
23.2 安装Machine 265
23.3 使用Machine 266
23.4 Machine命令 268
23.5 本章小结 272
第24章 Docker三剑客之Compose 273
24.1 Compose简介 273
24.2 安装与卸载 274
24.3 Compose模板文件 277
24.4 Compose命令说明 292
24.5 Compose环境变量 299
24.6 Compose应用案例一:Web负载均衡 300
24.7 Compose应用案例二:大数据Spark集群 304
24.8 本章小结 309
第25章 Docker三剑客之Swarm 310
25.1 Swarm简介 310
25.2 基本概念 311
25.3 使用Swarm 313
25.4 使用服务命令 316
25.5 本章小结 319
第26章 Mesos—优秀的集群资源调度平台 321
26.1 简介 321
26.2 Mesos安装与使用 322
26.3 原理与架构 330
26.3.1 架构 330
26.3.2 基本单元 331
26.3.3 调度 331
26.3.4 高可用性 332
26.4 Mesos配置解析 333
26.4.1 通用项 333
26.4.2 master专属配置项 333
26.4.3 slave专属配置项 335
26.5 日志与监控 338
26.6 常见应用框架 340
26.7 本章小结 341
第27章 Kubernetes—生产级容器集群平台 343
27.1 简介 343
27.2 核心概念 345
27.3 资源抽象对象 348
27.3.1 容器组 348
27.3.2 服务 349
27.3.3 存储卷 350
27.4 控制器抽象对象 351
27.5 其他抽象对象 353
27.6 快速体验 355
27.7 重要组件 359
27.7.1 Etcd 360
27.7.2 kube-apiserver 360
27.7.3 kube-scheduler 361
27.7.4 kube-controller-manager 362
27.7.5 kubelet 363
27.7.6 kube-proxy 364
27.8 使用kubectl 365
27.8.1 获取kubectl 365
27.8.2 命令格式 366
27.8.3 全局参数 367
27.8.4 通用子命令 369
27.9 网络设计 372
27.10 本章小结 374
第28章 其他相关项目 375
28.1 持续集成 375
28.2 容器管理 377
28.2.1 Portainer 377
28.2.2 Panamax 378
28.2.3 Seagull 378
28.3 编程开发 380
28.4 网络支持 381
28.4.1 Pipework 381
28.4.2 Flannel项目 382
28.4.3 Weave Net项目 382
28.4.4 Calico项目 383
28.5 日志处理 383
28.6 服务代理 385
28.7 标准与规范 389
28.8 其他项目 392
28.9 本章小结 396
附录
附录A 常见问题总结 398
附录B Docker命令查询 404
附录C 参考资源链接 411
Java 8 终于支持 Docker !
Grzegorz Kocur Java技术栈 今天
作者 | Grzegorz Kocur
原文:https://blog.softwaremill.com/docker-support-in-new-java-8-finally-fd595df0ca54
出品 | CSDN,译者 | 苏本如,责编 | 屠敏
Java 8 过去一直与 Docker 无法很好地兼容,现在可让开发者们奔走相告的是,这个问题已经解决了。
请注意:本文中我使用的是遵循GNU GPL v2 许可授权的OpenJDK官方Docker镜像。这里描述的对Docker的支持在Oracle Java SE 开发工具包(JDK)版本8的更新191中被引入。Oracle在2019年4月修改了Java 8更新的许可政策,自Java SE 8更新211后的商业使用不再免费。
你是否曾经经历过在Docker中运行基于JVM的应用程序时出现“随机”故障?或者一些奇怪的死机?两者都有可能是由于Java 8(它仍然被广泛使用)中的糟糕的Docker支持引起。
Docker使用控制组(cgroups)来限制对资源的使用。在容器中运行应用程序时限制其对内存和CPU的使用绝对是一个好主意,它可以防止应用程序占用全部可用的内存和/或CPU,因而导致在同一系统上运行的其他容器无法响应。限制资源的使用可以提高应用程序的可靠性和稳定性。它还为硬件容量的规划提供了依据。在像诸如Kubernetes或DC/OS这样的编排系统上运行容器时,这一点尤为重要。
一、问题
JVM可以“看到”系统上所有可用的内存和CPU内核,并保持与这些资源的一致。在默认情况下,JVM会将max heap size(最大堆大小)设置为系统内存的1/4,并将一些线程池个数(比如说垃圾回收(GC))设置为与物理CPU内核的数量一致。我们一起来看看下面的例子。
我们将运行一个简单的应用程序,它将消耗尽可能多的内存(示例可以在这个站点上找到):
import java.util.Vector;
public class MemoryEater
{
public static void main(String[] args)
{
Vector v = new Vector();
while (true)
{
byte b[] = new byte[1048576];
v.add(b);
Runtime rt = Runtime.getRuntime();
System.out.println( "free memory: " + rt.freeMemory() );
}
}
}
我们在内存为64GB的系统上运行它,让我们来检查一下默认的最大堆大小:
$ docker run -ti -m 512M openjdk:8u181-jdk
root@eca214e0fcd4:/# java -XX:+PrintFlagsFinal -version | grep MaxHeap
uintx MaxHeapFreeRatio = 100 {manageable}
uintx MaxHeapSize := 16819159040 {product}
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-2~deb9u1-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
如前所述,它应该是系统物理内存的1/4 (16GB)。如果我们使用Docker cgroups限制内存,会发生什么呢?让我们检查一下:
$ docker run -ti -m 512M openjdk:8u181-jdk
root@eca214e0fcd4:/# javac MemoryEater.java
Note: MemoryEater.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
root@eca214e0fcd4:/# java MemoryEater
free memory: 1003980048
free memory: 1003980048
free memory: 1003980048
[...]
free memory: 803562640
free memory: 802514048
free memory: 801465456
free memory: 800416864
Killed
root@eca214e0fcd4:/#
这个JVM进程被终止了。因为它是一个子进程,所以容器本身幸存下来,但是通常当Java是容器内的唯一进程(用PID 1)时,容器也会崩溃。46张PPT弄懂JVM、GC算法和性能调优,这个分享给你。
让我们深入研究一下系统日志中有什么:
Apr 18 16:18:46 dcos-agent-1 kernel: java invoked oom-killer: gfp_mask=0xd0, order=0, oom_score_adj=0
Apr 18 16:18:46 dcos-agent-1 kernel: java cpuset=eca214e0fcd4b245eecb2a80c05e9d7f8688fc36979c510d2fb9afab2ce55712 mems_allowed=0
Apr 18 16:18:46 dcos-agent-1 kernel: CPU: 6 PID: 4142 Comm: java Tainted: G ------------ T 3.10.0-693.17.1.el7.x86_64 #1
Apr 18 16:18:46 dcos-agent-1 kernel: Hardware name: Supermicro Super Server/X10SRi-F, BIOS 2.0 12/17/2015
Apr 18 16:18:46 dcos-agent-1 kernel: Call Trace:
Apr 18 16:18:46 dcos-agent-1 kernel: [<ffffffff816a6071>] dump_stack+0x19/0x1b
Apr 18 16:18:46 dcos-agent-1 kernel: [<ffffffff816a1466>] dump_header+0x90/0x229
Apr 18 16:18:46 dcos-agent-1 kernel: [<ffffffff81187dc6>] ? find_lock_task_mm+0x56/0xc0
Apr 18 16:18:46 dcos-agent-1 kernel: [<ffffffff811f36a8>] ? try_get_mem_cgroup_from_mm+0x28/0x60
Apr 18 16:18:46 dcos-agent-1 kernel: [<ffffffff81188274>] oom_kill_process+0x254/0x3d0
Apr 18 16:18:46 dcos-agent-1 kernel: [<ffffffff812ba2fc>] ? selinux_capable+0x1c/0x40
Apr 18 16:18:46 dcos-agent-1 kernel: [<ffffffff811f73c6>] mem_cgroup_oom_synchronize+0x546/0x570
Apr 18 16:18:46 dcos-agent-1 kernel: [<ffffffff811f6840>] ? mem_cgroup_charge_common+0xc0/0xc0
Apr 18 16:18:46 dcos-agent-1 kernel: [<ffffffff81188b04>] pagefault_out_of_memory+0x14/0x90
Apr 18 16:18:46 dcos-agent-1 kernel: [<ffffffff8169f82e>] mm_fault_error+0x68/0x12b
Apr 18 16:18:46 dcos-agent-1 kernel: [<ffffffff816b3a21>] __do_page_fault+0x391/0x450
Apr 18 16:18:46 dcos-agent-1 kernel: [<ffffffff816b3b15>] do_page_fault+0x35/0x90
Apr 18 16:18:46 dcos-agent-1 kernel: [<ffffffff816af8f8>] page_fault+0x28/0x30
Apr 18 16:18:46 dcos-agent-1 kernel: Task in /docker/eca214e0fcd4b245eecb2a80c05e9d7f8688fc36979c510d2fb9afab2ce55712 killed as a result of limit of /docker/eca214e0fc
d4b245eecb2a80c05e9d7f8688fc36979c510d2fb9afab2ce55712
Apr 18 16:18:46 dcos-agent-1 kernel: memory: usage 524180kB, limit 524288kB, failcnt 314788
Apr 18 16:18:46 dcos-agent-1 kernel: memory+swap: usage 1048576kB, limit 1048576kB, failcnt 6
Apr 18 16:18:46 dcos-agent-1 kernel: kmem: usage 0kB, limit 9007199254740988kB, failcnt 0
Apr 18 16:18:46 dcos-agent-1 kernel: Memory cgroup stats for /docker/eca214e0fcd4b245eecb2a80c05e9d7f8688fc36979c510d2fb9afab2ce55712: cache:28KB rss:524152KB rss_huge
:0KB mapped_file:0KB swap:524396KB inactive_anon:262176KB active_anon:261976KB inactive_file:8KB active_file:4KB unevictable:0KB
Apr 18 16:18:46 dcos-agent-1 kernel: [ pid ] uid tgid total_vm rss nr_ptes swapents oom_score_adj name
Apr 18 16:18:46 dcos-agent-1 kernel: [ 1400] 0 1400 4985 418 14 139 0 bash
Apr 18 16:18:46 dcos-agent-1 kernel: [ 4141] 0 4141 4956003 126966 606 137837 0 java
Apr 18 16:18:46 dcos-agent-1 kernel: Memory cgroup out of memory: Kill process 4162 (java) score 1012 or sacrifice child
Apr 18 16:18:46 dcos-agent-1 kernel: Killed process 4141 (java) total-vm:19824012kB, anon-rss:495748kB, file-rss:12116kB, shmem-rss:0kB
像这样的故障很难调试,因为应用程序日志中没有任何内容。在像AWS ECS这样的管理系统上,它可能尤其困难。
CPU怎么样?让我们运行一个显示可用处理器数量的小程序,来再一次看看会发生什么:
public class AvailableProcessors {
public static void main(String[] args) {
// check the number of processors available
System.out.println(""+Runtime.getRuntime().availableProcessors());
}
}
我们在一个CPU数量设置为1的Docker容器中运行这个小程序:
$ docker run -ti --cpus 1 openjdk:8u181-jdk
root@82080104994c:/# javac AvailableProcessors.java
root@82080104994c:/# java AvailableProcessors
12