Compare commits
761 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
3a9d4bff61 | ||
![]() |
4bc29c0300 | ||
![]() |
65bc905920 | ||
![]() |
1b7d941fcd | ||
![]() |
e0ff3d315a | ||
![]() |
09de77b543 | ||
![]() |
344fc8bd3c | ||
![]() |
7ec5772432 | ||
![]() |
355dd3b051 | ||
![]() |
ca011164c2 | ||
![]() |
0f2956a646 | ||
![]() |
da7991660e | ||
![]() |
391c6364a0 | ||
![]() |
99433b2e45 | ||
![]() |
32c6a91aa9 | ||
![]() |
bea7b8d3f4 | ||
![]() |
1be1db5a43 | ||
![]() |
7052cea8a3 | ||
![]() |
584087ad46 | ||
![]() |
dd6b022429 | ||
![]() |
46020ff786 | ||
![]() |
3ccba8afb4 | ||
![]() |
f5e6a67664 | ||
![]() |
439264a87f | ||
![]() |
41558e73b4 | ||
![]() |
f34a985a78 | ||
![]() |
bd8387083a | ||
![]() |
8d129d0ead | ||
![]() |
85c5a280a4 | ||
![]() |
98044d04b2 | ||
![]() |
57873b1143 | ||
![]() |
6acf209b9a | ||
![]() |
ed4b3efd3b | ||
![]() |
eb327bf908 | ||
![]() |
cc683fdb56 | ||
![]() |
13b8e12f44 | ||
![]() |
ce4428adfb | ||
![]() |
6443ddc07c | ||
![]() |
ce5ae6a360 | ||
![]() |
35b264694b | ||
![]() |
e76b0b66a0 | ||
![]() |
d80f3430b2 | ||
![]() |
d9c5d2fb43 | ||
![]() |
fe7530c3f6 | ||
![]() |
30f00323e0 | ||
![]() |
93ea51ff07 | ||
![]() |
85be3008fa | ||
![]() |
88f9183fd5 | ||
![]() |
1c4a43e34e | ||
![]() |
7014e4d87c | ||
![]() |
18028b8eaa | ||
![]() |
7c78d1c256 | ||
![]() |
d4c6e590c6 | ||
![]() |
1e415ac76c | ||
![]() |
664ac88c85 | ||
![]() |
734079661d | ||
![]() |
1ed8c2c81f | ||
![]() |
b9455b2169 | ||
![]() |
10a77adbe6 | ||
![]() |
31f3540fbc | ||
![]() |
d5ce7f048b | ||
![]() |
a613c78c33 | ||
![]() |
d1d4f0f47d | ||
![]() |
d4fc0a9da1 | ||
![]() |
8dfdbc5b07 | ||
![]() |
5caddf4413 | ||
![]() |
95aed0099e | ||
![]() |
533f30a939 | ||
![]() |
1787c392c6 | ||
![]() |
ca29ab51b1 | ||
![]() |
64b75e997f | ||
![]() |
31ea892dfc | ||
![]() |
985e295d70 | ||
![]() |
330beb4fdb | ||
![]() |
baeb222455 | ||
![]() |
8705cede17 | ||
![]() |
ba36c90b6c | ||
![]() |
96fc5acc75 | ||
![]() |
6cfc12eece | ||
![]() |
da614e8441 | ||
![]() |
1e577a8c6f | ||
![]() |
9fe6c356f0 | ||
![]() |
aa08e32003 | ||
![]() |
bc43b30964 | ||
![]() |
7afb8991d3 | ||
![]() |
6f810c89f3 | ||
![]() |
0a87d2a643 | ||
![]() |
8dd3141c57 | ||
![]() |
ce48a157d5 | ||
![]() |
ea00e0d82a | ||
![]() |
5ebd6fb6f8 | ||
![]() |
6265d0274b | ||
![]() |
d1480092bf | ||
![]() |
d414505835 | ||
![]() |
aa3d56fce9 | ||
![]() |
2cd0fac44b | ||
![]() |
fb162df033 | ||
![]() |
cc726421c8 | ||
![]() |
47e83e7aa3 | ||
![]() |
da10b3a7a1 | ||
![]() |
9d62668fcf | ||
![]() |
da09321b0e | ||
![]() |
2b7f954c65 | ||
![]() |
7b5a21bf6d | ||
![]() |
e8d45d3be9 | ||
![]() |
7d51bacb12 | ||
![]() |
00274b0615 | ||
![]() |
0b1812aac8 | ||
![]() |
17ad494537 | ||
![]() |
8e8126756a | ||
![]() |
f9182e5d19 | ||
![]() |
0fdc2d64a9 | ||
![]() |
bcc901ac9f | ||
![]() |
47ec0e2ab8 | ||
![]() |
c572a399f3 | ||
![]() |
fd85d5a0e5 | ||
![]() |
1b2c480a55 | ||
![]() |
fc8b8867af | ||
![]() |
ff1f48a793 | ||
![]() |
4751e59a6f | ||
![]() |
f6ec3b23d2 | ||
![]() |
1c932ef567 | ||
![]() |
68d85ac31e | ||
![]() |
83929dd096 | ||
![]() |
d071ed7b99 | ||
![]() |
58c09788f6 | ||
![]() |
cbaa24c48f | ||
![]() |
5d91c5a39f | ||
![]() |
48785525e0 | ||
![]() |
6fcf302809 | ||
![]() |
4f08e73bfe | ||
![]() |
4f7b448f0c | ||
![]() |
c1c7a7981d | ||
![]() |
cc210f75a7 | ||
![]() |
b0ccb74dbd | ||
![]() |
90a7316322 | ||
![]() |
6ceeec7f45 | ||
![]() |
d1e303d139 | ||
![]() |
4b70a27151 | ||
![]() |
e021b27323 | ||
![]() |
eac2a57633 | ||
![]() |
c25c7283cf | ||
![]() |
4682ba336f | ||
![]() |
ee26243625 | ||
![]() |
5fb17c90e0 | ||
![]() |
6eb603a33b | ||
![]() |
9bc245dfdc | ||
![]() |
9a4660492c | ||
![]() |
edf1a3a07b | ||
![]() |
acb8662c43 | ||
![]() |
85b2325513 | ||
![]() |
cf7d53dc9c | ||
![]() |
83fbb87fd1 | ||
![]() |
61bda4b259 | ||
![]() |
c815720349 | ||
![]() |
4aa20ecce3 | ||
![]() |
6efe0297fe | ||
![]() |
6c668a94df | ||
![]() |
911ce1a2e4 | ||
![]() |
8b186fb7e7 | ||
![]() |
139b0ca65c | ||
![]() |
67213bc2f5 | ||
![]() |
d4d09f5154 | ||
![]() |
f0568ebffd | ||
![]() |
ddec6641b9 | ||
![]() |
4d3d2d21fe | ||
![]() |
f580130be0 | ||
![]() |
acc5c6e723 | ||
![]() |
1316e41222 | ||
![]() |
9cfd1fda2b | ||
![]() |
683cf95ca7 | ||
![]() |
8952dee0a8 | ||
![]() |
bdc8bd618c | ||
![]() |
41da49b127 | ||
![]() |
18ab3069a3 | ||
![]() |
0fd981acc2 | ||
![]() |
4561243c23 | ||
![]() |
ff28d7219d | ||
![]() |
34b6b617b9 | ||
![]() |
e0797515d3 | ||
![]() |
a691aa607a | ||
![]() |
e9dc8dc974 | ||
![]() |
44fdf58ba5 | ||
![]() |
bd74c85bb7 | ||
![]() |
e38ea82f37 | ||
![]() |
c887661c08 | ||
![]() |
fced7854ee | ||
![]() |
e4a68ea7e4 | ||
![]() |
d8e5cfe097 | ||
![]() |
5634eb2fda | ||
![]() |
c720d6959e | ||
![]() |
3a24901664 | ||
![]() |
ca5502e208 | ||
![]() |
d2f5e120ae | ||
![]() |
d887c8bda6 | ||
![]() |
1e026fb3a1 | ||
![]() |
33c2b2216d | ||
![]() |
6c0fc9e416 | ||
![]() |
a2e8595c42 | ||
![]() |
5577c9caa6 | ||
![]() |
2f46c5180c | ||
![]() |
9a0a76a5bb | ||
![]() |
9d450ffc26 | ||
![]() |
e77c9ecbab | ||
![]() |
386b1e4cf6 | ||
![]() |
9f0b2c725f | ||
![]() |
0dcc67da1c | ||
![]() |
bbfe14e0af | ||
![]() |
59317624bb | ||
![]() |
2092debcc0 | ||
![]() |
3ba77a7470 | ||
![]() |
fbfab11293 | ||
![]() |
f940d22950 | ||
![]() |
a601a83c0e | ||
![]() |
0ac24829e1 | ||
![]() |
a85ae7da1e | ||
![]() |
83619ad6e3 | ||
![]() |
8e38beee0e | ||
![]() |
c574178a02 | ||
![]() |
e02f015a23 | ||
![]() |
fde5496bb8 | ||
![]() |
e1961d62eb | ||
![]() |
c836c65a78 | ||
![]() |
5cb92f63cf | ||
![]() |
99e470eb2a | ||
![]() |
61492ff11a | ||
![]() |
6f96aaf5a6 | ||
![]() |
709c77adcb | ||
![]() |
3ba7560b4d | ||
![]() |
f44a3ee402 | ||
![]() |
eb274b16f6 | ||
![]() |
fadf84bb69 | ||
![]() |
c788212aad | ||
![]() |
7690686ddb | ||
![]() |
a3647ec3a3 | ||
![]() |
008f01592b | ||
![]() |
3923858f00 | ||
![]() |
b11cac80fb | ||
![]() |
38e810a407 | ||
![]() |
224fbe9fed | ||
![]() |
f260e3ba88 | ||
![]() |
f17f29bf41 | ||
![]() |
21a811d265 | ||
![]() |
803b93c1fc | ||
![]() |
4873267f31 | ||
![]() |
1aef2b7734 | ||
![]() |
49ef715e99 | ||
![]() |
dd060d026a | ||
![]() |
96aa9b99de | ||
![]() |
4e84715725 | ||
![]() |
48718d6035 | ||
![]() |
8666d2683f | ||
![]() |
84c2183cc8 | ||
![]() |
7ec38273bb | ||
![]() |
6bca9e8dff | ||
![]() |
6c6d2ac973 | ||
![]() |
8747860b95 | ||
![]() |
5a00a6b32f | ||
![]() |
8a3be4634e | ||
![]() |
c075122492 | ||
![]() |
593a0c39ff | ||
![]() |
823239010a | ||
![]() |
b8dc1a7b16 | ||
![]() |
710c1ec457 | ||
![]() |
b9247c16df | ||
![]() |
59af28af86 | ||
![]() |
0baf0fec99 | ||
![]() |
d14a0e0c4a | ||
![]() |
e7c1782c51 | ||
![]() |
7b02f90f09 | ||
![]() |
4ed6156a03 | ||
![]() |
a0c7670738 | ||
![]() |
00ec580e74 | ||
![]() |
3442dab121 | ||
![]() |
2e747fe2a5 | ||
![]() |
df2537b721 | ||
![]() |
bf04ac99a3 | ||
![]() |
77c8ae525a | ||
![]() |
f7dcffc7be | ||
![]() |
a17f3f6b2f | ||
![]() |
8576e16b61 | ||
![]() |
4949de94c4 | ||
![]() |
44e504c604 | ||
![]() |
0370871867 | ||
![]() |
d3c197ddfc | ||
![]() |
8fc2003414 | ||
![]() |
c446640591 | ||
![]() |
6a97772e79 | ||
![]() |
d4bbcc0cfb | ||
![]() |
994f6ac101 | ||
![]() |
fbf5a286ab | ||
![]() |
81e68f241c | ||
![]() |
aff886341f | ||
![]() |
44530ff366 | ||
![]() |
e2baa6401a | ||
![]() |
560c23797a | ||
![]() |
efee23eca7 | ||
![]() |
234ac706a3 | ||
![]() |
11e2bf1701 | ||
![]() |
c8b73b20c6 | ||
![]() |
2921a406d6 | ||
![]() |
944cb0dfd1 | ||
![]() |
2437dd0158 | ||
![]() |
a7660df66e | ||
![]() |
e2d5a2dff0 | ||
![]() |
9899c7028e | ||
![]() |
e1552503ac | ||
![]() |
35f4ca76b6 | ||
![]() |
e828a4888d | ||
![]() |
af7663bd61 | ||
![]() |
4d38aaad3b | ||
![]() |
89f7f3cf98 | ||
![]() |
7a45ac029e | ||
![]() |
6d4702484d | ||
![]() |
a50641d973 | ||
![]() |
3b798d1e64 | ||
![]() |
553ca77a07 | ||
![]() |
e3c46e3b09 | ||
![]() |
86657b8742 | ||
![]() |
39b69945cc | ||
![]() |
15ce0d8e04 | ||
![]() |
8bd26974b7 | ||
![]() |
38097d47eb | ||
![]() |
cb5813d10a | ||
![]() |
2cc1207dc3 | ||
![]() |
6f12336f33 | ||
![]() |
49841871aa | ||
![]() |
1b306447ef | ||
![]() |
dfa885f4f0 | ||
![]() |
08dc228718 | ||
![]() |
cabdcdb898 | ||
![]() |
627b17d2f5 | ||
![]() |
33bccf2ac4 | ||
![]() |
9919fd1c43 | ||
![]() |
b955c79fb9 | ||
![]() |
1fdb8da844 | ||
![]() |
a43bbd4f44 | ||
![]() |
cbe21e28ec | ||
![]() |
aa8adb4a36 | ||
![]() |
7005ba3d88 | ||
![]() |
276199aa37 | ||
![]() |
ee656ff4bb | ||
![]() |
c6ac96b64e | ||
![]() |
2e70663bf9 | ||
![]() |
80cb2445fc | ||
![]() |
c3c182e674 | ||
![]() |
fb66c7e5ee | ||
![]() |
8f46e579f4 | ||
![]() |
c6c0a6f1fe | ||
![]() |
9f08baaa5c | ||
![]() |
7bbc556e6e | ||
![]() |
c6118d511d | ||
![]() |
d242aaf10e | ||
![]() |
113b5c2d20 | ||
![]() |
b97e5e2a8b | ||
![]() |
54a8025903 | ||
![]() |
02d4c5704c | ||
![]() |
e0791a61a2 | ||
![]() |
5002488c24 | ||
![]() |
20f19cbafd | ||
![]() |
86d532630f | ||
![]() |
fcd9f49e24 | ||
![]() |
255292cc01 | ||
![]() |
9b9ab2349a | ||
![]() |
122df6f233 | ||
![]() |
274cb33e89 | ||
![]() |
ed816ba448 | ||
![]() |
ca01158e1c | ||
![]() |
60fb624a40 | ||
![]() |
58c6540cdf | ||
![]() |
79702eb956 | ||
![]() |
fed0d4f65b | ||
![]() |
79801a2389 | ||
![]() |
c753f3b509 | ||
![]() |
9187715bf0 | ||
![]() |
85f22aff35 | ||
![]() |
4c2acb419b | ||
![]() |
5cfe40a504 | ||
![]() |
107b14d6bb | ||
![]() |
717abe60e7 | ||
![]() |
0ccdc3fcfe | ||
![]() |
2c9acf141c | ||
![]() |
4abfa103b6 | ||
![]() |
0db00b9669 | ||
![]() |
7594e11f23 | ||
![]() |
d58af9ad64 | ||
![]() |
3b59591f14 | ||
![]() |
53e917bb08 | ||
![]() |
9deb181814 | ||
![]() |
37a9ed4b3b | ||
![]() |
81ec7190d6 | ||
![]() |
4667ffb091 | ||
![]() |
3face791c6 | ||
![]() |
3de028af98 | ||
![]() |
24a24306ae | ||
![]() |
dcb821d56b | ||
![]() |
2d4841b764 | ||
![]() |
d83d89f927 | ||
![]() |
45e6dadac8 | ||
![]() |
be6840b9c2 | ||
![]() |
8a276c8595 | ||
![]() |
8aa5ac4172 | ||
![]() |
eb081e5dfa | ||
![]() |
36b793408b | ||
![]() |
6822561fd1 | ||
![]() |
cb18e6f08f | ||
![]() |
5f32d8f5ea | ||
![]() |
c2f14bb2da | ||
![]() |
dddfcf2832 | ||
![]() |
c5c8b7d20a | ||
![]() |
c726aa30df | ||
![]() |
42317a359d | ||
![]() |
8a43919e51 | ||
![]() |
7753df7681 | ||
![]() |
5603887437 | ||
![]() |
d307ac54f6 | ||
![]() |
8589701bea | ||
![]() |
b2e0b720ac | ||
![]() |
9d196a2022 | ||
![]() |
1ea4934758 | ||
![]() |
b2427b1742 | ||
![]() |
b41d564c01 | ||
![]() |
d9fe0cc0d4 | ||
![]() |
19f8ec9654 | ||
![]() |
38070099d8 | ||
![]() |
c3bc7b124b | ||
![]() |
c0fb7f3af0 | ||
![]() |
4fa76da7f8 | ||
![]() |
a614374641 | ||
![]() |
8f92f3b114 | ||
![]() |
7d7b4f2afc | ||
![]() |
ba0b55101c | ||
![]() |
95d063dbd1 | ||
![]() |
047755b702 | ||
![]() |
654737a396 | ||
![]() |
8615cbf286 | ||
![]() |
154a42bd69 | ||
![]() |
e6291d57f9 | ||
![]() |
e9c9b8391d | ||
![]() |
3ab7f6dfb8 | ||
![]() |
a3267d1b3a | ||
![]() |
8dbaa7ea33 | ||
![]() |
8939af4f97 | ||
![]() |
6bcce7e562 | ||
![]() |
6af58b6c4a | ||
![]() |
0c594a5cc5 | ||
![]() |
c44f4d78b1 | ||
![]() |
9face881c7 | ||
![]() |
f60f4dd975 | ||
![]() |
3c40c84cde | ||
![]() |
7b93ed069f | ||
![]() |
3b508242ba | ||
![]() |
8d240b84bb | ||
![]() |
528267b4ba | ||
![]() |
bf18493b9a | ||
![]() |
17856d1067 | ||
![]() |
e330bbdad2 | ||
![]() |
31a0806e2b | ||
![]() |
e0c41e4feb | ||
![]() |
299013f4f7 | ||
![]() |
79adc251a6 | ||
![]() |
99172ecdad | ||
![]() |
8e31d114f8 | ||
![]() |
90b6d52969 | ||
![]() |
240c26edf8 | ||
![]() |
de1be5e574 | ||
![]() |
3a09552f97 | ||
![]() |
edd4464176 | ||
![]() |
3aecfc8b54 | ||
![]() |
4958b227d7 | ||
![]() |
7c84589565 | ||
![]() |
0d89e7120f | ||
![]() |
94df5237a6 | ||
![]() |
62bf5171e4 | ||
![]() |
b7900844d2 | ||
![]() |
52707276e6 | ||
![]() |
0ac2b50df1 | ||
![]() |
f2c04dff35 | ||
![]() |
c8fed2d977 | ||
![]() |
ce051cd1a1 | ||
![]() |
12ab87c248 | ||
![]() |
10a9cf5687 | ||
![]() |
38cfeae83b | ||
![]() |
555fee7d72 | ||
![]() |
7b2ad5b30e | ||
![]() |
fb85efc58d | ||
![]() |
47eb770257 | ||
![]() |
3e8abe7a38 | ||
![]() |
9c71a03e56 | ||
![]() |
1f59ebb225 | ||
![]() |
221644a271 | ||
![]() |
1ceb07e7f0 | ||
![]() |
6dc994c19c | ||
![]() |
5ff464fc96 | ||
![]() |
28cf0432f3 | ||
![]() |
6886790a18 | ||
![]() |
71012e03d6 | ||
![]() |
79bb7135db | ||
![]() |
1aeafe53d8 | ||
![]() |
7880173c63 | ||
![]() |
55a2f02431 | ||
![]() |
c798928369 | ||
![]() |
9ab182913c | ||
![]() |
99b8903808 | ||
![]() |
57fc8a7b3d | ||
![]() |
630de255d8 | ||
![]() |
cc14818ffa | ||
![]() |
e1db77a27a | ||
![]() |
c6a74cdb98 | ||
![]() |
c68386e0e2 | ||
![]() |
99a7cd31b4 | ||
![]() |
239c95771f | ||
![]() |
a3d9d9382f | ||
![]() |
d8e71510f7 | ||
![]() |
cd776a1a96 | ||
![]() |
afa90259dd | ||
![]() |
9930d6c2ea | ||
![]() |
d8f1e91471 | ||
![]() |
6ec314e229 | ||
![]() |
79dd874576 | ||
![]() |
656f1445cb | ||
![]() |
540c874ac0 | ||
![]() |
84a0453a9b | ||
![]() |
88607c404c | ||
![]() |
5ed88ccd75 | ||
![]() |
7cba69c5f7 | ||
![]() |
f2a2e421b5 | ||
![]() |
c4d6b80c18 | ||
![]() |
4fc094c17f | ||
![]() |
78335d324d | ||
![]() |
134fc6aad9 | ||
![]() |
d9a3b77753 | ||
![]() |
d3d48f0e38 | ||
![]() |
8bf728103b | ||
![]() |
a9eb521865 | ||
![]() |
e8a5cbb561 | ||
![]() |
3a8c201fbe | ||
![]() |
93f8b01d32 | ||
![]() |
c55e82300c | ||
![]() |
85d8a2d021 | ||
![]() |
d372fe7eb6 | ||
![]() |
a8e5a3069f | ||
![]() |
bdb78e3331 | ||
![]() |
75b1c683e0 | ||
![]() |
b6baf62508 | ||
![]() |
7ebb52d297 | ||
![]() |
458b26712c | ||
![]() |
b0e5d9894a | ||
![]() |
50ed70f29b | ||
![]() |
c251c3936d | ||
![]() |
69f46f9664 | ||
![]() |
0bbbad9add | ||
![]() |
9b4b96d3a4 | ||
![]() |
990f85cb5b | ||
![]() |
584a3696a1 | ||
![]() |
c5c10dd086 | ||
![]() |
e531f6a36b | ||
![]() |
9e3a4a3bbe | ||
![]() |
486e9fb7d0 | ||
![]() |
d1597500a3 | ||
![]() |
4ae6580c4d | ||
![]() |
7022c5ab4c | ||
![]() |
31365bddf2 | ||
![]() |
e2ebbd2f6e | ||
![]() |
766f3015aa | ||
![]() |
c9ee2a34e4 | ||
![]() |
fd1eb89c1e | ||
![]() |
4eabbf4661 | ||
![]() |
f2386afe6c | ||
![]() |
e65cf12625 | ||
![]() |
addf6b936f | ||
![]() |
4d4895435a | ||
![]() |
c20ebd66e4 | ||
![]() |
17bc13a877 | ||
![]() |
04c031fc40 | ||
![]() |
90bfc0d610 | ||
![]() |
dce2e464da | ||
![]() |
0077c223c8 | ||
![]() |
47b202f7bc | ||
![]() |
68c546add2 | ||
![]() |
2fb8281127 | ||
![]() |
fc416722a6 | ||
![]() |
0d4c9eda69 | ||
![]() |
304d6adc25 | ||
![]() |
3dabcb0fa7 | ||
![]() |
b3ce4ff613 | ||
![]() |
c94a86b7f6 | ||
![]() |
4b34085c5f | ||
![]() |
5c7db73fd0 | ||
![]() |
98c02be4cd | ||
![]() |
3c27207c8e | ||
![]() |
8c850ca22b | ||
![]() |
ddbadcb64d | ||
![]() |
29561e2395 | ||
![]() |
0ba14de20a | ||
![]() |
2cd1377229 | ||
![]() |
edd5374247 | ||
![]() |
ecf185ee61 | ||
![]() |
176422becc | ||
![]() |
d2512412d6 | ||
![]() |
359e765322 | ||
![]() |
cbc8f54ed7 | ||
![]() |
99401dcc4f | ||
![]() |
39bef7f604 | ||
![]() |
457813a231 | ||
![]() |
fef878d1f3 | ||
![]() |
e866c2a651 | ||
![]() |
e79a646b4e | ||
![]() |
81e9416d13 | ||
![]() |
40a14569ab | ||
![]() |
3f754a806e | ||
![]() |
5557170a95 | ||
![]() |
e3beb61a5f | ||
![]() |
9a42c63542 | ||
![]() |
731dea9a16 | ||
![]() |
4677bf077e | ||
![]() |
15ae487adc | ||
![]() |
dd248d7dc2 | ||
![]() |
888f253ac5 | ||
![]() |
ecb46c34ce | ||
![]() |
7049b1ce99 | ||
![]() |
80a07aee73 | ||
![]() |
a7d8829eaa | ||
![]() |
eb1573a1fe | ||
![]() |
1a75b7d669 | ||
![]() |
c0324f00c3 | ||
![]() |
41a8e21fe8 | ||
![]() |
ef3e10ccb4 | ||
![]() |
c36a42be8c | ||
![]() |
d3226aa818 | ||
![]() |
7cbdf27d93 | ||
![]() |
c3c3cf98cb | ||
![]() |
813e601bc1 | ||
![]() |
0ed5c2683c | ||
![]() |
4139271563 | ||
![]() |
48a3624644 | ||
![]() |
fcc6535910 | ||
![]() |
cb21e9b167 | ||
![]() |
d1a640f383 | ||
![]() |
f838297f05 | ||
![]() |
1ea4c09c80 | ||
![]() |
5ed1521c6a | ||
![]() |
1d06af72da | ||
![]() |
313bfc0b72 | ||
![]() |
096350920c | ||
![]() |
ff460c1f43 | ||
![]() |
31fdca5373 | ||
![]() |
4f42a0e730 | ||
![]() |
833aa02d92 | ||
![]() |
61be103f7f | ||
![]() |
23d6736c12 | ||
![]() |
d8632d8554 | ||
![]() |
417900da5b | ||
![]() |
6bbd85cc37 | ||
![]() |
a3660ecede | ||
![]() |
fe91c90324 | ||
![]() |
a24a153289 | ||
![]() |
baffd6a778 | ||
![]() |
74289f0e6d | ||
![]() |
a0135f2b71 | ||
![]() |
695c8f2a49 | ||
![]() |
426e6411d1 | ||
![]() |
c9a27f1ad8 | ||
![]() |
57dfd608d3 | ||
![]() |
4fc19f3234 | ||
![]() |
2232081465 | ||
![]() |
ed2830ef50 | ||
![]() |
beea9fae4b | ||
![]() |
05b4a078a7 | ||
![]() |
658a50cbcd | ||
![]() |
b198267022 | ||
![]() |
f41a7619b2 | ||
![]() |
19c31d8150 | ||
![]() |
8686fdbb7e | ||
![]() |
583494274e | ||
![]() |
83049d8a71 | ||
![]() |
46fc5f3d39 | ||
![]() |
7fccf1b2cd | ||
![]() |
b470de0882 | ||
![]() |
3e5e6bcd75 | ||
![]() |
7c626d449f | ||
![]() |
b4d8cc5230 | ||
![]() |
9b6d6fe6f5 | ||
![]() |
377a6939d1 | ||
![]() |
2cc56f0b82 | ||
![]() |
e42e1b9c51 | ||
![]() |
c560b6e2fc | ||
![]() |
9a805dffd4 | ||
![]() |
cd660f8f93 | ||
![]() |
0c27b25a83 | ||
![]() |
24001f7b26 | ||
![]() |
32042580ba | ||
![]() |
36155d9ba0 | ||
![]() |
de2f06a21c | ||
![]() |
d8567a6171 | ||
![]() |
fb75dd8e4d | ||
![]() |
9686afcf6f | ||
![]() |
c6245b2455 | ||
![]() |
fd8d7ac7ed | ||
![]() |
6e0aff86ed | ||
![]() |
c751613c57 | ||
![]() |
50ef788efd | ||
![]() |
e7719de38f | ||
![]() |
9c83eaa58b | ||
![]() |
d6f1b3bde2 | ||
![]() |
65d4e45c5e | ||
![]() |
f1445d7fb2 | ||
![]() |
82ecfd499a | ||
![]() |
aa3b036630 | ||
![]() |
8aaf0927d2 | ||
![]() |
44346ba200 | ||
![]() |
43f75a28b0 | ||
![]() |
bd34ba8077 | ||
![]() |
18a91f783e | ||
![]() |
b0e680dfe8 | ||
![]() |
212cd0289a | ||
![]() |
6faf2b7b0e | ||
![]() |
b0c572a9fe | ||
![]() |
09d6c9f1a1 | ||
![]() |
08534241df | ||
![]() |
0a0d4a015e | ||
![]() |
d7de30ef8a | ||
![]() |
16ef5d63ba | ||
![]() |
118b26f0a2 | ||
![]() |
293cd25271 | ||
![]() |
121c23e8f1 | ||
![]() |
11d7179051 | ||
![]() |
33b152c18f | ||
![]() |
e553c0062b | ||
![]() |
d032b463e5 | ||
![]() |
c8f2f162ca | ||
![]() |
34fc0e801a | ||
![]() |
5e7ae549f3 | ||
![]() |
a503c0708c | ||
![]() |
e38f5be83c | ||
![]() |
394b6622f9 | ||
![]() |
aee43fea12 | ||
![]() |
f4bb30b9f4 | ||
![]() |
366346e2a9 | ||
![]() |
ef65832291 | ||
![]() |
a511565933 | ||
![]() |
80a64ac0a4 | ||
![]() |
af4ac70ceb | ||
![]() |
bcd5fa4e58 | ||
![]() |
de81226f53 | ||
![]() |
25178fd616 | ||
![]() |
5bc5219fa2 | ||
![]() |
275644aa02 | ||
![]() |
1ab64b2775 | ||
![]() |
453e035885 | ||
![]() |
16247bb8c3 | ||
![]() |
2376e1ea18 | ||
![]() |
5e6073f46e | ||
![]() |
9f9151580d | ||
![]() |
abce07cda6 | ||
![]() |
f5747f6a5c | ||
![]() |
b3d6b681cb | ||
![]() |
d3f02b48cf | ||
![]() |
2ae37ecfa5 | ||
![]() |
f6e1be3cc0 | ||
![]() |
e8389a46b3 |
22
.devcontainer/devcontainer.json
Normal file
@ -0,0 +1,22 @@
|
||||
// https://code.visualstudio.com/docs/remote/devcontainerjson-reference
|
||||
|
||||
{
|
||||
"image": "yeasy/docker_practice:latest",
|
||||
"mounts": [
|
||||
"source=dp-code-remote-cache,target=/root/.vscode-server,type=volume"
|
||||
],
|
||||
"settings": {
|
||||
"terminal.integrated.shell.linux": "/bin/sh"
|
||||
},
|
||||
"forwardPorts": [
|
||||
4000
|
||||
],
|
||||
"runArgs": [
|
||||
"--cap-add=SYS_ADMIN"
|
||||
],
|
||||
"postStartCommand": [
|
||||
"sh",
|
||||
"-cx",
|
||||
"pwd ; cd /workspaces/docker_practice ; mkdir -p ${PWD}/node_modules; mkdir -p ${PWD}/_book; mount --bind /srv/gitbook/node_modules ${PWD}/node_modules ; mount --bind /mnt ${PWD}/_book"
|
||||
]
|
||||
}
|
11
.docker/docker-entrypoint.sh
Executable file
@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
echo
|
||||
echo
|
||||
echo "Please open your browser: 127.0.0.1:4000"
|
||||
echo
|
||||
echo "欢迎加入 QQ 群:【 145983035 】 分享 Docker 资源,交流 Docker 技术"
|
||||
echo
|
||||
echo
|
||||
|
||||
exec nginx -g "daemon off;"
|
15
.drone.yml
Normal file
@ -0,0 +1,15 @@
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: build
|
||||
steps:
|
||||
- name: build
|
||||
image: yeasy/docker_practice:latest
|
||||
pull: if-not-exists # always never
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
commands:
|
||||
- docker-entrypoint.sh build
|
||||
|
||||
trigger:
|
||||
branch:
|
||||
- master
|
29
.editorconfig
Normal file
@ -0,0 +1,29 @@
|
||||
# EditorConfig is awesome: https://EditorConfig.org
|
||||
|
||||
root = true
|
||||
|
||||
[*]
|
||||
|
||||
indent_style = space
|
||||
|
||||
indent_size = 2
|
||||
|
||||
end_of_line = lf
|
||||
|
||||
charset = utf-8
|
||||
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
insert_final_newline = true
|
||||
|
||||
[*.md]
|
||||
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.py]
|
||||
|
||||
indent_size = 4
|
||||
|
||||
[Makefile]
|
||||
|
||||
indent_style = tab
|
5
.gitattributes
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
* text=auto
|
||||
|
||||
*.sh text eol=lf
|
||||
|
||||
* linguist-language=go
|
39
.github/CODEOWNERS
vendored
Normal file
@ -0,0 +1,39 @@
|
||||
* @yeasy @khs1994
|
||||
/.github/* @khs1994
|
||||
/.travis/* @khs1994
|
||||
/.vuepress/* @khs1994
|
||||
/advanced_network/* @yeasy @khs1994
|
||||
/appendix/* @yeasy @khs1994
|
||||
/archive/* @khs1994
|
||||
/basic_concept/* @yeasy @khs1994
|
||||
/buildx/* @khs1994
|
||||
/cases/* @yeasy @khs1994
|
||||
/cloud/* @khs1994
|
||||
/compose/* @yeasy @khs1994
|
||||
/container/* @yeasy @khs1994
|
||||
/coreos/* @khs1994
|
||||
/data_management/* @khs1994
|
||||
/etcd/* @khs1994
|
||||
/IDE/* @khs1994
|
||||
/image/* @yeasy @khs1994
|
||||
/install/* @khs1994
|
||||
/introduction/* @yeasy @khs1994
|
||||
/kubernetes/* @yeasy @khs1994
|
||||
/network/* @yeasy @khs1994
|
||||
/opensource/* @khs1994
|
||||
/repository/* @khs1994
|
||||
/security/* @yeasy @khs1994
|
||||
/underly/* @yeasy @khs1994
|
||||
/.drone.yml @khs1994
|
||||
/.editorconfig/ @khs1994
|
||||
/.gitattributes @khs1994
|
||||
/.gitignore @khs1994
|
||||
/_config.yml @yeasy @khs1994
|
||||
/book.json @yeasy @khs1994
|
||||
/CHANGELOG.md @yeasy @khs1994
|
||||
/CONTRIBUTING.md @yeasy @khs1994
|
||||
/docker-compose.yml @khs1994
|
||||
/manifest @khs1994
|
||||
/package.json @khs1994
|
||||
/README.md @yeasy @khs1994
|
||||
/SUMMARY.md @yeasy @khs1994
|
13
.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: yeasy
|
||||
patreon: # Replace with a single Patreon username
|
||||
open_collective: # Replace with a single Open Collective username
|
||||
ko_fi: # Replace with a single Ko-fi username
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
liberapay: # Replace with a single Liberapay username
|
||||
issuehunt: # Replace with a single IssueHunt username
|
||||
otechie: # Replace with a single Otechie username
|
||||
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
|
||||
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
41
.github/ISSUE_TEMPLATE/Bug_report.md
vendored
Normal file
@ -0,0 +1,41 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
|
||||
---
|
||||
|
||||
* [ ] Have u googled the problem? If no, pls do that first!
|
||||
|
||||
### Environment
|
||||
<!--请提供环境信息,包括操作系统版本等,保留你的操作系统,其他选项删除-->
|
||||
<!--Provides env info like OS version-->
|
||||
|
||||
* [x] Linux
|
||||
* [x] CentOS 7
|
||||
* [x] Fedora
|
||||
* [x] Ubuntu 16.04 +
|
||||
* [x] Debian 9 +
|
||||
* [x] macOS
|
||||
* [x] Windows 10
|
||||
* [x] Raspberry Pi (ARM)
|
||||
* [x] Others (Pls describe below)
|
||||
|
||||
### Docker Version
|
||||
<!--如果你的 Docker 版本低于 20.10 请尽可能升级到该版本,保留你的 Docker 版本,其他选项删除-->
|
||||
<!--if Docker version under 20.10, please upgrade Docker to 20.10-->
|
||||
|
||||
* [x] Test (v20.10)
|
||||
* [x] Stable (v20.10)
|
||||
* [x] 1.13.0 or Before
|
||||
|
||||
### Problem Description
|
||||
<!--描述你的问题,请贴出操作步骤,终端报错截图或文字信息-->
|
||||
<!--describe problem with detailed steps and logs-->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!--提交问题之前请点击预览标签,符合要求之后再提交问题-->
|
41
.github/ISSUE_TEMPLATE/Custom.md
vendored
Normal file
@ -0,0 +1,41 @@
|
||||
---
|
||||
name: Custom issue template
|
||||
about: Create a issue about Docker
|
||||
|
||||
---
|
||||
|
||||
* [ ] Have u googled the problem? If no, pls do that first!
|
||||
|
||||
### Environment
|
||||
<!--请提供环境信息,包括操作系统版本等,保留你的操作系统,其他选项删除-->
|
||||
<!--Provides env info like OS version-->
|
||||
|
||||
* [x] Linux
|
||||
* [x] CentOS 7
|
||||
* [x] Fedora
|
||||
* [x] Ubuntu 16.04 +
|
||||
* [x] Debian 9 +
|
||||
* [x] macOS
|
||||
* [x] Windows 10
|
||||
* [x] Raspberry Pi (ARM)
|
||||
* [x] Others (Pls describe below)
|
||||
|
||||
### Docker Version
|
||||
<!--如果你的 Docker 版本低于 20.10 请尽可能升级到该版本,保留你的 Docker 版本,其他选项删除-->
|
||||
<!--if Docker version under 20.10, please upgrade Docker to 20.10-->
|
||||
|
||||
* [x] Test (v20.10)
|
||||
* [x] Stable (v20.10)
|
||||
* [x] 1.13.0 or Before
|
||||
|
||||
### Problem Description
|
||||
<!--描述你的问题,请贴出操作步骤,终端报错截图或文字信息-->
|
||||
<!--describe problem with detailed steps and logs-->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!--提交问题之前请点击预览标签,符合要求之后再提交问题-->
|
5
.github/ISSUE_TEMPLATE/Feature_request.md
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for docker_practice
|
||||
|
||||
---
|
20
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
<!--
|
||||
Thanks for your contribution.
|
||||
See [CONTRIBUTING](CONTRIBUTING.md) for contribution guidelines.
|
||||
-->
|
||||
|
||||
**Proposed changes (Mandatory)**
|
||||
|
||||
<!--
|
||||
Tell us what you did and why:
|
||||
|
||||
One line short description
|
||||
|
||||
And details in other paragraphs.
|
||||
-->
|
||||
|
||||
**Fix issues (Optional)**
|
||||
|
||||
<!--
|
||||
Tell us what issues you fixed, e.g., fix #123
|
||||
-->
|
65
.github/workflows/check-link.yml
vendored
Normal file
@ -0,0 +1,65 @@
|
||||
name: Check link
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
check-link:
|
||||
name: check-link
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
# search Issues :-(
|
||||
- run: |
|
||||
docker run -i --rm \
|
||||
-v $PWD:/mnt:ro \
|
||||
dkhamsing/awesome_bot \
|
||||
--white-list "localhost","0.0.0.0",\
|
||||
"server","example.com","docker",\
|
||||
"docker.domain.com","YourIP","register",\
|
||||
"172.16.238.100","172.16.238.101","172.16.238.102",\
|
||||
"192.168.199.100",\
|
||||
"github.com/settings",\
|
||||
"github.com/docker/compose/releases/download",\
|
||||
"github.com/etcd-io/etcd/releases/download",\
|
||||
"github.com/tianon/gosu/releases/download",\
|
||||
"github.com/yeasy/docker_practice",\
|
||||
"github.com/AliyunContainerService/k8s-for-docker-desktop/raw",\
|
||||
"dl-cdn.alpinelinux.org/alpine/edge/testing",\
|
||||
"www.w3.org/1999/xhtml",\
|
||||
"cr.console.aliyun.com",\
|
||||
"cloud.tencent.com",\
|
||||
"nodejs.org/dist/",\
|
||||
"c.163.com/hub",\
|
||||
"drone.yeasy.com",\
|
||||
"docs.docker.com",\
|
||||
"dockerhub.azk8s.cn",\
|
||||
"reg-mirror.qiniu.com",\
|
||||
"registry.docker-cn.com",\
|
||||
"mirror.ccs.tencentyun.com",\
|
||||
"vuepress.mirror.docker-practice.com",\
|
||||
"mc.qcloudimg.com/static/img",\
|
||||
"www.daocloud.io/mirror",\
|
||||
"download.docker.com",\
|
||||
"www.ubuntu.com",\
|
||||
"archive.ubuntu.com",\
|
||||
"security.ubuntu.com/ubuntu",\
|
||||
"nginx.com",\
|
||||
"img.shields.io/github/release/yeasy/docker_practice",\
|
||||
"launchpad.net",\
|
||||
"www.w3.org/1999",\
|
||||
"chat.freenode.net",\
|
||||
"en.wikipedia.org/wiki/UnionFS",\
|
||||
"product.china-pub.com",\
|
||||
"union-click.jd.com",\
|
||||
"x.x.x.x/base",\
|
||||
"x.x.x.x:9090",\
|
||||
"yeasy.gitbooks.io",\
|
||||
"download.fastgit.org",\
|
||||
"www.aliyun.com" \
|
||||
--allow-dupe \
|
||||
--skip-save-results \
|
||||
-t 10 \
|
||||
`find . \( -path "./mesos" -o -path "./swarm_mode" \) -prune -o -name "*.md" -exec ls {} \;`
|
||||
name: check-link
|
||||
timeout-minutes: 25
|
156
.github/workflows/ci.yaml
vendored
Normal file
@ -0,0 +1,156 @@
|
||||
name: CI
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash --noprofile --norc -exo pipefail {0}
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
- name: Build Gitbook
|
||||
uses: docker://yeasy/docker_practice
|
||||
with:
|
||||
args: build
|
||||
- name: Build Gitbook Docker Image
|
||||
if: github.repository == 'docker-practice/docker_practice'
|
||||
run: |
|
||||
sudo chmod -R 777 _book
|
||||
echo "FROM nginx:alpine" >> Dockerfile
|
||||
echo "COPY _book /usr/share/nginx/html" >> Dockerfile
|
||||
echo "COPY .docker/docker-entrypoint.sh /" >> Dockerfile
|
||||
echo "ENTRYPOINT [\"/docker-entrypoint.sh\"]" >> Dockerfile
|
||||
|
||||
export VCS_REF=`git rev-parse --short HEAD`
|
||||
|
||||
docker build \
|
||||
-t dockerpracticesig/docker_practice \
|
||||
-t dockerpracticesig/docker_practice:gitbook \
|
||||
--label org.opencontainers.image.revision=$VCS_REF \
|
||||
--label org.opencontainers.image.source="https://github.com/yeasy/docker_practice" \
|
||||
--label maintainer="https://github.com/docker-practice" \
|
||||
.
|
||||
|
||||
docker run -d --rm -p 4000:80 dockerpracticesig/docker_practice
|
||||
|
||||
sleep 5
|
||||
|
||||
echo "::group::Test"
|
||||
curl 127.0.0.1:4000
|
||||
echo "::endgroup::"
|
||||
|
||||
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
|
||||
docker push dockerpracticesig/docker_practice
|
||||
docker push dockerpracticesig/docker_practice:gitbook
|
||||
env:
|
||||
DOCKER_PASSWORD: ${{secrets.DOCKER_PASSWORD}}
|
||||
DOCKER_USERNAME: ${{secrets.DOCKER_USERNAME}}
|
||||
- name: Upload Gitbook dist
|
||||
uses: docker://pcit/pages
|
||||
if: github.repository == 'docker-practice/docker_practice'
|
||||
env:
|
||||
PCIT_EMAIL: khs1994@khs1994.com
|
||||
PCIT_GIT_TOKEN: ${{ secrets.PCIT_GIT_TOKEN }}
|
||||
PCIT_GIT_URL: github.com/docker-practice/zh-cn
|
||||
PCIT_KEEP_HISTORY: "true"
|
||||
PCIT_LOCAL_DIR: _book
|
||||
PCIT_MESSAGE: Build from yeasy/docker_practice@${{github.sha}}
|
||||
PCIT_TARGET_BRANCH: master
|
||||
PCIT_USERNAME: khs1994
|
||||
- name: vuepress
|
||||
run: |
|
||||
export NODE_OPTIONS=--openssl-legacy-provider
|
||||
sudo rm -rf _book
|
||||
npm i
|
||||
|
||||
git clone https://github.com/docker-practice/.vuepress .vuepress2
|
||||
cp -r .vuepress2/. .vuepress/
|
||||
rm -rf .vuepress2
|
||||
find . \( -path "./mesos" -o -path "./swarm_mode" -o -path "./node_modules" -o -path "./.vuepress" -o -path "./_book" -o -path "./CHANGELOG.md" -o -path "./CONTRIBUTING.md" \) -prune -o -name "*.md" -exec sed -i 'N;2a\<AdSenseTitle/>\n' {} \;
|
||||
|
||||
npx vuepress --version
|
||||
|
||||
npm run vuepress:build
|
||||
echo "vuepress.mirror.docker-practice.com" > .vuepress/dist/CNAME
|
||||
|
||||
cp -r _images .vuepress/dist
|
||||
cp -r advanced_network/_images .vuepress/dist/advanced_network
|
||||
cp -r appendix/_images .vuepress/dist/appendix
|
||||
cp -r cases/ci/drone/_images .vuepress/dist/cases/ci/drone
|
||||
cp -r cases/os/_images .vuepress/dist/cases/os
|
||||
cp -r cloud/_images .vuepress/dist/cloud
|
||||
cp -r data_management/_images .vuepress/dist/data_management
|
||||
cp -r etcd/_images .vuepress/dist/etcd
|
||||
cp -r image/_images .vuepress/dist/image
|
||||
cp -r install/_images .vuepress/dist/install
|
||||
cp -r introduction/_images .vuepress/dist/introduction
|
||||
cp -r kubernetes/_images .vuepress/dist/kubernetes
|
||||
cp -r underly/_images .vuepress/dist/underly
|
||||
|
||||
echo "include: [_images]" > .vuepress/dist/_config.yml
|
||||
- name: Upload Vuepress dist
|
||||
uses: docker://pcit/pages
|
||||
if: github.repository == 'docker-practice/docker_practice'
|
||||
env:
|
||||
PCIT_EMAIL: khs1994@khs1994.com
|
||||
PCIT_GIT_TOKEN: ${{ secrets.PCIT_GIT_TOKEN }}
|
||||
PCIT_GIT_URL: github.com/docker-practice/vuepress
|
||||
PCIT_KEEP_HISTORY: "true"
|
||||
PCIT_LOCAL_DIR: .vuepress/dist
|
||||
PCIT_MESSAGE: Build from yeasy/docker_practice@${{github.sha}}
|
||||
PCIT_TARGET_BRANCH: master
|
||||
PCIT_USERNAME: khs1994
|
||||
# - name: Set coding.net CNAME
|
||||
# run: |
|
||||
# echo "vuepress.mirror.docker-practice.com" > .vuepress/dist/CNAME
|
||||
# - name: Upload Vuepress dist to coding.net
|
||||
# uses: docker://pcit/pages
|
||||
# if: github.repository == 'docker-practice/docker_practice'
|
||||
# env:
|
||||
# PCIT_EMAIL: khs1994@khs1994.com
|
||||
# PCIT_GIT_TOKEN: ${{ secrets.CODING_GIT_TOKEN }}
|
||||
# PCIT_GIT_URL: e.coding.net/dpsigs/docker_practice
|
||||
# PCIT_KEEP_HISTORY: "true"
|
||||
# PCIT_LOCAL_DIR: .vuepress/dist
|
||||
# PCIT_MESSAGE: Build from yeasy/docker_practice@${{github.sha}}
|
||||
# PCIT_TARGET_BRANCH: master
|
||||
# PCIT_USERNAME: ptt0xjqzbke3
|
||||
- name: Build vuepress docker image
|
||||
if: github.repository == 'docker-practice/docker_practice'
|
||||
run: |
|
||||
sudo rm -rf .vuepress/dist/.git
|
||||
|
||||
echo "FROM nginx:alpine" > Dockerfile
|
||||
echo "COPY .vuepress/dist /usr/share/nginx/html" >> Dockerfile
|
||||
echo "COPY .docker/docker-entrypoint.sh /" >> Dockerfile
|
||||
echo "ENTRYPOINT [\"/docker-entrypoint.sh\"]" >> Dockerfile
|
||||
|
||||
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
|
||||
|
||||
VCS_REF=`git rev-parse --short HEAD`
|
||||
|
||||
docker build -t dockerpracticesig/docker_practice:vuepress \
|
||||
--label org.opencontainers.image.revision=$VCS_REF \
|
||||
--label org.opencontainers.image.source="https://github.com/yeasy/docker_practice" \
|
||||
--label maintainer="https://github.com/docker-practice" \
|
||||
.
|
||||
|
||||
docker push dockerpracticesig/docker_practice:vuepress
|
||||
|
||||
docker run -it --rm -d -p 4001:80 dockerpracticesig/docker_practice:vuepress
|
||||
|
||||
sleep 5
|
||||
|
||||
echo "::group::Test"
|
||||
curl 127.0.0.1:4001
|
||||
echo "::endgroup::"
|
||||
env:
|
||||
DOCKER_PASSWORD: ${{secrets.DOCKER_PASSWORD}}
|
||||
DOCKER_USERNAME: ${{secrets.DOCKER_USERNAME}}
|
4
.gitignore
vendored
@ -7,5 +7,7 @@ _book/
|
||||
*.edx
|
||||
.DS_Store
|
||||
|
||||
|
||||
node_modules/
|
||||
package-lock.json
|
||||
|
||||
docker-compose.override.yml
|
||||
|
26
.travis/Dockerfile
Normal file
@ -0,0 +1,26 @@
|
||||
FROM node:14.4.0-alpine
|
||||
|
||||
ENV TZ=Asia/Shanghai
|
||||
|
||||
WORKDIR /srv/gitbook
|
||||
|
||||
COPY book.json book.json
|
||||
|
||||
COPY docker-entrypoint.sh /usr/local/bin/
|
||||
|
||||
RUN set -x && apk add --no-cache \
|
||||
tzdata bash \
|
||||
&& npm install -g gitbook-cli \
|
||||
&& gitbook install \
|
||||
&& ln -s /usr/local/bin/docker-entrypoint.sh / \
|
||||
&& rm -rf /root/.npm /tmp/*
|
||||
|
||||
EXPOSE 4000
|
||||
|
||||
VOLUME /srv/gitbook-src
|
||||
|
||||
WORKDIR /srv/gitbook-src
|
||||
|
||||
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||
|
||||
CMD server
|
37
.travis/book.json
Normal file
@ -0,0 +1,37 @@
|
||||
{
|
||||
"title": "Docker -- 从入门到实践",
|
||||
"author": "yeasy",
|
||||
"language": "zh-hans",
|
||||
"links": {
|
||||
"sidebar": {
|
||||
"GitHub": "https://github.com/yeasy/docker_practice"
|
||||
}
|
||||
},
|
||||
"plugins": [
|
||||
"-livereload",
|
||||
"image-captions",
|
||||
"github",
|
||||
"page-treeview@2.9.8",
|
||||
"editlink"
|
||||
],
|
||||
"pluginsConfig": {
|
||||
"image-captions": {
|
||||
"attributes": {
|
||||
"width": "600"
|
||||
},
|
||||
"caption": "图 _PAGE_LEVEL_._PAGE_IMAGE_NUMBER_ - _CAPTION_"
|
||||
},
|
||||
"github": {
|
||||
"url": "https://github.com/yeasy/docker_practice"
|
||||
},
|
||||
"editlink": {
|
||||
"base": "https://github.com/yeasy/docker_practice/blob/master/",
|
||||
"label": "编辑本页"
|
||||
},
|
||||
"page-treeview": {
|
||||
"copyright": "Copyright © yeasy",
|
||||
"minHeaderCount": "2",
|
||||
"minHeaderDeep": "2"
|
||||
}
|
||||
}
|
||||
}
|
43
.travis/conf.d/nginx.conf
Normal file
@ -0,0 +1,43 @@
|
||||
user root;
|
||||
worker_processes auto;
|
||||
|
||||
error_log /var/log/nginx/error.log warn;
|
||||
pid /var/run/nginx.pid;
|
||||
|
||||
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
|
||||
http {
|
||||
include /etc/nginx/mime.types;
|
||||
default_type application/octet-stream;
|
||||
|
||||
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||
'$status $body_bytes_sent "$http_referer" '
|
||||
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||
|
||||
access_log /var/log/nginx/access.log main;
|
||||
|
||||
sendfile on;
|
||||
#tcp_nopush on;
|
||||
|
||||
keepalive_timeout 65;
|
||||
|
||||
#gzip on;
|
||||
|
||||
index index.html index.php;
|
||||
|
||||
server {
|
||||
|
||||
server_name localhost;
|
||||
|
||||
listen 4000;
|
||||
|
||||
root /srv/www/;
|
||||
|
||||
index index.html;
|
||||
|
||||
}
|
||||
}
|
5
.travis/docker-compose.test.yml
Normal file
@ -0,0 +1,5 @@
|
||||
sut:
|
||||
build: .
|
||||
volumes:
|
||||
- ../:/srv/gitbook-src
|
||||
command: build
|
23
.travis/docker-entrypoint.sh
Executable file
@ -0,0 +1,23 @@
|
||||
#!/bin/sh
|
||||
|
||||
START=`date "+%F %T"`
|
||||
|
||||
if [ $1 = "sh" ];then sh ; exit 0; fi
|
||||
|
||||
rm -rf node_modules _book
|
||||
|
||||
srcDir=$PWD
|
||||
|
||||
cp -a . /srv/gitbook
|
||||
|
||||
cd /srv/gitbook
|
||||
|
||||
main(){
|
||||
if [ "$1" = build ];then
|
||||
gitbook build && cp -a _book $srcDir && echo $START && date "+%F %T" && exit 0
|
||||
else
|
||||
exec gitbook serve
|
||||
fi
|
||||
}
|
||||
|
||||
main $1 $2 $3
|
8
.travis/update.sh
Executable file
@ -0,0 +1,8 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# cd .travis
|
||||
# ./update.sh
|
||||
|
||||
if [ ! -f Dockerfile ];then exit 1; fi
|
||||
|
||||
cp -a ../book.json book.json
|
3
.vuepress/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
/*
|
||||
!.gitignore
|
||||
!config.js
|
462
.vuepress/config.js
Normal file
@ -0,0 +1,462 @@
|
||||
const { config } = require('vuepress-theme-hope')
|
||||
|
||||
module.exports = config({
|
||||
title: 'Docker 从入门到实践',
|
||||
base: '/',
|
||||
head: [['script', {}, `
|
||||
var _hmt = _hmt || [];
|
||||
(function() {
|
||||
var hm = document.createElement("script");
|
||||
hm.src = "//hm.baidu.com/hm.js?81a3490c9cd141dbcf6d00bc18b6edae";
|
||||
var s = document.getElementsByTagName("script")[0];
|
||||
s.parentNode.insertBefore(hm, s);
|
||||
})();
|
||||
`],
|
||||
[
|
||||
'script', {}, `
|
||||
(function(){
|
||||
var bp = document.createElement('script');
|
||||
var curProtocol = window.location.protocol.split(':')[0];
|
||||
if (curProtocol === 'https') {
|
||||
bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
|
||||
}
|
||||
else {
|
||||
bp.src = 'http://push.zhanzhang.baidu.com/push.js';
|
||||
}
|
||||
var s = document.getElementsByTagName("script")[0];
|
||||
s.parentNode.insertBefore(bp, s);
|
||||
})();
|
||||
`
|
||||
]
|
||||
],
|
||||
plugins: {
|
||||
// sitemap: {
|
||||
// hostname: 'https://vuepress.mirror.docker-practice.com'
|
||||
// },
|
||||
// 'git-log': {
|
||||
// additionalArgs: '--no-merge',
|
||||
// onlyFirstAndLastCommit: true,
|
||||
// },
|
||||
},
|
||||
locales: {
|
||||
"/": {
|
||||
lang: "zh-CN"
|
||||
}
|
||||
},
|
||||
themeConfig: {
|
||||
blog: false,
|
||||
// comment: false,
|
||||
comment: {
|
||||
type: "disable", // 使用 Valine
|
||||
appId: "...", // your appId
|
||||
appKey: "...", // your appKey
|
||||
},
|
||||
pageInfo: [
|
||||
// 'author',
|
||||
'reading-time',
|
||||
'word',
|
||||
],
|
||||
footer: {
|
||||
content: "Made with <a target='_blank' href='https://github.com/vuepress-theme-hope/vuepress-theme-hope'>vuepress-theme-hope</a>",
|
||||
display: true,
|
||||
copyright: false,
|
||||
},
|
||||
searchPlaceholder: 'Search',
|
||||
repo: 'yeasy/docker_practice',
|
||||
repoLabel: 'GitHub',
|
||||
repoDisplay: true,
|
||||
hostname: 'https://vuepress.mirror.docker-practice.com',
|
||||
// author: 'yeasy',
|
||||
mdEnhance: {
|
||||
lineNumbers: true,
|
||||
},
|
||||
git: {
|
||||
contributor: false,
|
||||
},
|
||||
themeColor: {
|
||||
blue: '#2196f3',
|
||||
// red: '#f26d6d',
|
||||
// green: '#3eaf7c',
|
||||
// orange: '#fb9b5f'
|
||||
},
|
||||
locales: {
|
||||
"/": {
|
||||
lang: "zh-CN"
|
||||
}
|
||||
},
|
||||
|
||||
darkmode: 'auto-switch',
|
||||
|
||||
//
|
||||
|
||||
showAds: true,
|
||||
|
||||
docsRepo: 'yeasy/docker_practice',
|
||||
docsDir: '/',
|
||||
docsBranch: 'master',
|
||||
editLinks: true,
|
||||
nav: [
|
||||
{
|
||||
text: '微信交流群',
|
||||
link: 'https://docker_practice.gitee.io/pic/dpsig-wechat.jpg',
|
||||
},
|
||||
{
|
||||
text: '小程序',
|
||||
link: 'https://docker_practice.gitee.io/pic/dp-wechat-miniprogram.jpg',
|
||||
},
|
||||
{
|
||||
text: '安装 Docker',
|
||||
link: '/install/',
|
||||
},
|
||||
{
|
||||
text: 'Docker 入门',
|
||||
link: '/'
|
||||
},
|
||||
{
|
||||
text: 'Docker 实战',
|
||||
link: '/cases/os/'
|
||||
},
|
||||
{
|
||||
text: 'CI/CD',
|
||||
link: '/cases/ci/'
|
||||
},
|
||||
{
|
||||
text: 'Compose',
|
||||
link: '/compose/',
|
||||
},
|
||||
{
|
||||
text: 'Kubernetes',
|
||||
link: '/kubernetes/',
|
||||
},
|
||||
{
|
||||
text: "云计算",
|
||||
link: "/cloud/",
|
||||
},
|
||||
// {
|
||||
// text: 'GitHub',
|
||||
// link: 'https://github.com/yeasy/docker_practice'
|
||||
// },
|
||||
// {
|
||||
// text: '捐赠',
|
||||
// link: ''
|
||||
// },
|
||||
{
|
||||
text: '云服务器99/元首年特惠',
|
||||
link: 'https://cloud.tencent.com/act/cps/redirect?redirect=1062&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console'
|
||||
},
|
||||
// {
|
||||
// text: '语言',
|
||||
// items: [{
|
||||
// text: 'English',
|
||||
// link: ''
|
||||
// }]
|
||||
// }
|
||||
],
|
||||
sidebar: {
|
||||
'/cloud/': [
|
||||
'intro',
|
||||
'tencentCloud',
|
||||
'alicloud',
|
||||
'aws',
|
||||
'summary',
|
||||
],
|
||||
'/kubernetes/': [
|
||||
'intro',
|
||||
'concepts',
|
||||
'design',
|
||||
{
|
||||
title: "部署 Kubernetes",
|
||||
collapsable: true,
|
||||
children: [
|
||||
"setup/",
|
||||
"setup/kubeadm",
|
||||
"setup/docker-desktop",
|
||||
"setup/systemd",
|
||||
"setup/dashboard",
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Kubernetes 命令行 kubectl",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'kubectl/'
|
||||
]
|
||||
}
|
||||
],
|
||||
'/compose/': [
|
||||
'introduction',
|
||||
'v2',
|
||||
'install',
|
||||
'usage',
|
||||
'commands',
|
||||
'compose_file',
|
||||
'django',
|
||||
'rails',
|
||||
'wordpress',
|
||||
'lnmp',
|
||||
],
|
||||
'/install/': [
|
||||
'ubuntu',
|
||||
'debian',
|
||||
'fedora',
|
||||
'centos',
|
||||
'raspberry-pi',
|
||||
// 'offline',
|
||||
'mac',
|
||||
'windows',
|
||||
'mirror',
|
||||
'experimental',
|
||||
],
|
||||
'/cases/os/': [
|
||||
{
|
||||
title: "操作系统",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'busybox',
|
||||
'alpine',
|
||||
'debian',
|
||||
'centos',
|
||||
'summary',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "在 IDE 中使用 Docker",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'/ide/',
|
||||
'/ide/vsCode',
|
||||
],
|
||||
},
|
||||
],
|
||||
'/cases/ci/': [
|
||||
'actions/',
|
||||
{
|
||||
title: "Drone",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'drone/',
|
||||
'drone/install'
|
||||
]
|
||||
},
|
||||
],
|
||||
'/': [
|
||||
'/',
|
||||
'/CHANGELOG',
|
||||
'/CONTRIBUTING',
|
||||
{
|
||||
title: "Docker 简介",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'introduction/',
|
||||
'introduction/what',
|
||||
'introduction/why',
|
||||
]
|
||||
}, {
|
||||
title: "基本概念",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'basic_concept/',
|
||||
'basic_concept/image',
|
||||
'basic_concept/container',
|
||||
'basic_concept/repository'
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "使用镜像",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'image/',
|
||||
'image/pull',
|
||||
'image/list',
|
||||
'image/rm',
|
||||
'image/commit',
|
||||
'image/build',
|
||||
'image/other.md',
|
||||
'image/internal.md',
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'Dockerfile',
|
||||
collapsable: true,
|
||||
children: [
|
||||
"image/dockerfile/",
|
||||
'image/dockerfile/copy',
|
||||
'image/dockerfile/add',
|
||||
'image/dockerfile/cmd',
|
||||
'image/dockerfile/entrypoint',
|
||||
'image/dockerfile/env',
|
||||
'image/dockerfile/arg',
|
||||
'image/dockerfile/volume',
|
||||
'image/dockerfile/expose',
|
||||
'image/dockerfile/workdir',
|
||||
'image/dockerfile/user',
|
||||
'image/dockerfile/healthcheck',
|
||||
'image/dockerfile/label',
|
||||
'image/dockerfile/shell',
|
||||
'image/dockerfile/onbuild',
|
||||
'image/dockerfile/references',
|
||||
'image/multistage-builds/',
|
||||
'image/multistage-builds/laravel',
|
||||
'image/manifest',
|
||||
]
|
||||
}, {
|
||||
title: "操作容器",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'container/',
|
||||
'container/run',
|
||||
'container/daemon',
|
||||
'container/stop',
|
||||
'container/attach_exec',
|
||||
'container/import_export',
|
||||
'container/rm',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Docker 仓库",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'repository/',
|
||||
'repository/dockerhub',
|
||||
'repository/registry',
|
||||
'repository/registry_auth',
|
||||
'repository/nexus3_registry',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "数据管理",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'data_management/',
|
||||
'data_management/volume',
|
||||
'data_management/bind-mounts',
|
||||
],
|
||||
}, {
|
||||
title: "使用网络",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'network/',
|
||||
'network/port_mapping',
|
||||
'network/linking',
|
||||
'network/dns',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "高级网络配置",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'advanced_network/',
|
||||
'advanced_network/quick_guide',
|
||||
'advanced_network/access_control',
|
||||
'advanced_network/port_mapping',
|
||||
'advanced_network/bridge',
|
||||
'advanced_network/example',
|
||||
'advanced_network/config_file',
|
||||
'advanced_network/ptp',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Swarm mode",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'swarm_mode/',
|
||||
'swarm_mode/overview',
|
||||
'swarm_mode/create',
|
||||
'swarm_mode/deploy',
|
||||
'swarm_mode/stack',
|
||||
'swarm_mode/secret',
|
||||
'swarm_mode/config',
|
||||
'swarm_mode/rolling_update',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "安全",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'security/',
|
||||
'security/kernel_ns',
|
||||
'security/control_group',
|
||||
'security/daemon_sec',
|
||||
'security/kernel_capability',
|
||||
'security/other_feature',
|
||||
'security/summary',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "底层实现",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'underly/',
|
||||
'underly/arch',
|
||||
'underly/namespace',
|
||||
'underly/cgroups',
|
||||
'underly/ufs',
|
||||
'underly/container_format',
|
||||
'underly/network',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Docker Buildx",
|
||||
collapsable: false,
|
||||
children: [
|
||||
"buildx/",
|
||||
"buildx/buildkit",
|
||||
"buildx/buildx",
|
||||
"buildx/multi-arch-images",
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Etcd",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'etcd/',
|
||||
'etcd/intro',
|
||||
'etcd/install',
|
||||
'etcd/cluster',
|
||||
'etcd/etcdctl',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Fedora CoreOS",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'coreos/',
|
||||
'coreos/intro',
|
||||
'coreos/install',
|
||||
],
|
||||
},
|
||||
'podman/',
|
||||
'appendix/faq/',
|
||||
{
|
||||
title: "热门镜像介绍",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'appendix/repo/',
|
||||
'appendix/repo/ubuntu',
|
||||
'appendix/repo/centos',
|
||||
'appendix/repo/nginx',
|
||||
'appendix/repo/php',
|
||||
'appendix/repo/nodejs',
|
||||
'appendix/repo/mysql',
|
||||
'appendix/repo/wordpress',
|
||||
'appendix/repo/mongodb',
|
||||
'appendix/repo/redis',
|
||||
'appendix/repo/minio',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Docker 命令",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'appendix/command/',
|
||||
'appendix/command/docker',
|
||||
'appendix/command/dockerd',
|
||||
]
|
||||
},
|
||||
'appendix/best_practices',
|
||||
'appendix/debug',
|
||||
'appendix/resources',
|
||||
],
|
||||
},
|
||||
}
|
||||
});
|
129
CHANGELOG.md
Normal file
@ -0,0 +1,129 @@
|
||||
# 修订记录
|
||||
|
||||
* 1.3.0 2021-YY-DD
|
||||
* 全面支持 Docker v20.10 新版本
|
||||
* 新增 Docker Compose v2
|
||||
* Docker Hub 自动构建转为付费功能
|
||||
|
||||
* 1.2.0 2020-12-20
|
||||
* 错误修复
|
||||
|
||||
* 1.1.0 2019-12-31
|
||||
* 全面支持 Docker v19.03 新版本
|
||||
* 增加 `BuildKit`
|
||||
* 增加 `docker buildx` 命令使用说明
|
||||
* 增加 `docker manifest` 命令使用说明
|
||||
* 移除 `Ubuntu 14.04` `Debian 8` `Debian 7`
|
||||
|
||||
* 1.0.0: 2018-12-31
|
||||
* 全面支持 Docker v18.x 新版本
|
||||
* 添加如何调试 Docker
|
||||
* 错误修正
|
||||
|
||||
* 0.9.0: 2017-12-31
|
||||
* 对 v1.13.x 旧版本的最后支持
|
||||
|
||||
* 0.9.0-rc2: 2017-12-10
|
||||
|
||||
* 增加 Docker 中文资源链接
|
||||
* 增加介绍基于 Docker 的 CI/CD 工具 `Drone`
|
||||
* 增加 `docker secret` 相关内容
|
||||
* 增加 `docker config` 相关内容
|
||||
* 增加 `LinuxKit` 相关内容
|
||||
|
||||
* 更新 `CoreOS` 章节
|
||||
* 更新 `etcd` 章节,基于 3.x 版本
|
||||
|
||||
* 删除 `Docker Compose` 中的 `links`指令
|
||||
|
||||
* 替换 `docker daemon` 命令为 `dockerd`
|
||||
* 替换 `docker ps` 命令为 `docker container ls`
|
||||
* 替换 `docker images` 命令为 `docker image ls`
|
||||
|
||||
* 修改 `安装 Docker` 一节中部分文字表述
|
||||
|
||||
* 移除历史遗留文件和错误的文件
|
||||
* 优化文字排版
|
||||
* 调整目录结构
|
||||
* 修复内容逻辑错误
|
||||
* 修复`404` 链接
|
||||
|
||||
* 0.9.0-rc1: 2017-11-29
|
||||
|
||||
* 根据最新版本(v17.09)修订内容
|
||||
|
||||
* 增加 `Dockerfile` 多阶段构建( `multistage builds` ) `Docker 17.05` 新增特性
|
||||
* 增加 `docker exec` 子命令介绍
|
||||
* 增加 `docker` 管理子命令 `container` `image` `network` `volume` 介绍
|
||||
* 增加 `树莓派单片电脑` 安装 Docker
|
||||
* 增加 Docker 存储驱动 `OverlayFS` 相关内容
|
||||
|
||||
* 更新 `Docker CE` `v17.x` 安装说明
|
||||
* 更新 `Docker 网络` 一节
|
||||
* 更新 `Docker Machine` 基于 0.13.0 版本
|
||||
* 更新 `Docker Compose` 基于 3 文件格式
|
||||
|
||||
* 删除 `Docker Swarm` 相关内容,替换为 `Swarm mode` `Docker 1.12.0` 新增特性
|
||||
* 删除 `docker run` `--link` 参数
|
||||
|
||||
* 精简 `Docker Registry` 一节
|
||||
|
||||
* 替换 `docker run` `-v` 参数为 `--mount`
|
||||
|
||||
* 修复 `404` 链接
|
||||
* 优化文字排版
|
||||
* 增加离线阅读功能
|
||||
|
||||
* 0.8.0: 2017-01-08
|
||||
|
||||
* 修正文字内容
|
||||
* 根据最新版本(1.12)修订安装使用
|
||||
* 补充附录章节
|
||||
|
||||
* 0.7.0: 2016-06-12
|
||||
|
||||
* 根据最新版本进行命令调整
|
||||
* 修正若干文字描述
|
||||
|
||||
* 0.6.0: 2015-12-24
|
||||
|
||||
* 补充 Machine 项目
|
||||
* 修正若干 bug
|
||||
|
||||
* 0.5.0: 2015-06-29
|
||||
|
||||
* 添加 Compose 项目
|
||||
* 添加 Machine 项目
|
||||
* 添加 Swarm 项目
|
||||
* 完善 Kubernetes 项目内容
|
||||
* 添加 Mesos 项目内容
|
||||
|
||||
* 0.4.0: 2015-05-08
|
||||
|
||||
* 添加 Etcd 项目
|
||||
* 添加 Fig 项目
|
||||
* 添加 CoreOS 项目
|
||||
* 添加 Kubernetes 项目
|
||||
|
||||
* 0.3.0: 2014-11-25
|
||||
|
||||
* 完成仓库章节
|
||||
* 重写安全章节
|
||||
* 修正底层实现章节的架构、命名空间、控制组、文件系统、容器格式等内容
|
||||
* 添加对常见仓库和镜像的介绍
|
||||
* 添加 Dockerfile 的介绍
|
||||
* 重新校订中英文混排格式
|
||||
* 修订文字表达
|
||||
* 发布繁体版本分支:zh-Hant
|
||||
|
||||
* 0.2.0: 2014-09-18
|
||||
|
||||
* 对照官方文档重写介绍、基本概念、安装、镜像、容器、仓库、数据管理、网络等章节
|
||||
* 添加底层实现章节
|
||||
* 添加命令查询和资源链接章节
|
||||
* 其它修正
|
||||
|
||||
* 0.1.0: 2014-09-05
|
||||
|
||||
* 添加基本内容
|
||||
* 修正错别字和表达不通顺的地方
|
41
CONTRIBUTING.md
Normal file
@ -0,0 +1,41 @@
|
||||
# 如何贡献
|
||||
|
||||
领取或创建新的 [Issue](https://github.com/yeasy/docker_practice/issues),如 [issue 235](https://github.com/yeasy/docker_practice/issues/235),添加自己为 `Assignee`。
|
||||
|
||||
在 [GitHub](https://github.com/yeasy/docker_practice/fork) 上 `fork` 到自己的仓库,如 `docker_user/docker_practice`,然后 `clone` 到本地,并设置用户信息。
|
||||
|
||||
```bash
|
||||
$ git clone git@github.com:docker_user/docker_practice.git
|
||||
|
||||
$ cd docker_practice
|
||||
```
|
||||
|
||||
修改代码后提交,并推送到自己的仓库,注意修改提交消息为对应 Issue 号和描述。
|
||||
|
||||
```bash
|
||||
# Update the content
|
||||
|
||||
$ git commit -a -s
|
||||
|
||||
# In commit msg dialog, add content like "Fix issue #235: describe ur change"
|
||||
|
||||
$ git push
|
||||
```
|
||||
|
||||
在 [GitHub](https://github.com/yeasy/docker_practice/pulls) 上提交 `Pull Request`,添加标签,并邀请维护者进行 `Review`。
|
||||
|
||||
定期使用项目仓库内容更新自己仓库内容。
|
||||
|
||||
```bash
|
||||
$ git remote add upstream https://github.com/yeasy/docker_practice
|
||||
|
||||
$ git fetch upstream
|
||||
|
||||
$ git rebase upstream/master
|
||||
|
||||
$ git push -f origin master
|
||||
```
|
||||
|
||||
## 排版规范
|
||||
|
||||
本开源书籍遵循 [中文排版指南](https://github.com/mzlogin/chinese-copywriting-guidelines) 规范。
|
148
README.md
@ -1,19 +1,44 @@
|
||||
# Docker — 从入门到实践
|
||||
|
||||
0.8.0
|
||||
[](https://github.com/yeasy/docker_practice) [](https://github.com/yeasy/docker_practice/releases) [](https://github.com/docker/docker-ce) [][1]
|
||||
|
||||
[Docker](http://www.docker.com) 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的运行效率,降低了云计算资源供应的成本! 使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松!
|
||||
**v1.3.0**
|
||||
|
||||
无论是应用开发者、运维人员、还是其他信息技术从业人员,都有必要认识和掌握 Docker,以在有限的时间内做更多有意义的事。
|
||||
| 语言 | - |
|
||||
| :------------- | :--- |
|
||||
| [简体中文](https://github.com/yeasy/docker_practice) | [阅读](https://vuepress.mirror.docker-practice.com/) |
|
||||
|
||||
本书既适用于具备基础 Linux 知识的 Docker 初学者,也希望可供理解原理和实现的高级用户参考。同时,书中给出的实践案例,可供在进行实际部署时借鉴。前六章为基础内容,供用户理解 Docker 的基本概念和操作;7 ~ 9 章介绍一些高级操作;第 10 章给出典型的应用场景和实践案例;11、12 章介绍关于 Docker 安全和实现技术等高级话题。后续章节则分别介绍一些相关的热门开源项目。
|
||||
[Docker](https://www.docker.com) 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松!
|
||||
|
||||
在线阅读:[GitBook](https://www.gitbook.io/book/yeasy/docker_practice) 或 [Github](https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md)。
|
||||
无论是应用开发者、运维人员、还是其他信息技术从业人员,都有必要认识和掌握 Docker,节约有限的生命。
|
||||
|
||||
* pdf 版本 [下载](https://www.gitbook.com/download/pdf/book/yeasy/docker_practice)
|
||||
* epub 版本 [下载](https://www.gitbook.com/download/epub/book/yeasy/docker_practice)
|
||||
本书既适用于具备基础 Linux 知识的 Docker 初学者,也希望可供理解原理和实现的高级用户参考。同时,书中给出的实践案例,可供在进行实际部署时借鉴。前六章为基础内容,供用户理解 Docker 的基本概念和操作;7 ~ 9 章介绍包括数据管理、网络等高级操作;第 10 ~ 12 章介绍了容器生态中的几个核心项目;13、14 章讨论了关于 Docker 安全和实现技术等高级话题。后续章节则分别介绍包括 Etcd、Fedora CoreOS、Kubernetes、容器云等相关热门开源项目。最后,还展示了使用容器技术的典型的应用场景和实践案例。
|
||||
|
||||
欢迎关注 DockerPool 社区微博 [@dockerpool](http://weibo.com/u/5345404432),或加入 Docker 技术交流 QQ 群或微信组,分享 Docker 资源,交流 Docker 技术。
|
||||
* 在线阅读:[docker-practice.com](https://vuepress.mirror.docker-practice.com/),[GitBook](https://yeasy.gitbook.io/docker_practice/),[Github](https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md)
|
||||
* 离线阅读:[`$ docker run -it --rm -p 4000:80 ccr.ccs.tencentyun.com/dockerpracticesig/docker_practice:vuepress`](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)
|
||||
|
||||
Docker 自身仍在快速发展中,生态环境也在蓬勃成长。建议初学者使用最新稳定版本的 Docker 进行学习实践。欢迎 [参与项目维护](CONTRIBUTING.md)。
|
||||
|
||||
* [修订记录](CHANGELOG.md)
|
||||
* [贡献者名单](https://github.com/yeasy/docker_practice/graphs/contributors)
|
||||
|
||||
## 微信小程序
|
||||
|
||||
<p align="center">
|
||||
<img width="200" src="https://docker_practice.gitee.io/pic/dp-wechat-miniprogram.jpg">
|
||||
</p>
|
||||
|
||||
<p align="center"><strong>微信扫码 随时随地阅读~</strong></p>
|
||||
|
||||
## 技术交流
|
||||
|
||||
<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>
|
||||
|
||||
欢迎加入 Docker 技术交流 QQ 群,分享 Docker 资源,交流 Docker 技术。
|
||||
|
||||
* QQ 群 I (已满):341410255
|
||||
* QQ 群 II (已满):419042067
|
||||
@ -24,106 +49,25 @@
|
||||
* QQ 群 VII (已满):252403484
|
||||
* QQ 群 VIII(已满):544818750
|
||||
* QQ 群 IX (已满):571502246
|
||||
* QQ 群 X (可加):366203473
|
||||
* QQ 群 X (可加):145983035
|
||||
|
||||

|
||||
>如果有容器技术相关的疑问,请通过 [Issues](https://github.com/yeasy/docker_practice/issues/new/choose) 来提出。
|
||||
|
||||
《[Docker 技术入门与实战](http://item.jd.com/11598400.html)》一书已经正式出版,包含大量第一手实战案例和更为深入的技术剖析,欢迎大家阅读使用并反馈建议。
|
||||
## 进阶学习
|
||||
|
||||
* [China-Pub](http://product.china-pub.com/3770833)
|
||||
* [京东图书](http://item.jd.com/11598400.html)
|
||||
* [当当图书](http://product.dangdang.com/23620853.html)
|
||||
* [亚马逊图书](http://www.amazon.cn/%E5%9B%BE%E4%B9%A6/dp/B00R5MYI7C/ref=lh_ni_t?ie=UTF8&psc=1&smid=A1AJ19PSB66TGU)
|
||||
[][1]
|
||||
|
||||
## 主要版本历史
|
||||
《[Docker 技术入门与实战][1]》第三版已经面世,介绍最新的容器技术栈,欢迎大家阅读使用并反馈建议。
|
||||
|
||||
* 0.8.0: 2017-01-08
|
||||
* [京东图书][1]
|
||||
* [China-Pub](http://product.china-pub.com/8052127)
|
||||
|
||||
* 修正文字内容
|
||||
* 根据最新版本修订安装使用
|
||||
* 补充附录章节
|
||||
|
||||
* 0.7.0: 2016-06-12
|
||||
|
||||
* 根据最新版本进行命令调整
|
||||
* 修正若干文字描述
|
||||
|
||||
* 0.6.0: 2015-12-24
|
||||
|
||||
* 补充 Machine 项目
|
||||
* 修正若干 bug
|
||||
|
||||
* 0.5.0: 2015-06-29
|
||||
|
||||
* 添加 Compose 项目
|
||||
* 添加 Machine 项目
|
||||
* 添加 Swarm 项目
|
||||
* 完善 Kubernetes 项目内容
|
||||
* 添加 Mesos 项目内容
|
||||
|
||||
* 0.4.0: 2015-05-08
|
||||
|
||||
* 添加 Etcd 项目
|
||||
* 添加 Fig 项目
|
||||
* 添加 CoreOS 项目
|
||||
* 添加 Kubernetes 项目
|
||||
|
||||
* 0.3.0: 2014-11-25
|
||||
|
||||
* 完成仓库章节;
|
||||
* 重写安全章节;
|
||||
* 修正底层实现章节的架构、命名空间、控制组、文件系统、容器格式等内容;
|
||||
* 添加对常见仓库和镜像的介绍;
|
||||
* 添加 Dockerfile 的介绍;
|
||||
* 重新校订中英文混排格式。
|
||||
* 修订文字表达。
|
||||
* 发布繁体版本分支:zh-Hant。
|
||||
|
||||
* 0.2.0: 2014-09-18
|
||||
|
||||
* 对照官方文档重写介绍、基本概念、安装、镜像、容器、仓库、数据管理、网络等章节;
|
||||
* 添加底层实现章节;
|
||||
* 添加命令查询和资源链接章节;
|
||||
* 其它修正。
|
||||
|
||||
* 0.1.0: 2014-09-05
|
||||
|
||||
* 添加基本内容;
|
||||
* 修正错别字和表达不通顺的地方。
|
||||
|
||||
Docker 自身仍在快速发展中,生态环境也在蓬勃成长。源码开源托管在 Github 上,欢迎参与维护:[https://github.com/yeasy/docker_practice](https://github.com/yeasy/docker_practice)。贡献者 [名单](https://github.com/yeasy/docker_practice/graphs/contributors)。
|
||||
|
||||
## 参加步骤
|
||||
|
||||
* 在 GitHub 上 `fork` 到自己的仓库,如 `docker_user/docker_practice`,然后 `clone` 到本地,并设置用户信息。
|
||||
|
||||
```sh
|
||||
$ git clone git@github.com:docker_user/docker_practice.git
|
||||
$ cd docker_practice
|
||||
$ git config user.name "yourname"
|
||||
$ git config user.email "your email"
|
||||
```
|
||||
|
||||
* 修改代码后提交,并推送到自己的仓库。
|
||||
|
||||
```sh
|
||||
$ #do some change on the content
|
||||
$ git commit -am "Fix issue #1: change helo to hello"
|
||||
$ git push
|
||||
```
|
||||
|
||||
* 在 GitHub 网站上提交 pull request。
|
||||
|
||||
* 定期使用项目仓库内容更新自己仓库内容。
|
||||
```sh
|
||||
$ git remote add upstream https://github.com/yeasy/docker_practice
|
||||
$ git fetch upstream
|
||||
$ git checkout master
|
||||
$ git rebase upstream/master
|
||||
$ git push -f origin master
|
||||
```
|
||||
## 鼓励项目
|
||||
|
||||
欢迎鼓励项目一杯 coffee~
|
||||
<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>
|
||||
|
||||
[1]: https://union-click.jd.com/jdc?e=&p=JF8AANADIgZlGF0VAxUDVBJdHDISBFAfWRcCGzcRRANLXSJeEF4aVwkMGQ1eD0kdSVJKSQVJHBIEUB9ZFwIbGAxeB0gyS34PbFlHVHNkI0MQEAoIcSxyBWFLRAtZK1olABYHXR9eHAoQN2UbXCVQfN_jrYOwsw7T_5SOnZUiBmUbXBYBFwBVG14UBBAAZRxbHDJJUjscCEEHEQ4FSA4VBhBQZStrFjIiN1UrWCVAfARQT1gQA0cFAEwOEAcRDlMTDEALQAFTEwwRUhMAUR1cJQATBlES
|
||||
|
287
SUMMARY.md
@ -1,137 +1,172 @@
|
||||
# Summary
|
||||
# [Docker — 从入门到实践](https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md)
|
||||
|
||||
* [前言](README.md)
|
||||
* [修订记录](CHANGELOG.md)
|
||||
* [如何贡献](CONTRIBUTING.md)
|
||||
* [Docker 简介](introduction/README.md)
|
||||
* [什么是 Docker](introduction/what.md)
|
||||
* [为什么要用 Docker](introduction/why.md)
|
||||
* [什么是 Docker](introduction/what.md)
|
||||
* [为什么要用 Docker](introduction/why.md)
|
||||
* [基本概念](basic_concept/README.md)
|
||||
* [镜像](basic_concept/image.md)
|
||||
* [容器](basic_concept/container.md)
|
||||
* [仓库](basic_concept/repository.md)
|
||||
* [安装](install/README.md)
|
||||
* [Ubuntu、Debian](install/ubuntu.md)
|
||||
* [CentOS](install/centos.md)
|
||||
* [macOS](install/mac.md)
|
||||
* [镜像加速器](install/mirror.md)
|
||||
* [镜像](image/README.md)
|
||||
* [获取镜像](image/pull.md)
|
||||
* [列出镜像](image/list.md)
|
||||
* [利用 commit 理解镜像构成](image/commit.md)
|
||||
* [使用 Dockerfile 定制镜像](image/build.md)
|
||||
* [Dockerfile 指令详解](image/dockerfile/README.md)
|
||||
* [COPY 复制文件](image/dockerfile/copy.md)
|
||||
* [ADD 更高级的复制文件](image/dockerfile/add.md)
|
||||
* [CMD 容器启动命令](image/dockerfile/cmd.md)
|
||||
* [ENTRYPOINT 入口点](image/dockerfile/entrypoint.md)
|
||||
* [ENV 设置环境变量](image/dockerfile/env.md)
|
||||
* [ARG 构建参数](image/dockerfile/arg.md)
|
||||
* [VOLUME 定义匿名卷](image/dockerfile/volume.md)
|
||||
* [EXPOSE 暴露端口](image/dockerfile/expose.md)
|
||||
* [WORKDIR 指定工作目录](image/dockerfile/workdir.md)
|
||||
* [USER 指定当前用户](image/dockerfile/user.md)
|
||||
* [HEALTHCHECK 健康检查](image/dockerfile/healthcheck.md)
|
||||
* [ONBUILD 为他人作嫁衣裳](image/dockerfile/onbuild.md)
|
||||
* [参考文档](image/dockerfile/references.md)
|
||||
* [其它制作镜像的方式](image/other.md)
|
||||
* [删除本地镜像](image/rmi.md)
|
||||
* [实现原理](image/internal.md)
|
||||
* [容器](container/README.md)
|
||||
* [启动](container/run.md)
|
||||
* [守护态运行](container/daemon.md)
|
||||
* [终止](container/stop.md)
|
||||
* [进入容器](container/enter.md)
|
||||
* [导出和导入](container/import_export.md)
|
||||
* [删除](container/rm.md)
|
||||
* [仓库](repository/README.md)
|
||||
* [Docker Hub](repository/dockerhub.md)
|
||||
* [私有仓库](repository/local_repo.md)
|
||||
* [配置文件](repository/config.md)
|
||||
* [镜像](basic_concept/image.md)
|
||||
* [容器](basic_concept/container.md)
|
||||
* [仓库](basic_concept/repository.md)
|
||||
* [安装 Docker](install/README.md)
|
||||
* [Ubuntu](install/ubuntu.md)
|
||||
* [Debian](install/debian.md)
|
||||
* [Fedora](install/fedora.md)
|
||||
* [CentOS](install/centos.md)
|
||||
* [Raspberry Pi](install/raspberry-pi.md)
|
||||
* [Linux 离线安装](install/offline.md)
|
||||
* [macOS](install/mac.md)
|
||||
* [Windows 10](install/windows.md)
|
||||
* [镜像加速器](install/mirror.md)
|
||||
* [开启实验特性](install/experimental.md)
|
||||
* [使用镜像](image/README.md)
|
||||
* [获取镜像](image/pull.md)
|
||||
* [列出镜像](image/list.md)
|
||||
* [删除本地镜像](image/rm.md)
|
||||
* [利用 commit 理解镜像构成](image/commit.md)
|
||||
* [使用 Dockerfile 定制镜像](image/build.md)
|
||||
* [Dockerfile 指令详解](image/dockerfile/README.md)
|
||||
* [COPY 复制文件](image/dockerfile/copy.md)
|
||||
* [ADD 更高级的复制文件](image/dockerfile/add.md)
|
||||
* [CMD 容器启动命令](image/dockerfile/cmd.md)
|
||||
* [ENTRYPOINT 入口点](image/dockerfile/entrypoint.md)
|
||||
* [ENV 设置环境变量](image/dockerfile/env.md)
|
||||
* [ARG 构建参数](image/dockerfile/arg.md)
|
||||
* [VOLUME 定义匿名卷](image/dockerfile/volume.md)
|
||||
* [EXPOSE 暴露端口](image/dockerfile/expose.md)
|
||||
* [WORKDIR 指定工作目录](image/dockerfile/workdir.md)
|
||||
* [USER 指定当前用户](image/dockerfile/user.md)
|
||||
* [HEALTHCHECK 健康检查](image/dockerfile/healthcheck.md)
|
||||
* [ONBUILD 为他人作嫁衣裳](image/dockerfile/onbuild.md)
|
||||
* [LABEL 为镜像添加元数据](image/dockerfile/label.md)
|
||||
* [SHELL 指令](image/dockerfile/shell.md)
|
||||
* [参考文档](image/dockerfile/references.md)
|
||||
* [Dockerfile 多阶段构建](image/multistage-builds/README.md)
|
||||
* [实战多阶段构建 Laravel 镜像](image/multistage-builds/laravel.md)
|
||||
* [构建多种系统架构支持的 Docker 镜像](image/manifest.md)
|
||||
* [其它制作镜像的方式](image/other.md)
|
||||
* [实现原理](image/internal.md)
|
||||
* [操作容器](container/README.md)
|
||||
* [启动](container/run.md)
|
||||
* [守护态运行](container/daemon.md)
|
||||
* [终止](container/stop.md)
|
||||
* [进入容器](container/attach_exec.md)
|
||||
* [导出和导入](container/import_export.md)
|
||||
* [删除](container/rm.md)
|
||||
* [访问仓库](repository/README.md)
|
||||
* [Docker Hub](repository/dockerhub.md)
|
||||
* [私有仓库](repository/registry.md)
|
||||
* [私有仓库高级配置](repository/registry_auth.md)
|
||||
* [Nexus 3](repository/nexus3_registry.md)
|
||||
* [数据管理](data_management/README.md)
|
||||
* [数据卷](data_management/volume.md)
|
||||
* [数据卷容器](data_management/container.md)
|
||||
* [备份、恢复、迁移数据卷](data_management/management.md)
|
||||
* [数据卷](data_management/volume.md)
|
||||
* [挂载主机目录](data_management/bind-mounts.md)
|
||||
* [使用网络](network/README.md)
|
||||
* [外部访问容器](network/port_mapping.md)
|
||||
* [容器互联](network/linking.md)
|
||||
* [外部访问容器](network/port_mapping.md)
|
||||
* [容器互联](network/linking.md)
|
||||
* [配置 DNS](network/dns.md)
|
||||
* [高级网络配置](advanced_network/README.md)
|
||||
* [快速配置指南](advanced_network/quick_guide.md)
|
||||
* [配置 DNS](advanced_network/dns.md)
|
||||
* [容器访问控制](advanced_network/access_control.md)
|
||||
* [端口映射实现](advanced_network/port_mapping.md)
|
||||
* [配置 docker0 网桥](advanced_network/docker0.md)
|
||||
* [自定义网桥](advanced_network/bridge.md)
|
||||
* [工具和示例](advanced_network/example.md)
|
||||
* [编辑网络配置文件](advanced_network/config_file.md)
|
||||
* [实例:创建一个点到点连接](advanced_network/ptp.md)
|
||||
* [实战案例](cases/README.md)
|
||||
* [使用 Supervisor 来管理进程](cases/supervisor.md)
|
||||
* [创建 tomcat\/weblogic 集群](cases/tomcat.md)
|
||||
* [多台物理主机之间的容器互联](cases/container_connect.md)
|
||||
* [标准化开发测试和生产环境](cases/environment.md)
|
||||
* [快速配置指南](advanced_network/quick_guide.md)
|
||||
* [容器访问控制](advanced_network/access_control.md)
|
||||
* [端口映射实现](advanced_network/port_mapping.md)
|
||||
* [配置 docker0 网桥](advanced_network/docker0.md)
|
||||
* [自定义网桥](advanced_network/bridge.md)
|
||||
* [工具和示例](advanced_network/example.md)
|
||||
* [编辑网络配置文件](advanced_network/config_file.md)
|
||||
* [配置 HTTP/HTTPS 网络代理](advanced_network/http_https_proxy.md)
|
||||
* [实例:创建一个点到点连接](advanced_network/ptp.md)
|
||||
* [Docker Buildx](buildx/README.md)
|
||||
* [BuildKit](buildx/buildkit.md)
|
||||
* [使用 buildx 构建镜像](buildx/buildx.md)
|
||||
* [使用 buildx 构建多种系统架构支持的 Docker 镜像](buildx/multi-arch-images.md)
|
||||
* [Docker Compose](compose/README.md)
|
||||
* [简介](compose/introduction.md)
|
||||
* [Compose v2](compose/v2.md)
|
||||
* [安装与卸载](compose/install.md)
|
||||
* [使用](compose/usage.md)
|
||||
* [命令说明](compose/commands.md)
|
||||
* [Compose 模板文件](compose/compose_file.md)
|
||||
* [实战 Django](compose/django.md)
|
||||
* [实战 Rails](compose/rails.md)
|
||||
* [实战 WordPress](compose/wordpress.md)
|
||||
* [实战 LNMP](compose/lnmp.md)
|
||||
* [Swarm mode](swarm_mode/README.md)
|
||||
* [基本概念](swarm_mode/overview.md)
|
||||
* [创建 Swarm 集群](swarm_mode/create.md)
|
||||
* [部署服务](swarm_mode/deploy.md)
|
||||
* [使用 compose 文件](swarm_mode/stack.md)
|
||||
* [管理密钥](swarm_mode/secret.md)
|
||||
* [管理配置信息](swarm_mode/config.md)
|
||||
* [滚动升级](swarm_mode/rolling_update.md)
|
||||
* [安全](security/README.md)
|
||||
* [内核命名空间](security/kernel_ns.md)
|
||||
* [控制组](security/control_group.md)
|
||||
* [服务端防护](security/daemon_sec.md)
|
||||
* [内核能力机制](security/kernel_capability.md)
|
||||
* [其它安全特性](security/other_feature.md)
|
||||
* [总结](security/summary.md)
|
||||
* [内核命名空间](security/kernel_ns.md)
|
||||
* [控制组](security/control_group.md)
|
||||
* [服务端防护](security/daemon_sec.md)
|
||||
* [内核能力机制](security/kernel_capability.md)
|
||||
* [其它安全特性](security/other_feature.md)
|
||||
* [总结](security/summary.md)
|
||||
* [底层实现](underly/README.md)
|
||||
* [基本架构](underly/arch.md)
|
||||
* [命名空间](underly/namespace.md)
|
||||
* [控制组](underly/cgroups.md)
|
||||
* [联合文件系统](underly/ufs.md)
|
||||
* [容器格式](underly/container_format.md)
|
||||
* [网络](underly/network.md)
|
||||
* [Docker Compose 项目](compose/README.md)
|
||||
* [简介](compose/intro.md)
|
||||
* [安装与卸载](compose/install.md)
|
||||
* [使用](compose/usage.md)
|
||||
* [命令说明](compose/commands.md)
|
||||
* [YAML 模板文件](compose/yaml_file.md)
|
||||
* [实战 Django](compose/django.md)
|
||||
* [实战 Rails](compose/rails.md)
|
||||
* [实战 wordpress](compose/wordpress.md)
|
||||
* [Docker Machine 项目](machine/README.md)
|
||||
* [简介](machine/intro.md)
|
||||
* [安装](machine/install.md)
|
||||
* [使用](machine/usage.md)
|
||||
* [Docker Swarm 项目](swarm/README.md)
|
||||
* [简介](swarm/intro.md)
|
||||
* [安装](swarm/install.md)
|
||||
* [使用](swarm/usage.md)
|
||||
* [调度器](swarm/scheduling.md)
|
||||
* [过滤器](swarm/filter.md)
|
||||
* [基本架构](underly/arch.md)
|
||||
* [命名空间](underly/namespace.md)
|
||||
* [控制组](underly/cgroups.md)
|
||||
* [联合文件系统](underly/ufs.md)
|
||||
* [容器格式](underly/container_format.md)
|
||||
* [网络](underly/network.md)
|
||||
* [Etcd 项目](etcd/README.md)
|
||||
* [简介](etcd/intro.md)
|
||||
* [安装](etcd/install.md)
|
||||
* [使用 etcdctl](etcd/etcdctl.md)
|
||||
* [CoreOS 项目](coreos/README.md)
|
||||
* [简介](coreos/intro.md)
|
||||
* [工具](coreos/intro_tools.md)
|
||||
* [快速搭建CoreOS集群](coreos/quickstart.md)
|
||||
* [Kubernetes 项目](kubernetes/README.md)
|
||||
* [简介](kubernetes/intro.md)
|
||||
* [快速上手](kubernetes/quickstart.md)
|
||||
* [基本概念](kubernetes/concepts.md)
|
||||
* [kubectl 使用](kubernetes/kubectl.md)
|
||||
* [架构设计](kubernetes/design.md)
|
||||
* [Mesos 项目](mesos/README.md)
|
||||
* [简介](mesos/intro.md)
|
||||
* [安装与使用](mesos/installation.md)
|
||||
* [原理与架构](mesos/architecture.md)
|
||||
* [配置项解析](mesos/configuration.md)
|
||||
* [常见框架](mesos/framework.md)
|
||||
* [简介](etcd/intro.md)
|
||||
* [安装](etcd/install.md)
|
||||
* [集群](etcd/cluster.md)
|
||||
* [使用 etcdctl](etcd/etcdctl.md)
|
||||
* [Fedora CoreOS](coreos/README.md)
|
||||
* [简介](coreos/intro.md)
|
||||
* [安装](coreos/install.md)
|
||||
* [Kubernetes - 开源容器编排引擎](kubernetes/README.md)
|
||||
* [简介](kubernetes/intro.md)
|
||||
* [基本概念](kubernetes/concepts.md)
|
||||
* [架构设计](kubernetes/design.md)
|
||||
* [部署 Kubernetes](kubernetes/setup/README.md)
|
||||
* [使用 kubeadm 部署 kubernetes(CRI 使用 containerd)](kubernetes/setup/kubeadm.md)
|
||||
* [在 Docker Desktop 使用](kubernetes/setup/docker-desktop.md)
|
||||
* [一步步部署 kubernetes 集群](kubernetes/setup/systemd.md)
|
||||
* [部署 Dashboard](kubernetes/setup/dashboard.md)
|
||||
* [Kubernetes 命令行 kubectl](kubernetes/kubectl/README.md)
|
||||
* [容器与云计算](cloud/README.md)
|
||||
* [简介](cloud/intro.md)
|
||||
* [腾讯云](cloud/tencentCloud.md)
|
||||
* [阿里云](cloud/alicloud.md)
|
||||
* [亚马逊云](cloud/aws.md)
|
||||
* [小结](cloud/summary.md)
|
||||
* [实战案例 - 操作系统](cases/os/README.md)
|
||||
* [Busybox](cases/os/busybox.md)
|
||||
* [Alpine](cases/os/alpine.md)
|
||||
* [Debian Ubuntu](cases/os/debian.md)
|
||||
* [CentOS Fedora](cases/os/centos.md)
|
||||
* [本章小结](cases/os/summary.md)
|
||||
* [实战案例 - CI/CD](cases/ci/README.md)
|
||||
* [GitHub Actions](cases/ci/actions/README.md)
|
||||
* [Drone](cases/ci/drone/README.md)
|
||||
* [部署 Drone](cases/ci/drone/install.md)
|
||||
* [在 IDE 中使用 Docker](ide/README.md)
|
||||
* [VS Code](ide/vsCode.md)
|
||||
* [podman - 下一代 Linux 容器工具](podman/README.md)
|
||||
* [附录](appendix/README.md)
|
||||
* [附录一:常见问题总结](appendix/faq/README.md)
|
||||
* [附录二:热门镜像介绍](appendix/repo/README.md)
|
||||
* [Ubuntu](appendix/repo/ubuntu.md)
|
||||
* [CentOS](appendix/repo/centos.md)
|
||||
* [MySQL](appendix/repo/mysql.md)
|
||||
* [MongoDB](appendix/repo/mongodb.md)
|
||||
* [Redis](appendix/repo/redis.md)
|
||||
* [Nginx](appendix/repo/nginx.md)
|
||||
* [WordPress](appendix/repo/wordpress.md)
|
||||
* [Node.js](appendix/repo/nodejs.md)
|
||||
* [附录三:Docker 命令查询](appendix/command/README.md)
|
||||
* [附录四:资源链接](appendix/resources/README.md)
|
||||
|
||||
* [附录一:常见问题总结](appendix/faq/README.md)
|
||||
* [附录二:热门镜像介绍](appendix/repo/README.md)
|
||||
* [Ubuntu](appendix/repo/ubuntu.md)
|
||||
* [CentOS](appendix/repo/centos.md)
|
||||
* [Nginx](appendix/repo/nginx.md)
|
||||
* [PHP](appendix/repo/php.md)
|
||||
* [Node.js](appendix/repo/nodejs.md)
|
||||
* [MySQL](appendix/repo/mysql.md)
|
||||
* [WordPress](appendix/repo/wordpress.md)
|
||||
* [MongoDB](appendix/repo/mongodb.md)
|
||||
* [Redis](appendix/repo/redis.md)
|
||||
* [Minio](appendix/repo/minio.md)
|
||||
* [附录三:Docker 命令查询](appendix/command/README.md)
|
||||
* [客户端命令 - docker](appendix/command/docker.md)
|
||||
* [服务端命令 - dockerd](appendix/command/dockerd.md)
|
||||
* [附录四:Dockerfile 最佳实践](appendix/best_practices.md)
|
||||
* [附录五:如何调试 Docker](appendix/debug.md)
|
||||
* [附录六:资源链接](appendix/resources.md)
|
||||
|
2
_config.yml
Normal file
@ -0,0 +1,2 @@
|
||||
theme: jekyll-theme-slate
|
||||
include: [_images]
|
Before Width: | Height: | Size: 43 KiB |
Before Width: | Height: | Size: 29 KiB |
BIN
_images/cover.jpg
Normal file
After Width: | Height: | Size: 214 KiB |
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 116 KiB |
BIN
_images/docker_primer2.png
Normal file
After Width: | Height: | Size: 1.4 MiB |
BIN
_images/docker_primer3.png
Normal file
After Width: | Height: | Size: 52 KiB |
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 55 KiB |
Before Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 137 KiB |
Before Width: | Height: | Size: 146 KiB |
Before Width: | Height: | Size: 59 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 45 KiB |
Before Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 103 KiB |
@ -1,12 +0,0 @@
|
||||
{% extends template.self %}
|
||||
|
||||
{% block head %}
|
||||
{{ super() }}
|
||||
<style>
|
||||
@media only screen and (max-width: 640px) {
|
||||
.book-header .btn[aria-label="github"] {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
@ -1,49 +0,0 @@
|
||||
# Some useful commands to use docker.
|
||||
# Author: yeasy@github
|
||||
# Created:2014-09-25
|
||||
|
||||
alias docker-pid="sudo docker inspect --format '{{.State.Pid}}'"
|
||||
alias docker-ip="sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}'"
|
||||
|
||||
#the implementation refs from https://github.com/jpetazzo/nsenter/blob/master/docker-enter
|
||||
function docker-enter() {
|
||||
#if [ -e $(dirname "$0")/nsenter ]; then
|
||||
#Change for centos bash running
|
||||
if [ -e $(dirname '$0')/nsenter ]; then
|
||||
# with boot2docker, nsenter is not in the PATH but it is in the same folder
|
||||
NSENTER=$(dirname "$0")/nsenter
|
||||
else
|
||||
# if nsenter has already been installed with path notified, here will be clarified
|
||||
NSENTER=$(which nsenter)
|
||||
#NSENTER=nsenter
|
||||
fi
|
||||
[ -z "$NSENTER" ] && echo "WARN Cannot find nsenter" && return
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
echo "Usage: `basename "$0"` CONTAINER [COMMAND [ARG]...]"
|
||||
echo ""
|
||||
echo "Enters the Docker CONTAINER and executes the specified COMMAND."
|
||||
echo "If COMMAND is not specified, runs an interactive shell in CONTAINER."
|
||||
else
|
||||
PID=$(sudo docker inspect --format "{{.State.Pid}}" "$1")
|
||||
if [ -z "$PID" ]; then
|
||||
echo "WARN Cannot find the given container"
|
||||
return
|
||||
fi
|
||||
shift
|
||||
|
||||
OPTS="--target $PID --mount --uts --ipc --net --pid"
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
# No command given.
|
||||
# Use su to clear all host environment variables except for TERM,
|
||||
# initialize the environment variables HOME, SHELL, USER, LOGNAME, PATH,
|
||||
# and start a login shell.
|
||||
#sudo $NSENTER "$OPTS" su - root
|
||||
sudo $NSENTER --target $PID --mount --uts --ipc --net --pid su - root
|
||||
else
|
||||
# Use env to clear all host environment variables.
|
||||
sudo $NSENTER --target $PID --mount --uts --ipc --net --pid env -i $@
|
||||
fi
|
||||
fi
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# This script will update all local images
|
||||
# See: https://github.com/yeasy/docker_practice/blob/master/_local/pull_all.sh
|
||||
# Usage: pull_all
|
||||
# Author: yeasy@github
|
||||
# Create: 2014-09-23
|
||||
|
||||
for image in `sudo docker images|grep -v "REPOSITORY"|grep -v "<none>"|awk '{print $1":"$2}'`
|
||||
do
|
||||
sudo docker pull $image
|
||||
done
|
||||
|
@ -1,12 +0,0 @@
|
||||
#!/bin/sh
|
||||
# This script will upload all local images to a registry server ($registry is the default value).
|
||||
# This script requires the push_images, which can be found at https://github.com/yeasy/docker_practice/blob/master/_local/push_images.sh
|
||||
# Usage: push_all
|
||||
# Author: yeasy@github
|
||||
# Create: 2014-09-23
|
||||
|
||||
for image in `sudo docker images|grep -v "REPOSITORY"|grep -v "<none>"|awk '{print $1":"$2}'`
|
||||
do
|
||||
push_images $image
|
||||
done
|
||||
|
@ -1,47 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# This script will upload the given local images to a registry server ($registry is the default value).
|
||||
# See: https://github.com/yeasy/docker_practice/blob/master/_local/push_images.sh
|
||||
# Usage: push_images image1 [image2...]
|
||||
# Author: yeasy@github
|
||||
# Create: 2014-09-23
|
||||
|
||||
#The registry server address where you want push the images into
|
||||
registry=127.0.0.1:5000
|
||||
|
||||
### DO NOT MODIFY THE FOLLOWING PART, UNLESS YOU KNOW WHAT IT MEANS ###
|
||||
echo_r () {
|
||||
[ $# -ne 1 ] && return 0
|
||||
echo -e "\033[31m$1\033[0m"
|
||||
}
|
||||
echo_g () {
|
||||
[ $# -ne 1 ] && return 0
|
||||
echo -e "\033[32m$1\033[0m"
|
||||
}
|
||||
echo_y () {
|
||||
[ $# -ne 1 ] && return 0
|
||||
echo -e "\033[33m$1\033[0m"
|
||||
}
|
||||
echo_b () {
|
||||
[ $# -ne 1 ] && return 0
|
||||
echo -e "\033[34m$1\033[0m"
|
||||
}
|
||||
|
||||
usage() {
|
||||
sudo docker images
|
||||
echo "Usage: $0 registry1:tag1 [registry2:tag2...]"
|
||||
}
|
||||
|
||||
[ $# -lt 1 ] && usage && exit
|
||||
|
||||
echo_b "The registry server is $registry"
|
||||
|
||||
|
||||
for image in "$@"
|
||||
do
|
||||
echo_b "Uploading $image..."
|
||||
sudo docker tag $image $registry/$image
|
||||
sudo docker push $registry/$image
|
||||
sudo docker rmi $registry/$image
|
||||
echo_g "Done"
|
||||
done
|
@ -1,12 +1,15 @@
|
||||
# 高级网络配置
|
||||
|
||||
>注意:本章属于 `Docker` 高级配置,如果您是初学者,您可以暂时跳过本章节,直接学习 [Docker Compose](../compose) 一节。
|
||||
|
||||
本章将介绍 Docker 的一些高级网络配置和选项。
|
||||
|
||||
当 Docker 启动时,会自动在主机上创建一个 `docker0` 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。
|
||||
|
||||
同时,Docker 随机分配一个本地未占用的私有网段(在 [RFC1918](http://tools.ietf.org/html/rfc1918) 中定义)中的一个地址给 `docker0` 接口。比如典型的 `172.17.42.1`,掩码为 `255.255.0.0`。此后启动的容器内的网口也会自动分配一个同一网段(`172.17.0.0/16`)的地址。
|
||||
同时,Docker 随机分配一个本地未占用的私有网段(在 [RFC1918](https://datatracker.ietf.org/doc/html/rfc1918) 中定义)中的一个地址给 `docker0` 接口。比如典型的 `172.17.42.1`,掩码为 `255.255.0.0`。此后启动的容器内的网口也会自动分配一个同一网段(`172.17.0.0/16`)的地址。
|
||||
|
||||
当创建一个 Docker 容器的时候,同时会创建了一对 `veth pair` 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 `eth0`;另一端在本地并被挂载到 `docker0` 网桥,名称以 `veth` 开头(例如 `vethAQI2QT`)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。
|
||||
|
||||

|
||||

|
||||
|
||||
接下来的部分将介绍在一些场景中,Docker 所有的网络定制配置。以及通过 Linux 命令来调整、补充、甚至替换 Docker 默认的网络配置。
|
||||
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 48 KiB |
@ -1,36 +1,37 @@
|
||||
## 容器访问控制
|
||||
# 容器访问控制
|
||||
|
||||
容器的访问控制,主要通过 Linux 上的 `iptables` 防火墙来进行管理和实现。`iptables` 是 Linux 上默认的防火墙软件,在大部分发行版中都自带。
|
||||
|
||||
### 容器访问外部网络
|
||||
## 容器访问外部网络
|
||||
容器要想访问外部网络,需要本地系统的转发支持。在Linux 系统中,检查转发是否打开。
|
||||
|
||||
```
|
||||
```bash
|
||||
$sysctl net.ipv4.ip_forward
|
||||
net.ipv4.ip_forward = 1
|
||||
```
|
||||
如果为 0,说明没有开启转发,则需要手动打开。
|
||||
```
|
||||
```bash
|
||||
$sysctl -w net.ipv4.ip_forward=1
|
||||
```
|
||||
如果在启动 Docker 服务的时候设定 `--ip-forward=true`, Docker 就会自动设定系统的 `ip_forward` 参数为 1。
|
||||
|
||||
### 容器之间访问
|
||||
## 容器之间访问
|
||||
容器之间相互访问,需要两方面的支持。
|
||||
* 容器的网络拓扑是否已经互联。默认情况下,所有容器都会被连接到 `docker0` 网桥上。
|
||||
* 本地系统的防火墙软件 -- `iptables` 是否允许通过。
|
||||
|
||||
#### 访问所有端口
|
||||
当启动 Docker 服务时候,默认会添加一条转发策略到 iptables 的 FORWARD 链上。策略为通过(`ACCEPT`)还是禁止(`DROP`)取决于配置`--icc=true`(缺省值)还是 `--icc=false`。当然,如果手动指定 `--iptables=false` 则不会添加 `iptables` 规则。
|
||||
### 访问所有端口
|
||||
当启动 Docker 服务(即 dockerd)的时候,默认会添加一条转发策略到本地主机 iptables 的 FORWARD 链上。策略为通过(`ACCEPT`)还是禁止(`DROP`)取决于配置`--icc=true`(缺省值)还是 `--icc=false`。当然,如果手动指定 `--iptables=false` 则不会添加 `iptables` 规则。
|
||||
|
||||
可见,默认情况下,不同容器之间是允许网络互通的。如果为了安全考虑,可以在 `/etc/default/docker` 文件中配置 `DOCKER_OPTS=--icc=false` 来禁止它。
|
||||
可见,默认情况下,不同容器之间是允许网络互通的。如果为了安全考虑,可以在 `/etc/docker/daemon.json` 文件中配置 `{"icc": false}` 来禁止它。
|
||||
|
||||
#### 访问指定端口
|
||||
### 访问指定端口
|
||||
在通过 `-icc=false` 关闭网络访问后,还可以通过 `--link=CONTAINER_NAME:ALIAS` 选项来访问容器的开放端口。
|
||||
|
||||
例如,在启动 Docker 服务时,可以同时使用 `icc=false --iptables=true` 参数来关闭允许相互的网络访问,并让 Docker 可以修改系统中的 `iptables` 规则。
|
||||
|
||||
此时,系统中的 `iptables` 规则可能是类似
|
||||
```
|
||||
```bash
|
||||
$ sudo iptables -nL
|
||||
...
|
||||
Chain FORWARD (policy ACCEPT)
|
||||
@ -39,10 +40,10 @@ DROP all -- 0.0.0.0/0 0.0.0.0/0
|
||||
...
|
||||
```
|
||||
|
||||
之后,启动容器(`docker run`)时使用 `--link=CONTAINER_NAME:ALIAS` 选项。Docker 会在 `iptable` 中为 两个容器分别添加一条 `ACCEPT` 规则,允许相互访问开放的端口(取决于 Dockerfile 中的 EXPOSE 行)。
|
||||
之后,启动容器(`docker run`)时使用 `--link=CONTAINER_NAME:ALIAS` 选项。Docker 会在 `iptable` 中为 两个容器分别添加一条 `ACCEPT` 规则,允许相互访问开放的端口(取决于 `Dockerfile` 中的 `EXPOSE` 指令)。
|
||||
|
||||
当添加了 `--link=CONTAINER_NAME:ALIAS` 选项后,添加了 `iptables` 规则。
|
||||
```
|
||||
```bash
|
||||
$ sudo iptables -nL
|
||||
...
|
||||
Chain FORWARD (policy ACCEPT)
|
||||
|
@ -1,34 +1,45 @@
|
||||
## 自定义网桥
|
||||
# 自定义网桥
|
||||
|
||||
除了默认的 `docker0` 网桥,用户也可以指定网桥来连接各个容器。
|
||||
|
||||
在启动 Docker 服务的时候,使用 `-b BRIDGE`或`--bridge=BRIDGE` 来指定使用的网桥。
|
||||
|
||||
如果服务已经运行,那需要先停止服务,并删除旧的网桥。
|
||||
```
|
||||
$ sudo service docker stop
|
||||
|
||||
```bash
|
||||
$ sudo systemctl stop docker
|
||||
$ sudo ip link set dev docker0 down
|
||||
$ sudo brctl delbr docker0
|
||||
```
|
||||
|
||||
然后创建一个网桥 `bridge0`。
|
||||
```
|
||||
|
||||
```bash
|
||||
$ sudo brctl addbr bridge0
|
||||
$ sudo ip addr add 192.168.5.1/24 dev bridge0
|
||||
$ sudo ip link set dev bridge0 up
|
||||
```
|
||||
|
||||
查看确认网桥创建并启动。
|
||||
```
|
||||
|
||||
```bash
|
||||
$ ip addr show bridge0
|
||||
4: bridge0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state UP group default
|
||||
link/ether 66:38:d0:0d:76:18 brd ff:ff:ff:ff:ff:ff
|
||||
inet 192.168.5.1/24 scope global bridge0
|
||||
valid_lft forever preferred_lft forever
|
||||
```
|
||||
配置 Docker 服务,默认桥接到创建的网桥上。
|
||||
```
|
||||
$ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker
|
||||
$ sudo service docker start
|
||||
|
||||
在 Docker 配置文件 `/etc/docker/daemon.json` 中添加如下内容,即可将 Docker 默认桥接到创建的网桥上。
|
||||
|
||||
```json
|
||||
{
|
||||
"bridge": "bridge0",
|
||||
}
|
||||
```
|
||||
|
||||
启动 Docker 服务。
|
||||
|
||||
新建一个容器,可以看到它已经桥接到了 `bridge0` 上。
|
||||
|
||||
可以继续用 `brctl show` 命令查看桥接的信息。另外,在容器中可以使用 `ip addr` 和 `ip route` 命令来查看 IP 地址配置和路由信息。
|
||||
|
@ -1,5 +1,5 @@
|
||||
## 编辑网络配置文件
|
||||
# 编辑网络配置文件
|
||||
|
||||
Docker 1.2.0 开始支持在运行中的容器里编辑 `/etc/hosts`, `/etc/hostname` 和 `/etc/resolve.conf` 文件。
|
||||
Docker 1.2.0 开始支持在运行中的容器里编辑 `/etc/hosts`, `/etc/hostname` 和 `/etc/resolv.conf` 文件。
|
||||
|
||||
但是这些修改是临时的,只在运行的容器中保留,容器终止或重启后并不会被保存下来。也不会被 `docker commit` 提交。
|
||||
但是这些修改是临时的,只在运行的容器中保留,容器终止或重启后并不会被保存下来,也不会被 `docker commit` 提交。
|
||||
|
@ -1,29 +0,0 @@
|
||||
## 配置 DNS
|
||||
Docker 没有为每个容器专门定制镜像,那么怎么自定义配置容器的主机名和 DNS 配置呢?
|
||||
秘诀就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件。
|
||||
|
||||
在容器中使用 mount 命令可以看到挂载信息:
|
||||
```
|
||||
$ mount
|
||||
...
|
||||
/dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ...
|
||||
/dev/disk/by-uuid/1fec...ebdf on /etc/hosts type ext4 ...
|
||||
tmpfs on /etc/resolv.conf type tmpfs ...
|
||||
...
|
||||
```
|
||||
这种机制可以让宿主主机 DNS 信息发生更新后,所有 Docker 容器的 dns 配置通过 `/etc/resolv.conf` 文件立刻得到更新。
|
||||
|
||||
如果用户想要手动指定容器的配置,可以利用下面的选项。
|
||||
|
||||
`-h HOSTNAME or --hostname=HOSTNAME`
|
||||
设定容器的主机名,它会被写到容器内的 `/etc/hostname` 和 `/etc/hosts`。但它在容器外部看不到,既不会在 `docker ps` 中显示,也不会在其他的容器的 `/etc/hosts` 看到。
|
||||
|
||||
`--link=CONTAINER_NAME:ALIAS`
|
||||
选项会在创建容器的时候,添加一个其他容器的主机名到 `/etc/hosts` 文件中,让新容器的进程可以使用主机名 ALIAS 就可以连接它。
|
||||
|
||||
`--dns=IP_ADDRESS`
|
||||
添加 DNS 服务器到容器的 `/etc/resolv.conf` 中,让容器用这个服务器来解析所有不在 `/etc/hosts` 中的主机名。
|
||||
|
||||
`--dns-search=DOMAIN`
|
||||
设定容器的搜索域,当设定搜索域为 `.example.com` 时,在搜索一个名为 host 的主机时,DNS 不仅搜索host,还会搜索 `host.example.com`。
|
||||
注意:如果没有上述最后 2 个选项,Docker 会默认用主机上的 `/etc/resolv.conf` 来配置容器。
|
@ -1,13 +1,17 @@
|
||||
## 配置 docker0 网桥
|
||||
# 配置 docker0 网桥
|
||||
|
||||
Docker 服务默认会创建一个 `docker0` 网桥(其上有一个 `docker0` 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。
|
||||
|
||||
Docker 默认指定了 `docker0` 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信,它还给出了 MTU(接口允许接收的最大传输单元),通常是 1500 Bytes,或宿主主机网络路由上支持的默认值。这些值都可以在服务启动的时候进行配置。
|
||||
* `--bip=CIDR` -- IP 地址加掩码格式,例如 192.168.1.5/24
|
||||
* `--mtu=BYTES` -- 覆盖默认的 Docker mtu 配置
|
||||
|
||||
* `--bip=CIDR` IP 地址加掩码格式,例如 192.168.1.5/24
|
||||
* `--mtu=BYTES` 覆盖默认的 Docker mtu 配置
|
||||
|
||||
也可以在配置文件中配置 DOCKER_OPTS,然后重启服务。
|
||||
|
||||
由于目前 Docker 网桥是 Linux 网桥,用户可以使用 `brctl show` 来查看网桥和端口连接信息。
|
||||
```
|
||||
|
||||
```bash
|
||||
$ sudo brctl show
|
||||
bridge name bridge id STP enabled interfaces
|
||||
docker0 8000.3a1d7362b4ee no veth65f9
|
||||
@ -17,7 +21,8 @@ docker0 8000.3a1d7362b4ee no veth65f9
|
||||
|
||||
|
||||
每次创建一个新容器的时候,Docker 从可用的地址段中选择一个空闲的 IP 地址分配给容器的 eth0 端口。使用本地主机上 `docker0` 接口的 IP 作为所有容器的默认网关。
|
||||
```
|
||||
|
||||
```bash
|
||||
$ sudo docker run -i -t --rm base /bin/bash
|
||||
$ ip addr show eth0
|
||||
24: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
|
||||
@ -29,5 +34,4 @@ $ ip addr show eth0
|
||||
$ ip route
|
||||
default via 172.17.42.1 dev eth0
|
||||
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.3
|
||||
$ exit
|
||||
```
|
||||
|
@ -1,8 +1,9 @@
|
||||
## 工具和示例
|
||||
# 工具和示例
|
||||
|
||||
在介绍自定义网络拓扑之前,你可能会对一些外部工具和例子感兴趣:
|
||||
|
||||
### pipework
|
||||
## pipework
|
||||
Jérôme Petazzoni 编写了一个叫 [pipework](https://github.com/jpetazzo/pipework) 的 shell 脚本,可以帮助用户在比较复杂的场景中完成容器的连接。
|
||||
|
||||
### playground
|
||||
Brandon Rhodes 创建了一个提供完整的 Docker 容器网络拓扑管理的 [Python库](https://github.com/brandon-rhodes/fopnp/tree/m/playground),包括路由、NAT 防火墙;以及一些提供 HTTP, SMTP, POP, IMAP, Telnet, SSH, FTP 的服务器。
|
||||
## playground
|
||||
Brandon Rhodes 创建了一个提供完整的 Docker 容器网络拓扑管理的 [Python库](https://github.com/brandon-rhodes/fopnp/tree/m/playground),包括路由、NAT 防火墙;以及一些提供 `HTTP` `SMTP` `POP` `IMAP` `Telnet` `SSH` `FTP` 的服务器。
|
||||
|
74
advanced_network/http_https_proxy.md
Normal file
@ -0,0 +1,74 @@
|
||||
# 配置 HTTP/HTTPS 网络代理
|
||||
|
||||
使用Docker的过程中,因为网络原因,通常需要使用 HTTP/HTTPS 代理来加速镜像拉取、构建和使用。下面是常见的三种场景。
|
||||
|
||||
## 为 dockerd 设置网络代理
|
||||
|
||||
"docker pull" 命令是由 dockerd 守护进程执行。而 dockerd 守护进程是由 systemd 管理。因此,如果需要在执行 "docker pull" 命令时使用 HTTP/HTTPS 代理,需要通过 systemd 配置。
|
||||
|
||||
- 为 dockerd 创建配置文件夹。
|
||||
```
|
||||
sudo mkdir -p /etc/systemd/system/docker.service.d
|
||||
```
|
||||
|
||||
- 为 dockerd 创建 HTTP/HTTPS 网络代理的配置文件,文件路径是 /etc/systemd/system/docker.service.d/http-proxy.conf 。并在该文件中添加相关环境变量。
|
||||
```
|
||||
[Service]
|
||||
Environment="HTTP_PROXY=http://proxy.example.com:8080/"
|
||||
Environment="HTTPS_PROXY=http://proxy.example.com:8080/"
|
||||
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
|
||||
```
|
||||
|
||||
- 刷新配置并重启 docker 服务。
|
||||
```
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl restart docker
|
||||
```
|
||||
|
||||
## 为 docker 容器设置网络代理
|
||||
|
||||
在容器运行阶段,如果需要使用 HTTP/HTTPS 代理,可以通过更改 docker 客户端配置,或者指定环境变量的方式。
|
||||
|
||||
- 更改 docker 客户端配置:创建或更改 ~/.docker/config.json,并在该文件中添加相关配置。
|
||||
```
|
||||
{
|
||||
"proxies":
|
||||
{
|
||||
"default":
|
||||
{
|
||||
"httpProxy": "http://proxy.example.com:8080/",
|
||||
"httpsProxy": "http://proxy.example.com:8080/",
|
||||
"noProxy": "localhost,127.0.0.1,.example.com"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- 指定环境变量:运行 "docker run" 命令时,指定相关环境变量。
|
||||
|
||||
| 环境变量 | docker run 示例 |
|
||||
| -------- | ---------------- |
|
||||
| HTTP_PROXY | --env HTTP_PROXY="http://proxy.example.com:8080/" |
|
||||
| HTTPS_PROXY | --env HTTPS_PROXY="http://proxy.example.com:8080/" |
|
||||
| NO_PROXY | --env NO_PROXY="localhost,127.0.0.1,.example.com" |
|
||||
|
||||
## 为 docker build 过程设置网络代理
|
||||
|
||||
在容器构建阶段,如果需要使用 HTTP/HTTPS 代理,可以通过指定 "docker build" 的环境变量,或者在 Dockerfile 中指定环境变量的方式。
|
||||
|
||||
- 使用 "--build-arg" 指定 "docker build" 的相关环境变量
|
||||
```
|
||||
docker build \
|
||||
--build-arg "HTTP_PROXY=http://proxy.example.com:8080/" \
|
||||
--build-arg "HTTPS_PROXY=http://proxy.example.com:8080/" \
|
||||
--build-arg "NO_PROXY=localhost,127.0.0.1,.example.com" .
|
||||
```
|
||||
|
||||
- 在 Dockerfile 中指定相关环境变量
|
||||
|
||||
| 环境变量 | Dockerfile 示例 |
|
||||
| -------- | ---------------- |
|
||||
| HTTP_PROXY | ENV HTTP_PROXY="http://proxy.example.com:8080/" |
|
||||
| HTTPS_PROXY | ENV HTTPS_PROXY="http://proxy.example.com:8080/" |
|
||||
| NO_PROXY | ENV NO_PROXY="localhost,127.0.0.1,.example.com" |
|
||||
|
@ -1,11 +1,14 @@
|
||||
## 映射容器端口到宿主主机的实现
|
||||
# 映射容器端口到宿主主机的实现
|
||||
|
||||
默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。
|
||||
### 容器访问外部实现
|
||||
容器所有到外部网络的连接,源地址都会被NAT成本地系统的IP地址。这是使用 `iptables` 的源地址伪装操作实现的。
|
||||
|
||||
## 容器访问外部实现
|
||||
|
||||
容器所有到外部网络的连接,源地址都会被 NAT 成本地系统的 IP 地址。这是使用 `iptables` 的源地址伪装操作实现的。
|
||||
|
||||
查看主机的 NAT 规则。
|
||||
```
|
||||
|
||||
```bash
|
||||
$ sudo iptables -t nat -nL
|
||||
...
|
||||
Chain POSTROUTING (policy ACCEPT)
|
||||
@ -13,16 +16,18 @@ target prot opt source destination
|
||||
MASQUERADE all -- 172.17.0.0/16 !172.17.0.0/16
|
||||
...
|
||||
```
|
||||
|
||||
其中,上述规则将所有源地址在 `172.17.0.0/16` 网段,目标地址为其他网段(外部网络)的流量动态伪装为从系统网卡发出。MASQUERADE 跟传统 SNAT 的好处是它能动态从网卡获取地址。
|
||||
|
||||
### 外部访问容器实现
|
||||
## 外部访问容器实现
|
||||
|
||||
容器允许外部访问,可以在 `docker run` 时候通过 `-p` 或 `-P` 参数来启用。
|
||||
|
||||
不管用那种办法,其实也是在本地的 `iptable` 的 nat 表中添加相应的规则。
|
||||
|
||||
使用 `-P` 时:
|
||||
```
|
||||
|
||||
```bash
|
||||
$ iptables -t nat -nL
|
||||
...
|
||||
Chain DOCKER (2 references)
|
||||
@ -31,13 +36,22 @@ DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153 to:1
|
||||
```
|
||||
|
||||
使用 `-p 80:80` 时:
|
||||
```
|
||||
|
||||
```bash
|
||||
$ iptables -t nat -nL
|
||||
Chain DOCKER (2 references)
|
||||
target prot opt source destination
|
||||
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:80
|
||||
```
|
||||
|
||||
注意:
|
||||
* 这里的规则映射了 0.0.0.0,意味着将接受主机来自所有接口的流量。用户可以通过 `-p IP:host_port:container_port` 或 `-p
|
||||
IP::port` 来指定允许访问容器的主机上的 IP、接口等,以制定更严格的规则。
|
||||
* 如果希望永久绑定到某个固定的 IP 地址,可以在 Docker 配置文件 `/etc/default/docker` 中指定 `DOCKER_OPTS="--ip=IP_ADDRESS"`,之后重启 Docker 服务即可生效。
|
||||
|
||||
* 这里的规则映射了 `0.0.0.0`,意味着将接受主机来自所有接口的流量。用户可以通过 `-p IP:host_port:container_port` 或 `-p IP::port` 来指定允许访问容器的主机上的 IP、接口等,以制定更严格的规则。
|
||||
|
||||
* 如果希望永久绑定到某个固定的 IP 地址,可以在 Docker 配置文件 `/etc/docker/daemon.json` 中添加如下内容。
|
||||
|
||||
```json
|
||||
{
|
||||
"ip": "0.0.0.0"
|
||||
}
|
||||
```
|
||||
|
@ -1,4 +1,4 @@
|
||||
## 示例:创建一个点到点连接
|
||||
# 示例:创建一个点到点连接
|
||||
默认情况下,Docker 会将所有容器连接到由 `docker0` 提供的虚拟子网中。
|
||||
|
||||
用户有时候需要两个容器之间可以直连通信,而不用通过主机网桥进行桥接。
|
||||
@ -6,18 +6,18 @@
|
||||
解决办法很简单:创建一对 `peer` 接口,分别放到两个容器中,配置成点到点链路类型即可。
|
||||
|
||||
首先启动 2 个容器:
|
||||
```
|
||||
$ sudo docker run -i -t --rm --net=none base /bin/bash
|
||||
```bash
|
||||
$ docker run -i -t --rm --net=none base /bin/bash
|
||||
root@1f1f4c1f931a:/#
|
||||
$ sudo docker run -i -t --rm --net=none base /bin/bash
|
||||
$ docker run -i -t --rm --net=none base /bin/bash
|
||||
root@12e343489d2f:/#
|
||||
```
|
||||
|
||||
找到进程号,然后创建网络命名空间的跟踪文件。
|
||||
```
|
||||
$ sudo docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a
|
||||
```bash
|
||||
$ docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a
|
||||
2989
|
||||
$ sudo docker inspect -f '{{.State.Pid}}' 12e343489d2f
|
||||
$ docker inspect -f '{{.State.Pid}}' 12e343489d2f
|
||||
3004
|
||||
$ sudo mkdir -p /var/run/netns
|
||||
$ sudo ln -s /proc/2989/ns/net /var/run/netns/2989
|
||||
@ -25,7 +25,7 @@ $ sudo ln -s /proc/3004/ns/net /var/run/netns/3004
|
||||
```
|
||||
|
||||
创建一对 `peer` 接口,然后配置路由
|
||||
```
|
||||
```bash
|
||||
$ sudo ip link add A type veth peer name B
|
||||
|
||||
$ sudo ip link set A netns 2989
|
||||
|
@ -1,23 +1,26 @@
|
||||
## 快速配置指南
|
||||
# 快速配置指南
|
||||
|
||||
下面是一个跟 Docker 网络相关的命令列表。
|
||||
|
||||
其中有些命令选项只有在 Docker 服务启动的时候才能配置,而且不能马上生效。
|
||||
* `-b BRIDGE or --bridge=BRIDGE` --指定容器挂载的网桥
|
||||
* `--bip=CIDR` --定制 docker0 的掩码
|
||||
* `-H SOCKET... or --host=SOCKET...` --Docker 服务端接收命令的通道
|
||||
* `--icc=true|false` --是否支持容器之间进行通信
|
||||
* `--ip-forward=true|false` --请看下文容器之间的通信
|
||||
* `--iptables=true|false` --是否允许 Docker 添加 iptables 规则
|
||||
* `--mtu=BYTES` --容器网络中的 MTU
|
||||
|
||||
下面2个命令选项既可以在启动服务时指定,也可以 Docker 容器启动(`docker run`)时候指定。在 Docker 服务启动的时候指定则会成为默认值,后面执行 `docker run` 时可以覆盖设置的默认值。
|
||||
* `--dns=IP_ADDRESS...` --使用指定的DNS服务器
|
||||
* `--dns-search=DOMAIN...` --指定DNS搜索域
|
||||
* `-b BRIDGE` 或 `--bridge=BRIDGE` 指定容器挂载的网桥
|
||||
* `--bip=CIDR` 定制 docker0 的掩码
|
||||
* `-H SOCKET...` 或 `--host=SOCKET...` Docker 服务端接收命令的通道
|
||||
* `--icc=true|false` 是否支持容器之间进行通信
|
||||
* `--ip-forward=true|false` 请看下文容器之间的通信
|
||||
* `--iptables=true|false` 是否允许 Docker 添加 iptables 规则
|
||||
* `--mtu=BYTES` 容器网络中的 MTU
|
||||
|
||||
下面2个命令选项既可以在启动服务时指定,也可以在启动容器时指定。在 Docker 服务启动的时候指定则会成为默认值,后面执行 `docker run` 时可以覆盖设置的默认值。
|
||||
|
||||
* `--dns=IP_ADDRESS...` 使用指定的DNS服务器
|
||||
* `--dns-search=DOMAIN...` 指定DNS搜索域
|
||||
|
||||
最后这些选项只有在 `docker run` 执行时使用,因为它是针对容器的特性内容。
|
||||
* `-h HOSTNAME or --hostname=HOSTNAME` --配置容器主机名
|
||||
* `--link=CONTAINER_NAME:ALIAS` --添加到另一个容器的连接
|
||||
* `--net=bridge|none|container:NAME_or_ID|host` --配置容器的桥接模式
|
||||
* `-p SPEC or --publish=SPEC` --映射容器端口到宿主主机
|
||||
* `-P or --publish-all=true|false` --映射容器所有端口到宿主主机
|
||||
|
||||
* `-h HOSTNAME` 或 `--hostname=HOSTNAME` 配置容器主机名
|
||||
* `--link=CONTAINER_NAME:ALIAS` 添加到另一个容器的连接
|
||||
* `--net=bridge|none|container:NAME_or_ID|host` 配置容器的桥接模式
|
||||
* `-p SPEC` 或 `--publish=SPEC` 映射容器端口到宿主主机
|
||||
* `-P or --publish-all=true|false` 映射容器所有端口到宿主主机
|
||||
|
344
appendix/best_practices.md
Normal file
@ -0,0 +1,344 @@
|
||||
# Dockerfile 最佳实践
|
||||
|
||||
本附录是笔者对 Docker 官方文档中 [Best practices for writing Dockerfiles](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/) 的理解与翻译。
|
||||
|
||||
## 一般性的指南和建议
|
||||
|
||||
### 容器应该是短暂的
|
||||
|
||||
通过 `Dockerfile` 构建的镜像所启动的容器应该尽可能短暂(生命周期短)。「短暂」意味着可以停止和销毁容器,并且创建一个新容器并部署好所需的设置和配置工作量应该是极小的。
|
||||
|
||||
### 使用 `.dockerignore` 文件
|
||||
|
||||
使用 `Dockerfile` 构建镜像时最好是将 `Dockerfile` 放置在一个新建的空目录下。然后将构建镜像所需要的文件添加到该目录中。为了提高构建镜像的效率,你可以在目录下新建一个 `.dockerignore` 文件来指定要忽略的文件和目录。`.dockerignore` 文件的排除模式语法和 Git 的 `.gitignore` 文件相似。
|
||||
|
||||
### 使用多阶段构建
|
||||
|
||||
在 `Docker 17.05` 以上版本中,你可以使用 [多阶段构建](../image/multistage-builds.md) 来减少所构建镜像的大小。
|
||||
|
||||
### 避免安装不必要的包
|
||||
|
||||
为了降低复杂性、减少依赖、减小文件大小、节约构建时间,你应该避免安装任何不必要的包。例如,不要在数据库镜像中包含一个文本编辑器。
|
||||
|
||||
### 一个容器只运行一个进程
|
||||
|
||||
应该保证在一个容器中只运行一个进程。将多个应用解耦到不同容器中,保证了容器的横向扩展和复用。例如 web 应用应该包含三个容器:web应用、数据库、缓存。
|
||||
|
||||
如果容器互相依赖,你可以使用 [Docker 自定义网络](../network/linking.md) 来把这些容器连接起来。
|
||||
|
||||
### 镜像层数尽可能少
|
||||
|
||||
你需要在 `Dockerfile` 可读性(也包括长期的可维护性)和减少层数之间做一个平衡。
|
||||
|
||||
### 将多行参数排序
|
||||
|
||||
将多行参数按字母顺序排序(比如要安装多个包时)。这可以帮助你避免重复包含同一个包,更新包列表时也更容易。也便于 `PRs` 阅读和审查。建议在反斜杠符号 `\` 之前添加一个空格,以增加可读性。
|
||||
|
||||
下面是来自 `buildpack-deps` 镜像的例子:
|
||||
|
||||
```docker
|
||||
RUN apt-get update && apt-get install -y \
|
||||
bzr \
|
||||
cvs \
|
||||
git \
|
||||
mercurial \
|
||||
subversion
|
||||
```
|
||||
|
||||
### 构建缓存
|
||||
|
||||
在镜像的构建过程中,Docker 会遍历 `Dockerfile` 文件中的指令,然后按顺序执行。在执行每条指令之前,Docker 都会在缓存中查找是否已经存在可重用的镜像,如果有就使用现存的镜像,不再重复创建。如果你不想在构建过程中使用缓存,你可以在 `docker build` 命令中使用 `--no-cache=true` 选项。
|
||||
|
||||
但是,如果你想在构建的过程中使用缓存,你得明白什么时候会,什么时候不会找到匹配的镜像,遵循的基本规则如下:
|
||||
|
||||
* 从一个基础镜像开始(`FROM` 指令指定),下一条指令将和该基础镜像的所有子镜像进行匹配,检查这些子镜像被创建时使用的指令是否和被检查的指令完全一样。如果不是,则缓存失效。
|
||||
* 在大多数情况下,只需要简单地对比 `Dockerfile` 中的指令和子镜像。然而,有些指令需要更多的检查和解释。
|
||||
* 对于 `ADD` 和 `COPY` 指令,镜像中对应文件的内容也会被检查,每个文件都会计算出一个校验和。文件的最后修改时间和最后访问时间不会纳入校验。在缓存的查找过程中,会将这些校验和和已存在镜像中的文件校验和进行对比。如果文件有任何改变,比如内容和元数据,则缓存失效。
|
||||
* 除了 `ADD` 和 `COPY` 指令,缓存匹配过程不会查看临时容器中的文件来决定缓存是否匹配。例如,当执行完 `RUN apt-get -y update` 指令后,容器中一些文件被更新,但 Docker 不会检查这些文件。这种情况下,只有指令字符串本身被用来匹配缓存。
|
||||
|
||||
一旦缓存失效,所有后续的 `Dockerfile` 指令都将产生新的镜像,缓存不会被使用。
|
||||
|
||||
## Dockerfile 指令
|
||||
|
||||
下面针对 `Dockerfile` 中各种指令的最佳编写方式给出建议。
|
||||
|
||||
### FROM
|
||||
|
||||
尽可能使用当前官方仓库作为你构建镜像的基础。推荐使用 [Alpine](https://hub.docker.com/_/alpine/) 镜像,因为它被严格控制并保持最小尺寸(目前小于 5 MB),但它仍然是一个完整的发行版。
|
||||
|
||||
### LABEL
|
||||
|
||||
你可以给镜像添加标签来帮助组织镜像、记录许可信息、辅助自动化构建等。每个标签一行,由 `LABEL` 开头加上一个或多个标签对。下面的示例展示了各种不同的可能格式。`#` 开头的行是注释内容。
|
||||
|
||||
>注意:如果你的字符串中包含空格,必须将字符串放入引号中或者对空格使用转义。如果字符串内容本身就包含引号,必须对引号使用转义。
|
||||
|
||||
```docker
|
||||
# Set one or more individual labels
|
||||
LABEL com.example.version="0.0.1-beta"
|
||||
|
||||
LABEL vendor="ACME Incorporated"
|
||||
|
||||
LABEL com.example.release-date="2015-02-12"
|
||||
|
||||
LABEL com.example.version.is-production=""
|
||||
```
|
||||
|
||||
一个镜像可以包含多个标签,但建议将多个标签放入到一个 `LABEL` 指令中。
|
||||
|
||||
```docker
|
||||
# Set multiple labels at once, using line-continuation characters to break long lines
|
||||
LABEL vendor=ACME\ Incorporated \
|
||||
com.example.is-beta= \
|
||||
com.example.is-production="" \
|
||||
com.example.version="0.0.1-beta" \
|
||||
com.example.release-date="2015-02-12"
|
||||
```
|
||||
|
||||
关于标签可以接受的键值对,参考 [Understanding object labels](https://docs.docker.com/config/labels-custom-metadata/)。关于查询标签信息,参考 [Managing labels on objects](https://docs.docker.com/config/labels-custom-metadata/)。
|
||||
|
||||
### RUN
|
||||
|
||||
为了保持 `Dockerfile` 文件的可读性,可理解性,以及可维护性,建议将长的或复杂的 `RUN` 指令用反斜杠 `\` 分割成多行。
|
||||
|
||||
#### apt-get
|
||||
|
||||
`RUN` 指令最常见的用法是安装包用的 `apt-get`。因为 `RUN apt-get` 指令会安装包,所以有几个问题需要注意。
|
||||
|
||||
不要使用 `RUN apt-get upgrade` 或 `dist-upgrade`,因为许多基础镜像中的「必须」包不会在一个非特权容器中升级。如果基础镜像中的某个包过时了,你应该联系它的维护者。如果你确定某个特定的包,比如 `foo`,需要升级,使用 `apt-get install -y foo` 就行,该指令会自动升级 `foo` 包。
|
||||
|
||||
永远将 `RUN apt-get update` 和 `apt-get install` 组合成一条 `RUN` 声明,例如:
|
||||
|
||||
```docker
|
||||
RUN apt-get update && apt-get install -y \
|
||||
package-bar \
|
||||
package-baz \
|
||||
package-foo
|
||||
```
|
||||
|
||||
将 `apt-get update` 放在一条单独的 `RUN` 声明中会导致缓存问题以及后续的 `apt-get install` 失败。比如,假设你有一个 `Dockerfile` 文件:
|
||||
|
||||
```docker
|
||||
FROM ubuntu:18.04
|
||||
|
||||
RUN apt-get update
|
||||
|
||||
RUN apt-get install -y curl
|
||||
```
|
||||
|
||||
构建镜像后,所有的层都在 Docker 的缓存中。假设你后来又修改了其中的 `apt-get install` 添加了一个包:
|
||||
|
||||
```docker
|
||||
FROM ubuntu:18.04
|
||||
|
||||
RUN apt-get update
|
||||
|
||||
RUN apt-get install -y curl nginx
|
||||
```
|
||||
|
||||
Docker 发现修改后的 `RUN apt-get update` 指令和之前的完全一样。所以,`apt-get update` 不会执行,而是使用之前的缓存镜像。因为 `apt-get update` 没有运行,后面的 `apt-get install` 可能安装的是过时的 `curl` 和 `nginx` 版本。
|
||||
|
||||
使用 `RUN apt-get update && apt-get install -y` 可以确保你的 Dockerfiles 每次安装的都是包的最新的版本,而且这个过程不需要进一步的编码或额外干预。这项技术叫作 `cache busting`。你也可以显示指定一个包的版本号来达到 `cache-busting`,这就是所谓的固定版本,例如:
|
||||
|
||||
```docker
|
||||
RUN apt-get update && apt-get install -y \
|
||||
package-bar \
|
||||
package-baz \
|
||||
package-foo=1.3.*
|
||||
```
|
||||
|
||||
固定版本会迫使构建过程检索特定的版本,而不管缓存中有什么。这项技术也可以减少因所需包中未预料到的变化而导致的失败。
|
||||
|
||||
下面是一个 `RUN` 指令的示例模板,展示了所有关于 `apt-get` 的建议。
|
||||
|
||||
```docker
|
||||
RUN apt-get update && apt-get install -y \
|
||||
aufs-tools \
|
||||
automake \
|
||||
build-essential \
|
||||
curl \
|
||||
dpkg-sig \
|
||||
libcap-dev \
|
||||
libsqlite3-dev \
|
||||
mercurial \
|
||||
reprepro \
|
||||
ruby1.9.1 \
|
||||
ruby1.9.1-dev \
|
||||
s3cmd=1.1.* \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
```
|
||||
|
||||
其中 `s3cmd` 指令指定了一个版本号 `1.1.*`。如果之前的镜像使用的是更旧的版本,指定新的版本会导致 `apt-get update` 缓存失效并确保安装的是新版本。
|
||||
|
||||
另外,清理掉 apt 缓存 `var/lib/apt/lists` 可以减小镜像大小。因为 `RUN` 指令的开头为 `apt-get update`,包缓存总是会在 `apt-get install` 之前刷新。
|
||||
|
||||
> 注意:官方的 Debian 和 Ubuntu 镜像会自动运行 apt-get clean,所以不需要显式的调用 apt-get clean。
|
||||
|
||||
### CMD
|
||||
|
||||
`CMD` 指令用于执行目标镜像中包含的软件,可以包含参数。`CMD` 大多数情况下都应该以 `CMD ["executable", "param1", "param2"...]` 的形式使用。因此,如果创建镜像的目的是为了部署某个服务(比如 `Apache`),你可能会执行类似于 `CMD ["apache2", "-DFOREGROUND"]` 形式的命令。我们建议任何服务镜像都使用这种形式的命令。
|
||||
|
||||
多数情况下,`CMD` 都需要一个交互式的 `shell` (bash, Python, perl 等),例如 `CMD ["perl", "-de0"]`,或者 `CMD ["PHP", "-a"]`。使用这种形式意味着,当你执行类似 `docker run -it python` 时,你会进入一个准备好的 `shell` 中。`CMD` 应该在极少的情况下才能以 `CMD ["param", "param"]` 的形式与 `ENTRYPOINT` 协同使用,除非你和你的镜像使用者都对 `ENTRYPOINT` 的工作方式十分熟悉。
|
||||
|
||||
### EXPOSE
|
||||
|
||||
`EXPOSE` 指令用于指定容器将要监听的端口。因此,你应该为你的应用程序使用常见的端口。例如,提供 `Apache` web 服务的镜像应该使用 `EXPOSE 80`,而提供 `MongoDB` 服务的镜像使用 `EXPOSE 27017`。
|
||||
|
||||
对于外部访问,用户可以在执行 `docker run` 时使用一个标志来指示如何将指定的端口映射到所选择的端口。
|
||||
|
||||
### ENV
|
||||
|
||||
为了方便新程序运行,你可以使用 `ENV` 来为容器中安装的程序更新 `PATH` 环境变量。例如使用 `ENV PATH /usr/local/nginx/bin:$PATH` 来确保 `CMD ["nginx"]` 能正确运行。
|
||||
|
||||
`ENV` 指令也可用于为你想要容器化的服务提供必要的环境变量,比如 Postgres 需要的 `PGDATA`。
|
||||
|
||||
最后,`ENV` 也能用于设置常见的版本号,比如下面的示例:
|
||||
|
||||
```docker
|
||||
ENV PG_MAJOR 9.3
|
||||
|
||||
ENV PG_VERSION 9.3.4
|
||||
|
||||
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
|
||||
|
||||
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
|
||||
```
|
||||
|
||||
类似于程序中的常量,这种方法可以让你只需改变 `ENV` 指令来自动的改变容器中的软件版本。
|
||||
|
||||
### ADD 和 COPY
|
||||
|
||||
虽然 `ADD` 和 `COPY` 功能类似,但一般优先使用 `COPY`。因为它比 `ADD` 更透明。`COPY` 只支持简单将本地文件拷贝到容器中,而 `ADD` 有一些并不明显的功能(比如本地 tar 提取和远程 URL 支持)。因此,`ADD` 的最佳用例是将本地 tar 文件自动提取到镜像中,例如 `ADD rootfs.tar.xz`。
|
||||
|
||||
如果你的 `Dockerfile` 有多个步骤需要使用上下文中不同的文件。单独 `COPY` 每个文件,而不是一次性的 `COPY` 所有文件,这将保证每个步骤的构建缓存只在特定的文件变化时失效。例如:
|
||||
|
||||
```docker
|
||||
COPY requirements.txt /tmp/
|
||||
|
||||
RUN pip install --requirement /tmp/requirements.txt
|
||||
|
||||
COPY . /tmp/
|
||||
```
|
||||
|
||||
如果将 `COPY . /tmp/` 放置在 `RUN` 指令之前,只要 `.` 目录中任何一个文件变化,都会导致后续指令的缓存失效。
|
||||
|
||||
为了让镜像尽量小,最好不要使用 `ADD` 指令从远程 URL 获取包,而是使用 `curl` 和 `wget`。这样你可以在文件提取完之后删掉不再需要的文件来避免在镜像中额外添加一层。比如尽量避免下面的用法:
|
||||
|
||||
```docker
|
||||
ADD http://example.com/big.tar.xz /usr/src/things/
|
||||
|
||||
RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
|
||||
|
||||
RUN make -C /usr/src/things all
|
||||
```
|
||||
|
||||
而是应该使用下面这种方法:
|
||||
|
||||
```docker
|
||||
RUN mkdir -p /usr/src/things \
|
||||
&& curl -SL http://example.com/big.tar.xz \
|
||||
| tar -xJC /usr/src/things \
|
||||
&& make -C /usr/src/things all
|
||||
```
|
||||
|
||||
上面使用的管道操作,所以没有中间文件需要删除。
|
||||
|
||||
对于其他不需要 `ADD` 的自动提取功能的文件或目录,你应该使用 `COPY`。
|
||||
|
||||
### ENTRYPOINT
|
||||
|
||||
`ENTRYPOINT` 的最佳用处是设置镜像的主命令,允许将镜像当成命令本身来运行(用 `CMD` 提供默认选项)。
|
||||
|
||||
例如,下面的示例镜像提供了命令行工具 `s3cmd`:
|
||||
|
||||
```docker
|
||||
ENTRYPOINT ["s3cmd"]
|
||||
|
||||
CMD ["--help"]
|
||||
```
|
||||
|
||||
现在直接运行该镜像创建的容器会显示命令帮助:
|
||||
|
||||
```bash
|
||||
$ docker run s3cmd
|
||||
```
|
||||
|
||||
或者提供正确的参数来执行某个命令:
|
||||
|
||||
```bash
|
||||
$ docker run s3cmd ls s3://mybucket
|
||||
```
|
||||
|
||||
这样镜像名可以当成命令行的参考。
|
||||
|
||||
`ENTRYPOINT` 指令也可以结合一个辅助脚本使用,和前面命令行风格类似,即使启动工具需要不止一个步骤。
|
||||
|
||||
例如,`Postgres` 官方镜像使用下面的脚本作为 `ENTRYPOINT`:
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
if [ "$1" = 'postgres' ]; then
|
||||
chown -R postgres "$PGDATA"
|
||||
|
||||
if [ -z "$(ls -A "$PGDATA")" ]; then
|
||||
gosu postgres initdb
|
||||
fi
|
||||
|
||||
exec gosu postgres "$@"
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
```
|
||||
|
||||
>注意:该脚本使用了 Bash 的内置命令 exec,所以最后运行的进程就是容器的 PID 为 1 的进程。这样,进程就可以接收到任何发送给容器的 Unix 信号了。
|
||||
|
||||
该辅助脚本被拷贝到容器,并在容器启动时通过 `ENTRYPOINT` 执行:
|
||||
|
||||
```docker
|
||||
COPY ./docker-entrypoint.sh /
|
||||
|
||||
ENTRYPOINT ["/docker-entrypoint.sh"]
|
||||
```
|
||||
|
||||
该脚本可以让用户用几种不同的方式和 `Postgres` 交互。
|
||||
|
||||
你可以很简单地启动 `Postgres`:
|
||||
|
||||
```bash
|
||||
$ docker run postgres
|
||||
```
|
||||
|
||||
也可以执行 `Postgres` 并传递参数:
|
||||
|
||||
```bash
|
||||
$ docker run postgres postgres --help
|
||||
```
|
||||
|
||||
最后,你还可以启动另外一个完全不同的工具,比如 `Bash`:
|
||||
|
||||
```bash
|
||||
$ docker run --rm -it postgres bash
|
||||
```
|
||||
|
||||
### VOLUME
|
||||
|
||||
`VOLUME` 指令用于暴露任何数据库存储文件,配置文件,或容器创建的文件和目录。强烈建议使用 `VOLUME` 来管理镜像中的可变部分和用户可以改变的部分。
|
||||
|
||||
### USER
|
||||
|
||||
如果某个服务不需要特权执行,建议使用 `USER` 指令切换到非 root 用户。先在 `Dockerfile` 中使用类似 `RUN groupadd -r postgres && useradd -r -g postgres postgres` 的指令创建用户和用户组。
|
||||
|
||||
>注意:在镜像中,用户和用户组每次被分配的 UID/GID 都是不确定的,下次重新构建镜像时被分配到的 UID/GID 可能会不一样。如果要依赖确定的 UID/GID,你应该显式的指定一个 UID/GID。
|
||||
|
||||
你应该避免使用 `sudo`,因为它不可预期的 TTY 和信号转发行为可能造成的问题比它能解决的问题还多。如果你真的需要和 `sudo` 类似的功能(例如,以 root 权限初始化某个守护进程,以非 root 权限执行它),你可以使用 [gosu](https://github.com/tianon/gosu)。
|
||||
|
||||
最后,为了减少层数和复杂度,避免频繁地使用 `USER` 来回切换用户。
|
||||
|
||||
### WORKDIR
|
||||
|
||||
为了清晰性和可靠性,你应该总是在 `WORKDIR` 中使用绝对路径。另外,你应该使用 `WORKDIR` 来替代类似于 `RUN cd ... && do-something` 的指令,后者难以阅读、排错和维护。
|
||||
|
||||
## 官方镜像示例
|
||||
|
||||
这些官方镜像的 Dockerfile 都是参考典范:https://github.com/docker-library/docs
|
@ -1,126 +1,13 @@
|
||||
# Docker 命令查询
|
||||
|
||||
## 基本语法
|
||||
Docker 命令有两大类,客户端命令和服务端命令。前者是主要的操作接口,后者用来启动 Docker daemon。
|
||||
|
||||
Docker 命令有两大类,客户端命令和服务端命令。前者是主要的操作接口,后者用来启动 Docker Daemon。
|
||||
|
||||
* 客户端命令:基本命令格式为 `docker [OPTIONS] COMMAND [arg...]`;
|
||||
* 服务端命令:基本命令格式为 `docker daemon [OPTIONS]`。
|
||||
|
||||
* 服务端命令:基本命令格式为 `dockerd [OPTIONS]`。
|
||||
|
||||
可以通过 `man docker` 或 `docker help` 来查看这些命令。
|
||||
|
||||
## 客户端命令选项
|
||||
|
||||
* --config="":指定客户端配置文件,默认为 `/.docker`;
|
||||
* -D=true|false:是否使用 debug 模式。默认不开启;
|
||||
* -H, --host=[]:指定命令对应 Docker daemon 的监听接口,可以为 unix 套接字(unix:///path/to/socket),文件句柄(fd://socketfd)或 tcp 套接字(tcp://[host[:port]]),默认为 unix:///var/run/docker.sock;
|
||||
* -l, --log-level="debug|info|warn|error|fatal":指定日志输出级别;
|
||||
* --tls=true|false:是否对 Docker daemon 启用 TLS 安全机制,默认为否;
|
||||
* --tlscacert= /.docker/ca.pem:TLS CA 签名的可信证书文件路径;
|
||||
* --tlscert= /.docker/cert.pem:TLS 可信证书文件路径;
|
||||
* --tlscert= /.docker/key.pem:TLS 密钥文件路径;
|
||||
* --tlsverify=true|false:启用 TLS 校验,默认为否。
|
||||
|
||||
## daemon 命令选项
|
||||
* --api-cors-header="":CORS 头部域,默认不允许 CORS,要允许任意的跨域访问,可以指定为 “*”;
|
||||
* --authorization-plugin="":载入认证的插件;
|
||||
* -b="":将容器挂载到一个已存在的网桥上。指定为 'none' 时则禁用容器的网络,与 --bip 选项互斥;
|
||||
* --bip="":让动态创建的 docker0 网桥采用给定的 CIDR 地址; 与 -b 选项互斥;
|
||||
* --cgroup-parent="":指定 cgroup 的父组,默认 fs cgroup 驱动为 `/docker`,systemd cgroup 驱动为 `system.slice`;
|
||||
* --cluster-store="":构成集群(如 Swarm)时,集群键值数据库服务地址;
|
||||
* --cluster-advertise="":构成集群时,自身的被访问地址,可以为 `host:port` 或 `interface:port`;
|
||||
* --cluster-store-opt="":构成集群时,键值数据库的配置选项;
|
||||
* --config-file="/etc/docker/daemon.json":daemon 配置文件路径;
|
||||
* --containerd="":containerd 文件的路径;
|
||||
* -D, --debug=true|false:是否使用 Debug 模式。缺省为 false;
|
||||
* --default-gateway="":容器的 IPv4 网关地址,必须在网桥的子网段内;
|
||||
* --default-gateway-v6="":容器的 IPv6 网关地址;
|
||||
* --default-ulimit=[]:默认的 ulimit 值;
|
||||
* --disable-legacy-registry=true|false:是否允许访问旧版本的镜像仓库服务器;
|
||||
* --dns="":指定容器使用的 DNS 服务器地址;
|
||||
* --dns-opt="":DNS 选项;
|
||||
* --dns-search=[]:DNS 搜索域;
|
||||
* --exec-opt=[]:运行时的执行选项;
|
||||
* --exec-root="":容器执行状态文件的根路径,默认为 `/var/run/docker`;
|
||||
* --fixed-cidr="":限定分配 IPv4 地址范围;
|
||||
* --fixed-cidr-v6="":限定分配 IPv6 地址范围;
|
||||
* -G, --group="":分配给 unix 套接字的组,默认为 `docker`;
|
||||
* -g, --graph="":Docker 运行时的根路径,默认为 `/var/lib/docker`;
|
||||
* -H, --host=[]:指定命令对应 Docker daemon 的监听接口,可以为 unix 套接字(unix:///path/to/socket),文件句柄(fd://socketfd)或 tcp 套接字(tcp://[host[:port]]),默认为 unix:///var/run/docker.sock;
|
||||
* --icc=true|false:是否启用容器间以及跟 daemon 所在主机的通信。默认为 true。
|
||||
* --insecure-registry=[]:允许访问给定的非安全仓库服务;
|
||||
* --ip="":绑定容器端口时候的默认 IP 地址。缺省为 0.0.0.0;
|
||||
* --ip-forward=true|false:是否检查启动在 Docker 主机上的启用 IP 转发服务,默认开启。注意关闭该选项将不对系统转发能力进行任何检查修改;
|
||||
* --ip-masq=true|false:是否进行地址伪装,用于容器访问外部网络,默认开启;
|
||||
* --iptables=true|false:是否允许 Docker 添加 iptables 规则。缺省为 true;
|
||||
* --ipv6=true|false:是否启用 IPv6 支持,默认关闭;
|
||||
* -l, --log-level="debug|info|warn|error|fatal":指定日志输出级别;
|
||||
* --label="[]":添加指定的键值对标注;
|
||||
* --log-driver="json-file|syslog|journald|gelf|fluentd|awslogs|splunk|etwlogs|gcplogs|none":指定日志后端驱动,默认为 json-file;
|
||||
* --log-opt=[]:日志后端的选项;
|
||||
* --mtu=VALUE:指定容器网络的 mtu;
|
||||
* -p="":指定 daemon 的 PID 文件路径。缺省为 `/var/run/docker.pid`;
|
||||
* --raw-logs:输出原始,未加色彩的日志信息;
|
||||
* --registry-mirror=<scheme>://<host>:指定 `docker pull` 时使用的注册服务器镜像地址;
|
||||
* -s, --storage-driver="":指定使用给定的存储后端;
|
||||
* --selinux-enabled=true|false:是否启用 SELinux 支持。缺省值为 false。SELinux 目前尚不支持 overlay 存储驱动;
|
||||
* --storage-opt=[]:驱动后端选项;
|
||||
* --tls=true|false:是否对 Docker daemon 启用 TLS 安全机制,默认为否;
|
||||
* --tlscacert= /.docker/ca.pem:TLS CA 签名的可信证书文件路径;
|
||||
* --tlscert= /.docker/cert.pem:TLS 可信证书文件路径;
|
||||
* --tlscert= /.docker/key.pem:TLS 密钥文件路径;
|
||||
* --tlsverify=true|false:启用 TLS 校验,默认为否;
|
||||
* --userland-proxy=true|false:是否使用用户态代理来实现容器间和出容器的回环通信,默认为 true;
|
||||
* --userns-remap=default|uid:gid|user:group|user|uid:指定容器的用户命名空间,默认是创建新的 UID 和 GID 映射到容器内进程。
|
||||
|
||||
## 客户端命令
|
||||
|
||||
可以通过 `man docker-COMMAND` 或 `docker help COMMAND` 来查看这些命令的具体用法。
|
||||
|
||||
* attach:依附到一个正在运行的容器中;
|
||||
* build:从一个 Dockerfile 创建一个镜像;
|
||||
* commit:从一个容器的修改中创建一个新的镜像;
|
||||
* cp:在容器和本地宿主系统之间复制文件中;
|
||||
* create:创建一个新容器,但并不运行它;
|
||||
* diff:检查一个容器内文件系统的修改,包括修改和增加;
|
||||
* events:从服务端获取实时的事件;
|
||||
* exec:在运行的容器内执行命令;
|
||||
* export:导出容器内容为一个 tar 包;
|
||||
* history:显示一个镜像的历史信息;
|
||||
* images:列出存在的镜像;
|
||||
* import:导入一个文件(典型为 tar 包)路径或目录来创建一个本地镜像;
|
||||
* info:显示一些相关的系统信息;
|
||||
* inspect:显示一个容器的具体配置信息;
|
||||
* kill:关闭一个运行中的容器 (包括进程和所有相关资源);
|
||||
* load:从一个 tar 包中加载一个镜像;
|
||||
* login:注册或登录到一个 Docker 的仓库服务器;
|
||||
* logout:从 Docker 的仓库服务器登出;
|
||||
* logs:获取容器的 log 信息;
|
||||
* network:管理 Docker 的网络,包括查看、创建、删除、挂载、卸载等;
|
||||
* node:管理 swarm 集群中的节点,包括查看、更新、删除、提升/取消管理节点等;
|
||||
* pause:暂停一个容器中的所有进程;
|
||||
* port:查找一个 nat 到一个私有网口的公共口;
|
||||
* ps:列出主机上的容器;
|
||||
* pull:从一个Docker的仓库服务器下拉一个镜像或仓库;
|
||||
* push:将一个镜像或者仓库推送到一个 Docker 的注册服务器;
|
||||
* rename:重命名一个容器;
|
||||
* restart:重启一个运行中的容器;
|
||||
* rm:删除给定的若干个容器;
|
||||
* rmi:删除给定的若干个镜像;
|
||||
* run:创建一个新容器,并在其中运行给定命令;
|
||||
* save:保存一个镜像为 tar 包文件;
|
||||
* search:在 Docker index 中搜索一个镜像;
|
||||
* service:管理 Docker 所启动的应用服务,包括创建、更新、删除等;
|
||||
* start:启动一个容器;
|
||||
* stats:输出(一个或多个)容器的资源使用统计信息;
|
||||
* stop:终止一个运行中的容器;
|
||||
* swarm:管理 Docker swarm 集群,包括创建、加入、退出、更新等;
|
||||
* tag:为一个镜像打标签;
|
||||
* top:查看一个容器中的正在运行的进程信息;
|
||||
* unpause:将一个容器内所有的进程从暂停状态中恢复;
|
||||
* update:更新指定的若干容器的配置信息;
|
||||
* version:输出 Docker 的版本信息;
|
||||
* volume:管理 Docker volume,包括查看、创建、删除等;
|
||||
* wait:阻塞直到一个容器终止,然后输出它的退出符。
|
||||
|
||||
## 一张图总结 Docker 的命令
|
||||

|
||||
接下来的小节对这两个命令进行介绍。
|
||||
|
70
appendix/command/docker.md
Normal file
@ -0,0 +1,70 @@
|
||||
# 客户端命令(docker)
|
||||
|
||||
## 客户端命令选项
|
||||
|
||||
* `--config=""`:指定客户端配置文件,默认为 `~/.docker`;
|
||||
* `-D=true|false`:是否使用 debug 模式。默认不开启;
|
||||
* `-H, --host=[]`:指定命令对应 Docker 守护进程的监听接口,可以为 unix 套接字 `unix:///path/to/socket`,文件句柄 `fd://socketfd` 或 tcp 套接字 `tcp://[host[:port]]`,默认为 `unix:///var/run/docker.sock`;
|
||||
* `-l, --log-level="debug|info|warn|error|fatal"`:指定日志输出级别;
|
||||
* `--tls=true|false`:是否对 Docker 守护进程启用 TLS 安全机制,默认为否;
|
||||
* `--tlscacert=/.docker/ca.pem`:TLS CA 签名的可信证书文件路径;
|
||||
* `--tlscert=/.docker/cert.pem`:TLS 可信证书文件路径;
|
||||
* `--tlscert=/.docker/key.pem`:TLS 密钥文件路径;
|
||||
* `--tlsverify=true|false`:启用 TLS 校验,默认为否。
|
||||
|
||||
## 客户端命令
|
||||
|
||||
可以通过 `docker COMMAND --help` 来查看这些命令的具体用法。
|
||||
|
||||
* `attach`:依附到一个正在运行的容器中;
|
||||
* `build`:从一个 Dockerfile 创建一个镜像;
|
||||
* `commit`:从一个容器的修改中创建一个新的镜像;
|
||||
* `cp`:在容器和本地宿主系统之间复制文件中;
|
||||
* `create`:创建一个新容器,但并不运行它;
|
||||
* `diff`:检查一个容器内文件系统的修改,包括修改和增加;
|
||||
* `events`:从服务端获取实时的事件;
|
||||
* `exec`:在运行的容器内执行命令;
|
||||
* `export`:导出容器内容为一个 `tar` 包;
|
||||
* `history`:显示一个镜像的历史信息;
|
||||
* `images`:列出存在的镜像;
|
||||
* `import`:导入一个文件(典型为 `tar` 包)路径或目录来创建一个本地镜像;
|
||||
* `info`:显示一些相关的系统信息;
|
||||
* `inspect`:显示一个容器的具体配置信息;
|
||||
* `kill`:关闭一个运行中的容器 (包括进程和所有相关资源);
|
||||
* `load`:从一个 tar 包中加载一个镜像;
|
||||
* `login`:注册或登录到一个 Docker 的仓库服务器;
|
||||
* `logout`:从 Docker 的仓库服务器登出;
|
||||
* `logs`:获取容器的 log 信息;
|
||||
* `network`:管理 Docker 的网络,包括查看、创建、删除、挂载、卸载等;
|
||||
* `node`:管理 swarm 集群中的节点,包括查看、更新、删除、提升/取消管理节点等;
|
||||
* `pause`:暂停一个容器中的所有进程;
|
||||
* `port`:查找一个 nat 到一个私有网口的公共口;
|
||||
* `ps`:列出主机上的容器;
|
||||
* `pull`:从一个Docker的仓库服务器下拉一个镜像或仓库;
|
||||
* `push`:将一个镜像或者仓库推送到一个 Docker 的注册服务器;
|
||||
* `rename`:重命名一个容器;
|
||||
* `restart`:重启一个运行中的容器;
|
||||
* `rm`:删除给定的若干个容器;
|
||||
* `rmi`:删除给定的若干个镜像;
|
||||
* `run`:创建一个新容器,并在其中运行给定命令;
|
||||
* `save`:保存一个镜像为 tar 包文件;
|
||||
* `search`:在 Docker index 中搜索一个镜像;
|
||||
* `service`:管理 Docker 所启动的应用服务,包括创建、更新、删除等;
|
||||
* `start`:启动一个容器;
|
||||
* `stats`:输出(一个或多个)容器的资源使用统计信息;
|
||||
* `stop`:终止一个运行中的容器;
|
||||
* `swarm`:管理 Docker swarm 集群,包括创建、加入、退出、更新等;
|
||||
* `tag`:为一个镜像打标签;
|
||||
* `top`:查看一个容器中的正在运行的进程信息;
|
||||
* `unpause`:将一个容器内所有的进程从暂停状态中恢复;
|
||||
* `update`:更新指定的若干容器的配置信息;
|
||||
* `version`:输出 Docker 的版本信息;
|
||||
* `volume`:管理 Docker volume,包括查看、创建、删除等;
|
||||
* `wait`:阻塞直到一个容器终止,然后输出它的退出符。
|
||||
|
||||
## 一张图总结 Docker 的命令
|
||||

|
||||
|
||||
## 参考
|
||||
|
||||
* [官方文档](https://docs.docker.com/engine/reference/commandline/cli/)
|
58
appendix/command/dockerd.md
Normal file
@ -0,0 +1,58 @@
|
||||
# 服务端命令(dockerd)
|
||||
|
||||
## dockerd 命令选项
|
||||
|
||||
* `--api-cors-header=""`:CORS 头部域,默认不允许 CORS,要允许任意的跨域访问,可以指定为 "*";
|
||||
* `--authorization-plugin=""`:载入认证的插件;
|
||||
* `-b=""`:将容器挂载到一个已存在的网桥上。指定为 `none` 时则禁用容器的网络,与 `--bip` 选项互斥;
|
||||
* `--bip=""`:让动态创建的 `docker0` 网桥采用给定的 CIDR 地址; 与 `-b` 选项互斥;
|
||||
* `--cgroup-parent=""`:指定 cgroup 的父组,默认 fs cgroup 驱动为 `/docker`,systemd cgroup 驱动为 `system.slice`;
|
||||
* `--cluster-store=""`:构成集群(如 `Swarm`)时,集群键值数据库服务地址;
|
||||
* `--cluster-advertise=""`:构成集群时,自身的被访问地址,可以为 `host:port` 或 `interface:port`;
|
||||
* `--cluster-store-opt=""`:构成集群时,键值数据库的配置选项;
|
||||
* `--config-file="/etc/docker/daemon.json"`:daemon 配置文件路径;
|
||||
* `--containerd=""`:containerd 文件的路径;
|
||||
* `-D, --debug=true|false`:是否使用 Debug 模式。缺省为 false;
|
||||
* `--default-gateway=""`:容器的 IPv4 网关地址,必须在网桥的子网段内;
|
||||
* `--default-gateway-v6=""`:容器的 IPv6 网关地址;
|
||||
* `--default-ulimit=[]`:默认的 ulimit 值;
|
||||
* `--disable-legacy-registry=true|false`:是否允许访问旧版本的镜像仓库服务器;
|
||||
* `--dns=""`:指定容器使用的 DNS 服务器地址;
|
||||
* `--dns-opt=""`:DNS 选项;
|
||||
* `--dns-search=[]`:DNS 搜索域;
|
||||
* `--exec-opt=[]`:运行时的执行选项;
|
||||
* `--exec-root=""`:容器执行状态文件的根路径,默认为 `/var/run/docker`;
|
||||
* `--fixed-cidr=""`:限定分配 IPv4 地址范围;
|
||||
* `--fixed-cidr-v6=""`:限定分配 IPv6 地址范围;
|
||||
* `-G, --group=""`:分配给 unix 套接字的组,默认为 `docker`;
|
||||
* `-g, --graph=""`:Docker 运行时的根路径,默认为 `/var/lib/docker`;
|
||||
* `-H, --host=[]`:指定命令对应 Docker daemon 的监听接口,可以为 unix 套接字 `unix:///path/to/socket`,文件句柄 `fd://socketfd` 或 tcp 套接字 `tcp://[host[:port]]`,默认为 `unix:///var/run/docker.sock`;
|
||||
* `--icc=true|false`:是否启用容器间以及跟 daemon 所在主机的通信。默认为 true。
|
||||
* `--insecure-registry=[]`:允许访问给定的非安全仓库服务;
|
||||
* `--ip=""`:绑定容器端口时候的默认 IP 地址。缺省为 `0.0.0.0`;
|
||||
* `--ip-forward=true|false`:是否检查启动在 Docker 主机上的启用 IP 转发服务,默认开启。注意关闭该选项将不对系统转发能力进行任何检查修改;
|
||||
* `--ip-masq=true|false`:是否进行地址伪装,用于容器访问外部网络,默认开启;
|
||||
* `--iptables=true|false`:是否允许 Docker 添加 iptables 规则。缺省为 true;
|
||||
* `--ipv6=true|false`:是否启用 IPv6 支持,默认关闭;
|
||||
* `-l, --log-level="debug|info|warn|error|fatal"`:指定日志输出级别;
|
||||
* `--label="[]"`:添加指定的键值对标注;
|
||||
* `--log-driver="json-file|syslog|journald|gelf|fluentd|awslogs|splunk|etwlogs|gcplogs|none"`:指定日志后端驱动,默认为 `json-file`;
|
||||
* `--log-opt=[]`:日志后端的选项;
|
||||
* `--mtu=VALUE`:指定容器网络的 `mtu`;
|
||||
* `-p=""`:指定 daemon 的 PID 文件路径。缺省为 `/var/run/docker.pid`;
|
||||
* `--raw-logs`:输出原始,未加色彩的日志信息;
|
||||
* `--registry-mirror=<scheme>://<host>`:指定 `docker pull` 时使用的注册服务器镜像地址;
|
||||
* `-s, --storage-driver=""`:指定使用给定的存储后端;
|
||||
* `--selinux-enabled=true|false`:是否启用 SELinux 支持。缺省值为 false。SELinux 目前尚不支持 overlay 存储驱动;
|
||||
* `--storage-opt=[]`:驱动后端选项;
|
||||
* `--tls=true|false`:是否对 Docker daemon 启用 TLS 安全机制,默认为否;
|
||||
* `--tlscacert=/.docker/ca.pem`:TLS CA 签名的可信证书文件路径;
|
||||
* `--tlscert=/.docker/cert.pem`:TLS 可信证书文件路径;
|
||||
* `--tlscert=/.docker/key.pem`:TLS 密钥文件路径;
|
||||
* `--tlsverify=true|false`:启用 TLS 校验,默认为否;
|
||||
* `--userland-proxy=true|false`:是否使用用户态代理来实现容器间和出容器的回环通信,默认为 true;
|
||||
* `--userns-remap=default|uid:gid|user:group|user|uid`:指定容器的用户命名空间,默认是创建新的 UID 和 GID 映射到容器内进程。
|
||||
|
||||
## 参考
|
||||
|
||||
* [官方文档](https://docs.docker.com/engine/reference/commandline/dockerd/)
|
42
appendix/debug.md
Normal file
@ -0,0 +1,42 @@
|
||||
# 如何调试 Docker
|
||||
|
||||
## 开启 Debug 模式
|
||||
|
||||
在 dockerd 配置文件 daemon.json(默认位于 /etc/docker/)中添加
|
||||
|
||||
```json
|
||||
{
|
||||
"debug": true
|
||||
}
|
||||
```
|
||||
|
||||
重启守护进程。
|
||||
|
||||
```bash
|
||||
$ sudo kill -SIGHUP $(pidof dockerd)
|
||||
```
|
||||
|
||||
此时 dockerd 会在日志中输入更多信息供分析。
|
||||
|
||||
## 检查内核日志
|
||||
|
||||
```bash
|
||||
$ sudo dmesg |grep dockerd
|
||||
$ sudo dmesg |grep runc
|
||||
```
|
||||
|
||||
## Docker 不响应时处理
|
||||
|
||||
可以杀死 dockerd 进程查看其堆栈调用情况。
|
||||
|
||||
```bash
|
||||
$ sudo kill -SIGUSR1 $(pidof dockerd)
|
||||
```
|
||||
|
||||
## 重置 Docker 本地数据
|
||||
|
||||
*注意,本操作会移除所有的 Docker 本地数据,包括镜像和容器等。*
|
||||
|
||||
```bash
|
||||
$ sudo rm -rf /var/lib/docker
|
||||
```
|
@ -1,99 +1,118 @@
|
||||
# 常见问题总结
|
||||
|
||||
## 镜像相关
|
||||
### 如何批量清理临时镜像文件
|
||||
答:可以使用 `docker rmi $(docker images -q -f dangling=true)` 命令。
|
||||
|
||||
### 如何批量清理临时镜像文件?
|
||||
|
||||
答:可以使用 `docker image prune` 命令。
|
||||
|
||||
### 如何查看镜像支持的环境变量?
|
||||
|
||||
答:可以使用 `docker run IMAGE env` 命令。
|
||||
|
||||
### 本地的镜像文件都存放在哪里?
|
||||
答:与 Docker 相关的本地资源都存放在 `/var/lib/docker/` 目录下,以 aufs 文件系统为例,其中 container 目录存放容器信息,graph 目录存放镜像信息,aufs 目录下存放具体的镜像层文件。
|
||||
|
||||
答:与 Docker 相关的本地资源默认存放在 `/var/lib/docker/` 目录下,以 `overlay2` 文件系统为例,其中 `containers` 目录存放容器信息,`image` 目录存放镜像信息,`overlay2` 目录下存放具体的镜像层文件。
|
||||
|
||||
### 构建 Docker 镜像应该遵循哪些原则?
|
||||
|
||||
答:整体原则上,尽量保持镜像功能的明确和内容的精简,要点包括
|
||||
|
||||
* 尽量选取满足需求但较小的基础系统镜像,例如大部分时候可以选择 debian:wheezy 或 debian:jessie 镜像,仅有不足百兆大小;
|
||||
* 尽量选取满足需求但较小的基础系统镜像,例如大部分时候可以选择 `alpine` 镜像,仅有不足六兆大小;
|
||||
|
||||
* 清理编译生成文件、安装包的缓存等临时文件;
|
||||
|
||||
* 安装各个软件时候要指定准确的版本号,并避免引入不需要的依赖;
|
||||
|
||||
* 从安全角度考虑,应用要尽量使用系统的库和依赖;
|
||||
|
||||
* 如果安装应用时候需要配置一些特殊的环境变量,在安装后要还原不需要保持的变量值;
|
||||
|
||||
* 使用 Dockerfile 创建镜像时候要添加 .dockerignore 文件或使用干净的工作目录。
|
||||
|
||||
更多内容请查看 [Dockerfile 最佳实践](../best_practices.md)
|
||||
|
||||
### 碰到网络问题,无法 pull 镜像,命令行指定 http_proxy 无效?
|
||||
|
||||
答:在 Docker 配置文件中添加 `export http_proxy="http://<PROXY_HOST>:<PROXY_PORT>"`,之后重启 Docker 服务即可。
|
||||
|
||||
## 容器相关
|
||||
### 容器退出后,通过 docker ps 命令查看不到,数据会丢失么?
|
||||
答:容器退出后会处于终止(exited)状态,此时可以通过 `docker ps -a` 查看。其中的数据也不会丢失,还可以通过 `docker start` 命令来启动它。只有删除掉容器才会清除所有数据。
|
||||
|
||||
### 如何停止所有正在运行的容器
|
||||
答:可以使用 `docker kill $(docker ps -q)` 命令。
|
||||
### 容器退出后,通过 docker container ls 命令查看不到,数据会丢失么?
|
||||
|
||||
### 如何清理批量后台停止的容器?
|
||||
答:可以使用 `docker rm -f $(docker ps -qa)` 命令。
|
||||
答:容器退出后会处于终止(exited)状态,此时可以通过 `docker container ls -a` 查看。其中的数据也不会丢失,还可以通过 `docker start` 命令来启动它。只有删除掉容器才会清除所有数据。
|
||||
|
||||
### 如何停止所有正在运行的容器?
|
||||
|
||||
答:可以使用 `docker stop $(docker container ls -q)` 命令。
|
||||
|
||||
### 如何批量清理已经停止的容器?
|
||||
|
||||
答:可以使用 `docker container prune` 命令。
|
||||
|
||||
### 如何获取某个容器的 PID 信息?
|
||||
答:可以使用 `docker inspect --format '{{ .State.Pid }}' <CONTAINER ID or NAME>` 命令。
|
||||
|
||||
答:可以使用
|
||||
|
||||
```bash
|
||||
docker inspect --format '{{ .State.Pid }}' <CONTAINER ID or NAME>
|
||||
```
|
||||
|
||||
### 如何获取某个容器的 IP 地址?
|
||||
答:可以使用 `docker inspect --format '{{ .NetworkSettings.IPAddress }}' <CONTAINER ID or NAME>` 命令
|
||||
|
||||
答:可以使用
|
||||
```bash
|
||||
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <CONTAINER ID or NAME>
|
||||
```
|
||||
|
||||
### 如何给容器指定一个固定 IP 地址,而不是每次重启容器 IP 地址都会变?
|
||||
答:目前 Docker 并没有提供直接的对容器 IP 地址的管理支持,用户可以考虑参考第三部分中高级网络配置章节中介绍的创建点对点连接例子,来手动配置容器的静态 IP。或者在启动容器后,再手动进行修改(可参考其它类的问题 “*如何进入 Docker 容器的网络命名空间?*”)。
|
||||
|
||||
答:使用以下命令启动容器可以使容器 IP 固定不变
|
||||
|
||||
```bash
|
||||
$ docker network create -d bridge --subnet 172.25.0.0/16 my-net
|
||||
|
||||
$ docker run --network=my-net --ip=172.25.3.3 -itd --name=my-container busybox
|
||||
```
|
||||
|
||||
### 如何临时退出一个正在交互的容器的终端,而不终止它?
|
||||
|
||||
答:按 `Ctrl-p Ctrl-q`。如果按 `Ctrl-c` 往往会让容器内应用进程终止,进而会终止容器。
|
||||
|
||||
### 使用 `docker port` 命令映射容器的端口时,系统报错“Error: No public port '80' published for xxx”?
|
||||
|
||||
答:
|
||||
|
||||
* 创建镜像时 Dockerfile 要通过 EXPOSE 指定正确的开放端口;
|
||||
* 创建镜像时 `Dockerfile` 要通过 `EXPOSE` 指定正确的开放端口;
|
||||
|
||||
* 容器启动时指定 `PublishAllPort = true`。
|
||||
|
||||
### 可以在一个容器中同时运行多个应用进程么?
|
||||
答:一般并不推荐在同一个容器内运行多个应用进程。如果有类似需求,可以通过一些额外的进程管理机制,比如 supervisord 来管理所运行的进程。可以参考 https://docs.docker.com/articles/using_supervisord/。
|
||||
|
||||
答:一般并不推荐在同一个容器内运行多个应用进程。如果有类似需求,可以通过一些额外的进程管理机制,比如 `supervisord` 来管理所运行的进程。可以参考 https://docs.docker.com/config/containers/multi-service_container/ 。
|
||||
|
||||
### 如何控制容器占用系统资源(CPU、内存)的份额?
|
||||
|
||||
答:在使用 `docker create` 命令创建容器或使用 `docker run` 创建并启动容器的时候,可以使用 -c|--cpu-shares[=0] 参数来调整容器使用 CPU 的权重;使用 -m|--memory[=MEMORY] 参数来调整容器使用内存的大小。
|
||||
|
||||
## 仓库相关
|
||||
|
||||
### 仓库(Repository)、注册服务器(Registry)、注册索引(Index) 有何关系?
|
||||
|
||||
首先,仓库是存放一组关联镜像的集合,比如同一个应用的不同版本的镜像。
|
||||
|
||||
注册服务器是存放实际的镜像文件的地方。注册索引则负责维护用户的账号、权限、搜索、标签等的管理。因此,注册服务器利用注册索引来实现认证等管理。
|
||||
|
||||
### 从非官方仓库(例如 non-official-repo.com)下载镜像时候,有时候会提示“Error: Invalid registry endpoint https://non-official-repo.com/v1/……”?
|
||||
答:Docker 自 1.3.0 版本往后,加强了对镜像安全性的验证,需要添加私有仓库证书,或者手动添加对非官方仓库的信任。
|
||||
编辑 Docker 配置文件,在其中添加:
|
||||
|
||||
```sh
|
||||
DOCKER_OPTS="--insecure-registry non-official-repo"
|
||||
```
|
||||
之后,重启 Docker 服务即可。
|
||||
|
||||
## 配置相关
|
||||
|
||||
### Docker 的配置文件放在哪里,如何修改配置?
|
||||
答:使用 upstart 的系统(如Ubuntu 14.04)的配置文件在 `/etc/default/docker`,使用systemd 的系统(如 Ubuntu 16.04、Centos 等)的配置文件在 `/etc/systemd/system/docker.service.d/docker.conf`。
|
||||
|
||||
Ubuntu 下面的配置文件内容如下,读者可以参考配。(如果出现该文件不存在的情况,重启或者自己新建一个文件都可以解决。)
|
||||
答:使用 `systemd` 的系统(如 Ubuntu 16.04、Centos 等)的配置文件在 `/etc/docker/daemon.json`。
|
||||
|
||||
```sh
|
||||
# Customize location of Docker binary (especially for development testing).
|
||||
#DOCKERD="/usr/local/bin/dockerd"
|
||||
|
||||
# Use DOCKER_OPTS to modify the daemon startup options.
|
||||
#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
|
||||
|
||||
# If you need Docker to use an HTTP proxy, it can also be specified here.
|
||||
#export http_proxy="http://127.0.0.1:3128/"
|
||||
|
||||
# This is also a handy place to tweak where Docker's temporary files go.
|
||||
#export TMPDIR="/mnt/bigdrive/docker-tmp"
|
||||
```
|
||||
|
||||
### 如何更改 Docker 的默认存储位置?
|
||||
答:Docker 的默认存储位置是 `/var/lib/docker`,如果希望将 Docker 的本地文件存储到其他分区,可以使用 Linux 软连接的方式来完成,或者在启动 daemon 时通过 `-g` 参数指定。
|
||||
|
||||
答:Docker 的默认存储位置是 `/var/lib/docker`,如果希望将 Docker 的本地文件存储到其他分区,可以使用 Linux 软连接的方式来完成,或者在启动 daemon 时通过 `-g` 参数指定,或者修改配置文件 `/etc/docker/daemon.json` 的 "data-root" 项 。可以使用 `docker system info | grep "Root Dir"` 查看当前使用的存储位置。
|
||||
|
||||
例如,如下操作将默认存储位置迁移到 /storage/docker。
|
||||
|
||||
@ -114,24 +133,29 @@ lrwxrwxrwx. 1 root root 15 11月 17 13:43 docker -> /storage/docker
|
||||
[root@s26 lib]# service docker start
|
||||
```
|
||||
|
||||
### 使用内存和 swap 限制启动容器时候报警告:“WARNING: Your kernel does not support cgroup swap limit. WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.”?
|
||||
### 使用内存和 swap 限制启动容器时候报警告:"WARNING: Your kernel does not support cgroup swap limit. WARNING: Your kernel does not support swap limit capabilities. Limitation discarded."?
|
||||
|
||||
答:这是因为系统默认没有开启对内存和 swap 使用的统计功能,引入该功能会带来性能的下降。要开启该功能,可以采取如下操作:
|
||||
|
||||
* 编辑 `/etc/default/grub` 文件(Ubuntu 系统为例),配置 `GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"`;
|
||||
* 更新 grub:`$ sudo update-grub`;
|
||||
* 编辑 `/etc/default/grub` 文件(Ubuntu 系统为例),配置 `GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"`
|
||||
|
||||
* 更新 grub:`$ sudo update-grub`
|
||||
|
||||
* 重启系统,即可。
|
||||
|
||||
## Docker 与虚拟化
|
||||
|
||||
### Docker 与 LXC(Linux Container)有何不同?
|
||||
|
||||
答:LXC 利用 Linux 上相关技术实现了容器。Docker 则在如下的几个方面进行了改进:
|
||||
* 移植性:通过抽象容器配置,容器可以实现从一个平台移植到另一个平台;
|
||||
* 镜像系统:基于 AUFS 的镜像系统为容器的分发带来了很多的便利,同时共同的镜像层只需要存储一份,实现高效率的存储;
|
||||
* 镜像系统:基于 OverlayFS 的镜像系统为容器的分发带来了很多的便利,同时共同的镜像层只需要存储一份,实现高效率的存储;
|
||||
* 版本管理:类似于Git的版本管理理念,用户可以更方便的创建、管理镜像文件;
|
||||
* 仓库系统:仓库系统大大降低了镜像的分发和管理的成本;
|
||||
* 周边工具:各种现有工具(配置管理、云平台)对 Docker 的支持,以及基于 Docker的 PaaS、CI 等系统,让 Docker 的应用更加方便和多样化。
|
||||
|
||||
### Docker 与 Vagrant 有何不同?
|
||||
|
||||
答:两者的定位完全不同。
|
||||
|
||||
* Vagrant 类似 Boot2Docker(一款运行 Docker 的最小内核),是一套虚拟机的管理环境。Vagrant 可以在多种系统上和虚拟机软件中运行,可以在 Windows,Mac 等非 Linux 平台上为 Docker 提供支持,自身具有较好的包装性和移植性。
|
||||
@ -141,52 +165,57 @@ lrwxrwxrwx. 1 root root 15 11月 17 13:43 docker -> /storage/docker
|
||||
简单说:Vagrant 适合用来管理虚拟机,而 Docker 适合用来管理应用环境。
|
||||
|
||||
### 开发环境中 Docker 和 Vagrant 该如何选择?
|
||||
答:
|
||||
Docker 不是虚拟机,而是进程隔离,对于资源的消耗很少,但是目前需要 Linux 环境支持。Vagrant 是虚拟机上做的封装,虚拟机本身会消耗资源。
|
||||
|
||||
答:Docker 不是虚拟机,而是进程隔离,对于资源的消耗很少,但是目前需要 Linux 环境支持。Vagrant 是虚拟机上做的封装,虚拟机本身会消耗资源。
|
||||
|
||||
如果本地使用的 Linux 环境,推荐都使用 Docker。
|
||||
|
||||
如果本地使用的是 OSX 或者 Windows 环境,那就需要开虚拟机,单一开发环境下 Vagrant 更简单;多环境开发下推荐在 Vagrant 里面再使用 Docker 进行环境隔离。
|
||||
如果本地使用的是 macOS 或者 Windows 环境,那就需要开虚拟机,单一开发环境下 Vagrant 更简单;多环境开发下推荐在 Vagrant 里面再使用 Docker 进行环境隔离。
|
||||
|
||||
## 其它
|
||||
|
||||
### Docker 能在非 Linux 平台(比如 Windows 或 MacOS)上运行么?
|
||||
答:可以。目前需要使用 docker for mac、boot2docker 等软件创建一个轻量级的 Linux 虚拟机层。
|
||||
### Docker 能在非 Linux 平台(比如 Windows 或 macOS )上运行么?
|
||||
|
||||
答:完全可以。安装方法请查看 [安装 Docker](../../install/) 一节
|
||||
|
||||
### 如何将一台宿主主机的 Docker 环境迁移到另外一台宿主主机?
|
||||
|
||||
### 如何将一台宿主主机的 docker 环境迁移到另外一台宿主主机
|
||||
答:停止 Docker 服务。将整个 Docker 存储文件夹复制到另外一台宿主主机,然后调整另外一台宿主主机的配置即可。
|
||||
|
||||
### 如何进入 Docker 容器的网络命名空间?
|
||||
|
||||
答:Docker 在创建容器后,删除了宿主主机上 `/var/run/netns` 目录中的相关的网络命名空间文件。因此,在宿主主机上是无法看到或访问容器的网络命名空间的。
|
||||
|
||||
用户可以通过如下方法来手动恢复它。
|
||||
|
||||
首先,使用下面的命令查看容器进程信息,比如这里的1234。
|
||||
首先,使用下面的命令查看容器进程信息,比如这里的 1234。
|
||||
|
||||
```sh
|
||||
```bash
|
||||
$ docker inspect --format='{{. State.Pid}} ' $container_id
|
||||
1234
|
||||
```
|
||||
接下来,在 /proc 目录下,把对应的网络命名空间文件链接到 /var/run/netns 目录。
|
||||
|
||||
```sh
|
||||
接下来,在 `/proc` 目录下,把对应的网络命名空间文件链接到 `/var/run/netns` 目录。
|
||||
|
||||
```bash
|
||||
$ sudo ln -s /proc/1234/ns/net /var/run/netns/
|
||||
```
|
||||
|
||||
然后,在宿主主机上就可以看到容器的网络命名空间信息。例如
|
||||
|
||||
```sh
|
||||
```bash
|
||||
$ sudo ip netns show
|
||||
1234
|
||||
```
|
||||
|
||||
此时,用户可以通过正常的系统命令来查看或操作容器的命名空间了。例如修改容器的 IP 地址信息为 `172.17.0.100/16`。
|
||||
|
||||
```sh
|
||||
```bash
|
||||
$ sudo ip netns exec 1234 ifconfig eth0 172.17.0.100/16
|
||||
```
|
||||
|
||||
### 如何获取容器绑定到本地那个 veth 接口上?
|
||||
|
||||
答:Docker 容器启动后,会通过 veth 接口对连接到本地网桥,veth 接口命名跟容器命名毫无关系,十分难以找到对应关系。
|
||||
|
||||
最简单的一种方式是通过查看接口的索引号,在容器中执行 `ip a` 命令,查看到本地接口最前面的接口索引号,如 `205`,将此值加上 1,即 `206`,然后在本地主机执行 `ip a` 命令,查找接口索引号为 `206` 的接口,两者即为连接的 veth 接口对。
|
||||
|
@ -1,2 +1,3 @@
|
||||
# 热门镜像介绍
|
||||
本章将介绍一些热门镜像的功能,使用方法和生成它们的 Dockerfile 等。包括 Ubuntu、CentOS、MySQL、MongoDB、Redis、Nginx、Wordpress、Node.js 等。
|
||||
|
||||
本章将介绍一些热门镜像的功能,使用方法等。包括 Ubuntu、CentOS、MySQL、MongoDB、Redis、Nginx、Wordpress、Node.js 等。
|
||||
|
@ -1,58 +1,20 @@
|
||||
## [CentOS](https://hub.docker.com/_/centos/)
|
||||
# [CentOS](https://hub.docker.com/_/centos)
|
||||
|
||||
## 基本信息
|
||||
|
||||
### 基本信息
|
||||
[CentOS](https://en.wikipedia.org/wiki/CentOS) 是流行的 Linux 发行版,其软件包大多跟 RedHat 系列保持一致。
|
||||
|
||||
该仓库位于 https://hub.docker.com/_/centos/,提供了 CentOS 从 5 ~ 7 各个版本的镜像。
|
||||
该仓库位于 `https://hub.docker.com/_/centos` ,提供了 CentOS 从 5 ~ 8 各个版本的镜像。
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 使用方法
|
||||
默认会启动一个最小化的 CentOS 环境。
|
||||
|
||||
```sh
|
||||
$ docker run --name some-centos -i -t centos bash
|
||||
```bash
|
||||
$ docker run --name centos -it centos bash
|
||||
bash-4.2#
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
## Dockerfile
|
||||
|
||||
#### CentOS 5 版本
|
||||
```
|
||||
FROM scratch
|
||||
MAINTAINER The CentOS Project <cloud-ops@centos.org>
|
||||
ADD c5-docker.tar.xz /
|
||||
LABEL name="CentOS Base Image" \
|
||||
vendor="CentOS" \
|
||||
license="GPLv2" \
|
||||
build-date="2016-03-31"
|
||||
|
||||
# Default command
|
||||
CMD ["/bin/bash"]
|
||||
```
|
||||
|
||||
#### CentOS 6 版本
|
||||
```
|
||||
FROM scratch
|
||||
MAINTAINER https://github.com/CentOS/sig-cloud-instance-images
|
||||
ADD centos-6-docker.tar.xz /
|
||||
|
||||
LABEL name="CentOS Base Image" \
|
||||
vendor="CentOS" \
|
||||
license="GPLv2" \
|
||||
build-date="20160729"
|
||||
|
||||
CMD ["/bin/bash"]
|
||||
```
|
||||
|
||||
#### CentOS 7 版本
|
||||
```
|
||||
FROM scratch
|
||||
MAINTAINER https://github.com/CentOS/sig-cloud-instance-images
|
||||
ADD centos-7-docker.tar.xz /
|
||||
|
||||
LABEL name="CentOS Base Image" \
|
||||
vendor="CentOS" \
|
||||
license="GPLv2" \
|
||||
build-date="20160729"
|
||||
|
||||
CMD ["/bin/bash"]
|
||||
```
|
||||
请到 https://github.com/docker-library/docs/tree/master/centos 查看。
|
||||
|
58
appendix/repo/minio.md
Normal file
@ -0,0 +1,58 @@
|
||||
# minio
|
||||
|
||||
**MinIO** 是一个基于 Apache License v2.0 开源协议的对象存储服务。它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几 kb 到最大 5T 不等。
|
||||
|
||||
MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。
|
||||
|
||||
[官方文档](https://docs.min.io/)
|
||||
|
||||
## 简单使用
|
||||
|
||||
测试、开发环境下不考虑数据存储的情况下可以使用下面的命令快速开启服务。
|
||||
|
||||
```bash
|
||||
$ docker run -d -p 9000:9000 -p 9090:9090 minio/minio server /data --console-address ':9090'
|
||||
```
|
||||
|
||||
## 离线部署
|
||||
|
||||
许多生产环境是一般是没有公网资源的,这就需要从有公网资源的服务器上把镜像导出,然后导入到需要运行镜像的内网服务器。
|
||||
|
||||
### 导出镜像
|
||||
|
||||
在有公网资源的服务器上下载好`minio/minio`镜像
|
||||
|
||||
```bash
|
||||
$ docker save -o minio.tar minio/minio:latest
|
||||
```
|
||||
|
||||
> 使用docker save 的时候,也可以使用image id 来导出,但是那样导出的时候,就会丢失原来的镜像名称,推荐,还是使用镜像名字+tag来导出镜像
|
||||
|
||||
### 导入镜像
|
||||
|
||||
把压缩文件复制到内网服务器上,使用下面的命令导入镜像
|
||||
|
||||
```bash
|
||||
$ docker load minio.tar
|
||||
```
|
||||
|
||||
### 运行 minio
|
||||
|
||||
- 把 `/mnt/data` 改成要替换的数据目录
|
||||
- 替换 `MINIO_ROOT_USER` 的值
|
||||
- 替换 `MINIO_ROOT_PASSWORD` 的值
|
||||
- 替换 name,minio1(可选)
|
||||
- 如果 9000、9090 端口冲突,替换端口前面的如 `9009:9000`
|
||||
|
||||
```bash
|
||||
$ sudo docker run -d -p 9000:9000 -p 9090:9090 --name minio1 \
|
||||
-e "MINIO_ROOT_USER=改成自己需要的" \
|
||||
-e "MINIO_ROOT_PASSWORD=改成自己需要的" \
|
||||
-v /mnt/data:/data \
|
||||
--restart=always \
|
||||
minio/minio server /data --console-address ':9090'
|
||||
```
|
||||
|
||||
### 访问 web 管理页面
|
||||
|
||||
http://x.x.x.x:9090
|
@ -1,263 +1,34 @@
|
||||
## [MongoDB](https://hub.docker.com/_/mongo/)
|
||||
# [MongoDB](https://hub.docker.com/_/mongo/)
|
||||
|
||||
## 基本信息
|
||||
|
||||
### 基本信息
|
||||
[MongoDB](https://en.wikipedia.org/wiki/MongoDB) 是开源的 NoSQL 数据库实现。
|
||||
|
||||
该仓库位于 https://hub.docker.com/_/mongo/,提供了 MongoDB 2.x ~ 3.x 各个版本的镜像。
|
||||
该仓库位于 `https://hub.docker.com/_/mongo/` ,提供了 MongoDB 2.x ~ 4.x 各个版本的镜像。
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 使用方法
|
||||
默认会在 `27017` 端口启动数据库。
|
||||
|
||||
```sh
|
||||
$ docker run --name some-mongo -d mongo
|
||||
```bash
|
||||
$ docker run --name mongo -d mongo
|
||||
```
|
||||
|
||||
使用其他应用连接到容器,可以用
|
||||
|
||||
```sh
|
||||
```bash
|
||||
$ docker run --name some-app --link some-mongo:mongo -d application-that-uses-mongo
|
||||
```
|
||||
|
||||
或者通过 `mongo`
|
||||
|
||||
```sh
|
||||
$ docker run -it --link some-mongo:mongo --rm mongo sh -c 'exec mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/test"'
|
||||
```bash
|
||||
$ docker run -it --rm \
|
||||
--link some-mongo:mongo \
|
||||
mongo \
|
||||
sh -c 'exec mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/test"'
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
## Dockerfile
|
||||
|
||||
#### 2.6 版本
|
||||
```
|
||||
FROM debian:wheezy
|
||||
|
||||
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
|
||||
RUN groupadd -r mongodb && useradd -r -g mongodb mongodb
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
ca-certificates wget \
|
||||
numactl \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# grab gosu for easy step-down from root
|
||||
ENV GOSU_VERSION 1.7
|
||||
RUN set -x \
|
||||
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \
|
||||
&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \
|
||||
&& export GNUPGHOME="$(mktemp -d)" \
|
||||
&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
|
||||
&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
|
||||
&& rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \
|
||||
&& chmod +x /usr/local/bin/gosu \
|
||||
&& gosu nobody true
|
||||
|
||||
ENV MONGO_VERSION 2.6.12
|
||||
|
||||
RUN set -x \
|
||||
&& wget -O mongo.tgz "https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-$MONGO_VERSION.tgz" \
|
||||
&& wget -O mongo.tgz.sig "https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-$MONGO_VERSION.tgz.sig" \
|
||||
&& export GNUPGHOME="$(mktemp -d)" \
|
||||
&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys DFFA3DCF326E302C4787673A01C4E7FAAAB2461C \
|
||||
&& gpg --batch --verify mongo.tgz.sig mongo.tgz \
|
||||
&& rm -r "$GNUPGHOME" mongo.tgz.sig \
|
||||
&& tar -xvf mongo.tgz -C /usr/local --strip-components=1 \
|
||||
&& rm mongo.tgz
|
||||
|
||||
RUN mkdir -p /data/db /data/configdb \
|
||||
&& chown -R mongodb:mongodb /data/db /data/configdb
|
||||
VOLUME /data/db /data/configdb
|
||||
|
||||
COPY docker-entrypoint.sh /entrypoint.sh
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
|
||||
EXPOSE 27017
|
||||
CMD ["mongod"]
|
||||
```
|
||||
|
||||
#### 3.0 版本
|
||||
```
|
||||
FROM debian:wheezy
|
||||
|
||||
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
|
||||
RUN groupadd -r mongodb && useradd -r -g mongodb mongodb
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
numactl \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# grab gosu for easy step-down from root
|
||||
ENV GOSU_VERSION 1.7
|
||||
RUN set -x \
|
||||
&& apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \
|
||||
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \
|
||||
&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \
|
||||
&& export GNUPGHOME="$(mktemp -d)" \
|
||||
&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
|
||||
&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
|
||||
&& rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \
|
||||
&& chmod +x /usr/local/bin/gosu \
|
||||
&& gosu nobody true \
|
||||
&& apt-get purge -y --auto-remove ca-certificates wget
|
||||
|
||||
# gpg: key 7F0CEB10: public key "Richard Kreuter <richard@10gen.com>" imported
|
||||
RUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys 492EAFE8CD016A07919F1D2B9ECBEC467F0CEB10
|
||||
|
||||
ENV MONGO_MAJOR 3.0
|
||||
ENV MONGO_VERSION 3.0.12
|
||||
|
||||
RUN echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/$MONGO_MAJOR main" > /etc/apt/sources.list.d/mongodb-org.list
|
||||
|
||||
RUN set -x \
|
||||
&& apt-get update \
|
||||
&& apt-get install -y \
|
||||
mongodb-org=$MONGO_VERSION \
|
||||
mongodb-org-server=$MONGO_VERSION \
|
||||
mongodb-org-shell=$MONGO_VERSION \
|
||||
mongodb-org-mongos=$MONGO_VERSION \
|
||||
mongodb-org-tools=$MONGO_VERSION \
|
||||
&& rm -rf /var/lib/apt/lists/* \
|
||||
&& rm -rf /var/lib/mongodb \
|
||||
&& mv /etc/mongod.conf /etc/mongod.conf.orig
|
||||
|
||||
RUN mkdir -p /data/db /data/configdb \
|
||||
&& chown -R mongodb:mongodb /data/db /data/configdb
|
||||
VOLUME /data/db /data/configdb
|
||||
|
||||
COPY docker-entrypoint.sh /entrypoint.sh
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
|
||||
EXPOSE 27017
|
||||
CMD ["mongod"]
|
||||
```
|
||||
|
||||
#### 3.2 版本
|
||||
|
||||
```
|
||||
FROM debian:wheezy
|
||||
|
||||
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
|
||||
RUN groupadd -r mongodb && useradd -r -g mongodb mongodb
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
numactl \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# grab gosu for easy step-down from root
|
||||
ENV GOSU_VERSION 1.7
|
||||
RUN set -x \
|
||||
&& apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \
|
||||
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \
|
||||
&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \
|
||||
&& export GNUPGHOME="$(mktemp -d)" \
|
||||
&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
|
||||
&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
|
||||
&& rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \
|
||||
&& chmod +x /usr/local/bin/gosu \
|
||||
&& gosu nobody true \
|
||||
&& apt-get purge -y --auto-remove ca-certificates wget
|
||||
|
||||
# pub 4096R/AAB2461C 2014-02-25 [expires: 2016-02-25]
|
||||
# Key fingerprint = DFFA 3DCF 326E 302C 4787 673A 01C4 E7FA AAB2 461C
|
||||
# uid MongoDB 2.6 Release Signing Key <packaging@mongodb.com>
|
||||
#
|
||||
# pub 4096R/EA312927 2015-10-09 [expires: 2017-10-08]
|
||||
# Key fingerprint = 42F3 E95A 2C4F 0827 9C49 60AD D68F A50F EA31 2927
|
||||
# uid MongoDB 3.2 Release Signing Key <packaging@mongodb.com>
|
||||
#
|
||||
ENV GPG_KEYS \
|
||||
DFFA3DCF326E302C4787673A01C4E7FAAAB2461C \
|
||||
42F3E95A2C4F08279C4960ADD68FA50FEA312927
|
||||
RUN set -ex \
|
||||
&& for key in $GPG_KEYS; do \
|
||||
apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
|
||||
done
|
||||
|
||||
ENV MONGO_MAJOR 3.2
|
||||
ENV MONGO_VERSION 3.2.8
|
||||
|
||||
RUN echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/$MONGO_MAJOR main" > /etc/apt/sources.list.d/mongodb-org.list
|
||||
|
||||
RUN set -x \
|
||||
&& apt-get update \
|
||||
&& apt-get install -y \
|
||||
mongodb-org=$MONGO_VERSION \
|
||||
mongodb-org-server=$MONGO_VERSION \
|
||||
mongodb-org-shell=$MONGO_VERSION \
|
||||
mongodb-org-mongos=$MONGO_VERSION \
|
||||
mongodb-org-tools=$MONGO_VERSION \
|
||||
&& rm -rf /var/lib/apt/lists/* \
|
||||
&& rm -rf /var/lib/mongodb \
|
||||
&& mv /etc/mongod.conf /etc/mongod.conf.orig
|
||||
|
||||
RUN mkdir -p /data/db /data/configdb \
|
||||
&& chown -R mongodb:mongodb /data/db /data/configdb
|
||||
VOLUME /data/db /data/configdb
|
||||
|
||||
COPY docker-entrypoint.sh /entrypoint.sh
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
|
||||
EXPOSE 27017
|
||||
CMD ["mongod"]
|
||||
```
|
||||
|
||||
#### 3.3 版本
|
||||
|
||||
```
|
||||
FROM debian:jessie
|
||||
|
||||
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
|
||||
RUN groupadd -r mongodb && useradd -r -g mongodb mongodb
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
numactl \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# grab gosu for easy step-down from root
|
||||
ENV GOSU_VERSION 1.7
|
||||
RUN set -x \
|
||||
&& apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \
|
||||
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \
|
||||
&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \
|
||||
&& export GNUPGHOME="$(mktemp -d)" \
|
||||
&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
|
||||
&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
|
||||
&& rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \
|
||||
&& chmod +x /usr/local/bin/gosu \
|
||||
&& gosu nobody true \
|
||||
&& apt-get purge -y --auto-remove ca-certificates wget
|
||||
|
||||
# pub 4096R/A15703C6 2016-01-11 [expires: 2018-01-10]
|
||||
# Key fingerprint = 0C49 F373 0359 A145 1858 5931 BC71 1F9B A157 03C6
|
||||
# uid MongoDB 3.4 Release Signing Key <packaging@mongodb.com>
|
||||
RUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys 0C49F3730359A14518585931BC711F9BA15703C6
|
||||
|
||||
ENV MONGO_MAJOR 3.3
|
||||
ENV MONGO_VERSION 3.3.10
|
||||
|
||||
RUN echo "deb http://repo.mongodb.org/apt/debian jessie/mongodb-org/$MONGO_MAJOR main" > /etc/apt/sources.list.d/mongodb-org.list
|
||||
|
||||
RUN set -x \
|
||||
&& apt-get update \
|
||||
&& apt-get install -y \
|
||||
mongodb-org-unstable=$MONGO_VERSION \
|
||||
mongodb-org-unstable-server=$MONGO_VERSION \
|
||||
mongodb-org-unstable-shell=$MONGO_VERSION \
|
||||
mongodb-org-unstable-mongos=$MONGO_VERSION \
|
||||
mongodb-org-unstable-tools=$MONGO_VERSION \
|
||||
&& rm -rf /var/lib/apt/lists/* \
|
||||
&& rm -rf /var/lib/mongodb \
|
||||
&& mv /etc/mongod.conf /etc/mongod.conf.orig
|
||||
|
||||
RUN mkdir -p /data/db /data/configdb \
|
||||
&& chown -R mongodb:mongodb /data/db /data/configdb
|
||||
VOLUME /data/db /data/configdb
|
||||
|
||||
COPY docker-entrypoint.sh /entrypoint.sh
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
|
||||
EXPOSE 27017
|
||||
CMD ["mongod"]
|
||||
```
|
||||
请到 https://github.com/docker-library/docs/tree/master/mongo 查看。
|
||||
|
@ -1,124 +1,34 @@
|
||||
## [MySQL](https://hub.docker.com/_/mysql/)
|
||||
# [MySQL](https://hub.docker.com/_/mysql/)
|
||||
|
||||
## 基本信息
|
||||
|
||||
### 基本信息
|
||||
[MySQL](https://en.wikipedia.org/wiki/MySQL) 是开源的关系数据库实现。
|
||||
|
||||
该仓库位于 https://hub.docker.com/_/mysql/,提供了 MySQL 各个版本的镜像,包括 5.6 系列、5.7 系列等。
|
||||
该仓库位于 `https://hub.docker.com/_/mysql/` ,提供了 MySQL 5.5 ~ 8.x 各个版本的镜像。
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 使用方法
|
||||
默认会在 `3306` 端口启动数据库。
|
||||
|
||||
```
|
||||
```bash
|
||||
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql
|
||||
```
|
||||
|
||||
之后就可以使用其它应用来连接到该容器。
|
||||
|
||||
```
|
||||
```bash
|
||||
$ docker run --name some-app --link some-mysql:mysql -d application-that-uses-mysql
|
||||
```
|
||||
或者通过 `mysql`。
|
||||
|
||||
```
|
||||
$ docker run -it --link some-mysql:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
|
||||
或者通过 `mysql` 命令行连接。
|
||||
|
||||
```bash
|
||||
$ docker run -it --rm \
|
||||
--link some-mysql:mysql \
|
||||
mysql \
|
||||
sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
#### 5.6 版本
|
||||
```
|
||||
FROM debian:wheezy
|
||||
## Dockerfile
|
||||
|
||||
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
|
||||
RUN groupadd -r mysql && useradd -r -g mysql mysql
|
||||
|
||||
# FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:
|
||||
# File::Basename
|
||||
# File::Copy
|
||||
# Sys::Hostname
|
||||
# Data::Dumper
|
||||
RUN apt-get update && apt-get install -y perl --no-install-recommends && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
|
||||
RUN apt-get update && apt-get install -y libaio1 && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# gpg: key 5072E1F5: public key "MySQL Release Engineering <mysql-build@oss.oracle.com>" imported
|
||||
RUN gpg --keyserver pgp.mit.edu --recv-keys A4A9406876FCBD3C456770C88C718D3B5072E1F5
|
||||
|
||||
ENV MYSQL_MAJOR 5.6
|
||||
ENV MYSQL_VERSION 5.6.20
|
||||
|
||||
# note: we're pulling the *.asc file from mysql.he.net instead of dev.mysql.com because the official mirror 404s that file for whatever reason - maybe it's at a different path?
|
||||
RUN apt-get update && apt-get install -y curl --no-install-recommends && rm -rf /var/lib/apt/lists/* \
|
||||
&& curl -SL "http://dev.mysql.com/get/Downloads/MySQL-$MYSQL_MAJOR/mysql-$MYSQL_VERSION-linux-glibc2.5-x86_64.tar.gz" -o mysql.tar.gz \
|
||||
&& curl -SL "http://mysql.he.net/Downloads/MySQL-$MYSQL_MAJOR/mysql-$MYSQL_VERSION-linux-glibc2.5-x86_64.tar.gz.asc" -o mysql.tar.gz.asc \
|
||||
&& apt-get purge -y --auto-remove curl \
|
||||
&& gpg --verify mysql.tar.gz.asc \
|
||||
&& mkdir /usr/local/mysql \
|
||||
&& tar -xzf mysql.tar.gz -C /usr/local/mysql --strip-components=1 \
|
||||
&& rm mysql.tar.gz* \
|
||||
&& rm -rf /usr/local/mysql/mysql-test /usr/local/mysql/sql-bench \
|
||||
&& rm -rf /usr/local/mysql/bin/*-debug /usr/local/mysql/bin/*_embedded \
|
||||
&& find /usr/local/mysql -type f -name "*.a" -delete \
|
||||
&& apt-get update && apt-get install -y binutils && rm -rf /var/lib/apt/lists/* \
|
||||
&& { find /usr/local/mysql -type f -executable -exec strip --strip-all '{}' + || true; } \
|
||||
&& apt-get purge -y --auto-remove binutils
|
||||
ENV PATH $PATH:/usr/local/mysql/bin:/usr/local/mysql/scripts
|
||||
|
||||
WORKDIR /usr/local/mysql
|
||||
VOLUME /var/lib/mysql
|
||||
|
||||
COPY docker-entrypoint.sh /entrypoint.sh
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
|
||||
EXPOSE 3306
|
||||
CMD ["mysqld", "--datadir=/var/lib/mysql", "--user=mysql"]
|
||||
```
|
||||
|
||||
#### 5.7 版本
|
||||
```
|
||||
FROM debian:wheezy
|
||||
|
||||
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
|
||||
RUN groupadd -r mysql && useradd -r -g mysql mysql
|
||||
|
||||
# FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:
|
||||
# File::Basename
|
||||
# File::Copy
|
||||
# Sys::Hostname
|
||||
# Data::Dumper
|
||||
RUN apt-get update && apt-get install -y perl --no-install-recommends && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
|
||||
RUN apt-get update && apt-get install -y libaio1 && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# gpg: key 5072E1F5: public key "MySQL Release Engineering <mysql-build@oss.oracle.com>" imported
|
||||
RUN gpg --keyserver pgp.mit.edu --recv-keys A4A9406876FCBD3C456770C88C718D3B5072E1F5
|
||||
|
||||
ENV MYSQL_MAJOR 5.7
|
||||
ENV MYSQL_VERSION 5.7.4-m14
|
||||
|
||||
# note: we're pulling the *.asc file from mysql.he.net instead of dev.mysql.com because the official mirror 404s that file for whatever reason - maybe it's at a different path?
|
||||
RUN apt-get update && apt-get install -y curl --no-install-recommends && rm -rf /var/lib/apt/lists/* \
|
||||
&& curl -SL "http://dev.mysql.com/get/Downloads/MySQL-$MYSQL_MAJOR/mysql-$MYSQL_VERSION-linux-glibc2.5-x86_64.tar.gz" -o mysql.tar.gz \
|
||||
&& curl -SL "http://mysql.he.net/Downloads/MySQL-$MYSQL_MAJOR/mysql-$MYSQL_VERSION-linux-glibc2.5-x86_64.tar.gz.asc" -o mysql.tar.gz.asc \
|
||||
&& apt-get purge -y --auto-remove curl \
|
||||
&& gpg --verify mysql.tar.gz.asc \
|
||||
&& mkdir /usr/local/mysql \
|
||||
&& tar -xzf mysql.tar.gz -C /usr/local/mysql --strip-components=1 \
|
||||
&& rm mysql.tar.gz* \
|
||||
&& rm -rf /usr/local/mysql/mysql-test /usr/local/mysql/sql-bench \
|
||||
&& rm -rf /usr/local/mysql/bin/*-debug /usr/local/mysql/bin/*_embedded \
|
||||
&& find /usr/local/mysql -type f -name "*.a" -delete \
|
||||
&& apt-get update && apt-get install -y binutils && rm -rf /var/lib/apt/lists/* \
|
||||
&& { find /usr/local/mysql -type f -executable -exec strip --strip-all '{}' + || true; } \
|
||||
&& apt-get purge -y --auto-remove binutils
|
||||
ENV PATH $PATH:/usr/local/mysql/bin:/usr/local/mysql/scripts
|
||||
|
||||
WORKDIR /usr/local/mysql
|
||||
VOLUME /var/lib/mysql
|
||||
|
||||
COPY docker-entrypoint.sh /entrypoint.sh
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
|
||||
EXPOSE 3306
|
||||
CMD ["mysqld", "--datadir=/var/lib/mysql", "--user=mysql"]
|
||||
```
|
||||
请到 https://github.com/docker-library/docs/tree/master/mysql 查看
|
||||
|
@ -1,101 +1,49 @@
|
||||
## [Nginx](https://hub.docker.com/_/nginx/)
|
||||
# [Nginx](https://hub.docker.com/_/nginx/)
|
||||
|
||||
## 基本信息
|
||||
|
||||
### 基本信息
|
||||
[Nginx](https://en.wikipedia.org/wiki/Nginx) 是开源的高效的 Web 服务器实现,支持 HTTP、HTTPS、SMTP、POP3、IMAP 等协议。
|
||||
|
||||
该仓库位于 https://hub.docker.com/_/nginx/,提供了 Nginx 1.0 ~ 1.11.x 各个版本的镜像。
|
||||
该仓库位于 `https://hub.docker.com/_/nginx/` ,提供了 Nginx 1.0 ~ 1.19.x 各个版本的镜像。
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 使用方法
|
||||
下面的命令将作为一个静态页面服务器启动。
|
||||
|
||||
```
|
||||
```bash
|
||||
$ docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
|
||||
```
|
||||
|
||||
用户也可以不使用这种映射方式,通过利用 Dockerfile 来直接将静态页面内容放到镜像中,内容为
|
||||
|
||||
```
|
||||
```docker
|
||||
FROM nginx
|
||||
COPY static-html-directory /usr/share/nginx/html
|
||||
```
|
||||
|
||||
之后生成新的镜像,并启动一个容器。
|
||||
|
||||
```
|
||||
```bash
|
||||
$ docker build -t some-content-nginx .
|
||||
$ docker run --name some-nginx -d some-content-nginx
|
||||
```
|
||||
|
||||
开放端口,并映射到本地的 `8080` 端口。
|
||||
|
||||
```
|
||||
docker run --name some-nginx -d -p 8080:80 some-content-nginx
|
||||
```bash
|
||||
$ docker run --name some-nginx -d -p 8080:80 some-content-nginx
|
||||
```
|
||||
|
||||
Nginx的默认配置文件路径为 `/etc/nginx/nginx.conf`,可以通过映射它来使用本地的配置文件,例如
|
||||
|
||||
```
|
||||
docker run --name some-nginx -v /some/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx
|
||||
```
|
||||
使用配置文件时,为了在容器中正常运行,需要保持 `daemon off;`。
|
||||
|
||||
### Dockerfile
|
||||
#### stable 版本
|
||||
```
|
||||
FROM debian:jessie
|
||||
|
||||
MAINTAINER NGINX Docker Maintainers "docker-maint@nginx.com"
|
||||
|
||||
ENV NGINX_VERSION 1.10.1-1~jessie
|
||||
|
||||
RUN apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 \
|
||||
&& echo "deb http://nginx.org/packages/debian/ jessie nginx" >> /etc/apt/sources.list \
|
||||
&& apt-get update \
|
||||
&& apt-get install --no-install-recommends --no-install-suggests -y \
|
||||
ca-certificates \
|
||||
nginx=${NGINX_VERSION} \
|
||||
nginx-module-xslt \
|
||||
nginx-module-geoip \
|
||||
nginx-module-image-filter \
|
||||
nginx-module-perl \
|
||||
nginx-module-njs \
|
||||
gettext-base \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# forward request and error logs to docker log collector
|
||||
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
|
||||
&& ln -sf /dev/stderr /var/log/nginx/error.log
|
||||
|
||||
EXPOSE 80 443
|
||||
|
||||
CMD ["nginx", "-g", "daemon off;"]
|
||||
```bash
|
||||
$ docker run -d \
|
||||
--name some-nginx \
|
||||
-p 8080:80 \
|
||||
-v /path/nginx.conf:/etc/nginx/nginx.conf:ro \
|
||||
nginx
|
||||
```
|
||||
|
||||
#### 1.11.x 版本
|
||||
## Dockerfile
|
||||
|
||||
```
|
||||
FROM debian:jessie
|
||||
|
||||
MAINTAINER NGINX Docker Maintainers "docker-maint@nginx.com"
|
||||
|
||||
ENV NGINX_VERSION 1.11.1-1~jessie
|
||||
|
||||
RUN apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 \
|
||||
&& echo "deb http://nginx.org/packages/mainline/debian/ jessie nginx" >> /etc/apt/sources.list \
|
||||
&& apt-get update \
|
||||
&& apt-get install --no-install-recommends --no-install-suggests -y \
|
||||
ca-certificates \
|
||||
nginx=${NGINX_VERSION} \
|
||||
nginx-module-xslt \
|
||||
nginx-module-geoip \
|
||||
nginx-module-image-filter \
|
||||
nginx-module-perl \
|
||||
nginx-module-njs \
|
||||
gettext-base \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# forward request and error logs to docker log collector
|
||||
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
|
||||
&& ln -sf /dev/stderr /var/log/nginx/error.log
|
||||
|
||||
EXPOSE 80 443
|
||||
|
||||
CMD ["nginx", "-g", "daemon off;"]
|
||||
```
|
||||
请到 https://github.com/docker-library/docs/tree/master/nginx 查看。
|
||||
|
@ -1,151 +1,40 @@
|
||||
## [Node.js](https://hub.docker.com/_/node/)
|
||||
# [Node.js](https://hub.docker.com/_/node/)
|
||||
|
||||
### 基本信息
|
||||
[Node.js](https://en.wikipedia.org/wiki/Node.js)是基于 JavaScript 的可扩展服务端和网络软件开发平台。
|
||||
## 基本信息
|
||||
|
||||
该仓库位于 https://hub.docker.com/_/node/,提供了 Node.js 0.10 ~ 6.3.x 各个版本的镜像。
|
||||
[Node.js](https://en.wikipedia.org/wiki/Node.js) 是基于 JavaScript 的可扩展服务端和网络软件开发平台。
|
||||
|
||||
该仓库位于 `https://hub.docker.com/_/node/` ,提供了 Node.js 0.10 ~ 14.x 各个版本的镜像。
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 使用方法
|
||||
在项目中创建一个 Dockerfile。
|
||||
|
||||
```
|
||||
FROM node:0.10-onbuild
|
||||
```docker
|
||||
FROM node:12
|
||||
# replace this with your application's default port
|
||||
EXPOSE 8888
|
||||
```
|
||||
|
||||
然后创建镜像,并启动容器。
|
||||
|
||||
```
|
||||
```bash
|
||||
$ docker build -t my-nodejs-app
|
||||
$ docker run -it --rm --name my-running-app my-nodejs-app
|
||||
```
|
||||
|
||||
也可以直接运行一个简单容器。
|
||||
|
||||
```
|
||||
$ docker run -it --rm --name my-running-script -v "$(pwd)":/usr/src/myapp -w /usr/src/myapp node:0.10 node your-daemon-or-script.js
|
||||
```bash
|
||||
$ docker run -it --rm \
|
||||
--name my-running-script \
|
||||
# -v "$(pwd)":/usr/src/myapp \
|
||||
--mount type=bind,src=`$(pwd)`,target=/usr/src/myapp \
|
||||
-w /usr/src/myapp \
|
||||
node:12-alpine \
|
||||
node your-daemon-or-script.js
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
|
||||
#### 0.10 版本
|
||||
```
|
||||
FROM buildpack-deps
|
||||
|
||||
RUN apt-get update && apt-get install -y \
|
||||
ca-certificates \
|
||||
curl
|
||||
|
||||
# verify gpg and sha256: http://nodejs.org/dist/v0.10.31/SHASUMS256.txt.asc
|
||||
# gpg: aka "Timothy J Fontaine (Work) <tj.fontaine@joyent.com>"
|
||||
RUN gpg --keyserver pgp.mit.edu --recv-keys 7937DFD2AB06298B2293C3187D33FF9D0246406D
|
||||
|
||||
ENV NODE_VERSION 0.10.32
|
||||
|
||||
RUN curl -SLO "http://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz" \
|
||||
&& curl -SLO "http://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \
|
||||
&& gpg --verify SHASUMS256.txt.asc \
|
||||
&& grep " node-v$NODE_VERSION-linux-x64.tar.gz\$" SHASUMS256.txt.asc | sha256sum -c - \
|
||||
&& tar -xzf "node-v$NODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1 \
|
||||
&& rm "node-v$NODE_VERSION-linux-x64.tar.gz" SHASUMS256.txt.asc
|
||||
|
||||
CMD [ "node" ]
|
||||
```
|
||||
|
||||
#### 4.x 版本
|
||||
```
|
||||
FROM buildpack-deps:jessie
|
||||
|
||||
# gpg keys listed at https://github.com/nodejs/node
|
||||
RUN set -ex \
|
||||
&& for key in \
|
||||
9554F04D7259F04124DE6B476D5A82AC7E37093B \
|
||||
94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \
|
||||
0034A06D9D9B0064CE8ADF6BF1747F4AD2306D93 \
|
||||
FD3A5288F042B6850C66B31F09FE44734EB7990E \
|
||||
71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \
|
||||
DD8F2338BAE7501E3DD5AC78C273792F7D83545D \
|
||||
B9AE9905FFD7803F25714661B63B535A4C206CA9 \
|
||||
C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \
|
||||
; do \
|
||||
gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
|
||||
done
|
||||
|
||||
ENV NPM_CONFIG_LOGLEVEL info
|
||||
ENV NODE_VERSION 4.4.7
|
||||
|
||||
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
|
||||
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \
|
||||
&& gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \
|
||||
&& grep " node-v$NODE_VERSION-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - \
|
||||
&& tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \
|
||||
&& rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt
|
||||
|
||||
CMD [ "node" ]
|
||||
```
|
||||
|
||||
#### 5.x 版本
|
||||
|
||||
```
|
||||
FROM buildpack-deps:jessie
|
||||
|
||||
# gpg keys listed at https://github.com/nodejs/node
|
||||
RUN set -ex \
|
||||
&& for key in \
|
||||
9554F04D7259F04124DE6B476D5A82AC7E37093B \
|
||||
94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \
|
||||
0034A06D9D9B0064CE8ADF6BF1747F4AD2306D93 \
|
||||
FD3A5288F042B6850C66B31F09FE44734EB7990E \
|
||||
71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \
|
||||
DD8F2338BAE7501E3DD5AC78C273792F7D83545D \
|
||||
B9AE9905FFD7803F25714661B63B535A4C206CA9 \
|
||||
C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \
|
||||
; do \
|
||||
gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
|
||||
done
|
||||
|
||||
ENV NPM_CONFIG_LOGLEVEL info
|
||||
ENV NODE_VERSION 5.12.0
|
||||
|
||||
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
|
||||
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \
|
||||
&& gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \
|
||||
&& grep " node-v$NODE_VERSION-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - \
|
||||
&& tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \
|
||||
&& rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt
|
||||
|
||||
CMD [ "node" ]
|
||||
```
|
||||
|
||||
#### 6.x 版本
|
||||
```
|
||||
FROM buildpack-deps:jessie
|
||||
|
||||
# gpg keys listed at https://github.com/nodejs/node
|
||||
RUN set -ex \
|
||||
&& for key in \
|
||||
9554F04D7259F04124DE6B476D5A82AC7E37093B \
|
||||
94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \
|
||||
0034A06D9D9B0064CE8ADF6BF1747F4AD2306D93 \
|
||||
FD3A5288F042B6850C66B31F09FE44734EB7990E \
|
||||
71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \
|
||||
DD8F2338BAE7501E3DD5AC78C273792F7D83545D \
|
||||
B9AE9905FFD7803F25714661B63B535A4C206CA9 \
|
||||
C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \
|
||||
; do \
|
||||
gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
|
||||
done
|
||||
|
||||
ENV NPM_CONFIG_LOGLEVEL info
|
||||
ENV NODE_VERSION 6.3.1
|
||||
|
||||
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
|
||||
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \
|
||||
&& gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \
|
||||
&& grep " node-v$NODE_VERSION-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - \
|
||||
&& tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \
|
||||
&& rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt
|
||||
|
||||
CMD [ "node" ]
|
||||
```
|
||||
## Dockerfile
|
||||
|
||||
请到 https://github.com/docker-library/docs/tree/master/node 查看。
|
||||
|
19
appendix/repo/php.md
Normal file
@ -0,0 +1,19 @@
|
||||
# [PHP](https://hub.docker.com/_/php/)
|
||||
|
||||
## 基本信息
|
||||
|
||||
[PHP](https://en.wikipedia.org/wiki/Php)(Hypertext Preprocessor 超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML 中,尤其适合 web 开发。
|
||||
|
||||
该仓库位于 `https://hub.docker.com/_/php/` ,提供了 PHP 5.x ~ 8.x 各个版本的镜像。
|
||||
|
||||
## 使用方法
|
||||
|
||||
下面的命令将运行一个已有的 PHP 脚本。
|
||||
|
||||
```bash
|
||||
$ docker run -it --rm -v "$PWD":/app -w /app php:alpine php your-script.php
|
||||
```
|
||||
|
||||
## Dockerfile
|
||||
|
||||
请到 https://github.com/docker-library/docs/tree/master/php 查看。
|
@ -1,141 +1,42 @@
|
||||
## [Redis](https://hub.docker.com/_/redis/)
|
||||
# [Redis](https://hub.docker.com/_/redis/)
|
||||
|
||||
## 基本信息
|
||||
|
||||
### 基本信息
|
||||
[Redis](https://en.wikipedia.org/wiki/Redis) 是开源的内存 Key-Value 数据库实现。
|
||||
|
||||
该仓库位于 https://hub.docker.com/_/redis/,提供了 Redis 3.x 各个版本的镜像。
|
||||
该仓库位于 `https://hub.docker.com/_/redis/` ,提供了 Redis 3.x ~ 6.x 各个版本的镜像。
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 使用方法
|
||||
默认会在 `6379` 端口启动数据库。
|
||||
|
||||
```bash
|
||||
$ docker run --name some-redis -d -p 6379:6379 redis
|
||||
```
|
||||
$ docker run --name some-redis -d redis
|
||||
```
|
||||
另外还可以启用 [持久存储](http://redis.io/topics/persistence)。
|
||||
|
||||
```
|
||||
$ docker run --name some-redis -d redis redis-server --appendonly yes
|
||||
另外还可以启用 [持久存储](https://redis.io/topics/persistence)。
|
||||
|
||||
```bash
|
||||
$ docker run --name some-redis -d -p 6379:6379 redis redis-server --appendonly yes
|
||||
```
|
||||
|
||||
默认数据存储位置在 `VOLUME/data`。可以使用 `--volumes-from some-volume-container` 或 `-v /docker/host/dir:/data` 将数据存放到本地。
|
||||
|
||||
使用其他应用连接到容器,可以用
|
||||
|
||||
```
|
||||
```bash
|
||||
$ docker run --name some-app --link some-redis:redis -d application-that-uses-redis
|
||||
```
|
||||
|
||||
或者通过 `redis-cli`
|
||||
|
||||
```
|
||||
$ docker run -it --link some-redis:redis --rm redis sh -c 'exec redis-cli -h "$REDIS_PORT_6379_TCP_ADDR" -p "$REDIS_PORT_6379_TCP_PORT"'
|
||||
```bash
|
||||
$ docker run -it --rm \
|
||||
--link some-redis:redis \
|
||||
redis \
|
||||
sh -c 'exec redis-cli -h "$REDIS_PORT_6379_TCP_ADDR" -p "$REDIS_PORT_6379_TCP_PORT"'
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
#### 3.0 版本
|
||||
```
|
||||
FROM debian:jessie
|
||||
## Dockerfile
|
||||
|
||||
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
|
||||
RUN groupadd -r redis && useradd -r -g redis redis
|
||||
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
ca-certificates \
|
||||
wget \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# grab gosu for easy step-down from root
|
||||
ENV GOSU_VERSION 1.7
|
||||
RUN set -x \
|
||||
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \
|
||||
&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \
|
||||
&& export GNUPGHOME="$(mktemp -d)" \
|
||||
&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
|
||||
&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
|
||||
&& rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \
|
||||
&& chmod +x /usr/local/bin/gosu \
|
||||
&& gosu nobody true
|
||||
|
||||
ENV REDIS_VERSION 3.0.7
|
||||
ENV REDIS_DOWNLOAD_URL http://download.redis.io/releases/redis-3.0.7.tar.gz
|
||||
ENV REDIS_DOWNLOAD_SHA1 e56b4b7e033ae8dbf311f9191cf6fdf3ae974d1c
|
||||
|
||||
# for redis-sentinel see: http://redis.io/topics/sentinel
|
||||
RUN buildDeps='gcc libc6-dev make' \
|
||||
&& set -x \
|
||||
&& apt-get update && apt-get install -y $buildDeps --no-install-recommends \
|
||||
&& rm -rf /var/lib/apt/lists/* \
|
||||
&& wget -O redis.tar.gz "$REDIS_DOWNLOAD_URL" \
|
||||
&& echo "$REDIS_DOWNLOAD_SHA1 *redis.tar.gz" | sha1sum -c - \
|
||||
&& mkdir -p /usr/src/redis \
|
||||
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
|
||||
&& rm redis.tar.gz \
|
||||
&& make -C /usr/src/redis \
|
||||
&& make -C /usr/src/redis install \
|
||||
&& rm -r /usr/src/redis \
|
||||
&& apt-get purge -y --auto-remove $buildDeps
|
||||
|
||||
RUN mkdir /data && chown redis:redis /data
|
||||
VOLUME /data
|
||||
WORKDIR /data
|
||||
|
||||
COPY docker-entrypoint.sh /usr/local/bin/
|
||||
RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
|
||||
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||
|
||||
EXPOSE 6379
|
||||
CMD [ "redis-server" ]
|
||||
```
|
||||
|
||||
#### 3.2 版本
|
||||
```
|
||||
FROM debian:jessie
|
||||
|
||||
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
|
||||
RUN groupadd -r redis && useradd -r -g redis redis
|
||||
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
ca-certificates \
|
||||
wget \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# grab gosu for easy step-down from root
|
||||
ENV GOSU_VERSION 1.7
|
||||
RUN set -x \
|
||||
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \
|
||||
&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \
|
||||
&& export GNUPGHOME="$(mktemp -d)" \
|
||||
&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
|
||||
&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
|
||||
&& rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \
|
||||
&& chmod +x /usr/local/bin/gosu \
|
||||
&& gosu nobody true
|
||||
|
||||
ENV REDIS_VERSION 3.2.3
|
||||
ENV REDIS_DOWNLOAD_URL http://download.redis.io/releases/redis-3.2.3.tar.gz
|
||||
ENV REDIS_DOWNLOAD_SHA1 92d6d93ef2efc91e595c8bf578bf72baff397507
|
||||
|
||||
# for redis-sentinel see: http://redis.io/topics/sentinel
|
||||
RUN buildDeps='gcc libc6-dev make' \
|
||||
&& set -x \
|
||||
&& apt-get update && apt-get install -y $buildDeps --no-install-recommends \
|
||||
&& rm -rf /var/lib/apt/lists/* \
|
||||
&& wget -O redis.tar.gz "$REDIS_DOWNLOAD_URL" \
|
||||
&& echo "$REDIS_DOWNLOAD_SHA1 *redis.tar.gz" | sha1sum -c - \
|
||||
&& mkdir -p /usr/src/redis \
|
||||
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
|
||||
&& rm redis.tar.gz \
|
||||
&& make -C /usr/src/redis \
|
||||
&& make -C /usr/src/redis install \
|
||||
&& rm -r /usr/src/redis \
|
||||
&& apt-get purge -y --auto-remove $buildDeps
|
||||
|
||||
RUN mkdir /data && chown redis:redis /data
|
||||
VOLUME /data
|
||||
WORKDIR /data
|
||||
|
||||
COPY docker-entrypoint.sh /usr/local/bin/
|
||||
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||
|
||||
EXPOSE 6379
|
||||
CMD [ "redis-server" ]
|
||||
```
|
||||
请到 https://github.com/docker-library/docs/tree/master/redis 查看。
|
||||
|
@ -1,142 +1,20 @@
|
||||
## [Ubuntu](https://hub.docker.com/_/ubuntu/)
|
||||
# [Ubuntu](https://hub.docker.com/_/ubuntu/)
|
||||
|
||||
## 基本信息
|
||||
|
||||
### 基本信息
|
||||
[Ubuntu](https://en.wikipedia.org/wiki/Ubuntu) 是流行的 Linux 发行版,其自带软件版本往往较新一些。
|
||||
|
||||
该仓库位于 https://hub.docker.com/_/ubuntu/,提供了 Ubuntu 从 12.04 ~ 16.10 各个版本的镜像。
|
||||
该仓库位于 `https://hub.docker.com/_/ubuntu/` ,提供了 Ubuntu 从 12.04 ~ 20.04 各个版本的镜像。
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 使用方法
|
||||
默认会启动一个最小化的 Ubuntu 环境。
|
||||
|
||||
```
|
||||
$ docker run --name some-ubuntu -i -t ubuntu
|
||||
```bash
|
||||
$ docker run --name some-ubuntu -it ubuntu:20.04
|
||||
root@523c70904d54:/#
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
## Dockerfile
|
||||
|
||||
#### 12.04 版本
|
||||
```
|
||||
FROM scratch
|
||||
ADD precise-core-amd64.tar.gz /
|
||||
|
||||
# a few minor docker-specific tweaks
|
||||
# see https://github.com/dotcloud/docker/blob/master/contrib/mkimage/debootstrap
|
||||
RUN echo '#!/bin/sh' > /usr/sbin/policy-rc.d \
|
||||
&& echo 'exit 101' >> /usr/sbin/policy-rc.d \
|
||||
&& chmod +x /usr/sbin/policy-rc.d \
|
||||
\
|
||||
&& dpkg-divert --local --rename --add /sbin/initctl \
|
||||
&& cp -a /usr/sbin/policy-rc.d /sbin/initctl \
|
||||
&& sed -i 's/^exit.*/exit 0/' /sbin/initctl \
|
||||
\
|
||||
&& echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \
|
||||
\
|
||||
&& echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean \
|
||||
&& echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean \
|
||||
&& echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \
|
||||
\
|
||||
&& echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages \
|
||||
\
|
||||
&& echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes
|
||||
|
||||
# delete all the apt list files since they're big and get stale quickly
|
||||
RUN rm -rf /var/lib/apt/lists/*
|
||||
# this forces "apt-get update" in dependent images, which is also good
|
||||
|
||||
# enable the universe
|
||||
RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list
|
||||
|
||||
# upgrade packages for now, since the tarballs aren't updated frequently enough
|
||||
RUN apt-get update && apt-get dist-upgrade -y && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# overwrite this with 'CMD []' in a dependent Dockerfile
|
||||
CMD ["/bin/bash"]
|
||||
```
|
||||
|
||||
#### 14.04 版本
|
||||
```
|
||||
FROM scratch
|
||||
ADD trusty-core-amd64.tar.gz /
|
||||
|
||||
# a few minor docker-specific tweaks
|
||||
# see https://github.com/dotcloud/docker/blob/master/contrib/mkimage/debootstrap
|
||||
RUN echo '#!/bin/sh' > /usr/sbin/policy-rc.d \
|
||||
&& echo 'exit 101' >> /usr/sbin/policy-rc.d \
|
||||
&& chmod +x /usr/sbin/policy-rc.d \
|
||||
\
|
||||
&& dpkg-divert --local --rename --add /sbin/initctl \
|
||||
&& cp -a /usr/sbin/policy-rc.d /sbin/initctl \
|
||||
&& sed -i 's/^exit.*/exit 0/' /sbin/initctl \
|
||||
\
|
||||
&& echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \
|
||||
\
|
||||
&& echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean \
|
||||
&& echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean \
|
||||
&& echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \
|
||||
\
|
||||
&& echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages \
|
||||
\
|
||||
&& echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes
|
||||
|
||||
# delete all the apt list files since they're big and get stale quickly
|
||||
RUN rm -rf /var/lib/apt/lists/*
|
||||
# this forces "apt-get update" in dependent images, which is also good
|
||||
|
||||
# enable the universe
|
||||
RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list
|
||||
|
||||
# upgrade packages for now, since the tarballs aren't updated frequently enough
|
||||
RUN apt-get update && apt-get dist-upgrade -y && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# overwrite this with 'CMD []' in a dependent Dockerfile
|
||||
CMD ["/bin/bash"]
|
||||
```
|
||||
|
||||
#### 16.04 版本
|
||||
|
||||
```
|
||||
FROM scratch
|
||||
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
|
||||
|
||||
# a few minor docker-specific tweaks
|
||||
# see https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap
|
||||
RUN set -xe \
|
||||
\
|
||||
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L40-L48
|
||||
&& echo '#!/bin/sh' > /usr/sbin/policy-rc.d \
|
||||
&& echo 'exit 101' >> /usr/sbin/policy-rc.d \
|
||||
&& chmod +x /usr/sbin/policy-rc.d \
|
||||
\
|
||||
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L54-L56
|
||||
&& dpkg-divert --local --rename --add /sbin/initctl \
|
||||
&& cp -a /usr/sbin/policy-rc.d /sbin/initctl \
|
||||
&& sed -i 's/^exit.*/exit 0/' /sbin/initctl \
|
||||
\
|
||||
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L71-L78
|
||||
&& echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \
|
||||
\
|
||||
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L85-L105
|
||||
&& echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean \
|
||||
&& echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean \
|
||||
&& echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \
|
||||
\
|
||||
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L109-L115
|
||||
&& echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages \
|
||||
\
|
||||
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L118-L130
|
||||
&& echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes \
|
||||
\
|
||||
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L134-L151
|
||||
&& echo 'Apt::AutoRemove::SuggestsImportant "false";' > /etc/apt/apt.conf.d/docker-autoremove-suggests
|
||||
|
||||
# delete all the apt list files since they're big and get stale quickly
|
||||
RUN rm -rf /var/lib/apt/lists/*
|
||||
# this forces "apt-get update" in dependent images, which is also good
|
||||
|
||||
# enable the universe
|
||||
RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list
|
||||
|
||||
# overwrite this with 'CMD []' in a dependent Dockerfile
|
||||
CMD ["/bin/bash"]
|
||||
```
|
||||
请到 https://github.com/docker-library/docs/tree/master/ubuntu 查看。
|
||||
|
@ -1,117 +1,25 @@
|
||||
## [WordPress](https://hub.docker.com/_/wordpress/)
|
||||
# [WordPress](https://hub.docker.com/_/wordpress/)
|
||||
|
||||
### 基本信息
|
||||
[WordPress](https://en.wikipedia.org/wiki/WordPress) 是开源的 Blog 和内容管理系统框架,它基于 PhP 和 MySQL。
|
||||
## 基本信息
|
||||
|
||||
该仓库位于 https://hub.docker.com/_/wordpress/,提供了 WordPress 4.x 版本的镜像。
|
||||
[WordPress](https://en.wikipedia.org/wiki/WordPress) 是开源的 Blog 和内容管理系统框架,它基于 PHP 和 MySQL。
|
||||
|
||||
该仓库位于 `https://hub.docker.com/_/wordpress/` ,提供了 WordPress 4.x ~ 5.x 版本的镜像。
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 使用方法
|
||||
启动容器需要 MySQL 的支持,默认端口为 `80`。
|
||||
|
||||
```
|
||||
```bash
|
||||
$ docker run --name some-wordpress --link some-mysql:mysql -d wordpress
|
||||
```
|
||||
启动 WordPress 容器时可以指定的一些环境参数包括:
|
||||
|
||||
* `-e WORDPRESS_DB_USER=...` 缺省为 “root”
|
||||
* `-e WORDPRESS_DB_PASSWORD=...` 缺省为连接 mysql 容器的环境变量 `MYSQL_ROOT_PASSWORD` 的值
|
||||
* `-e WORDPRESS_DB_NAME=...` 缺省为 “wordpress”
|
||||
* `-e WORDPRESS_AUTH_KEY=...`, `-e WORDPRESS_SECURE_AUTH_KEY=...`, `-e WORDPRESS_LOGGED_IN_KEY=...`, `-e WORDPRESS_NONCE_KEY=...`, `-e WORDPRESS_AUTH_SALT=...`, `-e WORDPRESS_SECURE_AUTH_SALT=...`, `-e WORDPRESS_LOGGED_IN_SALT=...`, `-e WORDPRESS_NONCE_SALT=...` 缺省为随机 sha1 串
|
||||
启动 WordPress 容器时可以指定的一些环境变量包括:
|
||||
|
||||
### Dockerfile
|
||||
#### 4.0 版本
|
||||
```
|
||||
FROM debian:wheezy
|
||||
* `WORDPRESS_DB_USER` 缺省为 `root`
|
||||
* `WORDPRESS_DB_PASSWORD` 缺省为连接 mysql 容器的环境变量 `MYSQL_ROOT_PASSWORD` 的值
|
||||
* `WORDPRESS_DB_NAME` 缺省为 `wordpress`
|
||||
|
||||
RUN apt-get update && apt-get install -y \
|
||||
apache2 \
|
||||
curl \
|
||||
libapache2-mod-php5 \
|
||||
php5-curl \
|
||||
php5-gd \
|
||||
php5-mysql \
|
||||
rsync \
|
||||
wget \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
RUN a2enmod rewrite
|
||||
## Dockerfile
|
||||
|
||||
# copy a few things from apache's init script that it requires to be setup
|
||||
ENV APACHE_CONFDIR /etc/apache2
|
||||
ENV APACHE_ENVVARS $APACHE_CONFDIR/envvars
|
||||
# and then a few more from $APACHE_CONFDIR/envvars itself
|
||||
ENV APACHE_RUN_USER www-data
|
||||
ENV APACHE_RUN_GROUP www-data
|
||||
ENV APACHE_RUN_DIR /var/run/apache2
|
||||
ENV APACHE_PID_FILE $APACHE_RUN_DIR/apache2.pid
|
||||
ENV APACHE_LOCK_DIR /var/lock/apache2
|
||||
ENV APACHE_LOG_DIR /var/log/apache2
|
||||
ENV LANG C
|
||||
RUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIR
|
||||
|
||||
# make CustomLog (access log) go to stdout instead of files
|
||||
# and ErrorLog to stderr
|
||||
RUN find "$APACHE_CONFDIR" -type f -exec sed -ri ' \
|
||||
s!^(\s*CustomLog)\s+\S+!\1 /proc/self/fd/1!g; \
|
||||
s!^(\s*ErrorLog)\s+\S+!\1 /proc/self/fd/2!g; \
|
||||
' '{}' ';'
|
||||
|
||||
RUN rm -rf /var/www/html && mkdir /var/www/html
|
||||
VOLUME /var/www/html
|
||||
WORKDIR /var/www/html
|
||||
|
||||
ENV WORDPRESS_VERSION 4.0.0
|
||||
ENV WORDPRESS_UPSTREAM_VERSION 4.0
|
||||
|
||||
# upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress
|
||||
RUN curl -SL http://wordpress.org/wordpress-${WORDPRESS_UPSTREAM_VERSION}.tar.gz | tar -xzC /usr/src/
|
||||
|
||||
COPY docker-apache.conf /etc/apache2/sites-available/wordpress
|
||||
RUN a2dissite 000-default && a2ensite wordpress
|
||||
|
||||
COPY docker-entrypoint.sh /entrypoint.sh
|
||||
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
EXPOSE 80
|
||||
CMD ["apache2", "-DFOREGROUND"]
|
||||
```
|
||||
|
||||
#### 4.5 版本
|
||||
```
|
||||
FROM php:5.6-apache
|
||||
|
||||
RUN a2enmod rewrite expires
|
||||
|
||||
# install the PHP extensions we need
|
||||
RUN apt-get update && apt-get install -y libpng12-dev libjpeg-dev && rm -rf /var/lib/apt/lists/* \
|
||||
&& docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \
|
||||
&& docker-php-ext-install gd mysqli opcache
|
||||
|
||||
# set recommended PHP.ini settings
|
||||
# see https://secure.php.net/manual/en/opcache.installation.php
|
||||
RUN { \
|
||||
echo 'opcache.memory_consumption=128'; \
|
||||
echo 'opcache.interned_strings_buffer=8'; \
|
||||
echo 'opcache.max_accelerated_files=4000'; \
|
||||
echo 'opcache.revalidate_freq=60'; \
|
||||
echo 'opcache.fast_shutdown=1'; \
|
||||
echo 'opcache.enable_cli=1'; \
|
||||
} > /usr/local/etc/php/conf.d/opcache-recommended.ini
|
||||
|
||||
VOLUME /var/www/html
|
||||
|
||||
ENV WORDPRESS_VERSION 4.5.3
|
||||
ENV WORDPRESS_SHA1 835b68748dae5a9d31c059313cd0150f03a49269
|
||||
|
||||
# upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress
|
||||
RUN curl -o wordpress.tar.gz -SL https://wordpress.org/wordpress-${WORDPRESS_VERSION}.tar.gz \
|
||||
&& echo "$WORDPRESS_SHA1 *wordpress.tar.gz" | sha1sum -c - \
|
||||
&& tar -xzf wordpress.tar.gz -C /usr/src/ \
|
||||
&& rm wordpress.tar.gz \
|
||||
&& chown -R www-data:www-data /usr/src/wordpress
|
||||
|
||||
COPY docker-entrypoint.sh /entrypoint.sh
|
||||
|
||||
# grr, ENTRYPOINT resets CMD now
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
CMD ["apache2-foreground"]
|
||||
```
|
||||
请到 https://github.com/docker-library/docs/tree/master/wordpress 查看。
|
||||
|
28
appendix/resources.md
Normal file
@ -0,0 +1,28 @@
|
||||
# 资源链接
|
||||
|
||||
## 官方网站
|
||||
|
||||
* Docker 官方主页:https://www.docker.com
|
||||
* Docker 官方博客:https://www.docker.com/blog/
|
||||
* Docker 官方文档:https://docs.docker.com/
|
||||
* Docker Hub:https://hub.docker.com
|
||||
* Docker 的源代码仓库:https://github.com/moby/moby
|
||||
* Docker 路线图 https://github.com/docker/roadmap/projects
|
||||
* Docker 发布版本历史:https://docs.docker.com/release-notes/
|
||||
* Docker 常见问题:https://docs.docker.com/engine/faq/
|
||||
* Docker 远端应用 API:https://docs.docker.com/develop/sdk/
|
||||
|
||||
## 实践参考
|
||||
|
||||
* Dockerfile 参考:https://docs.docker.com/engine/reference/builder/
|
||||
* Dockerfile 最佳实践:https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/
|
||||
|
||||
## 技术交流
|
||||
|
||||
* Docker 邮件列表: https://groups.google.com/forum/#!forum/docker-user
|
||||
* Docker 的 IRC 频道:https://chat.freenode.net#docker
|
||||
* Docker 的 Twitter 主页:https://twitter.com/docker
|
||||
|
||||
## 其它
|
||||
|
||||
* Docker 的 StackOverflow 问答主页:https://stackoverflow.com/search?q=docker
|
@ -1,23 +0,0 @@
|
||||
# 资源链接
|
||||
|
||||
## 官方网站
|
||||
* Docker 官方主页: https://www.docker.com
|
||||
* Docker 官方博客: https://blog.docker.com/
|
||||
* Docker 官方文档: https://docs.docker.com/
|
||||
* Docker Hub: https://hub.docker.com
|
||||
* Docker 的源代码仓库: https://github.com/docker/docker
|
||||
* Docker 发布版本历史:https://docs.docker.com/release-notes/
|
||||
* Docker 常见问题:https://docs.docker.com/engine/faq/
|
||||
* Docker 远端应用 API: https://docs.docker.com/reference/api/docker_remote_api/
|
||||
|
||||
## 实践参考
|
||||
* Dockerfile 参考:https://docs.docker.com/reference/builder/
|
||||
* Dockerfile 最佳实践:https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/
|
||||
|
||||
## 技术交流
|
||||
* Docker 邮件列表: https://groups.google.com/forum/#!forum/docker-user
|
||||
* Docker 的 IRC 频道: https://chat.freenode.net#docker
|
||||
* Docker 的 Twitter 主页: https://twitter.com/docker
|
||||
|
||||
## 其它
|
||||
* Docker 的 StackOverflow 问答主页: https://stackoverflow.com/search?q=docker
|
@ -1,126 +0,0 @@
|
||||
# Docker命令查询
|
||||
|
||||
## 基本语法
|
||||
Docker 命令有两大类,客户端命令和服务端命令。前者是主要的操作接口,后者用来启动 Docker daemon。
|
||||
|
||||
* 客户端命令:基本命令格式为 `docker [OPTIONS] COMMAND [arg...]`;
|
||||
* 服务端命令:基本命令格式为 `docker daemon [OPTIONS]`。
|
||||
|
||||
可以通过 `man docker` 或 `docker help` 来查看这些命令。
|
||||
|
||||
## 客户端命令选项
|
||||
|
||||
* --config="":指定客户端配置文件,默认为 `/.docker`;
|
||||
* -D=true|false:是否使用 debug 模式。默认不开启;
|
||||
* -H, --host=[]:指定命令对应 Docker daemon 的监听接口,可以为 unix 套接字(unix:///path/to/socket),文件句柄(fd://socketfd)或 tcp 套接字(tcp://[host[:port]]),默认为 unix:///var/run/docker.sock;
|
||||
* -l, --log-level="debug|info|warn|error|fatal":指定日志输出级别;
|
||||
* --tls=true|false:是否对 Docker daemon 启用 TLS 安全机制,默认为否;
|
||||
* --tlscacert= /.docker/ca.pem:TLS CA 签名的可信证书文件路径;
|
||||
* --tlscert= /.docker/cert.pem:TLS 可信证书文件路径;
|
||||
* --tlscert= /.docker/key.pem:TLS 密钥文件路径;
|
||||
* --tlsverify=true|false:启用 TLS 校验,默认为否。
|
||||
|
||||
## daemon 命令选项
|
||||
* --api-cors-header="":CORS 头部域,默认不允许 CORS,要允许任意的跨域访问,可以指定为 “*”;
|
||||
* --authorization-plugin="":载入认证的插件;
|
||||
* -b="":将容器挂载到一个已存在的网桥上。指定为 'none' 时则禁用容器的网络,与 --bip 选项互斥;
|
||||
* --bip="":让动态创建的 docker0 网桥采用给定的 CIDR 地址; 与 -b 选项互斥;
|
||||
* --cgroup-parent="":指定 cgroup 的父组,默认 fs cgroup 驱动为 `/docker`,systemd cgroup 驱动为 `system.slice`;
|
||||
* --cluster-store="":构成集群(如 Swarm)时,集群键值数据库服务地址;
|
||||
* --cluster-advertise="":构成集群时,自身的被访问地址,可以为 `host:port` 或 `interface:port`;
|
||||
* --cluster-store-opt="":构成集群时,键值数据库的配置选项;
|
||||
* --config-file="/etc/docker/daemon.json":daemon 配置文件路径;
|
||||
* --containerd="":containerd 文件的路径;
|
||||
* -D, --debug=true|false:是否使用 Debug 模式。缺省为 false;
|
||||
* --default-gateway="":容器的 IPv4 网关地址,必须在网桥的子网段内;
|
||||
* --default-gateway-v6="":容器的 IPv6 网关地址;
|
||||
* --default-ulimit=[]:默认的 ulimit 值;
|
||||
* --disable-legacy-registry=true|false:是否允许访问旧版本的镜像仓库服务器;
|
||||
* --dns="":指定容器使用的 DNS 服务器地址;
|
||||
* --dns-opt="":DNS 选项;
|
||||
* --dns-search=[]:DNS 搜索域;
|
||||
* --exec-opt=[]:运行时的执行选项;
|
||||
* --exec-root="":容器执行状态文件的根路径,默认为 `/var/run/docker`;
|
||||
* --fixed-cidr="":限定分配 IPv4 地址范围;
|
||||
* --fixed-cidr-v6="":限定分配 IPv6 地址范围;
|
||||
* -G, --group="":分配给 unix 套接字的组,默认为 `docker`;
|
||||
* -g, --graph="":Docker 运行时的根路径,默认为 `/var/lib/docker`;
|
||||
* -H, --host=[]:指定命令对应 Docker daemon 的监听接口,可以为 unix 套接字(unix:///path/to/socket),文件句柄(fd://socketfd)或 tcp 套接字(tcp://[host[:port]]),默认为 unix:///var/run/docker.sock;
|
||||
* --icc=true|false:是否启用容器间以及跟 daemon 所在主机的通信。默认为 true。
|
||||
* --insecure-registry=[]:允许访问给定的非安全仓库服务;
|
||||
* --ip="":绑定容器端口时候的默认 IP 地址。缺省为 0.0.0.0;
|
||||
* --ip-forward=true|false:是否检查启动在 Docker 主机上的启用 IP 转发服务,默认开启。注意关闭该选项将不对系统转发能力进行任何检查修改;
|
||||
* --ip-masq=true|false:是否进行地址伪装,用于容器访问外部网络,默认开启;
|
||||
* --iptables=true|false:是否允许 Docker 添加 iptables 规则。缺省为 true;
|
||||
* --ipv6=true|false:是否启用 IPv6 支持,默认关闭;
|
||||
* -l, --log-level="debug|info|warn|error|fatal":指定日志输出级别;
|
||||
* --label="[]":添加指定的键值对标注;
|
||||
* --log-driver="json-file|syslog|journald|gelf|fluentd|awslogs|splunk|etwlogs|gcplogs|none":指定日志后端驱动,默认为 json-file;
|
||||
* --log-opt=[]:日志后端的选项;
|
||||
* --mtu=VALUE:指定容器网络的 mtu;
|
||||
* -p="":指定 daemon 的 PID 文件路径。缺省为 `/var/run/docker.pid`;
|
||||
* --raw-logs:输出原始,未加色彩的日志信息;
|
||||
* --registry-mirror=<scheme>://<host>:指定 `docker pull` 时使用的注册服务器镜像地址;
|
||||
* -s, --storage-driver="":指定使用给定的存储后端;
|
||||
* --selinux-enabled=true|false:是否启用 SELinux 支持。缺省值为 false。SELinux 目前尚不支持 overlay 存储驱动;
|
||||
* --storage-opt=[]:驱动后端选项;
|
||||
* --tls=true|false:是否对 Docker daemon 启用 TLS 安全机制,默认为否;
|
||||
* --tlscacert= /.docker/ca.pem:TLS CA 签名的可信证书文件路径;
|
||||
* --tlscert= /.docker/cert.pem:TLS 可信证书文件路径;
|
||||
* --tlscert= /.docker/key.pem:TLS 密钥文件路径;
|
||||
* --tlsverify=true|false:启用 TLS 校验,默认为否;
|
||||
* --userland-proxy=true|false:是否使用用户态代理来实现容器间和出容器的回环通信,默认为 true;
|
||||
* --userns-remap=default|uid:gid|user:group|user|uid:指定容器的用户命名空间,默认是创建新的 UID 和 GID 映射到容器内进程。
|
||||
|
||||
## 子命令
|
||||
|
||||
可以通过 `man docker-COMMAND` 来查看这些命令的具体用法。
|
||||
|
||||
* attach:依附到一个正在运行的容器中;
|
||||
* build:从一个 Dockerfile 创建一个镜像;
|
||||
* commit:从一个容器的修改中创建一个新的镜像;
|
||||
* cp:在容器和本地宿主系统之间复制文件中;
|
||||
* create:创建一个新容器,但并不运行它;
|
||||
* diff:检查一个容器文件系统的修改;
|
||||
* events:从服务端获取实时的事件;
|
||||
* exec:在运行的容器内执行命令;
|
||||
* export:导出容器内容为一个 tar 包;
|
||||
* history:显示一个镜像的历史信息;
|
||||
* images:列出存在的镜像;
|
||||
* import:导入一个文件(典型为 tar 包)路径或目录来创建一个本地镜像;
|
||||
* info:显示一些相关的系统信息;
|
||||
* inspect:显示一个容器的具体配置信息;
|
||||
* kill:关闭一个运行中的容器 (包括进程和所有相关资源);
|
||||
* load:从一个 tar 包中加载一个镜像;
|
||||
* login:注册或登录到一个 Docker 的仓库服务器;
|
||||
* logout:从 Docker 的仓库服务器登出;
|
||||
* logs:获取容器的 log 信息;
|
||||
* network:管理 Docker 的网络,包括查看、创建、删除、挂载、卸载等;
|
||||
* node:管理 swarm 集群中的节点,包括查看、更新、删除、提升/取消管理节点等;
|
||||
* pause:暂停一个容器中的所有进程;
|
||||
* port:查找一个 nat 到一个私有网口的公共口;
|
||||
* ps:列出主机上的容器;
|
||||
* pull:从一个Docker的仓库服务器下拉一个镜像或仓库;
|
||||
* push:将一个镜像或者仓库推送到一个 Docker 的注册服务器;
|
||||
* rename:重命名一个容器;
|
||||
* restart:重启一个运行中的容器;
|
||||
* rm:删除给定的若干个容器;
|
||||
* rmi:删除给定的若干个镜像;
|
||||
* run:创建一个新容器,并在其中运行给定命令;
|
||||
* save:保存一个镜像为 tar 包文件;
|
||||
* search:在 Docker index 中搜索一个镜像;
|
||||
* service:管理 Docker 所启动的应用服务,包括创建、更新、删除等;
|
||||
* start:启动一个容器;
|
||||
* stats:输出(一个或多个)容器的资源使用统计信息;
|
||||
* stop:终止一个运行中的容器;
|
||||
* swarm:管理 Docker swarm 集群,包括创建、加入、退出、更新等;
|
||||
* tag:为一个镜像打标签;
|
||||
* top:查看一个容器中的正在运行的进程信息;
|
||||
* unpause:将一个容器内所有的进程从暂停状态中恢复;
|
||||
* update:更新指定的若干容器的配置信息;
|
||||
* version:输出 Docker 的版本信息;
|
||||
* volume:管理 Docker volume,包括查看、创建、删除等;
|
||||
* wait:阻塞直到一个容器终止,然后输出它的退出符。
|
||||
|
||||
## 一张图总结 Docker 的命令
|
||||

|
7
archive/README.md
Normal file
@ -0,0 +1,7 @@
|
||||
# 归档项目
|
||||
|
||||
以下项目不被官方支持或内容陈旧,将在下一版本中删除(或已经删除)。
|
||||
|
||||
* [Docker Machine](https://github.com/yeasy/docker_practice/tree/ca29ab51b121f43563f5d6659dedbda5cb6f048d/machine)
|
||||
* [Docker Swarm](https://github.com/yeasy/docker_practice/tree/ca29ab51b121f43563f5d6659dedbda5cb6f048d/swarm)
|
||||
* Mesos
|
@ -1,8 +1,8 @@
|
||||
# 基本概念
|
||||
Docker 包括三个基本概念
|
||||
* 镜像(Image)
|
||||
* 容器(Container)
|
||||
* 仓库(Repository)
|
||||
|
||||
理解了这三个概念,就理解了 Docker 的整个生命周期。
|
||||
**Docker** 包括三个基本概念
|
||||
* **镜像**(`Image`)
|
||||
* **容器**(`Container`)
|
||||
* **仓库**(`Repository`)
|
||||
|
||||
理解了这三个概念,就理解了 **Docker** 的整个生命周期。
|
||||
|
@ -1,13 +1,13 @@
|
||||
## Docker 容器
|
||||
# Docker 容器
|
||||
|
||||
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的`类`和`实例`一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
|
||||
镜像(`Image`)和容器(`Container`)的关系,就像是面向对象程序设计中的 `类` 和 `实例` 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
|
||||
|
||||
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 [命名空间](https://en.wikipedia.org/wiki/Linux_namespaces)。因此容器可以拥有自己的 `root` 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会把容器和虚拟机搞混。
|
||||
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 [命名空间](https://en.wikipedia.org/wiki/Linux_namespaces)。因此容器可以拥有自己的 `root` 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会混淆容器和虚拟机。
|
||||
|
||||
前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为**容器存储层**。
|
||||
前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为 **容器存储层**。
|
||||
|
||||
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
|
||||
|
||||
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 [数据卷(Volume)](https://docs.docker.com/engine/tutorials/dockervolumes/)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
|
||||
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 [数据卷(Volume)](../data_management/volume.md)、或者 [绑定宿主目录](../data_management/bind-mounts.md),在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
|
||||
|
||||
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器可以随意删除、重新 `run`,数据却不会丢失。
|
||||
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。
|
||||
|
@ -1,12 +1,12 @@
|
||||
## Docker 镜像
|
||||
# Docker 镜像
|
||||
|
||||
我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 `root` 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 `root` 文件系统。比如官方镜像 `ubuntu:14.04` 就包含了完整的一套 Ubuntu 14.04 最小系统的 `root` 文件系统。
|
||||
我们都知道,操作系统分为 **内核** 和 **用户空间**。对于 `Linux` 而言,内核启动后,会挂载 `root` 文件系统为其提供用户空间支持。而 **Docker 镜像**(`Image`),就相当于是一个 `root` 文件系统。比如官方镜像 `ubuntu:18.04` 就包含了完整的一套 Ubuntu 18.04 最小系统的 `root` 文件系统。
|
||||
|
||||
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
|
||||
**Docker 镜像** 是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像 **不包含** 任何动态数据,其内容在构建之后也不会被改变。
|
||||
|
||||
### 分层存储
|
||||
## 分层存储
|
||||
|
||||
因为镜像包含操作系统完整的 `root` 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 [Union FS](https://en.wikipedia.org/wiki/Union_mount) 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
|
||||
因为镜像包含操作系统完整的 `root` 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 [Union FS](https://en.wikipedia.org/wiki/Union_mount) 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 `ISO` 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
|
||||
|
||||
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
|
||||
|
||||
|
@ -1,29 +1,29 @@
|
||||
## Docker Registry
|
||||
# Docker Registry
|
||||
|
||||
镜像构建完成后,可以很容易的在当前宿主上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,[Docker Registry](https://docs.docker.com/registry/) 就是这样的服务。
|
||||
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,[Docker Registry](../repository/registry.md) 就是这样的服务。
|
||||
|
||||
一个 **Docker Registry** 中可以包含多个**仓库**(Repository);每个仓库可以包含多个**标签**(Tag);每个标签对应一个镜像。
|
||||
一个 **Docker Registry** 中可以包含多个 **仓库**(`Repository`);每个仓库可以包含多个 **标签**(`Tag`);每个标签对应一个镜像。
|
||||
|
||||
一般而言,一个仓库包含的是同一个软件的不同版本的镜像,而标签则用于对应于软件的的不同版本。我们可以通过 `<仓库名>:<标签>` 的格式来指定具体是哪个版本的镜像。如果不给出标签,将以 `latest` 作为默认标签。
|
||||
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 `<仓库名>:<标签>` 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 `latest` 作为默认标签。
|
||||
|
||||
以 [Ubuntu 镜像](https://hub.docker.com/_/ubuntu/) 为例,`ubuntu` 是仓库的名字,其内包含有不同的版本标签,如,`14.04`, `16.04`。我们可以通过 `ubuntu:14.04`,或者 `ubuntu:16.04` 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 `ubuntu`,那将视为 `ubuntu:latest`。
|
||||
以 [Ubuntu 镜像](https://hub.docker.com/_/ubuntu) 为例,`ubuntu` 是仓库的名字,其内包含有不同的版本标签,如,`16.04`, `18.04`。我们可以通过 `ubuntu:16.04`,或者 `ubuntu:18.04` 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 `ubuntu`,那将视为 `ubuntu:latest`。
|
||||
|
||||
仓库名经常以 *两段式路径* 形式出现,比如 `jwilder/nginx-proxy`,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。
|
||||
|
||||
### Docker Registry 公开服务
|
||||
## Docker Registry 公开服务
|
||||
|
||||
Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
|
||||
|
||||
最常使用的 Registry 公开服务是官方的 [Docker Hub](https://hub.docker.com/),这也是默认的 Registry,并拥有大量的高质量的官方镜像。除此以外,还有 [CoreOS](https://coreos.com/) 的 [Quay.io](https://quay.io/repository/),CoreOS 相关的镜像存储在这里;Google 的 [Google Container Registry](https://cloud.google.com/container-registry/),[Kubernetes](http://kubernetes.io/) 的镜像使用的就是这个服务。
|
||||
最常使用的 Registry 公开服务是官方的 [Docker Hub](https://hub.docker.com/),这也是默认的 Registry,并拥有大量的高质量的 [官方镜像](https://hub.docker.com/search?q=&type=image&image_filter=official)。除此以外,还有 Red Hat 的 [Quay.io](https://quay.io/repository/);Google 的 [Google Container Registry](https://cloud.google.com/container-registry/),[Kubernetes](https://kubernetes.io/) 的镜像使用的就是这个服务;代码托管平台 [GitHub](https://github.com) 推出的 [ghcr.io](https://docs.github.com/cn/packages/working-with-a-github-packages-registry/working-with-the-container-registry)。
|
||||
|
||||
由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为**加速器**。常见的有 [阿里云加速器](https://cr.console.aliyun.com/#/accelerator)、[DaoCloud 加速器](https://www.daocloud.io/mirror#accelerator-doc)、[灵雀云加速器](http://docs.alauda.cn/feature/accelerator.html)等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从官方网站下载速度会提高很多。在后面的章节中会有进一步如何配置加速器的讲解。
|
||||
由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务(`Registry Mirror`),这些镜像服务被称为 **加速器**。常见的有 [阿里云加速器](https://www.aliyun.com/product/acr?source=5176.11533457&userCode=8lx5zmtu)、[DaoCloud 加速器](https://www.daocloud.io/mirror#accelerator-doc) 等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从 Docker Hub 下载速度会提高很多。在 [安装 Docker](../install/mirror.md) 一节中有详细的配置方法。
|
||||
|
||||
国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 [时速云镜像仓库](https://hub.tenxcloud.com/)、[网易云镜像服务](https://c.163.com/hub#/m/library/)、[DaoCloud 镜像市场](https://hub.daocloud.io/)、[阿里云镜像库](https://cr.console.aliyun.com)等。
|
||||
国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 [网易云镜像服务](https://c.163.com/hub#/m/library/)、[DaoCloud 镜像市场](https://hub.daocloud.io/)、[阿里云镜像库](https://www.aliyun.com/product/acr?source=5176.11533457&userCode=8lx5zmtu) 等。
|
||||
|
||||
### 私有 Docker Registry
|
||||
## 私有 Docker Registry
|
||||
|
||||
除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 [Docker Registry 镜像](https://hub.docker.com/_/registry/),可以直接使用做为私有 Registry 服务。在后续的相关章节中,会有进一步的搭建私有 Registry 服务的讲解。
|
||||
除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 [Docker Registry](https://hub.docker.com/_/registry/) 镜像,可以直接使用做为私有 Registry 服务。在 [私有仓库](../repository/registry.md) 一节中,会有进一步的搭建私有 Registry 服务的讲解。
|
||||
|
||||
开源的 Docker Registry 镜像只提供了 [Docker Registry API](https://docs.docker.com/registry/spec/api/) 的服务端实现,足以支持 `docker` 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。在官方的商业化版本 [Docker Trusted Registry](https://docs.docker.com/datacenter/dtr/2.0/) 中,提供了这些高级功能。
|
||||
开源的 Docker Registry 镜像只提供了 [Docker Registry API](https://docs.docker.com/registry/spec/api/) 的服务端实现,足以支持 `docker` 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。
|
||||
|
||||
除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,[VMWare Harbor](http://vmware.github.io/harbor/index_cn.html) 和 [Sonatype Nexus](https://www.sonatype.com/docker)。
|
||||
除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,[Harbor](https://github.com/goharbor/harbor) 和 [Sonatype Nexus](../repository/nexus3_registry.md)。
|
||||
|
29
book.json
@ -1,9 +1,18 @@
|
||||
{
|
||||
"title": "Docker -- 从入门到实践",
|
||||
"author": "yeasy",
|
||||
"language": "zh-hans",
|
||||
"links": {
|
||||
"sidebar": {
|
||||
"GitHub": "https://github.com/yeasy/docker_practice"
|
||||
}
|
||||
},
|
||||
"plugins": [
|
||||
"-livereload",
|
||||
"image-captions",
|
||||
"github-buttons"
|
||||
"github",
|
||||
"page-treeview@2.9.8",
|
||||
"editlink"
|
||||
],
|
||||
"pluginsConfig": {
|
||||
"image-captions": {
|
||||
@ -12,13 +21,17 @@
|
||||
},
|
||||
"caption": "图 _PAGE_LEVEL_._PAGE_IMAGE_NUMBER_ - _CAPTION_"
|
||||
},
|
||||
"github-buttons": {
|
||||
"repo": "yeasy/docker_practice",
|
||||
"types": [
|
||||
"star",
|
||||
"watch"
|
||||
],
|
||||
"size": "small"
|
||||
"github": {
|
||||
"url": "https://github.com/yeasy/docker_practice"
|
||||
},
|
||||
"editlink": {
|
||||
"base": "https://github.com/yeasy/docker_practice/blob/master/",
|
||||
"label": "编辑本页"
|
||||
},
|
||||
"page-treeview": {
|
||||
"copyright": "Copyright © yeasy",
|
||||
"minHeaderCount": "2",
|
||||
"minHeaderDeep": "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
5
buildx/README.md
Normal file
@ -0,0 +1,5 @@
|
||||
# Docker Buildx
|
||||
|
||||
Docker Buildx 是一个 docker CLI 插件,其扩展了 docker 命令,支持 [Moby BuildKit](buildkit.md) 提供的功能。提供了与 docker build 相同的用户体验,并增加了许多新功能。
|
||||
|
||||
> 该功能仅适用于 Docker v19.03+ 版本
|
154
buildx/buildkit.md
Normal file
@ -0,0 +1,154 @@
|
||||
# 使用 `BuildKit` 构建镜像
|
||||
|
||||
**BuildKit** 是下一代的镜像构建组件,在 https://github.com/moby/buildkit 开源。
|
||||
|
||||
**注意:如果您的镜像构建使用的是云服务商提供的镜像构建服务(腾讯云容器服务、阿里云容器服务等),由于上述服务提供商的 Docker 版本低于 18.09,BuildKit 无法使用,将造成镜像构建失败。建议使用 BuildKit 构建镜像时使用一个新的 Dockerfile 文件(例如 Dockerfile.buildkit)**
|
||||
|
||||
目前,Docker Hub 自动构建已经支持 buildkit,具体请参考 https://github.com/docker-practice/docker-hub-buildx
|
||||
|
||||
## `Dockerfile` 新增指令详解
|
||||
|
||||
启用 `BuildKit` 之后,我们可以使用下面几个新的 `Dockerfile` 指令来加快镜像构建。
|
||||
|
||||
### `RUN --mount=type=cache`
|
||||
|
||||
目前,几乎所有的程序都会使用依赖管理工具,例如 `Go` 中的 `go mod`、`Node.js` 中的 `npm` 等等,当我们构建一个镜像时,往往会重复的从互联网中获取依赖包,难以缓存,大大降低了镜像的构建效率。
|
||||
|
||||
例如一个前端工程需要用到 `npm`:
|
||||
|
||||
```docker
|
||||
FROM node:alpine as builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY package.json /app/
|
||||
|
||||
RUN npm i --registry=https://registry.npm.taobao.org \
|
||||
&& rm -rf ~/.npm
|
||||
|
||||
COPY src /app/src
|
||||
|
||||
RUN npm run build
|
||||
|
||||
FROM nginx:alpine
|
||||
|
||||
COPY --from=builder /app/dist /app/dist
|
||||
```
|
||||
|
||||
使用多阶段构建,构建的镜像中只包含了目标文件夹 `dist`,但仍然存在一些问题,当 `package.json` 文件变动时,`RUN npm i && rm -rf ~/.npm` 这一层会重新执行,变更多次后,生成了大量的中间层镜像。
|
||||
|
||||
为解决这个问题,进一步的我们可以设想一个类似 **数据卷** 的功能,在镜像构建时把 `node_modules` 文件夹挂载上去,在构建完成后,这个 `node_modules` 文件夹会自动卸载,实际的镜像中并不包含 `node_modules` 这个文件夹,这样我们就省去了每次获取依赖的时间,大大增加了镜像构建效率,同时也避免了生成了大量的中间层镜像。
|
||||
|
||||
`BuildKit` 提供了 `RUN --mount=type=cache` 指令,可以实现上边的设想。
|
||||
|
||||
```docker
|
||||
# syntax = docker/dockerfile:experimental
|
||||
FROM node:alpine as builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY package.json /app/
|
||||
|
||||
RUN --mount=type=cache,target=/app/node_modules,id=my_app_npm_module,sharing=locked \
|
||||
--mount=type=cache,target=/root/.npm,id=npm_cache \
|
||||
npm i --registry=https://registry.npm.taobao.org
|
||||
|
||||
COPY src /app/src
|
||||
|
||||
RUN --mount=type=cache,target=/app/node_modules,id=my_app_npm_module,sharing=locked \
|
||||
# --mount=type=cache,target=/app/dist,id=my_app_dist,sharing=locked \
|
||||
npm run build
|
||||
|
||||
FROM nginx:alpine
|
||||
|
||||
# COPY --from=builder /app/dist /app/dist
|
||||
|
||||
# 为了更直观的说明 from 和 source 指令,这里使用 RUN 指令
|
||||
RUN --mount=type=cache,target=/tmp/dist,from=builder,source=/app/dist \
|
||||
# --mount=type=cache,target/tmp/dist,from=my_app_dist,sharing=locked \
|
||||
mkdir -p /app/dist && cp -r /tmp/dist/* /app/dist
|
||||
```
|
||||
|
||||
**由于 `BuildKit` 为实验特性,每个 `Dockerfile` 文件开头都必须加上如下指令**
|
||||
|
||||
```docker
|
||||
# syntax = docker/dockerfile:experimental
|
||||
```
|
||||
|
||||
第一个 `RUN` 指令执行后,`id` 为 `my_app_npm_module` 的缓存文件夹挂载到了 `/app/node_modules` 文件夹中。多次执行也不会产生多个中间层镜像。
|
||||
|
||||
第二个 `RUN` 指令执行时需要用到 `node_modules` 文件夹,`node_modules` 已经挂载,命令也可以正确执行。
|
||||
|
||||
第三个 `RUN` 指令将上一阶段产生的文件复制到指定位置,`from` 指明缓存的来源,这里 `builder` 表示缓存来源于构建的第一阶段,`source` 指明缓存来源的文件夹。
|
||||
|
||||
上面的 `Dockerfile` 中 `--mount=type=cache,...` 中指令作用如下:
|
||||
|
||||
|Option |Description|
|
||||
|---------------------|-----------|
|
||||
|`id` | `id` 设置一个标志,以便区分缓存。|
|
||||
|`target` (必填项) | 缓存的挂载目标文件夹。|
|
||||
|`ro`,`readonly` | 只读,缓存文件夹不能被写入。 |
|
||||
|`sharing` | 有 `shared` `private` `locked` 值可供选择。`sharing` 设置当一个缓存被多次使用时的表现,由于 `BuildKit` 支持并行构建,当多个步骤使用同一缓存时(同一 `id`)会发生冲突。`shared` 表示多个步骤可以同时读写,`private` 表示当多个步骤使用同一缓存时,每个步骤使用不同的缓存,`locked` 表示当一个步骤完成释放缓存后,后一个步骤才能继续使用该缓存。|
|
||||
|`from` | 缓存来源(构建阶段),不填写时为空文件夹。|
|
||||
|`source` | 来源的文件夹路径。|
|
||||
|
||||
### `RUN --mount=type=bind`
|
||||
|
||||
该指令可以将一个镜像(或上一构建阶段)的文件挂载到指定位置。
|
||||
|
||||
```docker
|
||||
# syntax = docker/dockerfile:experimental
|
||||
RUN --mount=type=bind,from=php:alpine,source=/usr/local/bin/docker-php-entrypoint,target=/docker-php-entrypoint \
|
||||
cat /docker-php-entrypoint
|
||||
```
|
||||
|
||||
### `RUN --mount=type=tmpfs`
|
||||
|
||||
该指令可以将一个 `tmpfs` 文件系统挂载到指定位置。
|
||||
|
||||
```docker
|
||||
# syntax = docker/dockerfile:experimental
|
||||
RUN --mount=type=tmpfs,target=/temp \
|
||||
mount | grep /temp
|
||||
```
|
||||
|
||||
### `RUN --mount=type=secret`
|
||||
|
||||
该指令可以将一个文件(例如密钥)挂载到指定位置。
|
||||
|
||||
```docker
|
||||
# syntax = docker/dockerfile:experimental
|
||||
RUN --mount=type=secret,id=aws,target=/root/.aws/credentials \
|
||||
cat /root/.aws/credentials
|
||||
```
|
||||
|
||||
```bash
|
||||
$ docker build -t test --secret id=aws,src=$HOME/.aws/credentials .
|
||||
```
|
||||
|
||||
### `RUN --mount=type=ssh`
|
||||
|
||||
该指令可以挂载 `ssh` 密钥。
|
||||
|
||||
```docker
|
||||
# syntax = docker/dockerfile:experimental
|
||||
FROM alpine
|
||||
RUN apk add --no-cache openssh-client
|
||||
RUN mkdir -p -m 0700 ~/.ssh && ssh-keyscan gitlab.com >> ~/.ssh/known_hosts
|
||||
RUN --mount=type=ssh ssh git@gitlab.com | tee /hello
|
||||
```
|
||||
|
||||
```bash
|
||||
$ eval $(ssh-agent)
|
||||
$ ssh-add ~/.ssh/id_rsa
|
||||
(Input your passphrase here)
|
||||
$ docker build -t test --ssh default=$SSH_AUTH_SOCK .
|
||||
```
|
||||
|
||||
## docker-compose build 使用 Buildkit
|
||||
|
||||
设置 `COMPOSE_DOCKER_CLI_BUILD=1` 环境变量即可使用。
|
||||
|
||||
## 官方文档
|
||||
|
||||
* https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md
|
17
buildx/buildx.md
Normal file
@ -0,0 +1,17 @@
|
||||
# 使用 Buildx 构建镜像
|
||||
|
||||
## 使用
|
||||
|
||||
你可以直接使用 `docker buildx build` 命令构建镜像。
|
||||
|
||||
```bash
|
||||
$ docker buildx build .
|
||||
[+] Building 8.4s (23/32)
|
||||
=> ...
|
||||
```
|
||||
|
||||
Buildx 使用 [BuildKit 引擎](buildkit.md) 进行构建,支持许多新的功能,具体参考 [Buildkit](buildkit.md) 一节。
|
||||
|
||||
## 官方文档
|
||||
|
||||
* https://docs.docker.com/engine/reference/commandline/buildx/
|
126
buildx/multi-arch-images.md
Normal file
@ -0,0 +1,126 @@
|
||||
# 使用 buildx 构建多种系统架构支持的 Docker 镜像
|
||||
|
||||
在之前的版本中构建多种系统架构支持的 Docker 镜像,要想使用统一的名字必须使用 [`$ docker manifest`](../image/manifest.md) 命令。
|
||||
|
||||
在 Docker 19.03+ 版本中可以使用 `$ docker buildx build` 命令使用 `BuildKit` 构建镜像。该命令支持 `--platform` 参数可以同时构建支持多种系统架构的 Docker 镜像,大大简化了构建步骤。
|
||||
|
||||
## 新建 `builder` 实例
|
||||
|
||||
Docker for Linux 不支持构建 `arm` 架构镜像,我们可以运行一个新的容器让其支持该特性,Docker 桌面版无需进行此项设置。
|
||||
|
||||
```bash
|
||||
$ docker run --rm --privileged tonistiigi/binfmt:latest --install all
|
||||
```
|
||||
|
||||
由于 Docker 默认的 `builder` 实例不支持同时指定多个 `--platform`,我们必须首先创建一个新的 `builder` 实例。同时由于国内拉取镜像较缓慢,我们可以使用配置了 [镜像加速地址](https://github.com/moby/buildkit/blob/master/docs/buildkitd.toml.md) 的 [`dockerpracticesig/buildkit:master`](https://github.com/docker-practice/buildx) 镜像替换官方镜像。
|
||||
|
||||
> 如果你有私有的镜像加速器,可以基于 https://github.com/docker-practice/buildx 构建自己的 buildkit 镜像并使用它。
|
||||
|
||||
```bash
|
||||
# 适用于国内环境
|
||||
$ docker buildx create --use --name=mybuilder-cn --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master
|
||||
|
||||
# 适用于腾讯云环境(腾讯云主机、coding.net 持续集成)
|
||||
$ docker buildx create --use --name=mybuilder-cn --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master-tencent
|
||||
|
||||
# $ docker buildx create --name mybuilder --driver docker-container
|
||||
|
||||
$ docker buildx use mybuilder
|
||||
```
|
||||
|
||||
## 构建镜像
|
||||
|
||||
新建 Dockerfile 文件。
|
||||
|
||||
```docker
|
||||
FROM --platform=$TARGETPLATFORM alpine
|
||||
|
||||
RUN uname -a > /os.txt
|
||||
|
||||
CMD cat /os.txt
|
||||
```
|
||||
|
||||
使用 `$ docker buildx build` 命令构建镜像,注意将 `myusername` 替换为自己的 Docker Hub 用户名。
|
||||
|
||||
`--push` 参数表示将构建好的镜像推送到 Docker 仓库。
|
||||
|
||||
```bash
|
||||
$ docker buildx build --platform linux/arm,linux/arm64,linux/amd64 -t myusername/hello . --push
|
||||
|
||||
# 查看镜像信息
|
||||
$ docker buildx imagetools inspect myusername/hello
|
||||
```
|
||||
|
||||
在不同架构运行该镜像,可以得到该架构的信息。
|
||||
|
||||
```bash
|
||||
# arm
|
||||
$ docker run -it --rm myusername/hello
|
||||
Linux buildkitsandbox 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 armv7l Linux
|
||||
|
||||
# arm64
|
||||
$ docker run -it --rm myusername/hello
|
||||
Linux buildkitsandbox 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 aarch64 Linux
|
||||
|
||||
# amd64
|
||||
$ docker run -it --rm myusername/hello
|
||||
Linux buildkitsandbox 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 x86_64 Linux
|
||||
```
|
||||
|
||||
## 架构相关变量
|
||||
|
||||
`Dockerfile` 支持如下架构相关的变量
|
||||
|
||||
**TARGETPLATFORM**
|
||||
|
||||
构建镜像的目标平台,例如 `linux/amd64`, `linux/arm/v7`, `windows/amd64`。
|
||||
|
||||
**TARGETOS**
|
||||
|
||||
`TARGETPLATFORM` 的 OS 类型,例如 `linux`, `windows`
|
||||
|
||||
**TARGETARCH**
|
||||
|
||||
`TARGETPLATFORM` 的架构类型,例如 `amd64`, `arm`
|
||||
|
||||
**TARGETVARIANT**
|
||||
|
||||
`TARGETPLATFORM` 的变种,该变量可能为空,例如 `v7`
|
||||
|
||||
**BUILDPLATFORM**
|
||||
|
||||
构建镜像主机平台,例如 `linux/amd64`
|
||||
|
||||
**BUILDOS**
|
||||
|
||||
`BUILDPLATFORM` 的 OS 类型,例如 `linux`
|
||||
|
||||
**BUILDARCH**
|
||||
|
||||
`BUILDPLATFORM` 的架构类型,例如 `amd64`
|
||||
|
||||
**BUILDVARIANT**
|
||||
|
||||
`BUILDPLATFORM` 的变种,该变量可能为空,例如 `v7`
|
||||
|
||||
### 使用举例
|
||||
|
||||
例如我们要构建支持 `linux/arm/v7` 和 `linux/amd64` 两种架构的镜像。假设已经生成了两个平台对应的二进制文件:
|
||||
|
||||
* `bin/dist-linux-arm`
|
||||
* `bin/dist-linux-amd64`
|
||||
|
||||
那么 `Dockerfile` 可以这样书写:
|
||||
|
||||
```docker
|
||||
FROM scratch
|
||||
|
||||
# 使用变量必须申明
|
||||
ARG TARGETOS
|
||||
|
||||
ARG TARGETARCH
|
||||
|
||||
COPY bin/dist-${TARGETOS}-${TARGETARCH} /dist
|
||||
|
||||
ENTRYPOINT ["dist"]
|
||||
```
|
@ -1,2 +0,0 @@
|
||||
#实战案例
|
||||
介绍一些典型的应用场景和案例。
|
7
cases/ci/README.md
Normal file
@ -0,0 +1,7 @@
|
||||
# CI/CD
|
||||
|
||||
**持续集成(Continuous integration)** 是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
|
||||
|
||||
**持续部署(continuous deployment)** 是通过自动化的构建、测试和部署循环来快速交付高质量的产品。
|
||||
|
||||
与 `Jenkins` 不同的是,基于 Docker 的 CI/CD 每一步都运行在 Docker 容器中,所以理论上支持所有的编程语言。
|
28
cases/ci/actions/README.md
Normal file
@ -0,0 +1,28 @@
|
||||
# GitHub Actions
|
||||
|
||||
GitHub [Actions](https://github.com/features/actions) 是 GitHub 推出的一款 CI/CD 工具。
|
||||
|
||||
我们可以在每个 `job` 的 `step` 中使用 Docker 执行构建步骤。
|
||||
|
||||
```yaml
|
||||
on: push
|
||||
|
||||
name: CI
|
||||
|
||||
jobs:
|
||||
my-job:
|
||||
name: Build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@master
|
||||
with:
|
||||
fetch-depth: 2
|
||||
- name: run docker container
|
||||
uses: docker://golang:alpine
|
||||
with:
|
||||
args: go version
|
||||
```
|
||||
|
||||
## 参考资料
|
||||
|
||||
* [Actions Docs](https://docs.github.com/en/actions)
|
6
cases/ci/drone/.env.example
Normal file
@ -0,0 +1,6 @@
|
||||
DRONE_SERVER_HOST=
|
||||
DRONE_SERVER_PROTO=
|
||||
DRONE_RPC_SECRET=
|
||||
HOSTNAME=
|
||||
DRONE_GITHUB_CLIENT_ID=
|
||||
DRONE_GITHUB_CLIENT_SECRET=
|
2
cases/ci/drone/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
.env
|
||||
ssl/*
|