-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
atom.xml
5541 lines (5380 loc) · 417 KB
/
atom.xml
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
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CN">
<id>https://vuepress.mirror.docker-practice.com/</id>
<title>Docker 从入门到实践</title>
<updated>2022-06-25T13:34:49.470Z</updated>
<generator>@mr-hope/vuepress-plugin-feed</generator>
<link rel="self" href="https://vuepress.mirror.docker-practice.com/atom.xml"/>
<link rel="alternate" href="https://vuepress.mirror.docker-practice.com/"/>
<entry>
<title type="html">修订记录</title>
<id>https://vuepress.mirror.docker-practice.com/CHANGELOG/</id>
<link href="https://vuepress.mirror.docker-practice.com/CHANGELOG/"/>
<updated>2022-06-25T13:30:44.000Z</updated>
<content type="html"><![CDATA[<h1 id="修订记录"> 修订记录</h1>
<ul>
<li>
<p>1.4.0 2022-MM-DD</p>
<ul>
<li>以 Docker Compose v2 为例介绍 compose</li>
</ul>
</li>
<li>
<p>1.3.0 2021-12-02</p>
<ul>
<li>全面支持 Docker v20.10 新版本</li>
<li>新增 Docker Compose v2</li>
<li>Docker Hub 自动构建转为付费功能</li>
</ul>
</li>
<li>
<p>1.2.0 2020-12-20</p>
<ul>
<li>错误修复</li>
</ul>
</li>
<li>
<p>1.1.0 2019-12-31</p>
<ul>
<li>全面支持 Docker v19.03 新版本</li>
<li>增加 <code>BuildKit</code></li>
<li>增加 <code>docker buildx</code> 命令使用说明</li>
<li>增加 <code>docker manifest</code> 命令使用说明</li>
<li>移除 <code>Ubuntu 14.04</code> <code>Debian 8</code> <code>Debian 7</code></li>
</ul>
</li>
<li>
<p>1.0.0: 2018-12-31</p>
<ul>
<li>全面支持 Docker v18.x 新版本</li>
<li>添加如何调试 Docker</li>
<li>错误修正</li>
</ul>
</li>
<li>
<p>0.9.0: 2017-12-31</p>
<ul>
<li>对 v1.13.x 旧版本的最后支持</li>
</ul>
</li>
<li>
<p>0.9.0-rc2: 2017-12-10</p>
<ul>
<li>
<p>增加 Docker 中文资源链接</p>
</li>
<li>
<p>增加介绍基于 Docker 的 CI/CD 工具 <code>Drone</code></p>
</li>
<li>
<p>增加 <code>docker secret</code> 相关内容</p>
</li>
<li>
<p>增加 <code>docker config</code> 相关内容</p>
</li>
<li>
<p>增加 <code>LinuxKit</code> 相关内容</p>
</li>
<li>
<p>更新 <code>CoreOS</code> 章节</p>
</li>
<li>
<p>更新 <code>etcd</code> 章节,基于 3.x 版本</p>
</li>
<li>
<p>删除 <code>Docker Compose</code> 中的 <code>links</code>指令</p>
</li>
<li>
<p>替换 <code>docker daemon</code> 命令为 <code>dockerd</code></p>
</li>
<li>
<p>替换 <code>docker ps</code> 命令为 <code>docker container ls</code></p>
</li>
<li>
<p>替换 <code>docker images</code> 命令为 <code>docker image ls</code></p>
</li>
<li>
<p>修改 <code>安装 Docker</code> 一节中部分文字表述</p>
</li>
<li>
<p>移除历史遗留文件和错误的文件</p>
</li>
<li>
<p>优化文字排版</p>
</li>
<li>
<p>调整目录结构</p>
</li>
<li>
<p>修复内容逻辑错误</p>
</li>
<li>
<p>修复<code>404</code> 链接</p>
</li>
</ul>
</li>
<li>
<p>0.9.0-rc1: 2017-11-29</p>
<ul>
<li>
<p>根据最新版本(v17.09)修订内容</p>
</li>
<li>
<p>增加 <code>Dockerfile</code> 多阶段构建( <code>multistage builds</code> ) <code>Docker 17.05</code> 新增特性</p>
</li>
<li>
<p>增加 <code>docker exec</code> 子命令介绍</p>
</li>
<li>
<p>增加 <code>docker</code> 管理子命令 <code>container</code> <code>image</code> <code>network</code> <code>volume</code> 介绍</p>
</li>
<li>
<p>增加 <code>树莓派单片电脑</code> 安装 Docker</p>
</li>
<li>
<p>增加 Docker 存储驱动 <code>OverlayFS</code> 相关内容</p>
</li>
<li>
<p>更新 <code>Docker CE</code> <code>v17.x</code> 安装说明</p>
</li>
<li>
<p>更新 <code>Docker 网络</code> 一节</p>
</li>
<li>
<p>更新 <code>Docker Machine</code> 基于 0.13.0 版本</p>
</li>
<li>
<p>更新 <code>Docker Compose</code> 基于 3 文件格式</p>
</li>
<li>
<p>删除 <code>Docker Swarm</code> 相关内容,替换为 <code>Swarm mode</code> <code>Docker 1.12.0</code> 新增特性</p>
</li>
<li>
<p>删除 <code>docker run</code> <code>--link</code> 参数</p>
</li>
<li>
<p>精简 <code>Docker Registry</code> 一节</p>
</li>
<li>
<p>替换 <code>docker run</code> <code>-v</code> 参数为 <code>--mount</code></p>
</li>
<li>
<p>修复 <code>404</code> 链接</p>
</li>
<li>
<p>优化文字排版</p>
</li>
<li>
<p>增加离线阅读功能</p>
</li>
</ul>
</li>
<li>
<p>0.8.0: 2017-01-08</p>
<ul>
<li>修正文字内容</li>
<li>根据最新版本(1.12)修订安装使用</li>
<li>补充附录章节</li>
</ul>
</li>
<li>
<p>0.7.0: 2016-06-12</p>
<ul>
<li>根据最新版本进行命令调整</li>
<li>修正若干文字描述</li>
</ul>
</li>
<li>
<p>0.6.0: 2015-12-24</p>
<ul>
<li>补充 Machine 项目</li>
<li>修正若干 bug</li>
</ul>
</li>
<li>
<p>0.5.0: 2015-06-29</p>
<ul>
<li>添加 Compose 项目</li>
<li>添加 Machine 项目</li>
<li>添加 Swarm 项目</li>
<li>完善 Kubernetes 项目内容</li>
<li>添加 Mesos 项目内容</li>
</ul>
</li>
<li>
<p>0.4.0: 2015-05-08</p>
<ul>
<li>添加 Etcd 项目</li>
<li>添加 Fig 项目</li>
<li>添加 CoreOS 项目</li>
<li>添加 Kubernetes 项目</li>
</ul>
</li>
<li>
<p>0.3.0: 2014-11-25</p>
<ul>
<li>完成仓库章节</li>
<li>重写安全章节</li>
<li>修正底层实现章节的架构、命名空间、控制组、文件系统、容器格式等内容</li>
<li>添加对常见仓库和镜像的介绍</li>
<li>添加 Dockerfile 的介绍</li>
<li>重新校订中英文混排格式</li>
<li>修订文字表达</li>
<li>发布繁体版本分支:zh-Hant</li>
</ul>
</li>
<li>
<p>0.2.0: 2014-09-18</p>
<ul>
<li>对照官方文档重写介绍、基本概念、安装、镜像、容器、仓库、数据管理、网络等章节</li>
<li>添加底层实现章节</li>
<li>添加命令查询和资源链接章节</li>
<li>其它修正</li>
</ul>
</li>
<li>
<p>0.1.0: 2014-09-05</p>
<ul>
<li>添加基本内容</li>
<li>修正错别字和表达不通顺的地方</li>
</ul>
</li>
</ul>
]]></content>
<published>2022-05-12T21:37:08.000Z</published>
</entry>
<entry>
<title type="html">Docker — 从入门到实践</title>
<id>https://vuepress.mirror.docker-practice.com/</id>
<link href="https://vuepress.mirror.docker-practice.com/"/>
<updated>2022-05-12T21:37:08.000Z</updated>
<content type="html"><![CDATA[<h1 id="docker-从入门到实践"> Docker — 从入门到实践</h1>
<i>Content not supported</i>
<p><a href="https://github.com/yeasy/docker_practice" target="_blank" rel="noopener noreferrer"><img src="https://img.shields.io/github/stars/yeasy/docker_practice.svg?style=social&label=Stars" alt=""><i>Content not supported</i></a> <a href="https://github.com/yeasy/docker_practice/releases" target="_blank" rel="noopener noreferrer"><img src="https://img.shields.io/github/release/yeasy/docker_practice/all.svg" alt=""><i>Content not supported</i></a> <a href="https://github.com/docker/docker-ce" target="_blank" rel="noopener noreferrer"><img src="https://img.shields.io/badge/Based-Docker CE v20.10-blue.svg" alt=""><i>Content not supported</i></a> <a href="https://union-click.jd.com/jdc?e=&p=JF8AANADIgZlGF0VAxUDVBJdHDISBFAfWRcCGzcRRANLXSJeEF4aVwkMGQ1eD0kdSVJKSQVJHBIEUB9ZFwIbGAxeB0gyS34PbFlHVHNkI0MQEAoIcSxyBWFLRAtZK1olABYHXR9eHAoQN2UbXCVQfN_jrYOwsw7T_5SOnZUiBmUbXBYBFwBVG14UBBAAZRxbHDJJUjscCEEHEQ4FSA4VBhBQZStrFjIiN1UrWCVAfARQT1gQA0cFAEwOEAcRDlMTDEALQAFTEwwRUhMAUR1cJQATBlES" target="_blank" rel="noopener noreferrer"><img src="https://img.shields.io/badge/Docker 技术入门与实战-jd.com-red.svg" alt=""><i>Content not supported</i></a></p>
<p><strong>v1.3.0</strong></p>
<table>
<thead>
<tr>
<th style="text-align:left">语言</th>
<th style="text-align:left">-</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><a href="https://github.com/yeasy/docker_practice" target="_blank" rel="noopener noreferrer">简体中文<i>Content not supported</i></a></td>
<td style="text-align:left"><a href="https://vuepress.mirror.docker-practice.com/" target="_blank" rel="noopener noreferrer">阅读<i>Content not supported</i></a></td>
</tr>
</tbody>
</table>
<p><a href="https://www.docker.com" target="_blank" rel="noopener noreferrer">Docker<i>Content not supported</i></a> 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松!</p>
<p>无论是应用开发者、运维人员、还是其他信息技术从业人员,都有必要认识和掌握 Docker,节约有限的生命。</p>
<p>本书既适用于具备基础 Linux 知识的 Docker 初学者,也希望可供理解原理和实现的高级用户参考。同时,书中给出的实践案例,可供在进行实际部署时借鉴。前六章为基础内容,供用户理解 Docker 的基本概念和操作;7 ~ 9 章介绍包括数据管理、网络等高级操作;第 10 ~ 12 章介绍了容器生态中的几个核心项目;13、14 章讨论了关于 Docker 安全和实现技术等高级话题。后续章节则分别介绍包括 Etcd、Fedora CoreOS、Kubernetes、容器云等相关热门开源项目。最后,还展示了使用容器技术的典型的应用场景和实践案例。</p>
<ul>
<li>在线阅读:<a href="https://vuepress.mirror.docker-practice.com/" target="_blank" rel="noopener noreferrer">docker-practice.com<i>Content not supported</i></a>,<a href="https://yeasy.gitbook.io/docker_practice/" target="_blank" rel="noopener noreferrer">GitBook<i>Content not supported</i></a>,<a href="https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md" target="_blank" rel="noopener noreferrer">Github<i>Content not supported</i></a></li>
<li>离线阅读:<a href="https://github.com/yeasy/docker_practice/wiki/%E7%A6%BB%E7%BA%BF%E9%98%85%E8%AF%BB%E5%8A%9F%E8%83%BD%E8%AF%A6%E8%A7%A3" target="_blank" rel="noopener noreferrer"><code>$ docker run -it --rm -p 4000:80 ccr.ccs.tencentyun.com/dockerpracticesig/docker_practice:vuepress</code><i>Content not supported</i></a></li>
</ul>
<p>Docker 自身仍在快速发展中,生态环境也在蓬勃成长。建议初学者使用最新稳定版本的 Docker 进行学习实践。欢迎 <a href="./CONTRIBUTING.html">参与项目维护</a>。</p>
<ul>
<li><a href="./CHANGELOG.html">修订记录</a></li>
<li><a href="https://github.com/yeasy/docker_practice/graphs/contributors" target="_blank" rel="noopener noreferrer">贡献者名单<i>Content not supported</i></a></li>
</ul>
<h2 id="微信小程序"> 微信小程序</h2>
<p align="center">
<img width="200" src="https://docker_practice.gitee.io/pic/dp-wechat-miniprogram.jpg">
</p>
<p align="center"><strong>微信扫码 随时随地阅读~</strong></p>
<h2 id="技术交流"> 技术交流</h2>
<p align="center">
<img width="200" src="https://docker_practice.gitee.io/pic/dpsig-wechat.jpg">
</p>
<p align="center"><strong>微信扫码 加入群聊~ 或者微信添加 <code>dpsigs</code> 邀请入群</strong></p>
<p>欢迎加入 Docker 技术交流 QQ 群,分享 Docker 资源,交流 Docker 技术。</p>
<ul>
<li>QQ 群 I (已满):341410255</li>
<li>QQ 群 II (已满):419042067</li>
<li>QQ 群 III (已满):210028779</li>
<li>QQ 群 IV (已满):483702734</li>
<li>QQ 群 V (已满):460598761</li>
<li>QQ 群 VI (已满):581983671</li>
<li>QQ 群 VII (已满):252403484</li>
<li>QQ 群 VIII(已满):544818750</li>
<li>QQ 群 IX (已满):571502246</li>
<li>QQ 群 X (可加):145983035</li>
</ul>
<blockquote>
<p>如果有容器技术相关的疑问,请通过 <a href="https://github.com/yeasy/docker_practice/issues/new/choose" target="_blank" rel="noopener noreferrer">Issues<i>Content not supported</i></a> 来提出。</p>
</blockquote>
<h2 id="进阶学习"> 进阶学习</h2>
<p><a href="https://union-click.jd.com/jdc?e=&p=JF8AANADIgZlGF0VAxUDVBJdHDISBFAfWRcCGzcRRANLXSJeEF4aVwkMGQ1eD0kdSVJKSQVJHBIEUB9ZFwIbGAxeB0gyS34PbFlHVHNkI0MQEAoIcSxyBWFLRAtZK1olABYHXR9eHAoQN2UbXCVQfN_jrYOwsw7T_5SOnZUiBmUbXBYBFwBVG14UBBAAZRxbHDJJUjscCEEHEQ4FSA4VBhBQZStrFjIiN1UrWCVAfARQT1gQA0cFAEwOEAcRDlMTDEALQAFTEwwRUhMAUR1cJQATBlES" target="_blank" rel="noopener noreferrer"><img src="https://github.com/yeasy/docker_practice/raw/master/_images/docker_primer3.png" alt=""><i>Content not supported</i></a></p>
<p>《<a href="https://union-click.jd.com/jdc?e=&p=JF8AANADIgZlGF0VAxUDVBJdHDISBFAfWRcCGzcRRANLXSJeEF4aVwkMGQ1eD0kdSVJKSQVJHBIEUB9ZFwIbGAxeB0gyS34PbFlHVHNkI0MQEAoIcSxyBWFLRAtZK1olABYHXR9eHAoQN2UbXCVQfN_jrYOwsw7T_5SOnZUiBmUbXBYBFwBVG14UBBAAZRxbHDJJUjscCEEHEQ4FSA4VBhBQZStrFjIiN1UrWCVAfARQT1gQA0cFAEwOEAcRDlMTDEALQAFTEwwRUhMAUR1cJQATBlES" target="_blank" rel="noopener noreferrer">Docker 技术入门与实战<i>Content not supported</i></a>》第三版已经面世,介绍最新的容器技术栈,欢迎大家阅读使用并反馈建议。</p>
<ul>
<li><a href="https://union-click.jd.com/jdc?e=&p=JF8AANADIgZlGF0VAxUDVBJdHDISBFAfWRcCGzcRRANLXSJeEF4aVwkMGQ1eD0kdSVJKSQVJHBIEUB9ZFwIbGAxeB0gyS34PbFlHVHNkI0MQEAoIcSxyBWFLRAtZK1olABYHXR9eHAoQN2UbXCVQfN_jrYOwsw7T_5SOnZUiBmUbXBYBFwBVG14UBBAAZRxbHDJJUjscCEEHEQ4FSA4VBhBQZStrFjIiN1UrWCVAfARQT1gQA0cFAEwOEAcRDlMTDEALQAFTEwwRUhMAUR1cJQATBlES" target="_blank" rel="noopener noreferrer">京东图书<i>Content not supported</i></a></li>
<li><a href="http://product.china-pub.com/8052127" target="_blank" rel="noopener noreferrer">China-Pub<i>Content not supported</i></a></li>
</ul>
<h2 id="鼓励项目"> 鼓励项目</h2>
<p align="center">
<img width="200" src="https://github.com/yeasy/docker_practice/raw/master/_images/donate.jpeg">
</p>
<p align="center"><strong>欢迎鼓励项目一杯 coffee~</strong></p>
]]></content>
<published>2022-05-12T21:37:08.000Z</published>
</entry>
<entry>
<title type="html">如何贡献</title>
<id>https://vuepress.mirror.docker-practice.com/CONTRIBUTING/</id>
<link href="https://vuepress.mirror.docker-practice.com/CONTRIBUTING/"/>
<updated>2022-05-12T21:37:08.000Z</updated>
<content type="html"><![CDATA[<h1 id="如何贡献"> 如何贡献</h1>
<p>领取或创建新的 <a href="https://github.com/yeasy/docker_practice/issues" target="_blank" rel="noopener noreferrer">Issue<i>Content not supported</i></a>,如 <a href="https://github.com/yeasy/docker_practice/issues/235" target="_blank" rel="noopener noreferrer">issue 235<i>Content not supported</i></a>,添加自己为 <code>Assignee</code>。</p>
<p>在 <a href="https://github.com/yeasy/docker_practice/fork" target="_blank" rel="noopener noreferrer">GitHub<i>Content not supported</i></a> 上 <code>fork</code> 到自己的仓库,如 <code>docker_user/docker_practice</code>,然后 <code>clone</code> 到本地,并设置用户信息。</p>
<div><pre><code>$ <span>git</span> clone git@github.com:docker_user/docker_practice.git
$ <span>cd</span> docker_practice
</code></pre>
<div><span>1</span><br><span>2</span><br><span>3</span><br></div></div><p>修改代码后提交,并推送到自己的仓库,注意修改提交消息为对应 Issue 号和描述。</p>
<div><pre><code><span># Update the content</span>
$ <span>git</span> commit -a -s
<span># In commit msg dialog, add content like "Fix issue #235: describe ur change"</span>
$ <span>git</span> push
</code></pre>
<div><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br></div></div><p>在 <a href="https://github.com/yeasy/docker_practice/pulls" target="_blank" rel="noopener noreferrer">GitHub<i>Content not supported</i></a> 上提交 <code>Pull Request</code>,添加标签,并邀请维护者进行 <code>Review</code>。</p>
<p>定期使用项目仓库内容更新自己仓库内容。</p>
<div><pre><code>$ <span>git</span> remote <span>add</span> upstream https://github.com/yeasy/docker_practice
$ <span>git</span> fetch upstream
$ <span>git</span> rebase upstream/master
$ <span>git</span> push -f origin master
</code></pre>
<div><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br></div></div><h2 id="排版规范"> 排版规范</h2>
<p>本开源书籍遵循 <a href="https://github.com/mzlogin/chinese-copywriting-guidelines" target="_blank" rel="noopener noreferrer">中文排版指南<i>Content not supported</i></a> 规范。</p>
]]></content>
<published>2022-05-12T21:37:08.000Z</published>
</entry>
<entry>
<title type="html">Docker — 从入门到实践</title>
<id>https://vuepress.mirror.docker-practice.com/SUMMARY/</id>
<link href="https://vuepress.mirror.docker-practice.com/SUMMARY/"/>
<updated>2022-06-25T13:30:44.000Z</updated>
<content type="html"><![CDATA[<h1 id="docker-从入门到实践"> <a href="https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md" target="_blank" rel="noopener noreferrer">Docker — 从入门到实践<i>Content not supported</i></a></h1>
<i>Content not supported</i>
<ul>
<li><a href="./">前言</a></li>
<li><a href="./CHANGELOG.html">修订记录</a></li>
<li><a href="./CONTRIBUTING.html">如何贡献</a></li>
<li><a href="./introduction/">Docker 简介</a>
<ul>
<li><a href="./introduction/what.html">什么是 Docker</a></li>
<li><a href="./introduction/why.html">为什么要用 Docker</a></li>
</ul>
</li>
<li><a href="./basic_concept/">基本概念</a>
<ul>
<li><a href="./basic_concept/image.html">镜像</a></li>
<li><a href="./basic_concept/container.html">容器</a></li>
<li><a href="./basic_concept/repository.html">仓库</a></li>
</ul>
</li>
<li><a href="./install/">安装 Docker</a>
<ul>
<li><a href="./install/ubuntu.html">Ubuntu</a></li>
<li><a href="./install/debian.html">Debian</a></li>
<li><a href="./install/fedora.html">Fedora</a></li>
<li><a href="./install/centos.html">CentOS</a></li>
<li><a href="./install/raspberry-pi.html">Raspberry Pi</a></li>
<li><a href="./install/offline.html">Linux 离线安装</a></li>
<li><a href="./install/mac.html">macOS</a></li>
<li><a href="./install/windows.html">Windows 10/11</a></li>
<li><a href="./install/mirror.html">镜像加速器</a></li>
<li><a href="./install/experimental.html">开启实验特性</a></li>
</ul>
</li>
<li><a href="./image/">使用镜像</a>
<ul>
<li><a href="./image/pull.html">获取镜像</a></li>
<li><a href="./image/list.html">列出镜像</a></li>
<li><a href="./image/rm.html">删除本地镜像</a></li>
<li><a href="./image/commit.html">利用 commit 理解镜像构成</a></li>
<li><a href="./image/build.html">使用 Dockerfile 定制镜像</a></li>
<li><a href="./image/dockerfile/">Dockerfile 指令详解</a>
<ul>
<li><a href="./image/dockerfile/copy.html">COPY 复制文件</a></li>
<li><a href="./image/dockerfile/add.html">ADD 更高级的复制文件</a></li>
<li><a href="./image/dockerfile/cmd.html">CMD 容器启动命令</a></li>
<li><a href="./image/dockerfile/entrypoint.html">ENTRYPOINT 入口点</a></li>
<li><a href="./image/dockerfile/env.html">ENV 设置环境变量</a></li>
<li><a href="./image/dockerfile/arg.html">ARG 构建参数</a></li>
<li><a href="./image/dockerfile/volume.html">VOLUME 定义匿名卷</a></li>
<li><a href="./image/dockerfile/expose.html">EXPOSE 暴露端口</a></li>
<li><a href="./image/dockerfile/workdir.html">WORKDIR 指定工作目录</a></li>
<li><a href="./image/dockerfile/user.html">USER 指定当前用户</a></li>
<li><a href="./image/dockerfile/healthcheck.html">HEALTHCHECK 健康检查</a></li>
<li><a href="./image/dockerfile/onbuild.html">ONBUILD 为他人作嫁衣裳</a></li>
<li><a href="./image/dockerfile/label.html">LABEL 为镜像添加元数据</a></li>
<li><a href="./image/dockerfile/shell.html">SHELL 指令</a></li>
<li><a href="./image/dockerfile/references.html">参考文档</a></li>
</ul>
</li>
<li><a href="./image/multistage-builds/">Dockerfile 多阶段构建</a>
<ul>
<li><a href="./image/multistage-builds/laravel.html">实战多阶段构建 Laravel 镜像</a></li>
</ul>
</li>
<li><a href="./image/manifest.html">构建多种系统架构支持的 Docker 镜像</a></li>
<li><a href="./image/other.html">其它制作镜像的方式</a></li>
<li><a href="./image/internal.html">实现原理</a></li>
</ul>
</li>
<li><a href="./container/">操作容器</a>
<ul>
<li><a href="./container/run.html">启动</a></li>
<li><a href="./container/daemon.html">守护态运行</a></li>
<li><a href="./container/stop.html">终止</a></li>
<li><a href="./container/attach_exec.html">进入容器</a></li>
<li><a href="./container/import_export.html">导出和导入</a></li>
<li><a href="./container/rm.html">删除</a></li>
</ul>
</li>
<li><a href="./repository/">访问仓库</a>
<ul>
<li><a href="./repository/dockerhub.html">Docker Hub</a></li>
<li><a href="./repository/registry.html">私有仓库</a></li>
<li><a href="./repository/registry_auth.html">私有仓库高级配置</a></li>
<li><a href="./repository/nexus3_registry.html">Nexus 3</a></li>
</ul>
</li>
<li><a href="./data_management/">数据管理</a>
<ul>
<li><a href="./data_management/volume.html">数据卷</a></li>
<li><a href="./data_management/bind-mounts.html">挂载主机目录</a></li>
</ul>
</li>
<li><a href="./network/">使用网络</a>
<ul>
<li><a href="./network/port_mapping.html">外部访问容器</a></li>
<li><a href="./network/linking.html">容器互联</a></li>
<li><a href="./network/dns.html">配置 DNS</a></li>
</ul>
</li>
<li><a href="./advanced_network/">高级网络配置</a>
<ul>
<li><a href="./advanced_network/quick_guide.html">快速配置指南</a></li>
<li><a href="./advanced_network/access_control.html">容器访问控制</a></li>
<li><a href="./advanced_network/port_mapping.html">端口映射实现</a></li>
<li><a href="./advanced_network/docker0.html">配置 docker0 网桥</a></li>
<li><a href="./advanced_network/bridge.html">自定义网桥</a></li>
<li><a href="./advanced_network/example.html">工具和示例</a></li>
<li><a href="./advanced_network/config_file.html">编辑网络配置文件</a></li>
<li><a href="./advanced_network/ptp.html">实例:创建一个点到点连接</a></li>
</ul>
</li>
<li><a href="./buildx/">Docker Buildx</a>
<ul>
<li><a href="./buildx/buildkit.html">BuildKit</a></li>
<li><a href="./buildx/buildx.html">使用 buildx 构建镜像</a></li>
<li><a href="./buildx/multi-arch-images.html">使用 buildx 构建多种系统架构支持的 Docker 镜像</a></li>
</ul>
</li>
<li><a href="./compose/">Docker Compose</a>
<ul>
<li><a href="./compose/introduction.html">简介</a></li>
<li><a href="./compose/install.html">安装与卸载</a></li>
<li><a href="./compose/usage.html">使用</a></li>
<li><a href="./compose/commands.html">命令说明</a></li>
<li><a href="./compose/compose_file.html">Compose 模板文件</a></li>
<li><a href="./compose/django.html">实战 Django</a></li>
<li><a href="./compose/rails.html">实战 Rails</a></li>
<li><a href="./compose/wordpress.html">实战 WordPress</a></li>
<li><a href="./compose/lnmp.html">实战 LNMP</a></li>
</ul>
</li>
<li><a href="./swarm_mode/">Swarm mode</a>
<ul>
<li><a href="./swarm_mode/overview.html">基本概念</a></li>
<li><a href="./swarm_mode/create.html">创建 Swarm 集群</a></li>
<li><a href="./swarm_mode/deploy.html">部署服务</a></li>
<li><a href="./swarm_mode/stack.html">使用 compose 文件</a></li>
<li><a href="./swarm_mode/secret.html">管理密钥</a></li>
<li><a href="./swarm_mode/config.html">管理配置信息</a></li>
<li><a href="./swarm_mode/rolling_update.html">滚动升级</a></li>
</ul>
</li>
<li><a href="./security/">安全</a>
<ul>
<li><a href="./security/kernel_ns.html">内核命名空间</a></li>
<li><a href="./security/control_group.html">控制组</a></li>
<li><a href="./security/daemon_sec.html">服务端防护</a></li>
<li><a href="./security/kernel_capability.html">内核能力机制</a></li>
<li><a href="./security/other_feature.html">其它安全特性</a></li>
<li><a href="./security/summary.html">总结</a></li>
</ul>
</li>
<li><a href="./underly/">底层实现</a>
<ul>
<li><a href="./underly/arch.html">基本架构</a></li>
<li><a href="./underly/namespace.html">命名空间</a></li>
<li><a href="./underly/cgroups.html">控制组</a></li>
<li><a href="./underly/ufs.html">联合文件系统</a></li>
<li><a href="./underly/container_format.html">容器格式</a></li>
<li><a href="./underly/network.html">网络</a></li>
</ul>
</li>
<li><a href="./etcd/">Etcd 项目</a>
<ul>
<li><a href="./etcd/intro.html">简介</a></li>
<li><a href="./etcd/install.html">安装</a></li>
<li><a href="./etcd/cluster.html">集群</a></li>
<li><a href="./etcd/etcdctl.html">使用 etcdctl</a></li>
</ul>
</li>
<li><a href="./coreos/">Fedora CoreOS</a>
<ul>
<li><a href="./coreos/intro.html">简介</a></li>
<li><a href="./coreos/install.html">安装</a></li>
</ul>
</li>
<li><a href="./kubernetes/">Kubernetes - 开源容器编排引擎</a>
<ul>
<li><a href="./kubernetes/intro.html">简介</a></li>
<li><a href="./kubernetes/concepts.html">基本概念</a></li>
<li><a href="./kubernetes/design.html">架构设计</a></li>
</ul>
</li>
<li><a href="./kubernetes/setup/">部署 Kubernetes</a>
<ul>
<li><a href="./kubernetes/setup/kubeadm.html">使用 kubeadm 部署 kubernetes(CRI 使用 containerd)</a></li>
<li><a href="./kubernetes/setup/docker-desktop.html">在 Docker Desktop 使用</a></li>
<li><a href="./kubernetes/setup/systemd.html">一步步部署 kubernetes 集群</a></li>
<li><a href="./kubernetes/setup/dashboard.html">部署 Dashboard</a></li>
</ul>
</li>
<li><a href="./kubernetes/kubectl/">Kubernetes 命令行 kubectl</a></li>
<li><a href="./cloud/">容器与云计算</a>
<ul>
<li><a href="./cloud/intro.html">简介</a></li>
<li><a href="./cloud/tencentCloud.html">腾讯云</a></li>
<li><a href="./cloud/alicloud.html">阿里云</a></li>
<li><a href="./cloud/aws.html">亚马逊云</a></li>
<li><a href="./cloud/summary.html">小结</a></li>
</ul>
</li>
<li><a href="./cases/os/">实战案例 - 操作系统</a>
<ul>
<li><a href="./cases/os/busybox.html">Busybox</a></li>
<li><a href="./cases/os/alpine.html">Alpine</a></li>
<li><a href="./cases/os/debian.html">Debian Ubuntu</a></li>
<li><a href="./cases/os/centos.html">CentOS Fedora</a></li>
<li><a href="./cases/os/summary.html">本章小结</a></li>
</ul>
</li>
<li><a href="./cases/ci/">CI/CD</a>
<ul>
<li><a href="./cases/ci/actions/">GitHub Actions</a></li>
<li><a href="./cases/ci/drone/">Drone</a>
<ul>
<li><a href="./cases/ci/drone/install.html">部署 Drone</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="./ide/">在 IDE 中使用 Docker</a>
<ul>
<li><a href="./ide/vsCode.html">VS Code</a></li>
</ul>
</li>
<li><a href="./podman/">podman - 下一代 Linux 容器工具</a></li>
<li><a href="./appendix/">附录</a>
<ul>
<li><a href="./appendix/faq/">附录一:常见问题总结</a></li>
<li><a href="./appendix/repo/">附录二:热门镜像介绍</a>
<ul>
<li><a href="./appendix/repo/ubuntu.html">Ubuntu</a></li>
<li><a href="./appendix/repo/centos.html">CentOS</a></li>
<li><a href="./appendix/repo/nginx.html">Nginx</a></li>
<li><a href="./appendix/repo/php.html">PHP</a></li>
<li><a href="./appendix/repo/nodejs.html">Node.js</a></li>
<li><a href="./appendix/repo/mysql.html">MySQL</a></li>
<li><a href="./appendix/repo/wordpress.html">WordPress</a></li>
<li><a href="./appendix/repo/mongodb.html">MongoDB</a></li>
<li><a href="./appendix/repo/redis.html">Redis</a></li>
<li><a href="./appendix/repo/minio.html">Minio</a></li>
</ul>
</li>
<li><a href="./appendix/command/">附录三:Docker 命令查询</a>
<ul>
<li><a href="./appendix/command/docker.html">客户端命令 - docker</a></li>
<li><a href="./appendix/command/dockerd.html">服务端命令 - dockerd</a></li>
</ul>
</li>
<li><a href="./appendix/best_practices.html">附录四:Dockerfile 最佳实践</a></li>
<li><a href="./appendix/debug.html">附录五:如何调试 Docker</a></li>
<li><a href="./appendix/resources.html">附录六:资源链接</a></li>
</ul>
</li>
</ul>
]]></content>
<published>2022-05-12T21:37:08.000Z</published>
</entry>
<entry>
<title type="html">高级网络配置</title>
<id>https://vuepress.mirror.docker-practice.com/advanced_network/</id>
<link href="https://vuepress.mirror.docker-practice.com/advanced_network/"/>
<updated>2022-05-12T21:37:08.000Z</updated>
<content type="html"><![CDATA[<h1 id="高级网络配置"> 高级网络配置</h1>
<i>Content not supported</i>
<blockquote>
<p>注意:本章属于 <code>Docker</code> 高级配置,如果您是初学者,您可以暂时跳过本章节,直接学习 <a href="../compose">Docker Compose</a> 一节。</p>
</blockquote>
<p>本章将介绍 Docker 的一些高级网络配置和选项。</p>
<p>当 Docker 启动时,会自动在主机上创建一个 <code>docker0</code> 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。</p>
<p>同时,Docker 随机分配一个本地未占用的私有网段(在 <a href="https://datatracker.ietf.org/doc/html/rfc1918" target="_blank" rel="noopener noreferrer">RFC1918<i>Content not supported</i></a> 中定义)中的一个地址给 <code>docker0</code> 接口。比如典型的 <code>172.17.42.1</code>,掩码为 <code>255.255.0.0</code>。此后启动的容器内的网口也会自动分配一个同一网段(<code>172.17.0.0/16</code>)的地址。</p>
<p>当创建一个 Docker 容器的时候,同时会创建了一对 <code>veth pair</code> 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 <code>eth0</code>;另一端在本地并被挂载到 <code>docker0</code> 网桥,名称以 <code>veth</code> 开头(例如 <code>vethAQI2QT</code>)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。</p>
<p><img src="./_images/network.png" alt="Docker 网络"></p>
<p>接下来的部分将介绍在一些场景中,Docker 所有的网络定制配置。以及通过 Linux 命令来调整、补充、甚至替换 Docker 默认的网络配置。</p>
]]></content>
<published>2022-05-12T21:37:08.000Z</published>
</entry>
<entry>
<title type="html">容器访问控制</title>
<id>https://vuepress.mirror.docker-practice.com/advanced_network/access_control/</id>
<link href="https://vuepress.mirror.docker-practice.com/advanced_network/access_control/"/>
<updated>2022-05-12T21:37:08.000Z</updated>
<content type="html"><![CDATA[<h1 id="容器访问控制"> 容器访问控制</h1>
<i>Content not supported</i>
<p>容器的访问控制,主要通过 Linux 上的 <code>iptables</code> 防火墙来进行管理和实现。<code>iptables</code> 是 Linux 上默认的防火墙软件,在大部分发行版中都自带。</p>
<h2 id="容器访问外部网络"> 容器访问外部网络</h2>
<p>容器要想访问外部网络,需要本地系统的转发支持。在Linux 系统中,检查转发是否打开。</p>
<div><pre><code><span>$sysctl</span> net.ipv4.ip_forward
net.ipv4.ip_forward <span>=</span> <span>1</span>
</code></pre>
<div><span>1</span><br><span>2</span><br></div></div><p>如果为 0,说明没有开启转发,则需要手动打开。</p>
<div><pre><code><span>$sysctl</span> -w net.ipv4.ip_forward<span>=</span><span>1</span>
</code></pre>
<div><span>1</span><br></div></div><p>如果在启动 Docker 服务的时候设定 <code>--ip-forward=true</code>, Docker 就会自动设定系统的 <code>ip_forward</code> 参数为 1。</p>
<h2 id="容器之间访问"> 容器之间访问</h2>
<p>容器之间相互访问,需要两方面的支持。</p>
<ul>
<li>容器的网络拓扑是否已经互联。默认情况下,所有容器都会被连接到 <code>docker0</code> 网桥上。</li>
<li>本地系统的防火墙软件 -- <code>iptables</code> 是否允许通过。</li>
</ul>
<h3 id="访问所有端口"> 访问所有端口</h3>
<p>当启动 Docker 服务(即 dockerd)的时候,默认会添加一条转发策略到本地主机 iptables 的 FORWARD 链上。策略为通过(<code>ACCEPT</code>)还是禁止(<code>DROP</code>)取决于配置<code>--icc=true</code>(缺省值)还是 <code>--icc=false</code>。当然,如果手动指定 <code>--iptables=false</code> 则不会添加 <code>iptables</code> 规则。</p>
<p>可见,默认情况下,不同容器之间是允许网络互通的。如果为了安全考虑,可以在 <code>/etc/docker/daemon.json</code> 文件中配置 <code>{"icc": false}</code> 来禁止它。</p>
<h3 id="访问指定端口"> 访问指定端口</h3>
<p>在通过 <code>-icc=false</code> 关闭网络访问后,还可以通过 <code>--link=CONTAINER_NAME:ALIAS</code> 选项来访问容器的开放端口。</p>
<p>例如,在启动 Docker 服务时,可以同时使用 <code>icc=false --iptables=true</code> 参数来关闭允许相互的网络访问,并让 Docker 可以修改系统中的 <code>iptables</code> 规则。</p>
<p>此时,系统中的 <code>iptables</code> 规则可能是类似</p>
<div><pre><code>$ <span>sudo</span> iptables -nL
<span>..</span>.
Chain FORWARD <span>(</span>policy ACCEPT<span>)</span>
target prot opt <span>source</span> destination
DROP all -- <span>0.0</span>.0.0/0 <span>0.0</span>.0.0/0
<span>..</span>.
</code></pre>
<div><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br></div></div><p>之后,启动容器(<code>docker run</code>)时使用 <code>--link=CONTAINER_NAME:ALIAS</code> 选项。Docker 会在 <code>iptable</code> 中为 两个容器分别添加一条 <code>ACCEPT</code> 规则,允许相互访问开放的端口(取决于 <code>Dockerfile</code> 中的 <code>EXPOSE</code> 指令)。</p>
<p>当添加了 <code>--link=CONTAINER_NAME:ALIAS</code> 选项后,添加了 <code>iptables</code> 规则。</p>
<div><pre><code>$ <span>sudo</span> iptables -nL
<span>..</span>.
Chain FORWARD <span>(</span>policy ACCEPT<span>)</span>
target prot opt <span>source</span> destination
ACCEPT tcp -- <span>172.17</span>.0.2 <span>172.17</span>.0.3 tcp spt:80
ACCEPT tcp -- <span>172.17</span>.0.3 <span>172.17</span>.0.2 tcp dpt:80
DROP all -- <span>0.0</span>.0.0/0 <span>0.0</span>.0.0/0
</code></pre>
<div><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br></div></div><p>注意:<code>--link=CONTAINER_NAME:ALIAS</code> 中的 <code>CONTAINER_NAME</code> 目前必须是 Docker 分配的名字,或使用 <code>--name</code> 参数指定的名字。主机名则不会被识别。</p>
]]></content>
<published>2022-05-12T21:37:08.000Z</published>
</entry>
<entry>
<title type="html">自定义网桥</title>
<id>https://vuepress.mirror.docker-practice.com/advanced_network/bridge/</id>
<link href="https://vuepress.mirror.docker-practice.com/advanced_network/bridge/"/>
<updated>2022-05-12T21:37:08.000Z</updated>
<content type="html"><![CDATA[<h1 id="自定义网桥"> 自定义网桥</h1>
<i>Content not supported</i>
<p>除了默认的 <code>docker0</code> 网桥,用户也可以指定网桥来连接各个容器。</p>
<p>在启动 Docker 服务的时候,使用 <code>-b BRIDGE</code>或<code>--bridge=BRIDGE</code> 来指定使用的网桥。</p>
<p>如果服务已经运行,那需要先停止服务,并删除旧的网桥。</p>
<div><pre><code>$ <span>sudo</span> systemctl stop <span>docker</span>
$ <span>sudo</span> <span>ip</span> <span>link</span> <span>set</span> dev docker0 down
$ <span>sudo</span> brctl delbr docker0
</code></pre>
<div><span>1</span><br><span>2</span><br><span>3</span><br></div></div><p>然后创建一个网桥 <code>bridge0</code>。</p>
<div><pre><code>$ <span>sudo</span> brctl addbr bridge0
$ <span>sudo</span> <span>ip</span> addr <span>add</span> <span>192.168</span>.5.1/24 dev bridge0
$ <span>sudo</span> <span>ip</span> <span>link</span> <span>set</span> dev bridge0 up
</code></pre>
<div><span>1</span><br><span>2</span><br><span>3</span><br></div></div><p>查看确认网桥创建并启动。</p>
<div><pre><code>$ <span>ip</span> addr show bridge0
<span>4</span>: bridge0: <span><</span>BROADCAST,MULTICAST<span>></span> mtu <span>1500</span> qdisc noop state UP group default
link/ether <span>66</span>:38:d0:0d:76:18 brd ff:ff:ff:ff:ff:ff
inet <span>192.168</span>.5.1/24 scope global bridge0
valid_lft forever preferred_lft forever
</code></pre>
<div><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br></div></div><p>在 Docker 配置文件 <code>/etc/docker/daemon.json</code> 中添加如下内容,即可将 Docker 默认桥接到创建的网桥上。</p>
<div><pre><code><span>{</span>
<span>"bridge"</span><span>:</span> <span>"bridge0"</span><span>,</span>
<span>}</span>
</code></pre>
<div><span>1</span><br><span>2</span><br><span>3</span><br></div></div><p>启动 Docker 服务。</p>
<p>新建一个容器,可以看到它已经桥接到了 <code>bridge0</code> 上。</p>
<p>可以继续用 <code>brctl show</code> 命令查看桥接的信息。另外,在容器中可以使用 <code>ip addr</code> 和 <code>ip route</code> 命令来查看 IP 地址配置和路由信息。</p>
]]></content>
<published>2022-05-12T21:37:08.000Z</published>
</entry>
<entry>
<title type="html">编辑网络配置文件</title>
<id>https://vuepress.mirror.docker-practice.com/advanced_network/config_file/</id>
<link href="https://vuepress.mirror.docker-practice.com/advanced_network/config_file/"/>
<updated>2022-05-12T21:37:08.000Z</updated>
<content type="html"><![CDATA[<h1 id="编辑网络配置文件"> 编辑网络配置文件</h1>
<i>Content not supported</i>
<p>Docker 1.2.0 开始支持在运行中的容器里编辑 <code>/etc/hosts</code>, <code>/etc/hostname</code> 和 <code>/etc/resolv.conf</code> 文件。</p>
<p>但是这些修改是临时的,只在运行的容器中保留,容器终止或重启后并不会被保存下来,也不会被 <code>docker commit</code> 提交。</p>
]]></content>
<published>2022-05-12T21:37:08.000Z</published>
</entry>
<entry>
<title type="html">配置 docker0 网桥</title>
<id>https://vuepress.mirror.docker-practice.com/advanced_network/docker0/</id>
<link href="https://vuepress.mirror.docker-practice.com/advanced_network/docker0/"/>
<updated>2022-05-12T21:37:08.000Z</updated>
<content type="html"><![CDATA[<h1 id="配置-docker0-网桥"> 配置 docker0 网桥</h1>
<i>Content not supported</i>
<p>Docker 服务默认会创建一个 <code>docker0</code> 网桥(其上有一个 <code>docker0</code> 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。</p>
<p>Docker 默认指定了 <code>docker0</code> 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信,它还给出了 MTU(接口允许接收的最大传输单元),通常是 1500 Bytes,或宿主主机网络路由上支持的默认值。这些值都可以在服务启动的时候进行配置。</p>
<ul>
<li><code>--bip=CIDR</code> IP 地址加掩码格式,例如 192.168.1.5/24</li>
<li><code>--mtu=BYTES</code> 覆盖默认的 Docker mtu 配置</li>
</ul>
<p>也可以在配置文件中配置 DOCKER_OPTS,然后重启服务。</p>
<p>由于目前 Docker 网桥是 Linux 网桥,用户可以使用 <code>brctl show</code> 来查看网桥和端口连接信息。</p>
<div><pre><code>$ <span>sudo</span> brctl show
bridge name bridge <span>id</span> STP enabled interfaces
docker0 <span>8000</span>.3a1d7362b4ee no veth65f9
vethdda6
</code></pre>
<div><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br></div></div><p>*注:<code>brctl</code> 命令在 Debian、Ubuntu 中可以使用 <code>sudo apt-get install bridge-utils</code> 来安装。</p>
<p>每次创建一个新容器的时候,Docker 从可用的地址段中选择一个空闲的 IP 地址分配给容器的 eth0 端口。使用本地主机上 <code>docker0</code> 接口的 IP 作为所有容器的默认网关。</p>
<div><pre><code>$ <span>sudo</span> <span>docker</span> run -i -t --rm base /bin/bash
$ <span>ip</span> addr show eth0
<span>24</span>: eth0: <span><</span>BROADCAST,UP,LOWER_UP<span>></span> mtu <span>1500</span> qdisc pfifo_fast state UP group default qlen <span>1000</span>
link/ether <span>32</span>:6f:e0:35:57:91 brd ff:ff:ff:ff:ff:ff
inet <span>172.17</span>.0.3/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::306f:e0ff:fe35:5791/64 scope <span>link</span>
valid_lft forever preferred_lft forever
$ <span>ip</span> route
default via <span>172.17</span>.42.1 dev eth0
<span>172.17</span>.0.0/16 dev eth0 proto kernel scope <span>link</span> src <span>172.17</span>.0.3
</code></pre>
<div><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br><span>9</span><br><span>10</span><br><span>11</span><br></div></div>]]></content>
<published>2022-05-12T21:37:08.000Z</published>
</entry>
<entry>
<title type="html">工具和示例</title>
<id>https://vuepress.mirror.docker-practice.com/advanced_network/example/</id>
<link href="https://vuepress.mirror.docker-practice.com/advanced_network/example/"/>
<updated>2022-05-12T21:37:08.000Z</updated>
<content type="html"><![CDATA[<h1 id="工具和示例"> 工具和示例</h1>
<i>Content not supported</i>
<p>在介绍自定义网络拓扑之前,你可能会对一些外部工具和例子感兴趣:</p>
<h2 id="pipework"> pipework</h2>
<p>Jérôme Petazzoni 编写了一个叫 <a href="https://github.com/jpetazzo/pipework" target="_blank" rel="noopener noreferrer">pipework<i>Content not supported</i></a> 的 shell 脚本,可以帮助用户在比较复杂的场景中完成容器的连接。</p>
<h2 id="playground"> playground</h2>
<p>Brandon Rhodes 创建了一个提供完整的 Docker 容器网络拓扑管理的 <a href="https://github.com/brandon-rhodes/fopnp/tree/m/playground" target="_blank" rel="noopener noreferrer">Python库<i>Content not supported</i></a>,包括路由、NAT 防火墙;以及一些提供 <code>HTTP</code> <code>SMTP</code> <code>POP</code> <code>IMAP</code> <code>Telnet</code> <code>SSH</code> <code>FTP</code> 的服务器。</p>
]]></content>
<published>2022-05-12T21:37:08.000Z</published>
</entry>
<entry>
<title type="html">映射容器端口到宿主主机的实现</title>
<id>https://vuepress.mirror.docker-practice.com/advanced_network/port_mapping/</id>
<link href="https://vuepress.mirror.docker-practice.com/advanced_network/port_mapping/"/>
<updated>2022-05-12T21:37:08.000Z</updated>
<content type="html"><![CDATA[<h1 id="映射容器端口到宿主主机的实现"> 映射容器端口到宿主主机的实现</h1>
<i>Content not supported</i>
<p>默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。</p>
<h2 id="容器访问外部实现"> 容器访问外部实现</h2>
<p>容器所有到外部网络的连接,源地址都会被 NAT 成本地系统的 IP 地址。这是使用 <code>iptables</code> 的源地址伪装操作实现的。</p>
<p>查看主机的 NAT 规则。</p>
<div><pre><code>$ <span>sudo</span> iptables -t nat -nL
<span>..</span>.
Chain POSTROUTING <span>(</span>policy ACCEPT<span>)</span>
target prot opt <span>source</span> destination
MASQUERADE all -- <span>172.17</span>.0.0/16 <span>!</span><span>172.17</span>.0.0/16
<span>..</span>.
</code></pre>
<div><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br></div></div><p>其中,上述规则将所有源地址在 <code>172.17.0.0/16</code> 网段,目标地址为其他网段(外部网络)的流量动态伪装为从系统网卡发出。MASQUERADE 跟传统 SNAT 的好处是它能动态从网卡获取地址。</p>
<h2 id="外部访问容器实现"> 外部访问容器实现</h2>
<p>容器允许外部访问,可以在 <code>docker run</code> 时候通过 <code>-p</code> 或 <code>-P</code> 参数来启用。</p>
<p>不管用那种办法,其实也是在本地的 <code>iptable</code> 的 nat 表中添加相应的规则。</p>
<p>使用 <code>-P</code> 时:</p>
<div><pre><code>$ iptables -t nat -nL
<span>..</span>.
Chain DOCKER <span>(</span><span>2</span> references<span>)</span>
target prot opt <span>source</span> destination
DNAT tcp -- <span>0.0</span>.0.0/0 <span>0.0</span>.0.0/0 tcp dpt:49153 to:172.17.0.2:80
</code></pre>
<div><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br></div></div><p>使用 <code>-p 80:80</code> 时:</p>
<div><pre><code>$ iptables -t nat -nL
Chain DOCKER <span>(</span><span>2</span> references<span>)</span>
target prot opt <span>source</span> destination
DNAT tcp -- <span>0.0</span>.0.0/0 <span>0.0</span>.0.0/0 tcp dpt:80 to:172.17.0.2:80
</code></pre>
<div><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br></div></div><p>注意:</p>
<ul>
<li>
<p>这里的规则映射了 <code>0.0.0.0</code>,意味着将接受主机来自所有接口的流量。用户可以通过 <code>-p IP:host_port:container_port</code> 或 <code>-p IP::port</code> 来指定允许访问容器的主机上的 IP、接口等,以制定更严格的规则。</p>
</li>
<li>
<p>如果希望永久绑定到某个固定的 IP 地址,可以在 Docker 配置文件 <code>/etc/docker/daemon.json</code> 中添加如下内容。</p>
</li>
</ul>
<div><pre><code><span>{</span>
<span>"ip"</span><span>:</span> <span>"0.0.0.0"</span>
<span>}</span>
</code></pre>
<div><span>1</span><br><span>2</span><br><span>3</span><br></div></div>]]></content>
<published>2022-05-12T21:37:08.000Z</published>
</entry>
<entry>
<title type="html">示例:创建一个点到点连接</title>
<id>https://vuepress.mirror.docker-practice.com/advanced_network/ptp/</id>
<link href="https://vuepress.mirror.docker-practice.com/advanced_network/ptp/"/>
<updated>2022-05-12T21:37:08.000Z</updated>
<content type="html"><![CDATA[<h1 id="示例-创建一个点到点连接"> 示例:创建一个点到点连接</h1>
<p>默认情况下,Docker 会将所有容器连接到由 <code>docker0</code> 提供的虚拟子网中。
<i>Content not supported</i></p>
<p>用户有时候需要两个容器之间可以直连通信,而不用通过主机网桥进行桥接。</p>
<p>解决办法很简单:创建一对 <code>peer</code> 接口,分别放到两个容器中,配置成点到点链路类型即可。</p>
<p>首先启动 2 个容器:</p>
<div><pre><code>$ <span>docker</span> run -i -t --rm --net<span>=</span>none base /bin/bash
root@1f1f4c1f931a:/<span>#</span>
$ <span>docker</span> run -i -t --rm --net<span>=</span>none base /bin/bash
root@12e343489d2f:/<span>#</span>
</code></pre>
<div><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br></div></div><p>找到进程号,然后创建网络命名空间的跟踪文件。</p>
<div><pre><code>$ <span>docker</span> inspect -f <span>'{{.State.Pid}}'</span> 1f1f4c1f931a
<span>2989</span>
$ <span>docker</span> inspect -f <span>'{{.State.Pid}}'</span> 12e343489d2f
<span>3004</span>
$ <span>sudo</span> <span>mkdir</span> -p /var/run/netns
$ <span>sudo</span> <span>ln</span> -s /proc/2989/ns/net /var/run/netns/2989
$ <span>sudo</span> <span>ln</span> -s /proc/3004/ns/net /var/run/netns/3004
</code></pre>
<div><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br></div></div><p>创建一对 <code>peer</code> 接口,然后配置路由</p>
<div><pre><code>$ <span>sudo</span> <span>ip</span> <span>link</span> <span>add</span> A <span>type</span> veth peer name B
$ <span>sudo</span> <span>ip</span> <span>link</span> <span>set</span> A netns <span>2989</span>
$ <span>sudo</span> <span>ip</span> netns <span>exec</span> <span>2989</span> <span>ip</span> addr <span>add</span> <span>10.1</span>.1.1/32 dev A
$ <span>sudo</span> <span>ip</span> netns <span>exec</span> <span>2989</span> <span>ip</span> <span>link</span> <span>set</span> A up
$ <span>sudo</span> <span>ip</span> netns <span>exec</span> <span>2989</span> <span>ip</span> route <span>add</span> <span>10.1</span>.1.2/32 dev A
$ <span>sudo</span> <span>ip</span> <span>link</span> <span>set</span> B netns <span>3004</span>
$ <span>sudo</span> <span>ip</span> netns <span>exec</span> <span>3004</span> <span>ip</span> addr <span>add</span> <span>10.1</span>.1.2/32 dev B
$ <span>sudo</span> <span>ip</span> netns <span>exec</span> <span>3004</span> <span>ip</span> <span>link</span> <span>set</span> B up
$ <span>sudo</span> <span>ip</span> netns <span>exec</span> <span>3004</span> <span>ip</span> route <span>add</span> <span>10.1</span>.1.1/32 dev B
</code></pre>
<div><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br><span>9</span><br><span>10</span><br><span>11</span><br></div></div><p>现在这 2 个容器就可以相互 ping 通,并成功建立连接。点到点链路不需要子网和子网掩码。</p>
<p>此外,也可以不指定 <code>--net=none</code> 来创建点到点链路。这样容器还可以通过原先的网络来通信。</p>
<p>利用类似的办法,可以创建一个只跟主机通信的容器。但是一般情况下,更推荐使用 <code>--icc=false</code> 来关闭容器之间的通信。</p>
]]></content>
<published>2022-05-12T21:37:08.000Z</published>
</entry>
<entry>
<title type="html">快速配置指南</title>
<id>https://vuepress.mirror.docker-practice.com/advanced_network/quick_guide/</id>
<link href="https://vuepress.mirror.docker-practice.com/advanced_network/quick_guide/"/>
<updated>2022-05-12T21:37:08.000Z</updated>
<content type="html"><![CDATA[<h1 id="快速配置指南"> 快速配置指南</h1>
<i>Content not supported</i>
<p>下面是一个跟 Docker 网络相关的命令列表。</p>
<p>其中有些命令选项只有在 Docker 服务启动的时候才能配置,而且不能马上生效。</p>
<ul>
<li><code>-b BRIDGE</code> 或 <code>--bridge=BRIDGE</code> 指定容器挂载的网桥</li>
<li><code>--bip=CIDR</code> 定制 docker0 的掩码</li>
<li><code>-H SOCKET...</code> 或 <code>--host=SOCKET...</code> Docker 服务端接收命令的通道</li>
<li><code>--icc=true|false</code> 是否支持容器之间进行通信</li>
<li><code>--ip-forward=true|false</code> 请看下文容器之间的通信</li>
<li><code>--iptables=true|false</code> 是否允许 Docker 添加 iptables 规则</li>
<li><code>--mtu=BYTES</code> 容器网络中的 MTU</li>
</ul>
<p>下面2个命令选项既可以在启动服务时指定,也可以在启动容器时指定。在 Docker 服务启动的时候指定则会成为默认值,后面执行 <code>docker run</code> 时可以覆盖设置的默认值。</p>
<ul>
<li><code>--dns=IP_ADDRESS...</code> 使用指定的DNS服务器</li>
<li><code>--dns-search=DOMAIN...</code> 指定DNS搜索域</li>
</ul>
<p>最后这些选项只有在 <code>docker run</code> 执行时使用,因为它是针对容器的特性内容。</p>
<ul>
<li><code>-h HOSTNAME</code> 或 <code>--hostname=HOSTNAME</code> 配置容器主机名</li>
<li><code>--link=CONTAINER_NAME:ALIAS</code> 添加到另一个容器的连接</li>
<li><code>--net=bridge|none|container:NAME_or_ID|host</code> 配置容器的桥接模式</li>
<li><code>-p SPEC</code> 或 <code>--publish=SPEC</code> 映射容器端口到宿主主机</li>
<li><code>-P or --publish-all=true|false</code> 映射容器所有端口到宿主主机</li>
</ul>
]]></content>
<published>2022-05-12T21:37:08.000Z</published>
</entry>
<entry>
<title type="html">附录</title>
<id>https://vuepress.mirror.docker-practice.com/appendix/</id>
<link href="https://vuepress.mirror.docker-practice.com/appendix/"/>
<updated>2022-05-12T21:37:08.000Z</updated>
<content type="html"><![CDATA[<h1 id="附录"> 附录</h1>
]]></content>
<published>2022-05-12T21:37:08.000Z</published>
</entry>
<entry>
<title type="html">Dockerfile 最佳实践</title>
<id>https://vuepress.mirror.docker-practice.com/appendix/best_practices/</id>
<link href="https://vuepress.mirror.docker-practice.com/appendix/best_practices/"/>
<updated>2022-05-12T21:37:08.000Z</updated>
<content type="html"><![CDATA[<h1 id="dockerfile-最佳实践"> Dockerfile 最佳实践</h1>
<i>Content not supported</i>
<p>本附录是笔者对 Docker 官方文档中 <a href="https://docs.docker.com/develop/develop-images/dockerfile_best-practices/" target="_blank" rel="noopener noreferrer">Best practices for writing Dockerfiles<i>Content not supported</i></a> 的理解与翻译。</p>
<h2 id="一般性的指南和建议"> 一般性的指南和建议</h2>
<h3 id="容器应该是短暂的"> 容器应该是短暂的</h3>
<p>通过 <code>Dockerfile</code> 构建的镜像所启动的容器应该尽可能短暂(生命周期短)。「短暂」意味着可以停止和销毁容器,并且创建一个新容器并部署好所需的设置和配置工作量应该是极小的。</p>
<h3 id="使用-dockerignore-文件"> 使用 <code>.dockerignore</code> 文件</h3>
<p>使用 <code>Dockerfile</code> 构建镜像时最好是将 <code>Dockerfile</code> 放置在一个新建的空目录下。然后将构建镜像所需要的文件添加到该目录中。为了提高构建镜像的效率,你可以在目录下新建一个 <code>.dockerignore</code> 文件来指定要忽略的文件和目录。<code>.dockerignore</code> 文件的排除模式语法和 Git 的 <code>.gitignore</code> 文件相似。</p>
<h3 id="使用多阶段构建"> 使用多阶段构建</h3>
<p>在 <code>Docker 17.05</code> 以上版本中,你可以使用 <a href="./../image/multistage-builds.html">多阶段构建</a> 来减少所构建镜像的大小。</p>
<h3 id="避免安装不必要的包"> 避免安装不必要的包</h3>
<p>为了降低复杂性、减少依赖、减小文件大小、节约构建时间,你应该避免安装任何不必要的包。例如,不要在数据库镜像中包含一个文本编辑器。</p>
<h3 id="一个容器只运行一个进程"> 一个容器只运行一个进程</h3>
<p>应该保证在一个容器中只运行一个进程。将多个应用解耦到不同容器中,保证了容器的横向扩展和复用。例如 web 应用应该包含三个容器:web应用、数据库、缓存。</p>
<p>如果容器互相依赖,你可以使用 <a href="./../network/linking.html">Docker 自定义网络</a> 来把这些容器连接起来。</p>
<h3 id="镜像层数尽可能少"> 镜像层数尽可能少</h3>
<p>你需要在 <code>Dockerfile</code> 可读性(也包括长期的可维护性)和减少层数之间做一个平衡。</p>
<h3 id="将多行参数排序"> 将多行参数排序</h3>
<p>将多行参数按字母顺序排序(比如要安装多个包时)。这可以帮助你避免重复包含同一个包,更新包列表时也更容易。也便于 <code>PRs</code> 阅读和审查。建议在反斜杠符号 <code>\</code> 之前添加一个空格,以增加可读性。</p>
<p>下面是来自 <code>buildpack-deps</code> 镜像的例子:</p>
<div><pre><code><span><span>RUN</span> apt-get update && apt-get install -y <span>\</span>
bzr <span>\</span>
cvs <span>\</span>
git <span>\</span>
mercurial <span>\</span>
subversion</span>
</code></pre>
<div><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br></div></div><h3 id="构建缓存"> 构建缓存</h3>
<p>在镜像的构建过程中,Docker 会遍历 <code>Dockerfile</code> 文件中的指令,然后按顺序执行。在执行每条指令之前,Docker 都会在缓存中查找是否已经存在可重用的镜像,如果有就使用现存的镜像,不再重复创建。如果你不想在构建过程中使用缓存,你可以在 <code>docker build</code> 命令中使用 <code>--no-cache=true</code> 选项。</p>
<p>但是,如果你想在构建的过程中使用缓存,你得明白什么时候会,什么时候不会找到匹配的镜像,遵循的基本规则如下:</p>
<ul>
<li>从一个基础镜像开始(<code>FROM</code> 指令指定),下一条指令将和该基础镜像的所有子镜像进行匹配,检查这些子镜像被创建时使用的指令是否和被检查的指令完全一样。如果不是,则缓存失效。</li>
<li>在大多数情况下,只需要简单地对比 <code>Dockerfile</code> 中的指令和子镜像。然而,有些指令需要更多的检查和解释。</li>
<li>对于 <code>ADD</code> 和 <code>COPY</code> 指令,镜像中对应文件的内容也会被检查,每个文件都会计算出一个校验和。文件的最后修改时间和最后访问时间不会纳入校验。在缓存的查找过程中,会将这些校验和和已存在镜像中的文件校验和进行对比。如果文件有任何改变,比如内容和元数据,则缓存失效。</li>
<li>除了 <code>ADD</code> 和 <code>COPY</code> 指令,缓存匹配过程不会查看临时容器中的文件来决定缓存是否匹配。例如,当执行完 <code>RUN apt-get -y update</code> 指令后,容器中一些文件被更新,但 Docker 不会检查这些文件。这种情况下,只有指令字符串本身被用来匹配缓存。</li>
</ul>
<p>一旦缓存失效,所有后续的 <code>Dockerfile</code> 指令都将产生新的镜像,缓存不会被使用。</p>
<h2 id="dockerfile-指令"> Dockerfile 指令</h2>
<p>下面针对 <code>Dockerfile</code> 中各种指令的最佳编写方式给出建议。</p>
<h3 id="from"> FROM</h3>
<p>尽可能使用当前官方仓库作为你构建镜像的基础。推荐使用 <a href="https://hub.docker.com/_/alpine/" target="_blank" rel="noopener noreferrer">Alpine<i>Content not supported</i></a> 镜像,因为它被严格控制并保持最小尺寸(目前小于 5 MB),但它仍然是一个完整的发行版。</p>
<h3 id="label"> LABEL</h3>
<p>你可以给镜像添加标签来帮助组织镜像、记录许可信息、辅助自动化构建等。每个标签一行,由 <code>LABEL</code> 开头加上一个或多个标签对。下面的示例展示了各种不同的可能格式。<code>#</code> 开头的行是注释内容。</p>
<blockquote>
<p>注意:如果你的字符串中包含空格,必须将字符串放入引号中或者对空格使用转义。如果字符串内容本身就包含引号,必须对引号使用转义。</p>
</blockquote>
<div><pre><code><span># Set one or more individual labels</span>
<span><span>LABEL</span> com.example.version=<span>"0.0.1-beta"</span></span>
<span><span>LABEL</span> vendor=<span>"ACME Incorporated"</span></span>
<span><span>LABEL</span> com.example.release-date=<span>"2015-02-12"</span></span>
<span><span>LABEL</span> com.example.version.is-production=<span>""</span></span>
</code></pre>
<div><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br></div></div><p>一个镜像可以包含多个标签,但建议将多个标签放入到一个 <code>LABEL</code> 指令中。</p>
<div><pre><code><span># Set multiple labels at once, using line-continuation characters to break long lines</span>
<span><span>LABEL</span> vendor=ACME\ Incorporated <span>\</span>
com.example.is-beta= <span>\</span>
com.example.is-production=<span>""</span> <span>\</span>
com.example.version=<span>"0.0.1-beta"</span> <span>\</span>
com.example.release-date=<span>"2015-02-12"</span></span>
</code></pre>
<div><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br></div></div><p>关于标签可以接受的键值对,参考 <a href="https://docs.docker.com/config/labels-custom-metadata/" target="_blank" rel="noopener noreferrer">Understanding object labels<i>Content not supported</i></a>。关于查询标签信息,参考 <a href="https://docs.docker.com/config/labels-custom-metadata/" target="_blank" rel="noopener noreferrer">Managing labels on objects<i>Content not supported</i></a>。</p>
<h3 id="run"> RUN</h3>