Compare commits
536 Commits
v0.1
...
docker-leg
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2535813859 | ||
|
|
c8260780d9 | ||
|
|
d8b2a7a303 | ||
|
|
41779a5661 | ||
|
|
fc86abea99 | ||
|
|
62f9976b0d | ||
|
|
70d77b489d | ||
|
|
060dee21d5 | ||
|
|
f59dd5bdc0 | ||
|
|
6612b45387 | ||
|
|
f7e6d648f5 | ||
|
|
1a5c72ee10 | ||
|
|
de972a0404 | ||
|
|
5217746e64 | ||
|
|
91e53f489a | ||
|
|
f1a9e3372c | ||
|
|
647828bf85 | ||
|
|
9e2cdc0779 | ||
|
|
62c03c1c53 | ||
|
|
b0d1050cfb | ||
|
|
0fd286a5d1 | ||
|
|
f07c51e2e7 | ||
|
|
705fb2efc3 | ||
|
|
f23e8f8ce7 | ||
|
|
5f481b90dc | ||
|
|
a7ac3b4273 | ||
|
|
e33150db73 | ||
|
|
095244b371 | ||
|
|
4f7a1ef89c | ||
|
|
6e3c7fd2a5 | ||
|
|
5786333a3b | ||
|
|
2568854736 | ||
|
|
79f0fc403f | ||
|
|
4ca37a0de7 | ||
|
|
34b0969ef7 | ||
|
|
1bfd80b970 | ||
|
|
8f7b408091 | ||
|
|
e87ff1bb1e | ||
|
|
7ef6616b1c | ||
|
|
fcabe5bc3b | ||
|
|
60ebacfda4 | ||
|
|
df6d092c11 | ||
|
|
2a39cf4ce8 | ||
|
|
22fa7ea709 | ||
|
|
17add1cda4 | ||
|
|
a56376fc7c | ||
|
|
9c93015ed3 | ||
|
|
c703cae1cf | ||
|
|
86523b981e | ||
|
|
4f3ecaa0df | ||
|
|
f22277afbf | ||
|
|
d9648a2544 | ||
|
|
12ddbfda1e | ||
|
|
0d2cc4a8d3 | ||
|
|
e003739d1a | ||
|
|
59e80243dc | ||
|
|
8a8edc3767 | ||
|
|
94e6ed39cc | ||
|
|
3344b31dcc | ||
|
|
caf3cdf801 | ||
|
|
53aca57515 | ||
|
|
7726d62b7a | ||
|
|
b003629be5 | ||
|
|
8291e13c27 | ||
|
|
05120d9e5e | ||
|
|
d4c1f98702 | ||
|
|
a3bec5ffba | ||
|
|
78e5d45125 | ||
|
|
37b4149605 | ||
|
|
ec70b04ff0 | ||
|
|
c247ef2aef | ||
|
|
60388ba6e9 | ||
|
|
bcb673ad00 | ||
|
|
9e60e762f5 | ||
|
|
db5da49511 | ||
|
|
dd33dea8e4 | ||
|
|
0b99f62220 | ||
|
|
8daf9c4f15 | ||
|
|
57b6e46ad2 | ||
|
|
0f91a0ed7d | ||
|
|
b2508c8bac | ||
|
|
2226d748e3 | ||
|
|
3d66f42043 | ||
|
|
52934e24c9 | ||
|
|
29c0385b12 | ||
|
|
a46012033f | ||
|
|
ecc493ac96 | ||
|
|
b1cf8d3dc1 | ||
|
|
63d52eba72 | ||
|
|
f2ede78953 | ||
|
|
2cfa980930 | ||
|
|
36ab0b9862 | ||
|
|
e8389a46b3 | ||
|
|
f2d6f998ab | ||
|
|
e537012881 | ||
|
|
590b0bea31 | ||
|
|
b0330ce1d8 | ||
|
|
bd7b7c18c3 | ||
|
|
5230300d30 | ||
|
|
fa3c55840c | ||
|
|
eb66a35128 | ||
|
|
3484bb3cf6 | ||
|
|
710956aed5 | ||
|
|
66b81709e7 | ||
|
|
66de644f33 | ||
|
|
5aec4fae19 | ||
|
|
5cd720a388 | ||
|
|
5291db9ad4 | ||
|
|
414a7cd087 | ||
|
|
5385a8b0dc | ||
|
|
4aec4f9d7a | ||
|
|
ff5eb9d96a | ||
|
|
34a0655774 | ||
|
|
72fbb7ed15 | ||
|
|
efb0afd0d9 | ||
|
|
e84a08c4f2 | ||
|
|
d816cd15ad | ||
|
|
48bf98a77b | ||
|
|
a37cf1b88c | ||
|
|
f3be1fe1f5 | ||
|
|
4a114902d6 | ||
|
|
3e0c0c6ef6 | ||
|
|
20d632465b | ||
|
|
f1b622ebfd | ||
|
|
28cfc39b9c | ||
|
|
fc5d514ec1 | ||
|
|
8889a6c8c3 | ||
|
|
45cdd756eb | ||
|
|
a119a30fa5 | ||
|
|
157923420f | ||
|
|
48badeb0a0 | ||
|
|
3f0b68c21d | ||
|
|
6c60ad459c | ||
|
|
f4e95e1215 | ||
|
|
aee6aa8fe6 | ||
|
|
3f41302794 | ||
|
|
6fd3097bd9 | ||
|
|
df94a6e1fb | ||
|
|
d8be8f15a9 | ||
|
|
c5ac987475 | ||
|
|
d8858e5e3d | ||
|
|
c7c5731104 | ||
|
|
65a1e69462 | ||
|
|
e2158ef4fd | ||
|
|
5b03c5d974 | ||
|
|
442f829ef5 | ||
|
|
c4028b0016 | ||
|
|
01ff5ca004 | ||
|
|
bdab0474c4 | ||
|
|
46be5458ef | ||
|
|
97d8e43b49 | ||
|
|
bf3100e68f | ||
|
|
57e97c6375 | ||
|
|
5c66e377f8 | ||
|
|
a63448d447 | ||
|
|
4fdbb1ee33 | ||
|
|
9fd3717645 | ||
|
|
8437b4fd1f | ||
|
|
3d9982357b | ||
|
|
b0626d8de8 | ||
|
|
e7fffbae3a | ||
|
|
8a68bf2108 | ||
|
|
7052c162e3 | ||
|
|
73161f3758 | ||
|
|
549d13b717 | ||
|
|
dcb2cfe246 | ||
|
|
e4e10ead0f | ||
|
|
4e70ce8578 | ||
|
|
8a2846741b | ||
|
|
18f3c52ba8 | ||
|
|
d894237ab5 | ||
|
|
a4de63b13f | ||
|
|
66e3bfcb6f | ||
|
|
efef4590b6 | ||
|
|
36b9f63707 | ||
|
|
0c6490c510 | ||
|
|
accd03a8e9 | ||
|
|
8e0137347b | ||
|
|
1fdc0dd63d | ||
|
|
7aab504ecb | ||
|
|
6be8a72e81 | ||
|
|
a0f18930f3 | ||
|
|
3c9695f9c1 | ||
|
|
4e6a59ebc5 | ||
|
|
26a6004ee5 | ||
|
|
6ce541c063 | ||
|
|
375512ec17 | ||
|
|
6076ac618a | ||
|
|
85c9b33621 | ||
|
|
dede6be4d3 | ||
|
|
3ed9e56dc3 | ||
|
|
507ae54044 | ||
|
|
1ef669b5e7 | ||
|
|
c0d6cc88d7 | ||
|
|
69d34f7607 | ||
|
|
904fb90f5b | ||
|
|
308f8c6f5a | ||
|
|
18bd64b147 | ||
|
|
7b68db9dc6 | ||
|
|
7c9ceaa4dc | ||
|
|
2ccf861503 | ||
|
|
1c4d30c374 | ||
|
|
1af242e154 | ||
|
|
9fa5ff18a7 | ||
|
|
2044998a27 | ||
|
|
a8e690e5f3 | ||
|
|
0cabecc05f | ||
|
|
51c1f16947 | ||
|
|
3e04648a41 | ||
|
|
280432204f | ||
|
|
6e5aeba187 | ||
|
|
1089796d49 | ||
|
|
7d4df6e369 | ||
|
|
45b0402226 | ||
|
|
bebc4f646c | ||
|
|
c9555eb0f5 | ||
|
|
33bfa4c9dc | ||
|
|
a6368a8091 | ||
|
|
55712f7bdf | ||
|
|
316b45f11a | ||
|
|
2fceed22ac | ||
|
|
5fa1b6024a | ||
|
|
c50cfe14e0 | ||
|
|
34fc4eee76 | ||
|
|
3bd6083e68 | ||
|
|
a6acd08bd0 | ||
|
|
6274d552d6 | ||
|
|
e2544bcb28 | ||
|
|
121f498011 | ||
|
|
7d9625ec25 | ||
|
|
3ca35d9638 | ||
|
|
c71cf6a731 | ||
|
|
062f008435 | ||
|
|
6158dda40e | ||
|
|
692db8b6a2 | ||
|
|
3291d4795f | ||
|
|
bfecf409ea | ||
|
|
eb32546e3c | ||
|
|
cd59aaf167 | ||
|
|
6066e9cc5a | ||
|
|
4d60922fa3 | ||
|
|
14fddb18be | ||
|
|
0dfe3ebcce | ||
|
|
99df02f626 | ||
|
|
0a4bd48a79 | ||
|
|
9956994b76 | ||
|
|
e564a7d4da | ||
|
|
950dadf54d | ||
|
|
a7d45c5a16 | ||
|
|
a435453b80 | ||
|
|
5ba3d7b007 | ||
|
|
bace19fdc0 | ||
|
|
76d8382136 | ||
|
|
17ecc5d33d | ||
|
|
8043983d75 | ||
|
|
28c1490fc6 | ||
|
|
f633c14de3 | ||
|
|
f026a1bee0 | ||
|
|
e0d2d0997f | ||
|
|
60ec1bf62c | ||
|
|
977221c5d1 | ||
|
|
72144f1032 | ||
|
|
62aa90a3bf | ||
|
|
94c15606b3 | ||
|
|
215a5dec0b | ||
|
|
2a6620036f | ||
|
|
c5a5656220 | ||
|
|
0e87b70fbf | ||
|
|
03b1d1ffc0 | ||
|
|
eb6683fbd7 | ||
|
|
345b0703a3 | ||
|
|
7f4e4145b0 | ||
|
|
c814568560 | ||
|
|
4cb1252a98 | ||
|
|
a2231978ab | ||
|
|
a3ca178621 | ||
|
|
0b607e92a2 | ||
|
|
29fcb84407 | ||
|
|
d457323780 | ||
|
|
f9c545dbfc | ||
|
|
ed893bea7e | ||
|
|
295b7cdb7f | ||
|
|
e4e3cca8d3 | ||
|
|
34a3c29865 | ||
|
|
b30d4a2328 | ||
|
|
5f59530d4c | ||
|
|
52a1755ce7 | ||
|
|
547ebe6053 | ||
|
|
fdeeaba0b0 | ||
|
|
8626d13738 | ||
|
|
36127abed9 | ||
|
|
8e976258b5 | ||
|
|
1d864385af | ||
|
|
068e2e948b | ||
|
|
d61a0b7677 | ||
|
|
da6bb5f174 | ||
|
|
fd92e6e343 | ||
|
|
39cb5ffa88 | ||
|
|
b66e84fb84 | ||
|
|
72f6c252be | ||
|
|
1b576a7e2a | ||
|
|
dee055b261 | ||
|
|
9df06628d2 | ||
|
|
c1844c1345 | ||
|
|
53b75686d7 | ||
|
|
d43fefff44 | ||
|
|
d4b2e6bee8 | ||
|
|
2fc168142c | ||
|
|
c06250ee20 | ||
|
|
815aca0279 | ||
|
|
1c194b4738 | ||
|
|
6b1a7e5028 | ||
|
|
939af1884a | ||
|
|
76fcc36ac9 | ||
|
|
6fb92461c4 | ||
|
|
86a4b061b0 | ||
|
|
cba7c8017e | ||
|
|
b7ed0ab7a4 | ||
|
|
7a87084d71 | ||
|
|
6375778e23 | ||
|
|
bf63c11c05 | ||
|
|
7cd6a94dc4 | ||
|
|
b445841df7 | ||
|
|
fa9d217607 | ||
|
|
60d1e6f20d | ||
|
|
340af53f10 | ||
|
|
4fff004b97 | ||
|
|
7ea165b3b4 | ||
|
|
842a81eb1c | ||
|
|
ff130ef077 | ||
|
|
57f53c031b | ||
|
|
92925d2cb3 | ||
|
|
b424142791 | ||
|
|
8d40f74532 | ||
|
|
285d69275a | ||
|
|
34282977af | ||
|
|
42ca51db65 | ||
|
|
dd02308d91 | ||
|
|
2da8779e68 | ||
|
|
e8607564a4 | ||
|
|
753130f571 | ||
|
|
9c5053b89c | ||
|
|
1cbd9645fc | ||
|
|
d473dabd78 | ||
|
|
b0a61fb009 | ||
|
|
6f3898ae6b | ||
|
|
7ccfec3f3b | ||
|
|
63264c623c | ||
|
|
8261449e42 | ||
|
|
9a6bc4a1aa | ||
|
|
42785a15a7 | ||
|
|
d044ff923a | ||
|
|
e55429f64f | ||
|
|
69e0cc2c26 | ||
|
|
94d7e664c3 | ||
|
|
14cad7881f | ||
|
|
a93f3b4d2a | ||
|
|
c5fd5f025c | ||
|
|
f80eed0e18 | ||
|
|
d2bbf9e4ca | ||
|
|
544ee1de65 | ||
|
|
8956a6b120 | ||
|
|
36b6e29d59 | ||
|
|
fbe187a743 | ||
|
|
971023ddca | ||
|
|
a977601251 | ||
|
|
589148450f | ||
|
|
29b7568853 | ||
|
|
69d10ac09d | ||
|
|
c0dbca7a93 | ||
|
|
dd24811386 | ||
|
|
2392ba87ea | ||
|
|
d4d430a99e | ||
|
|
201a2180a3 | ||
|
|
070359c511 | ||
|
|
7876ec1485 | ||
|
|
f945d9f209 | ||
|
|
9215e4b88e | ||
|
|
e5a297a7be | ||
|
|
34dc895942 | ||
|
|
d858b810be | ||
|
|
76b6a51f57 | ||
|
|
6af4bdd1d1 | ||
|
|
8a7c23ce01 | ||
|
|
089533127f | ||
|
|
d0297f8da6 | ||
|
|
fb3ba14bdf | ||
|
|
f9bdf3fe89 | ||
|
|
6e9dea1ffe | ||
|
|
d7c88f7972 | ||
|
|
05eb51961d | ||
|
|
5fc06666c8 | ||
|
|
af2a0b28c5 | ||
|
|
fda6a07a1e | ||
|
|
f936efebd9 | ||
|
|
16527880fb | ||
|
|
cb903202ba | ||
|
|
9d26f96ba2 | ||
|
|
ed7c2a3ee7 | ||
|
|
894d8ebc62 | ||
|
|
46195eb9f6 | ||
|
|
d732713b06 | ||
|
|
4e70438202 | ||
|
|
5a642809d9 | ||
|
|
06b9651af9 | ||
|
|
8117a15804 | ||
|
|
c48aa47432 | ||
|
|
d897954e8a | ||
|
|
1a6861476b | ||
|
|
6fa5159bb9 | ||
|
|
1faf0eeba6 | ||
|
|
24191c2ebe | ||
|
|
e94bb1d13b | ||
|
|
7896cb5d7b | ||
|
|
d4b8630bca | ||
|
|
8857c11fa6 | ||
|
|
8add83dcc2 | ||
|
|
6d890cab80 | ||
|
|
0505622aeb | ||
|
|
25c95840bf | ||
|
|
4098af51bc | ||
|
|
17ab6bcd7b | ||
|
|
73b5e3890e | ||
|
|
4901436e6b | ||
|
|
37e650575f | ||
|
|
3d8dd3175f | ||
|
|
56fc8fd280 | ||
|
|
d77c41dab7 | ||
|
|
5912b8fb00 | ||
|
|
929caa27e8 | ||
|
|
18507f9eaf | ||
|
|
ed6e476e94 | ||
|
|
2422e4e19d | ||
|
|
ec4e36bbf4 | ||
|
|
ae67944ddf | ||
|
|
cab41b6362 | ||
|
|
10b432ab65 | ||
|
|
08ed01831a | ||
|
|
26620cb3d5 | ||
|
|
a9825f93e9 | ||
|
|
86f8095149 | ||
|
|
ff245474dc | ||
|
|
cef1322014 | ||
|
|
b5d4a05d4b | ||
|
|
876ea4c9d6 | ||
|
|
9fd703bc18 | ||
|
|
2a60b4ce7e | ||
|
|
71bcec05b7 | ||
|
|
ed2750776a | ||
|
|
07edb7e3c1 | ||
|
|
3e9f1343f0 | ||
|
|
71f0f50f27 | ||
|
|
909dfb8e12 | ||
|
|
554224406b | ||
|
|
ca451d866f | ||
|
|
eb203c80d5 | ||
|
|
59abd4883d | ||
|
|
8c59d79c5b | ||
|
|
467edbe130 | ||
|
|
64ed80de0d | ||
|
|
ece126aa1b | ||
|
|
337065434d | ||
|
|
c5b81e3330 | ||
|
|
2a21c2f595 | ||
|
|
96b199aae2 | ||
|
|
5d00f5476b | ||
|
|
39ef881ace | ||
|
|
672316dfb5 | ||
|
|
f0eb7ac601 | ||
|
|
7f31be0ed9 | ||
|
|
49c4143e27 | ||
|
|
c184f014ae | ||
|
|
7b0e52f309 | ||
|
|
aa3ff4dc6a | ||
|
|
d544c2949f | ||
|
|
b94178ee16 | ||
|
|
4567e7e6f7 | ||
|
|
f4dc2303f6 | ||
|
|
8dffa923bc | ||
|
|
2b40097e66 | ||
|
|
0e65e07e3d | ||
|
|
23d4e36c64 | ||
|
|
424e07993e | ||
|
|
a3d8341e27 | ||
|
|
0d48072d5c | ||
|
|
b1e6415b8f | ||
|
|
d83e318b8c | ||
|
|
1065a728ce | ||
|
|
1ac18858b5 | ||
|
|
99f9a77b3c | ||
|
|
b20eb11659 | ||
|
|
6c1eeadd14 | ||
|
|
faacf4c31d | ||
|
|
beb5a07855 | ||
|
|
edbc260ba9 | ||
|
|
7fda9225a1 | ||
|
|
2b90922922 | ||
|
|
cdb5a2b4c7 | ||
|
|
22afe36b0f | ||
|
|
2403f6e73d | ||
|
|
4ad69eb796 | ||
|
|
7f5c1acf09 | ||
|
|
a228773062 | ||
|
|
910786014e | ||
|
|
4abab290ac | ||
|
|
389c15d748 | ||
|
|
c50e2aaf60 | ||
|
|
615bb9f517 | ||
|
|
c057d68cec | ||
|
|
3ec888c77a | ||
|
|
99b0f8fe72 | ||
|
|
34d63d30f3 | ||
|
|
dbb12986da | ||
|
|
64a0f39dff | ||
|
|
da60ad7b47 | ||
|
|
2c939cf20f | ||
|
|
e91a4955e9 | ||
|
|
fc7aa02f50 | ||
|
|
813c3bdab1 | ||
|
|
80eda65481 | ||
|
|
f14fddbba8 | ||
|
|
a9dddd5bc1 | ||
|
|
68e02605f6 | ||
|
|
743a09086a | ||
|
|
e6986e387e | ||
|
|
71adb73dbb | ||
|
|
e6883a4ef2 | ||
|
|
7fc1ca0733 | ||
|
|
79934ad3e1 | ||
|
|
0258da9046 | ||
|
|
e0405a38d6 | ||
|
|
afa47edf45 | ||
|
|
f5ab41b2fa | ||
|
|
1d101330fd | ||
|
|
1f5fb2d521 | ||
|
|
235a80aad8 |
10
.gitignore
vendored
@@ -1,3 +1,11 @@
|
||||
# Created by .gitignore support plugin (hsz.mobi)
|
||||
*.~
|
||||
*.tmp
|
||||
*.tmp
|
||||
.idea/
|
||||
_book/
|
||||
*.swp
|
||||
*.edx
|
||||
.DS_Store
|
||||
|
||||
|
||||
node_modules/
|
||||
|
||||
26
.travis/Dockerfile
Normal file
@@ -0,0 +1,26 @@
|
||||
FROM node:9-alpine
|
||||
|
||||
ENV TZ=Asia/Shanghai
|
||||
|
||||
WORKDIR /srv/gitbook
|
||||
|
||||
COPY book.json book.json
|
||||
|
||||
COPY docker-entrypoint.sh /usr/local/bin/
|
||||
|
||||
RUN apk add --no-cache \
|
||||
tzdata \
|
||||
&& 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
|
||||
30
.travis/book.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"title": "Docker -- 从入门到实践",
|
||||
"author": "yeasy",
|
||||
"plugins": [
|
||||
"image-captions",
|
||||
"github-buttons",
|
||||
"page-treeview"
|
||||
],
|
||||
"pluginsConfig": {
|
||||
"image-captions": {
|
||||
"attributes": {
|
||||
"width": "600"
|
||||
},
|
||||
"caption": "图 _PAGE_LEVEL_._PAGE_IMAGE_NUMBER_ - _CAPTION_"
|
||||
},
|
||||
"github-buttons": {
|
||||
"repo": "yeasy/docker_practice",
|
||||
"types": [
|
||||
"star",
|
||||
"watch"
|
||||
],
|
||||
"size": "small"
|
||||
},
|
||||
"page-treeview": {
|
||||
"copyright": "Copyright © yeasy",
|
||||
"minHeaderCount": "2",
|
||||
"minHeaderDeep": "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
5
.travis/docker-compose.test.yml
Normal file
@@ -0,0 +1,5 @@
|
||||
sut:
|
||||
build: .
|
||||
volumes:
|
||||
- ../:/srv/gitbook-src
|
||||
command: build
|
||||
19
.travis/docker-entrypoint.sh
Executable file
@@ -0,0 +1,19 @@
|
||||
#!/bin/sh
|
||||
|
||||
START=`date "+%F %T"`
|
||||
|
||||
if [ $1 = "sh" ];then sh ; exit 0; fi
|
||||
|
||||
rm -rf node_modules _book
|
||||
|
||||
cp -a . ../gitbook
|
||||
|
||||
cd ../gitbook
|
||||
|
||||
main(){
|
||||
if [ "$1" = build ];then gitbook build; cp -a _book ../gitbook-src; echo $START; date "+%F %T"; exit 0; fi
|
||||
gitbook serve
|
||||
exit 0
|
||||
}
|
||||
|
||||
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
|
||||
67
README.md
@@ -1,19 +1,60 @@
|
||||
Docker -- 从入门到实践
|
||||
===============
|
||||
# Docker — 从入门到实践
|
||||
|
||||
v0.1
|
||||
0.8.3
|
||||
|
||||
[Docker] (docker.com)是个伟大的项目!
|
||||
更新说明:2017年底本书内容将基于 Docker v17.09 进行重新修订,发布 0.9 版本。如果您由于特殊原因不能使用 Docker CE v17.09 以上版本,请阅读 [bump-0.8](https://github.com/yeasy/docker_practice/tree/bump-0.8) 分支的内容。
|
||||
|
||||
本书最初源于[WaitFish](mailto:dwj_wz@163.com)
|
||||
创作的<Docker学习手册v1.0> pdf内容,后来,[yeasy](github.com/yeasy)
|
||||
根据最新的官方文档对内容进行了修订,并与作者[WaitFish]
|
||||
(mailto:dwj_wz@163
|
||||
.com)协商,将内容开源,采用互联网合作的方式进行创作和维护。
|
||||
[Docker](http://www.docker.com) 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的运行效率,降低了云计算资源供应的成本! 使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松!
|
||||
|
||||
在线阅读:[https://www.gitbook.io/book/yeasy/docker_practice](https://www.gitbook.io/book/yeasy/docker_practice)
|
||||
无论是应用开发者、运维人员、还是其他信息技术从业人员,都有必要认识和掌握 Docker,以在有限的时间内做更多有意义的事。
|
||||
|
||||
维护本书的Github项目: [https://github.com/yeasy/docker_practice](https://github
|
||||
.com/yeasy/docker_practice)
|
||||
本开源书籍既适用于具备基础 Linux 知识的 Docker 初学者,也希望可供理解原理和实现的高级用户参考。同时,书中给出的实践案例,可供在进行实际部署时借鉴。前六章为基础内容,供用户理解 Docker 的基本概念和操作;7 ~ 9 章介绍一些高级操作;第 10 章给出典型的应用场景和实践案例;11、12 章介绍关于 Docker 安全和实现技术等高级话题。后续章节则分别介绍一些相关的热门开源项目。
|
||||
|
||||
欢迎大家提交pull request。
|
||||
在线阅读:[GitBook](https://www.gitbook.io/book/yeasy/docker_practice) 或 [Github](https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md)。
|
||||
|
||||
* pdf 版本 [下载](https://www.gitbook.com/download/pdf/book/yeasy/docker_practice)
|
||||
* epub 版本 [下载](https://www.gitbook.com/download/epub/book/yeasy/docker_practice)
|
||||
|
||||
离线阅读:
|
||||
|
||||
```bash
|
||||
$ git clone -b bump-0.8 --depth=1 https://github.com/yeasy/docker_practice.git
|
||||
|
||||
$ cd docker_practice
|
||||
|
||||
$ docker-compose pull # 如果您位于国外,这一步请改为 $ docker-compose build
|
||||
|
||||
$ docker-compose up
|
||||
```
|
||||
|
||||
Docker 自身仍在快速发展中,生态环境也在蓬勃成长。欢迎参与维护项目:[如何贡献](contribute.md)。
|
||||
|
||||
* [修订记录](revision.md)
|
||||
* [贡献者名单](https://github.com/yeasy/docker_practice/graphs/contributors)
|
||||
|
||||
## 技术交流
|
||||
欢迎关注 DockerPool 社区微博 [@dockerpool](http://weibo.com/u/5345404432),或加入 Docker 技术交流 QQ 群或微信组,分享 Docker 资源,交流 Docker 技术。
|
||||
|
||||
* QQ 群 I (已满):341410255
|
||||
* QQ 群 II (已满):419042067
|
||||
* QQ 群 III (已满):210028779
|
||||
* QQ 群 IV (已满):483702734
|
||||
* QQ 群 V (已满):460598761
|
||||
* QQ 群 VI (已满):581983671
|
||||
* QQ 群 VII (已满):252403484
|
||||
* QQ 群 VIII(已满):544818750
|
||||
* QQ 群 IX (可加):571502246
|
||||
|
||||
## 进阶学习
|
||||

|
||||
|
||||
《[Docker 技术入门与实战](http://item.jd.com/12121728.html)》第二版已经正式出版,针对初版进行内容升级,欢迎大家阅读使用并反馈建议。
|
||||
|
||||
* [京东图书](https://item.jd.com/12121728.html)
|
||||
* [China-Pub](http://product.china-pub.com/5089907)
|
||||
|
||||
## 鼓励项目
|
||||
|
||||
欢迎鼓励项目一杯 coffee~
|
||||
|
||||

|
||||
|
||||
202
SUMMARY.md
@@ -1,53 +1,151 @@
|
||||
#目录
|
||||
* [为什么要使用docker](why_use_docker/README.md)
|
||||
- [快速交付应用程序](why_use_docker/fast_deployment.md)
|
||||
- [更容易部署和扩展](why_use_docker/easy_deployment.md)
|
||||
- [效率更高](why_use_docker/high_efficiency.md)
|
||||
- [快速部署也意味着更简单的管理](why_use_docker/easy_management.md)
|
||||
* [Docker的体系结构](arch/README.md)
|
||||
- [内部组件](arch/internal.md)
|
||||
- [image的工作原理](arch/image.md)
|
||||
- [仓库](arch/repo.md)
|
||||
- [容器](arch/container.md)
|
||||
- [底层技术](arch/underly.md)
|
||||
* [安装](install/README.md)
|
||||
- [Ubuntu 14.04](install/ubuntu144.md)
|
||||
- [Ubuntu 12.04](install/ubuntu124.md)
|
||||
- [CentOS](install/centos.md)
|
||||
* [image介绍](image/README.md)
|
||||
- [获取mage](image/get.md)
|
||||
- [查找image](image/search.md)
|
||||
- [下载image](image/download.md)
|
||||
- [创建自己的image](image/create.md)
|
||||
- [上传image](image/push.md)
|
||||
- [移除本地image](image/rmi.md)
|
||||
* [网络介绍](network/README.md)
|
||||
- [端口映射](network/port_mapping.md)
|
||||
- [docker中的容器互联-linking系统](network/linking.md)
|
||||
* [高级网络配置](advanced_network/README.md)
|
||||
- [快速配置](advanced_network/fast_config.md)
|
||||
- [配置DNS](advanced_network/dns.md)
|
||||
- [容器之间的通信](advanced_network/communication.md)
|
||||
- [映射一个容器端口到宿主主机](advanced_network/port_mapping.md)
|
||||
- [定制docker0](advanced_network/docker0.md)
|
||||
- [创建自己的桥接](advanced_network/bridge.md)
|
||||
- [Docker 如何连接到容器](advanced_network/how_connect.md)
|
||||
- [工具和示例](advanced_network/example.md)
|
||||
- [创建一个点到点连接](advanced_network/ptp.md)
|
||||
# Summary
|
||||
|
||||
* [前言](README.md)
|
||||
* [修订记录](revision.md)
|
||||
* [如何贡献](contribute.md)
|
||||
* [Docker 简介](introduction/README.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)
|
||||
* [安装 Docker](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)
|
||||
* [数据管理](data_management/README.md)
|
||||
- [数据卷](data_management/volume.md)
|
||||
- [数据卷容器](data_management/container.md)
|
||||
- [备份、恢复、移动数据卷](data_management/management.md)
|
||||
* [容器安全](container_security/README.md)
|
||||
- [内核名字空间](container_security/kernel_ns.md)
|
||||
- [控制组](container_security/control_group.md)
|
||||
- [守护进程安全](container_security/daemon_sec.md)
|
||||
- [内核权限](container_security/kernel_capability.md)
|
||||
- [其他内核安全特性](container_security/other_feature.md)
|
||||
- [结论](container_security/summary.md)
|
||||
* [实战案例](practice/README.md)
|
||||
- [部署本地仓库](practice/local_repo.md)
|
||||
- [在Docker中使用 Supervisor来管理进程](practice/supervisor.md)
|
||||
* [创建tomcat/weblogic集群](practice/tomcat.md)
|
||||
* [多台物理主机之间的容器互联](practice/container_connect.md)
|
||||
* [中小企业docker环境搭建](practice/environment.md)
|
||||
* [数据卷](data_management/volume.md)
|
||||
* [数据卷容器](data_management/container.md)
|
||||
* [备份、恢复、迁移数据卷](data_management/management.md)
|
||||
* [使用网络](network/README.md)
|
||||
* [外部访问容器](network/port_mapping.md)
|
||||
* [容器互联](network/linking.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)
|
||||
* [安全](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)
|
||||
* [底层实现](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 三剑客之 Docker Swarm](swarm/README.md)
|
||||
* [Swarm 简介](swarm/intro.md)
|
||||
* [安装 Swarm](swarm/install.md)
|
||||
* [使用 Swarm](swarm/usage.md)
|
||||
* [使用其它服务发现后端](swarm/servicebackend.md)
|
||||
* [Swarm 中的调度器](swarm/scheduling.md)
|
||||
* [Swarm 中的过滤器](swarm/filter.md)
|
||||
* [本章小结](swarm/summary.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 简介](mesos/intro.md)
|
||||
* [安装与使用](mesos/installation.md)
|
||||
* [原理与架构](mesos/architecture.md)
|
||||
* [Mesos 配置项解析](mesos/configuration.md)
|
||||
* [日志与监控](mesos/monitor.md)
|
||||
* [常见应用框架](mesos/framework.md)
|
||||
* [本章小结](mesos/summary.md)
|
||||
* [容器与云计算](cloud/README.md)
|
||||
* [简介](cloud/intro.md)
|
||||
* [亚马逊云](cloud/aws.md)
|
||||
* [腾讯云](cloud/qcloud.md)
|
||||
* [阿里云](cloud/alicloud.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)
|
||||
* [CoreOS](cases/os/coreos.md)
|
||||
* [本章小结](cases/os/summary.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)
|
||||
|
||||
|
||||
BIN
_images/cover.jpg
Normal file
|
After Width: | Height: | Size: 214 KiB |
BIN
_images/cover.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
_images/cover.sketch
Normal file
BIN
_images/cover_small.jpg
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
BIN
_images/docker_primer.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
_images/docker_primer2.png
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
_images/donate.jpeg
Normal file
|
After Width: | Height: | Size: 55 KiB |
12
_layouts/website/page.html
Normal file
@@ -0,0 +1,12 @@
|
||||
{% extends template.self %}
|
||||
|
||||
{% block head %}
|
||||
{{ super() }}
|
||||
<style>
|
||||
@media only screen and (max-width: 640px) {
|
||||
.book-header .btn[aria-label="github"] {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
49
_local/.bashrc_docker
Normal file
@@ -0,0 +1,49 @@
|
||||
# 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
|
||||
}
|
||||
BIN
_local/docker_manual_waitfish.pdf
Normal file
13
_local/pull_all.sh
Normal file
@@ -0,0 +1,13 @@
|
||||
#!/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
|
||||
|
||||
12
_local/push_all.sh
Normal file
@@ -0,0 +1,12 @@
|
||||
#!/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
|
||||
|
||||
47
_local/push_images.sh
Normal file
@@ -0,0 +1,47 @@
|
||||
#!/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,9 +1,12 @@
|
||||
#docker高级网络配置
|
||||
当docker启动时,会在主机上创建一个docker0的虚拟网卡。他随机挑选RFC1918私有网络中的一段地址给docker0。比如172.17.42.1/16,16位掩码的网段可以拥有65534个地址可以使用,这对主机和容器来说应该足够了。
|
||||
注意:本章介绍docker的高级网络配置,一般情况下你不需要知道这些也可以使docker正常工作。简单的网络配置和介绍请看第五章内容。
|
||||
docker0 不是普通的网卡,他是桥接到其他网卡的虚拟网卡,容器使用它来和主机相互通信。当创建一个docker容器的时候,它就创建了一个对接口,当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包,它们是绑在一起的一对孪生接口。这对接口在容器中那一端的的名字是eth0,宿主主机端的会指定一个唯一的名字,比如vethAQI2QT这样的名字,这种接口名字不再主机的命名空间中。所有的veth*的接口都会桥接到docker0,这样docker就创建了在主机和所有容器之间一个虚拟共享网络。
|
||||
# 高级网络配置
|
||||
本章将介绍 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所有的网络定制配置。linux的原生命令将调整、补充、甚至替换docker默认的网络配置。
|
||||
当创建一个 Docker 容器的时候,同时会创建了一对 `veth pair` 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 `eth0`;另一端在本地并被挂载到 `docker0` 网桥,名称以 `veth` 开头(例如 `vethAQI2QT`)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。
|
||||
|
||||

|
||||
|
||||
接下来的部分将介绍在一些场景中,Docker 所有的网络定制配置。以及通过 Linux 命令来调整、补充、甚至替换 Docker 默认的网络配置。
|
||||
|
||||
BIN
advanced_network/_images/network.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
55
advanced_network/access_control.md
Normal file
@@ -0,0 +1,55 @@
|
||||
## 容器访问控制
|
||||
容器的访问控制,主要通过 Linux 上的 `iptables` 防火墙来进行管理和实现。`iptables` 是 Linux 上默认的防火墙软件,在大部分发行版中都自带。
|
||||
|
||||
### 容器访问外部网络
|
||||
容器要想访问外部网络,需要本地系统的转发支持。在Linux 系统中,检查转发是否打开。
|
||||
|
||||
```
|
||||
$sysctl net.ipv4.ip_forward
|
||||
net.ipv4.ip_forward = 1
|
||||
```
|
||||
如果为 0,说明没有开启转发,则需要手动打开。
|
||||
```
|
||||
$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` 规则。
|
||||
|
||||
可见,默认情况下,不同容器之间是允许网络互通的。如果为了安全考虑,可以在 `/etc/default/docker` 文件中配置 `DOCKER_OPTS=--icc=false` 来禁止它。
|
||||
|
||||
#### 访问指定端口
|
||||
在通过 `-icc=false` 关闭网络访问后,还可以通过 `--link=CONTAINER_NAME:ALIAS` 选项来访问容器的开放端口。
|
||||
|
||||
例如,在启动 Docker 服务时,可以同时使用 `icc=false --iptables=true` 参数来关闭允许相互的网络访问,并让 Docker 可以修改系统中的 `iptables` 规则。
|
||||
|
||||
此时,系统中的 `iptables` 规则可能是类似
|
||||
```
|
||||
$ sudo iptables -nL
|
||||
...
|
||||
Chain FORWARD (policy ACCEPT)
|
||||
target prot opt source destination
|
||||
DROP all -- 0.0.0.0/0 0.0.0.0/0
|
||||
...
|
||||
```
|
||||
|
||||
之后,启动容器(`docker run`)时使用 `--link=CONTAINER_NAME:ALIAS` 选项。Docker 会在 `iptable` 中为 两个容器分别添加一条 `ACCEPT` 规则,允许相互访问开放的端口(取决于 Dockerfile 中的 EXPOSE 行)。
|
||||
|
||||
当添加了 `--link=CONTAINER_NAME:ALIAS` 选项后,添加了 `iptables` 规则。
|
||||
```
|
||||
$ sudo iptables -nL
|
||||
...
|
||||
Chain FORWARD (policy ACCEPT)
|
||||
target prot opt source destination
|
||||
ACCEPT tcp -- 172.17.0.2 172.17.0.3 tcp spt:80
|
||||
ACCEPT tcp -- 172.17.0.3 172.17.0.2 tcp dpt:80
|
||||
DROP all -- 0.0.0.0/0 0.0.0.0/0
|
||||
```
|
||||
|
||||
注意:`--link=CONTAINER_NAME:ALIAS` 中的 `CONTAINER_NAME` 目前必须是 Docker 分配的名字,或使用 `--name` 参数指定的名字。主机名则不会被识别。
|
||||
@@ -1,31 +1,34 @@
|
||||
##创建自己的桥接
|
||||
如果希望完全使用自己的桥接设置,可以在启动docker服务的时候,使用 -b BRIDGE or --bridge=BRIDGE 来告诉docker使用你的网桥。如果服务已经启动,旧的网桥还在使用中,那需要先停止服务,再删除旧的网桥
|
||||
## 自定义网桥
|
||||
除了默认的 `docker0` 网桥,用户也可以指定网桥来连接各个容器。
|
||||
|
||||
在启动 Docker 服务的时候,使用 `-b BRIDGE`或`--bridge=BRIDGE` 来指定使用的网桥。
|
||||
|
||||
如果服务已经运行,那需要先停止服务,并删除旧的网桥。
|
||||
```
|
||||
#停止旧网桥并删除
|
||||
$ sudo service docker stop
|
||||
$ sudo ip link set dev docker0 down
|
||||
$ sudo brctl delbr docker0
|
||||
```
|
||||
然后在开启服务前,创建你自己希望的网桥接口,这里建立一个网桥的配置:
|
||||
然后创建一个网桥 `bridge0`。
|
||||
```
|
||||
# 创建自己的网桥
|
||||
$ sudo brctl addbr bridge0
|
||||
$ sudo ip addr add 192.168.5.1/24 dev bridge0
|
||||
$ sudo ip link set dev bridge0 up
|
||||
```
|
||||
查看确认网桥创建并启动。
|
||||
```
|
||||
# 确认网桥启动
|
||||
$ 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 服务,默认桥接到创建的网桥上。
|
||||
```
|
||||
# 告诉docker桥接设置,并启动docker服务(在ubuntu上)
|
||||
$ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker
|
||||
$ sudo service docker start
|
||||
```
|
||||
docker服务启动成功并绑定容器到新的网桥,新建一个容器,你会看到它的ip是我们的设置的新ip段,docker会自动检测到它。用brctl
|
||||
show可以看到容器启动或则停止后网桥的配置变化,在容器中使用```ip addr```和```ip route```来查看ip地址配置和路由信息。
|
||||
启动 Docker 服务。
|
||||
新建一个容器,可以看到它已经桥接到了 `bridge0` 上。
|
||||
|
||||
可以继续用 `brctl show` 命令查看桥接的信息。另外,在容器中可以使用 `ip addr` 和 `ip route` 命令来查看 IP 地址配置和路由信息。
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
##容器之间的通信
|
||||
判断2个容器之间是否能够通信,在操作系统层面,取决于3个因素:
|
||||
* 网络拓扑是否连接到容器的网络接口?默认docker会将所有的容器连接到docker0这网桥来提供数据包通信。其他拓扑结构将在稍后的文档中详细介绍。
|
||||
* 主机是否开启ip转发,ip_forward参数为1的时候可以提供数据包转发。通常你只需要为docker 设定 --ip-forward=true,
|
||||
docker 就会在服务启动的时候设定ip_forward参数为1。下面是手工检查并手工设定该参数的方法。
|
||||
```
|
||||
# Usually not necessary: turning on forwarding,
|
||||
# on the host where your Docker server is running
|
||||
$ cat /proc/sys/net/ipv4/ip_forward
|
||||
0
|
||||
$ sudo echo 1 > /proc/sys/net/ipv4/ip_forward
|
||||
$ cat /proc/sys/net/ipv4/ip_forward
|
||||
1
|
||||
```
|
||||
*你的iptables是否允许这条特殊的连接被建立?当docker的设定--iptables=false时,docker不会改变系统的iptables
|
||||
设定,否则它会在--icc=true的时候添加一条默认的ACCEPT策略到 FORWARD链,当—icc=false时,策略为DROP。几乎所有的人都会开启ip_forward来启用容器间的通信。但是否要改变icc-true配置是一个战略问题。这样iptable就可以防止其他被感染容器对宿主主机的恶意端口扫描和访问。
|
||||
当你选择更安全的设定--icc=false后,如何保持你希望的容器之间通信呢?
|
||||
答案就是--link=CONTAINER_NAME:ALIAS选项,在之前的dns服务设定中提及过。如果docker 使用icc=false and --iptables=true 2个参数,当docker run使用--link=选型时,docker会为2个容器在iptable中参数一对ACCEPT规则,开放的端口取决与dockerfile中的EXPOSE行,详见第五章。
|
||||
注意:--link= 中的CONTAINER_NAME 必须是自动生成的docker名字比如stupefied_pare,或者你用--name参数指定的名字,主机名在--link中不会被识别。
|
||||
你可以使用iptables命令来检查FORWARD链是ACCEPT 还是DROP
|
||||
当--icc=false时,默认规则应该是这样
|
||||
```
|
||||
$ sudo iptables -L -n
|
||||
...
|
||||
Chain FORWARD (policy ACCEPT)
|
||||
target prot opt source destination
|
||||
DROP all -- 0.0.0.0/0 0.0.0.0/0
|
||||
...
|
||||
```
|
||||
当添加了--link后,ACCEPT规则被改写了,添加了新的端口和IP规则
|
||||
```
|
||||
$ sudo iptables -L -n
|
||||
...
|
||||
Chain FORWARD (policy ACCEPT)
|
||||
target prot opt source destination
|
||||
ACCEPT tcp -- 172.17.0.2 172.17.0.3 tcp spt:80
|
||||
ACCEPT tcp -- 172.17.0.3 172.17.0.2 tcp dpt:80
|
||||
DROP all -- 0.0.0.0/0 0.0.0.0/0
|
||||
```
|
||||
5
advanced_network/config_file.md
Normal file
@@ -0,0 +1,5 @@
|
||||
## 编辑网络配置文件
|
||||
|
||||
Docker 1.2.0 开始支持在运行中的容器里编辑 `/etc/hosts`, `/etc/hostname` 和 `/etc/resolve.conf` 文件。
|
||||
|
||||
但是这些修改是临时的,只在运行的容器中保留,容器终止或重启后并不会被保存下来。也不会被 `docker commit` 提交。
|
||||
@@ -1,5 +1,8 @@
|
||||
##配置DNS
|
||||
docker没有定制为每一个容器定制image,是怎么提供容器的主机名和dns配置呢?秘诀就是它用主机上的3个配置文件来覆盖容器的这3个文件,在容器中使用mount命令可以看到:
|
||||
## 配置 DNS
|
||||
Docker 没有为每个容器专门定制镜像,那么怎么自定义配置容器的主机名和 DNS 配置呢?
|
||||
秘诀就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件。
|
||||
|
||||
在容器中使用 mount 命令可以看到挂载信息:
|
||||
```
|
||||
$ mount
|
||||
...
|
||||
@@ -8,18 +11,19 @@ $ mount
|
||||
tmpfs on /etc/resolv.conf type tmpfs ...
|
||||
...
|
||||
```
|
||||
这种机制可以让宿主主机从dhcp更新dns信息后,马上更新所有docker容器的dns配置。如果要保持docker中这些文件固定不变,你可以不覆盖容器中的这些配置文件,然后使用下面的选项来配置它们。
|
||||
配置容器dns服务的方法
|
||||
这种机制可以让宿主主机 DNS 信息发生更新后,所有 Docker 容器的 dns 配置通过 `/etc/resolv.conf` 文件立刻得到更新。
|
||||
|
||||
-h HOSTNAME or --hostname=HOSTNAME
|
||||
设定容器的主机名,它会被写到/etc/hostname,/etc/hosts中的ip地址自动写成分配的ip地址,在/bin/bash中显示该主机名。但它不会在docker ps中显示,也不会在其他的容器的/etc/hosts中显示。
|
||||
如果用户想要手动指定容器的配置,可以利用下面的选项。
|
||||
|
||||
--link=CONTAINER_NAME:ALIAS
|
||||
这选项会在创建容器的时候添加一个其他容器CONTAINE_NAME的主机名到/etc/hosts文件中,让新容器的进程可以使用主机名ALIAS就可以连接它。--link=会在容器之间的通信中更详细的介绍
|
||||
`-h HOSTNAME or --hostname=HOSTNAME`
|
||||
设定容器的主机名,它会被写到容器内的 `/etc/hostname` 和 `/etc/hosts`。但它在容器外部看不到,既不会在 `docker ps` 中显示,也不会在其他的容器的 `/etc/hosts` 看到。
|
||||
|
||||
--dns=IP_ADDRESS
|
||||
添加dns服务器到容器的/etc/resolv,conf中,让容器用这ip地址来解析所有不在/etc/hosts中的主机名。
|
||||
`--link=CONTAINER_NAME:ALIAS`
|
||||
选项会在创建容器的时候,添加一个其他容器的主机名到 `/etc/hosts` 文件中,让新容器的进程可以使用主机名 ALIAS 就可以连接它。
|
||||
|
||||
--dns-search=DOMAIN
|
||||
设定容器的搜索域,当设定搜索域为.example.com时,会在搜索一个host主机名时,dns不仅搜索host,还会搜索host.example.com
|
||||
注意:如果没有上述最后2个选项,docker会用主机上的/etc/resolv.conf来配置容器,它是默认配置。
|
||||
`--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,19 +1,22 @@
|
||||
##定制docker0
|
||||
docker服务默认会创建一个docker0接口,它在linux内核层桥接所有物理或虚拟网卡,这就将所有容器和主机接口都放到同一个物理网络。
|
||||
Docker指定了docker0的ip地址和子网掩码,让主机和容器之间可以通过网桥相互通信,它还给出了MTU-接口允许接收的最大传输单元,通常是1500bytes或宿主主机网络路由上支持的默认值,这2个都需要在服务启动的时候配置。
|
||||
* --bip=CIDR — 192.168.1.5/24.ip地址加掩码 使用这种格式
|
||||
* --mtu=BYTES — 覆盖默认的docker mtu配置
|
||||
## 配置 docker0 网桥
|
||||
Docker 服务默认会创建一个 `docker0` 网桥(其上有一个 `docker0` 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。
|
||||
|
||||
你可以在配置文件中配置DOCKER_OPTS,然后重启来改变这些参数。
|
||||
Docker 默认指定了 `docker0` 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信,它还给出了 MTU(接口允许接收的最大传输单元),通常是 1500 Bytes,或宿主主机网络路由上支持的默认值。这些值都可以在服务启动的时候进行配置。
|
||||
* `--bip=CIDR` -- IP 地址加掩码格式,例如 192.168.1.5/24
|
||||
* `--mtu=BYTES` -- 覆盖默认的 Docker mtu 配置
|
||||
|
||||
也可以在配置文件中配置 DOCKER_OPTS,然后重启服务。
|
||||
由于目前 Docker 网桥是 Linux 网桥,用户可以使用 `brctl show` 来查看网桥和端口连接信息。
|
||||
```
|
||||
# 当容器启动后,你可以使用brctl来确认他们是否已经连接到docker0网桥
|
||||
$ sudo brctl show
|
||||
bridge name bridge id STP enabled interfaces
|
||||
docker0 8000.3a1d7362b4ee no veth65f9
|
||||
vethdda6
|
||||
```
|
||||
如果brctl命令没安装的话,在ubuntu中你可以使用apt-get install bridge-utils这个命令来安装
|
||||
docker0 网桥设置会在每次创建新容器的时候被使用。docker从可用的地址段中选择一个空闲的ip地址给容器的eth0端口,子网掩码使用网桥docker0的配置,docker主机本身的ip作为容器的网关使用。
|
||||
```
|
||||
*注:`brctl` 命令在 Debian、Ubuntu 中可以使用 `sudo apt-get install bridge-utils` 来安装。
|
||||
|
||||
|
||||
每次创建一个新容器的时候,Docker 从可用的地址段中选择一个空闲的 IP 地址分配给容器的 eth0 端口。使用本地主机上 `docker0` 接口的 IP 作为所有容器的默认网关。
|
||||
```
|
||||
$ sudo docker run -i -t --rm base /bin/bash
|
||||
$ ip addr show eth0
|
||||
@@ -28,4 +31,3 @@ 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
|
||||
```
|
||||
转发数据包需要在主机上设定ip_forward参数为1,上文介绍过。
|
||||
@@ -1,8 +1,8 @@
|
||||
##工具和示例
|
||||
## 工具和示例
|
||||
在介绍自定义网络拓扑之前,你可能会对一些外部工具和例子感兴趣:
|
||||
https://github.com/jpetazzo/pipework
|
||||
Jérôme Petazzoni 创建了一个叫pipework的shell脚本来帮助我们在复杂的场景中完成网络连接
|
||||
|
||||
https://github.com/brandon-rhodes/fopnp/tree/m/playground
|
||||
Brandon Rhodes创建了一个完整的docker容器网络拓扑,包含 nat 防火墙,服务包括HTTP, SMTP, POP, IMAP, Telnet, SSH, and FTP:
|
||||
工具使用的网络命令跟我们之前看到非常相似。
|
||||
### 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 的服务器。
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
##快速配置指南
|
||||
|
||||
下面是一个跟docker网络相关的命令列表,希望可以让你快速找到需要的信息。有些命令选项只有在docker服务启动的时候才可以执行,而且不能马上生效。
|
||||
* -b BRIDGE or --bridge=BRIDGE — 桥接配置
|
||||
* --bip=CIDR — 定制docker0的掩码
|
||||
* -H SOCKET... or --host=SOCKET... — 它告诉docker从哪个通道来接收run container stop
|
||||
container这样的命令,也是docker api的地址
|
||||
|
||||
* --icc=true|false — 请看下文容器之间的通信
|
||||
* --ip-forward=true|false — 请看下文容器之间的通信
|
||||
* --iptables=true|false — 请看下文容器之间的通信
|
||||
* --mtu=BYTES —请看下文定制docker0
|
||||
|
||||
下面2个可以在docker服务启动和docker run执行的时候指定,服务启动的时候指定则会为docker run设定默认值,docker run 后面指定可以覆盖默认值。
|
||||
* --dns=IP_ADDRESS... — 请看下文dns配置
|
||||
* --dns-search=DOMAIN... — 请看下文dns配置
|
||||
|
||||
最后这些选项只有在docker run后执行,因为它是针对容器的特性内容。
|
||||
*-h HOSTNAME or --hostname=HOSTNAME — 主机名配置
|
||||
*--link=CONTAINER_NAME:ALIAS — link系统
|
||||
*--net=bridge|none|container:NAME_or_ID|host —桥接配置
|
||||
*-p SPEC or --publish=SPEC — 映射容器端口到宿主主机
|
||||
* -P or --publish-all=true|false — 映射容器端口到宿主主机
|
||||
@@ -1,60 +1 @@
|
||||
##Docker 如何连接到容器?
|
||||
|
||||
让我们回顾一些基础知识:
|
||||
机器需要一个网络接口来发送和接受数据包,路由表来定义如何到达哪些地址段。这里的网络接口可以不是物理接口。事实上,每个linxu机器上的lo环回接口(docker 容器中也有)就是一个完全的linux内核虚拟接口,它直接复制发送缓存中的数据包到接收缓存中。docker让宿主主机和容器使用特殊的虚拟接口来通信--通信的2端叫“peers“,他们在主机内核中连接在一起,所以能够相互通信。创建他们很简单,前面介绍过了。
|
||||
|
||||
docker创建容器的步骤如下:
|
||||
* 创建一对虚拟接口
|
||||
* 其中宿主主机一端使用一个名字比如veth65f9,他是唯一的,另外一端桥接到默认的docker0,或其它你指定的桥接网卡。
|
||||
* 主机上的veth65f9这种接口映射到新的新容器中的名称通常是eth0,在容器这个隔离的network namespace
|
||||
中,它是唯一的,不会有其他接口名字和它冲突。
|
||||
* 从主机桥接网卡的地址段中获取一个空闲地址给eth0使用,并设定默认路由到桥接网卡。
|
||||
* 完成这些之后,容器就可以使用这eth0虚拟网卡来连接其他容器和其他网络。
|
||||
|
||||
你也可以为特殊的容器设定特定的参数,在docker run的时候使用--net,它有4个可选参数:
|
||||
* --net=bridge — .默认连接到docker0网桥。
|
||||
* --net=host — 告诉docker不要将容器放到隔离的网络堆栈中。从本质上讲,这个选项告诉docker
|
||||
不要容器化容器的网络!尽管容器还是有自己的文件系统、进程列表和资源限制。但使用ip addr命令这样命令就可以知道实际上此时的的容器处于和docker 宿主主机的一样的网络级别,它拥有完全的宿主主机接口访问权限。虽然它不允许容器重新配置主机的网络堆栈,除非--privileged=true — 但是容器进程可以跟其他root进程一样可以打开低数字的端口,可以访问本地网络服务比如D-bus,还可以让容器做一些意想不到的事情,比如重启主机,使用这个选项的时候要非常小心!
|
||||
* --net=container:NAME_or_ID —
|
||||
告诉docker将新容器的进程放到一个已经存在的容器的网络堆栈中,新容器进程有它自己的文件系统、进程列表和资源限制,但它会和那个已经存在的容器共享ip地址和端口,他们之间来可以通过环回接口通信。
|
||||
* --net=none — 告诉docker将新容器放到自己的网络堆栈中,但是不要配置它的网络,
|
||||
类似于vmware的host-only。这可以让你创建任何自定义的配置,本文最后一段将介绍 他们。
|
||||
|
||||
下面通过配置一个以--net=none启动的容器,使他达到跟平常一样具有访问网络的权限。来介绍docker是如何连接到容器中的。
|
||||
|
||||
启动一个/bin/bash 指定--net=none
|
||||
```
|
||||
$ sudo docker run -i -t --rm --net=none base /bin/bash
|
||||
root@63f36fc01b5f:/#
|
||||
```
|
||||
再开启一个新的终端,查找这个容器的进程id,然后创建它的命名空间,后面的ip netns会用到
|
||||
```$ sudo docker inspect -f '{{.State.Pid}}' 63f36fc01b5f
|
||||
2778
|
||||
$ pid=2778
|
||||
$ sudo mkdir -p /var/run/netns
|
||||
$ sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid
|
||||
```
|
||||
检查桥接网卡的ip和子网掩码
|
||||
```
|
||||
$ ip addr show docker0
|
||||
21: docker0: ...
|
||||
inet 172.17.42.1/16 scope global docker0
|
||||
...
|
||||
```
|
||||
创建一对”peer“接口A和B,绑定A到网桥,并启用它
|
||||
```
|
||||
$ sudo ip link add A type veth peer name B
|
||||
$ sudo brctl addif docker0 A
|
||||
$ sudo ip link set A up
|
||||
```
|
||||
将B放到容器的网络命名空间,命名为eth0,配置一个空闲的ip
|
||||
```
|
||||
$ sudo ip link set B netns $pid
|
||||
$ sudo ip netns exec $pid ip link set dev B name eth0
|
||||
$ sudo ip netns exec $pid ip link set eth0 up
|
||||
$ sudo ip netns exec $pid ip addr add 172.17.42.99/16 dev eth0
|
||||
$ sudo ip netns exec $pid ip route add default via 172.17.42.1
|
||||
```
|
||||
自此,你又可以像平常一样使用网络了
|
||||
当你退出shell后,docker清空容器,容器的eth0随网络命名空间一起被摧毁,A 接口也被自动从docker0取消注册。不用其他命令,所有东西都被清理掉了!
|
||||
注意ip netns exec命令,它可以让我们像root一样配置网络命名空间。但在容器内部无法使用,因为统一的安全策略,docker限制容器进程配置自己的网络。使用ip netns exec 可以让我们不用设置--privileged=true就可以完成一些可能带来危险的操作。
|
||||
@@ -1,37 +1,43 @@
|
||||
##映射一个容器端口到宿主主机
|
||||
## 映射容器端口到宿主主机的实现
|
||||
|
||||
默认情况下,容器可以建立到外部网络的连接,但是外部网络无法连接到容器。所有到外部的连接,源地址都会被伪装成宿主主机的ip地址,iptables的 masquerading来做到这一点。
|
||||
默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。
|
||||
### 容器访问外部实现
|
||||
容器所有到外部网络的连接,源地址都会被NAT成本地系统的IP地址。这是使用 `iptables` 的源地址伪装操作实现的。
|
||||
|
||||
查看主机的 NAT 规则。
|
||||
```
|
||||
# 查看主机的masquerading规则
|
||||
$ sudo iptables -t nat -L -n
|
||||
$ sudo iptables -t nat -nL
|
||||
...
|
||||
Chain POSTROUTING (policy ACCEPT)
|
||||
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执行的时候就指定对应选项,第五章详细介绍了2种方法:
|
||||
* 指定-P --publish-all=true|false 选项会映射dockerfile
|
||||
中expose的所有端口,主机端口在49000-49900中随机挑选。当你的另外一个容器需要学习这个端口时候,很不方便。
|
||||
* 指定-p SPEC或则 --publish=SPEC,可以指定任意端口从主机映射容器内部
|
||||
### 外部访问容器实现
|
||||
|
||||
不管用那种办法,你可以通过查看iptable的 nat表来观察docker 在网络层做了什么操作。
|
||||
容器允许外部访问,可以在 `docker run` 时候通过 `-p` 或 `-P` 参数来启用。
|
||||
|
||||
不管用那种办法,其实也是在本地的 `iptable` 的 nat 表中添加相应的规则。
|
||||
|
||||
使用 `-P` 时:
|
||||
```
|
||||
#使用-P时:
|
||||
$ iptables -t nat -L -n
|
||||
$ 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:49153 to:172.17.0.2:80
|
||||
#使用-p 80:80时:
|
||||
$ iptables -t nat -L -n
|
||||
```
|
||||
|
||||
使用 `-p 80:80` 时:
|
||||
```
|
||||
$ 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
|
||||
```
|
||||
注意:
|
||||
* 这里看到docker映射了0.0.0.0.它接受主机上的所有接口地址。可以通过-p IP:host_port:container_port 或则 -p
|
||||
IP::port 来指定主机上的ip、接口,制定更严格的规则。
|
||||
* 如果你希望永久改变绑定的主机ip地址,可以 在dcoker 配置中指定--ip=IP_ADDRESS. 记得重启服务。
|
||||
* 这里的规则映射了 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 服务即可生效。
|
||||
|
||||
@@ -1,15 +1,19 @@
|
||||
##创建一个点到点连接
|
||||
默认docker会将所有容器连接到由docker0提供的虚拟子网,你也可以使用自己创建的网桥。但如果你想要2个特殊的容器之间可以直连通信,而不用去配置复杂的主机网卡桥接。
|
||||
解决办法很简单:创建一对接口,把2个容器放到这对接口中,配置成点到点链路类型。这2个容器就可以直接通信了。配置如下:
|
||||
## 示例:创建一个点到点连接
|
||||
默认情况下,Docker 会将所有容器连接到由 `docker0` 提供的虚拟子网中。
|
||||
|
||||
用户有时候需要两个容器之间可以直连通信,而不用通过主机网桥进行桥接。
|
||||
|
||||
解决办法很简单:创建一对 `peer` 接口,分别放到两个容器中,配置成点到点链路类型即可。
|
||||
|
||||
首先启动 2 个容器:
|
||||
```
|
||||
# 在2个终端中启动2个容器
|
||||
$ sudo docker run -i -t --rm --net=none base /bin/bash
|
||||
root@1f1f4c1f931a:/#
|
||||
$ sudo docker run -i -t --rm --net=none base /bin/bash
|
||||
root@12e343489d2f:/#
|
||||
```
|
||||
|
||||
找到他们的process IDs ,然后创建他们的 namespace entries
|
||||
找到进程号,然后创建网络命名空间的跟踪文件。
|
||||
```
|
||||
$ sudo docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a
|
||||
2989
|
||||
@@ -20,7 +24,7 @@ $ sudo ln -s /proc/2989/ns/net /var/run/netns/2989
|
||||
$ sudo ln -s /proc/3004/ns/net /var/run/netns/3004
|
||||
```
|
||||
|
||||
创建"peer"接口,然后配置路由
|
||||
创建一对 `peer` 接口,然后配置路由
|
||||
```
|
||||
$ sudo ip link add A type veth peer name B
|
||||
|
||||
@@ -34,7 +38,8 @@ $ sudo ip netns exec 3004 ip addr add 10.1.1.2/32 dev B
|
||||
$ sudo ip netns exec 3004 ip link set B up
|
||||
$ sudo ip netns exec 3004 ip route add 10.1.1.1/32 dev B
|
||||
```
|
||||
现在这2个容器就可以相互ping通,并成功建立连接。点到点链路不需要子网和子网掩码,使用ip route 来连接单个ip地址到指定的网络接口。
|
||||
如果没有特殊需要你不需要指定--net=none来创建点到点链路。
|
||||
现在这 2 个容器就可以相互 ping 通,并成功建立连接。点到点链路不需要子网和子网掩码。
|
||||
|
||||
还有一个办法就是创建一个只跟主机通信的容器,除非有特殊需求,你可以仅用--icc=false来限制主机间的通信。
|
||||
此外,也可以不指定 `--net=none` 来创建点到点链路。这样容器还可以通过原先的网络来通信。
|
||||
|
||||
利用类似的办法,可以创建一个只跟主机通信的容器。但是一般情况下,更推荐使用 `--icc=false` 来关闭容器之间的通信。
|
||||
|
||||
23
advanced_network/quick_guide.md
Normal file
@@ -0,0 +1,23 @@
|
||||
## 快速配置指南
|
||||
|
||||
下面是一个跟 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搜索域
|
||||
|
||||
最后这些选项只有在 `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` --映射容器所有端口到宿主主机
|
||||
1
appendix/README.md
Normal file
@@ -0,0 +1 @@
|
||||
# 附录
|
||||
56
appendix/_images/cmd_logic.dot
Normal file
@@ -0,0 +1,56 @@
|
||||
//dot -Tpng xx.dot -o xx.png
|
||||
digraph G {
|
||||
rankdir=TB;
|
||||
fontname = "Microsoft YaHei";
|
||||
fontsize = 14;
|
||||
penwidth = 3;
|
||||
compound=true;
|
||||
rankdir=LR;
|
||||
|
||||
node [shape = record];
|
||||
edge [fontname = "Arial", fontsize = 12, color="darkgreen" ];
|
||||
|
||||
image[label="Image",color=blue];
|
||||
registry[label="Registry",color=blue];
|
||||
tar[label="Tar files",color=blue];
|
||||
|
||||
subgraph cluster_container {
|
||||
label = "Container";
|
||||
style = "bold";
|
||||
color = blue;
|
||||
edge [fontname = "Arial", fontsize = 11, color="skyblue" ];
|
||||
//node [style=filled];
|
||||
run[label="Running",shape=circle, style=filled, fillcolor=green];
|
||||
stop[label="Stopped",shape=circle, style=filled, fillcolor=red];
|
||||
pause[label="Paused",shape=circle, style=filled, fillcolor=blue];
|
||||
|
||||
run->pause[label="pause"];
|
||||
pause->run[label="unpause"];
|
||||
run->run[label="restart"];
|
||||
run->stop[label="kill"];
|
||||
stop->run[label="start"];
|
||||
}
|
||||
|
||||
run->image[label="commit",ltail=cluster_container];
|
||||
image->run[label="start"];
|
||||
|
||||
image->tar[label="export|save"];
|
||||
tar->image[label="import"];
|
||||
|
||||
image->registry[label="push"];
|
||||
registry->image[label="pull"];
|
||||
|
||||
//heat[label="heat commands",color=blue];
|
||||
//heatshell[label="heatclient.shell.HeatShell",color=blue];
|
||||
//shell[label="{heatclient.v1.shell|+do_stack_create\l+do_stack_show\l+do_stack_update\l...\l+do_event_list\l...\l+do_resource_list\l...\l+do_resource_type_show\l...\l+do_template_show\l...\l}",color=blue];
|
||||
//heatclient[label="heatclient.client.Client",color=blue];
|
||||
//client[label="heatclient.v1.client.Client",color=blue];
|
||||
//httpclient[label="heatclient.common.http.HTTPClient",color=blue];
|
||||
|
||||
|
||||
|
||||
//openstackservices[label="{OpenStack Services|+Nova\l+Neutron\l+Keystone\l...}",color=blue];
|
||||
|
||||
//{rank=same; image cluster_container}
|
||||
//{rank=same; rpcproxy apimixin}
|
||||
}
|
||||
93
appendix/_images/cmd_logic.dot.bak
Normal file
@@ -0,0 +1,93 @@
|
||||
//dot -Tpng cmd_logic.dot -o cmd_logic.png
|
||||
digraph G {
|
||||
rankdir=TB;
|
||||
rankdir=LR;
|
||||
nodesep=1;
|
||||
//ranksep=1
|
||||
fontname = "Microsoft YaHei";
|
||||
fontsize = 28;
|
||||
penwidth = 4;
|
||||
compound=true;
|
||||
|
||||
node [shape = record];
|
||||
edge [fontname = "Arial", fontsize = 20, color="darkgreen" ];
|
||||
|
||||
user[label="User",color=blue,shape=ellipse, style=filled, fillcolor=green];
|
||||
dockerfile[label="Dockerfile",color=blue];
|
||||
daemon[label="Daemon",color=blue];
|
||||
image[label="Image",color=blue];
|
||||
registry[label="Registry",color=blue];
|
||||
tar[label="Tar files",color=blue];
|
||||
network[label="Network",color=blue]
|
||||
service[label="Service",color=blue]
|
||||
swarm[label="Swarm",color=blue]
|
||||
volume[label="Volume",color=blue]
|
||||
|
||||
subgraph cluster_container {
|
||||
label = "Container";
|
||||
labelloc = "c";
|
||||
nodesep=.5;
|
||||
style = "bold";
|
||||
color = blue;
|
||||
edge [fontname = "Arial", fontsize = 20, color="skyblue" ];
|
||||
//node [style=filled];
|
||||
create[label="Created",shape=circle, style=filled, fillcolor=lightblue];
|
||||
run[label="Running",shape=circle, style=filled, fillcolor=green];
|
||||
pause[label="Paused",shape=circle, style=filled, fillcolor=blue];
|
||||
stop[label="Stopped",shape=circle, style=filled, fillcolor=red];
|
||||
exit[label="Exited",shape=circle, style=filled, fillcolor=gray];
|
||||
|
||||
create->run[label=<<i>start</i>>];
|
||||
run->pause[label="pause"];
|
||||
pause->run[label="unpause"];
|
||||
run->run[label="restart"];
|
||||
run->stop[label="stop"];
|
||||
run->exit[label="kill"];
|
||||
stop->run[label="start"];
|
||||
}
|
||||
|
||||
//dockerfile
|
||||
dockerfile->image[label="build"];
|
||||
|
||||
//container
|
||||
run->image[headlabel="commit", labeldistance=7.5, ltail=cluster_container];
|
||||
run->tar[label="export",ltail=cluster_container];
|
||||
run->network[label="connect | disconnect",ltail=cluster_container];
|
||||
|
||||
//image
|
||||
image->create[label="create"];
|
||||
image->run[label="run"];
|
||||
image->tar[label="save"];
|
||||
image->registry[label="push"];
|
||||
|
||||
//tar
|
||||
tar->image[label="import | load"];
|
||||
image->registry[label="push"];
|
||||
|
||||
//registry
|
||||
registry->image[label="pull"];
|
||||
|
||||
//network
|
||||
network->network[label="create | rm | ls | inspect"]
|
||||
|
||||
//user
|
||||
user->run[label="attach | cp | diff | exec | inspect | logs | ps | rename | rm | stats | top | update | wait",lhead=cluster_container]
|
||||
user->image[label="history | images | rmi | tag"]
|
||||
user->daemon[label="event | info | version"]
|
||||
user->registry[label="login | logout | search"]
|
||||
|
||||
//heat[label="heat commands",color=blue];
|
||||
//heatshell[label="heatclient.shell.HeatShell",color=blue];
|
||||
//shell[label="{heatclient.v1.shell|+do_stack_create\l+do_stack_show\l+do_stack_update\l...\l+do_event_list\l...\l+do_resource_list\l...\l+do_resource_type_show\l...\l+do_template_show\l...\l}",color=blue];
|
||||
//heatclient[label="heatclient.client.Client",color=blue];
|
||||
//client[label="heatclient.v1.client.Client",color=blue];
|
||||
//httpclient[label="heatclient.common.http.HTTPClient",color=blue];
|
||||
|
||||
|
||||
|
||||
//openstackservices[label="{OpenStack Services|+Nova\l+Neutron\l+Keystone\l...}",color=blue];
|
||||
|
||||
//{rank=same; image registry dockerfile tar}
|
||||
//{rank=same; container}
|
||||
//{rank=same; user}
|
||||
}
|
||||
BIN
appendix/_images/cmd_logic.graffle/data.plist
Normal file
BIN
appendix/_images/cmd_logic.graffle/image10.pdf
Normal file
BIN
appendix/_images/cmd_logic.graffle/image11.pdf
Normal file
BIN
appendix/_images/cmd_logic.graffle/image12.pdf
Normal file
BIN
appendix/_images/cmd_logic.graffle/image13.pdf
Normal file
BIN
appendix/_images/cmd_logic.graffle/image4.pdf
Normal file
BIN
appendix/_images/cmd_logic.graffle/image5.pdf
Normal file
BIN
appendix/_images/cmd_logic.graffle/image6.pdf
Normal file
BIN
appendix/_images/cmd_logic.graffle/image7.pdf
Normal file
BIN
appendix/_images/cmd_logic.graffle/image9.pdf
Normal file
BIN
appendix/_images/cmd_logic.png
Normal file
|
After Width: | Height: | Size: 704 KiB |
51
appendix/_images/container_status.dot
Normal file
@@ -0,0 +1,51 @@
|
||||
//dot -Tpng container_status.dot -o container_status.png
|
||||
digraph G {
|
||||
rankdir=TB;
|
||||
rankdir=LR;
|
||||
nodesep=1;
|
||||
//ranksep=1
|
||||
fontname = "Microsoft YaHei";
|
||||
fontsize = 28;
|
||||
penwidth = 4;
|
||||
compound=true;
|
||||
style = "bold";
|
||||
color = blue;
|
||||
|
||||
node [shape = record];
|
||||
edge [fontname = "Arial", fontsize = 20, color="darkgreen" ];
|
||||
image[label="Image",color=blue];
|
||||
image->create[label="create"];
|
||||
image->run[label="run"];
|
||||
|
||||
edge [fontname = "Arial", fontsize = 20, color="skyblue" ];
|
||||
//node [style=filled];
|
||||
create[label="Created",shape=circle, style=filled, fillcolor=lightblue];
|
||||
run[label="Running",shape=circle, style=filled, fillcolor=green];
|
||||
pause[label="Paused",shape=circle, style=filled, fillcolor=blue];
|
||||
stop[label="Stopped",shape=circle, style=filled, fillcolor=red];
|
||||
exit[label="Exited",shape=circle, style=filled, fillcolor=gray];
|
||||
|
||||
create->run[label=<<i>start</i>>];
|
||||
run->pause[label="pause"];
|
||||
pause->run[label="unpause"];
|
||||
run->run[label="restart"];
|
||||
run->stop[label="stop"];
|
||||
run->exit[label="kill"];
|
||||
stop->run[label="start"];
|
||||
|
||||
|
||||
//heat[label="heat commands",color=blue];
|
||||
//heatshell[label="heatclient.shell.HeatShell",color=blue];
|
||||
//shell[label="{heatclient.v1.shell|+do_stack_create\l+do_stack_show\l+do_stack_update\l...\l+do_event_list\l...\l+do_resource_list\l...\l+do_resource_type_show\l...\l+do_template_show\l...\l}",color=blue];
|
||||
//heatclient[label="heatclient.client.Client",color=blue];
|
||||
//client[label="heatclient.v1.client.Client",color=blue];
|
||||
//httpclient[label="heatclient.common.http.HTTPClient",color=blue];
|
||||
|
||||
|
||||
|
||||
//openstackservices[label="{OpenStack Services|+Nova\l+Neutron\l+Keystone\l...}",color=blue];
|
||||
|
||||
//{rank=same; image registry dockerfile tar}
|
||||
//{rank=same; container}
|
||||
//{rank=same; user}
|
||||
}
|
||||
BIN
appendix/_images/container_status.png
Normal file
|
After Width: | Height: | Size: 67 KiB |
126
appendix/command/README.md
Normal file
@@ -0,0 +1,126 @@
|
||||
# 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` 或 `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 的命令
|
||||

|
||||
192
appendix/faq/README.md
Normal file
@@ -0,0 +1,192 @@
|
||||
# 常见问题总结
|
||||
|
||||
## 镜像相关
|
||||
### 如何批量清理临时镜像文件
|
||||
答:可以使用 `docker rmi $(docker images -q -f dangling=true)` 命令。
|
||||
|
||||
### 如何查看镜像支持的环境变量?
|
||||
答:可以使用 `docker run IMAGE env` 命令。
|
||||
|
||||
### 本地的镜像文件都存放在哪里?
|
||||
答:与 Docker 相关的本地资源都存放在 `/var/lib/docker/` 目录下,以 aufs 文件系统为例,其中 container 目录存放容器信息,graph 目录存放镜像信息,aufs 目录下存放具体的镜像层文件。
|
||||
|
||||
### 构建 Docker 镜像应该遵循哪些原则?
|
||||
答:整体原则上,尽量保持镜像功能的明确和内容的精简,要点包括
|
||||
|
||||
* 尽量选取满足需求但较小的基础系统镜像,例如大部分时候可以选择 debian:wheezy 或 debian:jessie 镜像,仅有不足百兆大小;
|
||||
* 清理编译生成文件、安装包的缓存等临时文件;
|
||||
* 安装各个软件时候要指定准确的版本号,并避免引入不需要的依赖;
|
||||
* 从安全角度考虑,应用要尽量使用系统的库和依赖;
|
||||
* 如果安装应用时候需要配置一些特殊的环境变量,在安装后要还原不需要保持的变量值;
|
||||
* 使用 Dockerfile 创建镜像时候要添加 .dockerignore 文件或使用干净的工作目录。
|
||||
|
||||
### 碰到网络问题,无法 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 rm -f $(docker ps -qa)` 命令。
|
||||
|
||||
### 如何获取某个容器的 PID 信息?
|
||||
答:可以使用 `docker inspect --format '{{ .State.Pid }}' <CONTAINER ID or NAME>` 命令。
|
||||
|
||||
### 如何获取某个容器的 IP 地址?
|
||||
答:可以使用 `docker inspect --format '{{ .NetworkSettings.IPAddress }}' <CONTAINER ID or NAME>` 命令
|
||||
|
||||
### 如何给容器指定一个固定 IP 地址,而不是每次重启容器 IP 地址都会变?
|
||||
答:目前 Docker 并没有提供直接的对容器 IP 地址的管理支持,用户可以考虑参考第三部分中高级网络配置章节中介绍的创建点对点连接例子,来手动配置容器的静态 IP。或者在启动容器后,再手动进行修改(可参考其它类的问题 “*如何进入 Docker 容器的网络命名空间?*”)。
|
||||
|
||||
### 如何临时退出一个正在交互的容器的终端,而不终止它?
|
||||
答:按 `Ctrl-p Ctrl-q`。如果按 `Ctrl-c` 往往会让容器内应用进程终止,进而会终止容器。
|
||||
|
||||
### 使用 `docker port` 命令映射容器的端口时,系统报错“Error: No public port '80' published for xxx”?
|
||||
答:
|
||||
|
||||
* 创建镜像时 Dockerfile 要通过 EXPOSE 指定正确的开放端口;
|
||||
* 容器启动时指定 `PublishAllPort = true`。
|
||||
|
||||
### 可以在一个容器中同时运行多个应用进程么?
|
||||
答:一般并不推荐在同一个容器内运行多个应用进程。如果有类似需求,可以通过一些额外的进程管理机制,比如 supervisord 来管理所运行的进程。可以参考 https://docs.docker.com/articles/using_supervisord/。
|
||||
|
||||
### 如何控制容器占用系统资源(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 下面的配置文件内容如下,读者可以参考配。(如果出现该文件不存在的情况,重启或者自己新建一个文件都可以解决。)
|
||||
|
||||
```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` 参数指定。
|
||||
|
||||
例如,如下操作将默认存储位置迁移到 /storage/docker。
|
||||
|
||||
```sh
|
||||
[root@s26 ~]# df -h
|
||||
Filesystem Size Used Avail Use% Mounted on
|
||||
/dev/mapper/VolGroup-lv_root 50G 5.3G 42G 12% /
|
||||
tmpfs 48G 228K 48G 1% /dev/shm
|
||||
/dev/sda1 485M 40M 420M 9% /boot
|
||||
/dev/mapper/VolGroup-lv_home 222G 188M 210G 1% /home
|
||||
/dev/sdb2 2.7T 323G 2.3T 13% /storage
|
||||
[root@s26 ~]# service docker stop
|
||||
[root@s26 ~]# cd /var/lib/
|
||||
[root@s26 lib]# mv docker /storage/
|
||||
[root@s26 lib]# ln -s /storage/docker/ docker
|
||||
[root@s26 lib]# ls -la docker
|
||||
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 使用的统计功能,引入该功能会带来性能的下降。要开启该功能,可以采取如下操作:
|
||||
|
||||
* 编辑 `/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 的镜像系统为容器的分发带来了很多的便利,同时共同的镜像层只需要存储一份,实现高效率的存储;
|
||||
* 版本管理:类似于Git的版本管理理念,用户可以更方便的创建、管理镜像文件;
|
||||
* 仓库系统:仓库系统大大降低了镜像的分发和管理的成本;
|
||||
* 周边工具:各种现有工具(配置管理、云平台)对 Docker 的支持,以及基于 Docker的 PaaS、CI 等系统,让 Docker 的应用更加方便和多样化。
|
||||
|
||||
### Docker 与 Vagrant 有何不同?
|
||||
答:两者的定位完全不同。
|
||||
|
||||
* Vagrant 类似 Boot2Docker(一款运行 Docker 的最小内核),是一套虚拟机的管理环境。Vagrant 可以在多种系统上和虚拟机软件中运行,可以在 Windows,Mac 等非 Linux 平台上为 Docker 提供支持,自身具有较好的包装性和移植性。
|
||||
|
||||
* 原生的 Docker 自身只能运行在 Linux 平台上,但启动和运行的性能都比虚拟机要快,往往更适合快速开发和部署应用的场景。
|
||||
|
||||
简单说:Vagrant 适合用来管理虚拟机,而 Docker 适合用来管理应用环境。
|
||||
|
||||
### 开发环境中 Docker 和 Vagrant 该如何选择?
|
||||
答:
|
||||
Docker 不是虚拟机,而是进程隔离,对于资源的消耗很少,但是目前需要 Linux 环境支持。Vagrant 是虚拟机上做的封装,虚拟机本身会消耗资源。
|
||||
|
||||
如果本地使用的 Linux 环境,推荐都使用 Docker。
|
||||
|
||||
如果本地使用的是 OSX 或者 Windows 环境,那就需要开虚拟机,单一开发环境下 Vagrant 更简单;多环境开发下推荐在 Vagrant 里面再使用 Docker 进行环境隔离。
|
||||
|
||||
## 其它
|
||||
|
||||
### Docker 能在非 Linux 平台(比如 Windows 或 MacOS)上运行么?
|
||||
答:可以。目前需要使用 docker for mac、boot2docker 等软件创建一个轻量级的 Linux 虚拟机层。
|
||||
|
||||
### 如何将一台宿主主机的 docker 环境迁移到另外一台宿主主机
|
||||
答:停止 Docker 服务。将整个 Docker 存储文件夹复制到另外一台宿主主机,然后调整另外一台宿主主机的配置即可。
|
||||
|
||||
### 如何进入 Docker 容器的网络命名空间?
|
||||
答:Docker 在创建容器后,删除了宿主主机上 `/var/run/netns` 目录中的相关的网络命名空间文件。因此,在宿主主机上是无法看到或访问容器的网络命名空间的。
|
||||
|
||||
用户可以通过如下方法来手动恢复它。
|
||||
|
||||
首先,使用下面的命令查看容器进程信息,比如这里的1234。
|
||||
|
||||
```sh
|
||||
$ docker inspect --format='{{. State.Pid}} ' $container_id
|
||||
1234
|
||||
```
|
||||
接下来,在 /proc 目录下,把对应的网络命名空间文件链接到 /var/run/netns 目录。
|
||||
|
||||
```sh
|
||||
$ sudo ln -s /proc/1234/ns/net /var/run/netns/
|
||||
```
|
||||
|
||||
然后,在宿主主机上就可以看到容器的网络命名空间信息。例如
|
||||
|
||||
```sh
|
||||
$ sudo ip netns show
|
||||
1234
|
||||
```
|
||||
|
||||
此时,用户可以通过正常的系统命令来查看或操作容器的命名空间了。例如修改容器的 IP 地址信息为 `172.17.0.100/16`。
|
||||
|
||||
```sh
|
||||
$ 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 接口对。
|
||||
2
appendix/repo/README.md
Normal file
@@ -0,0 +1,2 @@
|
||||
# 热门镜像介绍
|
||||
本章将介绍一些热门镜像的功能,使用方法和生成它们的 Dockerfile 等。包括 Ubuntu、CentOS、MySQL、MongoDB、Redis、Nginx、Wordpress、Node.js 等。
|
||||
60
appendix/repo/centos.md
Normal file
@@ -0,0 +1,60 @@
|
||||
## [CentOS](https://hub.docker.com/_/centos/)
|
||||
|
||||
### 基本信息
|
||||
[CentOS](https://en.wikipedia.org/wiki/CentOS) 是流行的 Linux 发行版,其软件包大多跟 RedHat 系列保持一致。
|
||||
|
||||
该仓库位于 https://hub.docker.com/_/centos/ ,提供了 CentOS 从 5 ~ 7 各个版本的镜像。
|
||||
|
||||
### 使用方法
|
||||
默认会启动一个最小化的 CentOS 环境。
|
||||
|
||||
```sh
|
||||
$ docker run --name some-centos -i -t centos bash
|
||||
bash-4.2#
|
||||
```
|
||||
|
||||
### 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"]
|
||||
```
|
||||
|
||||
|
||||
264
appendix/repo/mongodb.md
Normal file
@@ -0,0 +1,264 @@
|
||||
## [MongoDB](https://hub.docker.com/_/mongo/)
|
||||
|
||||
### 基本信息
|
||||
[MongoDB](https://en.wikipedia.org/wiki/MongoDB) 是开源的 NoSQL 数据库实现。
|
||||
|
||||
该仓库位于 https://hub.docker.com/_/mongo/ ,提供了 MongoDB 2.x ~ 3.x 各个版本的镜像。
|
||||
|
||||
### 使用方法
|
||||
默认会在 `27017` 端口启动数据库。
|
||||
|
||||
```sh
|
||||
$ docker run --name some-mongo -d mongo
|
||||
```
|
||||
|
||||
使用其他应用连接到容器,可以用
|
||||
|
||||
```sh
|
||||
$ 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"'
|
||||
```
|
||||
|
||||
### 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"]
|
||||
```
|
||||
|
||||
126
appendix/repo/mysql.md
Normal file
@@ -0,0 +1,126 @@
|
||||
## [MySQL](https://hub.docker.com/_/mysql/)
|
||||
|
||||
### 基本信息
|
||||
[MySQL](https://en.wikipedia.org/wiki/MySQL) 是开源的关系数据库实现。
|
||||
|
||||
该仓库位于 https://hub.docker.com/_/mysql/ ,提供了 MySQL 各个版本的镜像,包括 5.6 系列、5.7 系列等。
|
||||
|
||||
### 使用方法
|
||||
默认会在 `3306` 端口启动数据库。
|
||||
|
||||
```
|
||||
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql
|
||||
```
|
||||
之后就可以使用其它应用来连接到该容器。
|
||||
|
||||
```
|
||||
$ 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"'
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
#### 5.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 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"]
|
||||
```
|
||||
|
||||
|
||||
103
appendix/repo/nginx.md
Normal file
@@ -0,0 +1,103 @@
|
||||
## [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 各个版本的镜像。
|
||||
|
||||
### 使用方法
|
||||
下面的命令将作为一个静态页面服务器启动。
|
||||
|
||||
```
|
||||
$ docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
|
||||
```
|
||||
用户也可以不使用这种映射方式,通过利用 Dockerfile 来直接将静态页面内容放到镜像中,内容为
|
||||
|
||||
```
|
||||
FROM nginx
|
||||
COPY static-html-directory /usr/share/nginx/html
|
||||
```
|
||||
之后生成新的镜像,并启动一个容器。
|
||||
|
||||
```
|
||||
$ 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
|
||||
```
|
||||
|
||||
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;"]
|
||||
```
|
||||
|
||||
#### 1.11.x 版本
|
||||
|
||||
```
|
||||
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;"]
|
||||
```
|
||||
|
||||
|
||||
151
appendix/repo/nodejs.md
Normal file
@@ -0,0 +1,151 @@
|
||||
## [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 各个版本的镜像。
|
||||
|
||||
### 使用方法
|
||||
在项目中创建一个 Dockerfile。
|
||||
|
||||
```
|
||||
FROM node:0.10-onbuild
|
||||
# replace this with your application's default port
|
||||
EXPOSE 8888
|
||||
```
|
||||
然后创建镜像,并启动容器。
|
||||
|
||||
```
|
||||
$ 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
|
||||
```
|
||||
|
||||
### 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" ]
|
||||
```
|
||||
|
||||
143
appendix/repo/redis.md
Normal file
@@ -0,0 +1,143 @@
|
||||
## [Redis](https://hub.docker.com/_/redis/)
|
||||
|
||||
### 基本信息
|
||||
[Redis](https://en.wikipedia.org/wiki/Redis) 是开源的内存 Key-Value 数据库实现。
|
||||
|
||||
该仓库位于 https://hub.docker.com/_/redis/ ,提供了 Redis 3.x 各个版本的镜像。
|
||||
|
||||
### 使用方法
|
||||
默认会在 `6379` 端口启动数据库。
|
||||
|
||||
```
|
||||
$ docker run --name some-redis -d redis
|
||||
```
|
||||
另外还可以启用 [持久存储](http://redis.io/topics/persistence)。
|
||||
|
||||
```
|
||||
$ docker run --name some-redis -d redis redis-server --appendonly yes
|
||||
```
|
||||
|
||||
默认数据存储位置在 `VOLUME/data`。可以使用 `--volumes-from some-volume-container` 或 `-v /docker/host/dir:/data` 将数据存放到本地。
|
||||
|
||||
使用其他应用连接到容器,可以用
|
||||
|
||||
```
|
||||
$ 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"'
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
#### 3.0 版本
|
||||
```
|
||||
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.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" ]
|
||||
```
|
||||
|
||||
|
||||
144
appendix/repo/ubuntu.md
Normal file
@@ -0,0 +1,144 @@
|
||||
## [Ubuntu](https://hub.docker.com/_/ubuntu/)
|
||||
|
||||
### 基本信息
|
||||
[Ubuntu](https://en.wikipedia.org/wiki/Ubuntu) 是流行的 Linux 发行版,其自带软件版本往往较新一些。
|
||||
|
||||
该仓库位于 https://hub.docker.com/_/ubuntu/ ,提供了 Ubuntu 从 12.04 ~ 16.10 各个版本的镜像。
|
||||
|
||||
### 使用方法
|
||||
默认会启动一个最小化的 Ubuntu 环境。
|
||||
|
||||
```
|
||||
$ docker run --name some-ubuntu -i -t ubuntu
|
||||
root@523c70904d54:/#
|
||||
```
|
||||
|
||||
### 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"]
|
||||
```
|
||||
|
||||
|
||||
118
appendix/repo/wordpress.md
Normal file
@@ -0,0 +1,118 @@
|
||||
## [WordPress](https://hub.docker.com/_/wordpress/)
|
||||
|
||||
### 基本信息
|
||||
[WordPress](https://en.wikipedia.org/wiki/WordPress) 是开源的 Blog 和内容管理系统框架,它基于 PhP 和 MySQL。
|
||||
|
||||
该仓库位于 https://hub.docker.com/_/wordpress/ ,提供了 WordPress 4.x 版本的镜像。
|
||||
|
||||
### 使用方法
|
||||
启动容器需要 MySQL 的支持,默认端口为 `80`。
|
||||
|
||||
```
|
||||
$ 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 串
|
||||
|
||||
### Dockerfile
|
||||
#### 4.0 版本
|
||||
```
|
||||
FROM debian:wheezy
|
||||
|
||||
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
|
||||
|
||||
# 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"]
|
||||
```
|
||||
|
||||
23
appendix/resources/README.md
Normal file
@@ -0,0 +1,23 @@
|
||||
# 资源链接
|
||||
|
||||
## 官方网站
|
||||
* 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
|
||||
126
appendix_command/README.md
Normal file
@@ -0,0 +1,126 @@
|
||||
# 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 的命令
|
||||

|
||||
@@ -1,7 +0,0 @@
|
||||
#架构
|
||||
docker使用C/S架构,docker daemon作为server端接受client的请求,并处理(创建、运行、分发容器),他们可以运行在一个机器上,也通过sockerts或者RESTful API通信。
|
||||
|
||||

|
||||
|
||||
|
||||
Docker daemon一般在宿主主机后台运行,用户使用client而直接跟daemon交互。Docker client 以系统做bin命令的形式存在,用户用docker命令来跟docker daemon交互。
|
||||
@@ -1,9 +0,0 @@
|
||||
当我们运行`docker run -i -t ubuntu /bin/bash`命令时,docker 在后台运行的操作如下:
|
||||
|
||||
* 如果本地有ubuntu这个image就从它创建容器,否则从公有仓库下载
|
||||
* 从image创建容器
|
||||
* 分配一个文件系统,并在只读的image层外面挂载一层可读写的层
|
||||
* 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
|
||||
* 从地址池配置一个ip地址给容器
|
||||
* 执行你指定的程序,在这里启动一个/bin/bash进程
|
||||
* -i -t 指定标准输入和输出
|
||||
@@ -1,3 +0,0 @@
|
||||
每个docker都有很多层次构成,docker使用 union file systems 将这些不同的层结合到一个image中去。
|
||||
|
||||
AUFS (AnotherUnionFS) 是一种 Union FS, 简单来说就是支持将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)的文件系统, 更进一步的理解, AUFS支持为每一个成员目录(类似Git Branch)设定readonly、readwrite 和 whiteout-able 权限, 同时 AUFS 里有一个类似分层的概念, 对 readonly 权限的 branch 可以逻辑上进行修改(增量地, 不影响 readonly 部分的)。通常 Union FS 有两个用途, 一方面可以实现不借助 LVM、RAID 将多个disk挂到同一个目录下, 另一个更常用的就是将一个 readonly 的 branch 和一个 writeable 的 branch 联合在一起,Live CD正是基于此方法可以允许在 OS image 不变的基础上允许用户在其上进行一些写操作。Docker 在 AUFS 上构建的 container image 也正是如此。
|
||||
@@ -1,13 +0,0 @@
|
||||
docker有三个内部组件
|
||||
* docker images
|
||||
* docker registries
|
||||
* docker containers
|
||||
|
||||
### Docker images
|
||||
docker images 就是一个只读的模板。比如:一个image可以包含一个ubuntu的操作系统,里面安装了apache或者你需要的应用程序。images可以用来创建docker containers,docker提供了一个很简单的机制来创建images或者更新现有的images,你甚至可以直接从其他人那里下载一个已经做好的images
|
||||
|
||||
###Docker registries
|
||||
Docker registries 也叫docker 仓库,它有公有仓库和私有仓库2种形式,他们都可以用来让你上传和下载images。公有的仓库也叫 Docker Hub。它提供了一个巨大的image库可以让你下载,你也可以在自己的局域网内建一个自己的私有仓库。
|
||||
|
||||
###Docker containers
|
||||
Docker containers也叫docker容器,容器是从image镜像创建的。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、安全的平台。
|
||||
@@ -1 +0,0 @@
|
||||
docker仓库用来保存我们的images,当我们创建了自己的image之后我们就可以使用push命令将它上传到公有或者私有仓库,这样下次要在另外一台机器上使用这个image时候,只需要从仓库上pull下来就可以了。
|
||||
@@ -1,23 +0,0 @@
|
||||
docker底层的2个核心技术分别是Namespaces和Control groups。
|
||||
|
||||
以下内容摘自InfoQ Docker,自1.20版本开始docker已经抛开lxc,不过下面的内容对于理解docker还是有很大帮助。
|
||||
|
||||
###pid namespace
|
||||
不同用户的进程就是通过pid namespace隔离开的,且不同 namespace 中可以有相同pid。所有的LXC进程在docker中的父进程为docker进程,每个lxc进程具有不同的namespace。同时由于允许嵌套,因此可以很方便的实现 Docker in Docker。
|
||||
|
||||
###net namespace
|
||||
有了 pid namespace, 每个namespace中的pid能够相互隔离,但是网络端口还是共享host的端口。网络隔离是通过net namespace实现的, 每个net namespace有独立的 network devices, IP addresses, IP routing tables, /proc/net 目录。这样每个container的网络就能隔离开来。docker默认采用veth的方式将container中的虚拟网卡同host上的一个docker bridge: docker0连接在一起。
|
||||
|
||||
###ipc namespace
|
||||
container中进程交互还是采用linux常见的进程间交互方法(interprocess communication - IPC), 包括常见的信号量、消息队列和共享内存。然而同 VM 不同的是,container 的进程间交互实际上还是host上具有相同pid namespace中的进程间交互,因此需要在IPC资源申请时加入namespace信息 - 每个IPC资源有一个唯一的 32 位 ID。
|
||||
|
||||
###mnt namespace
|
||||
类似chroot,将一个进程放到一个特定的目录执行。mnt namespace允许不同namespace的进程看到的文件结构不同,这样每个 namespace 中的进程所看到的文件目录就被隔离开了。同chroot不同,每个namespace中的container在/proc/mounts的信息只包含所在namespace的mount point。
|
||||
|
||||
###uts namespace
|
||||
UTS("UNIX Time-sharing System") namespace允许每个container拥有独立的hostname和domain name, 使其在网络上可以被视作一个独立的节点而非Host上的一个进程。
|
||||
|
||||
###user namespace
|
||||
每个container可以有不同的 user 和 group id, 也就是说可以在container内部用container内部的用户执行程序而非Host上的用户。
|
||||
|
||||
Control groups主要用来隔离各个容器和宿主主机的资源利用。
|
||||
8
basic_concept/README.md
Normal file
@@ -0,0 +1,8 @@
|
||||
# 基本概念
|
||||
Docker 包括三个基本概念
|
||||
* 镜像(Image)
|
||||
* 容器(Container)
|
||||
* 仓库(Repository)
|
||||
|
||||
理解了这三个概念,就理解了 Docker 的整个生命周期。
|
||||
|
||||
13
basic_concept/container.md
Normal file
@@ -0,0 +1,13 @@
|
||||
## Docker 容器
|
||||
|
||||
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的`类`和`实例`一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
|
||||
|
||||
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 [命名空间](https://en.wikipedia.org/wiki/Linux_namespaces)。因此容器可以拥有自己的 `root` 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会把容器和虚拟机搞混。
|
||||
|
||||
前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为**容器存储层**。
|
||||
|
||||
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
|
||||
|
||||
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 [数据卷(Volume)](https://docs.docker.com/engine/tutorials/dockervolumes/)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
|
||||
|
||||
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器可以随意删除、重新 `run`,数据却不会丢失。
|
||||
15
basic_concept/image.md
Normal file
@@ -0,0 +1,15 @@
|
||||
## Docker 镜像
|
||||
|
||||
我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 `root` 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 `root` 文件系统。比如官方镜像 `ubuntu:14.04` 就包含了完整的一套 Ubuntu 14.04 最小系统的 `root` 文件系统。
|
||||
|
||||
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
|
||||
|
||||
### 分层存储
|
||||
|
||||
因为镜像包含操作系统完整的 `root` 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 [Union FS](https://en.wikipedia.org/wiki/Union_mount) 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
|
||||
|
||||
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
|
||||
|
||||
分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
|
||||
|
||||
关于镜像构建,将会在后续相关章节中做进一步的讲解。
|
||||
29
basic_concept/repository.md
Normal file
@@ -0,0 +1,29 @@
|
||||
## Docker Registry
|
||||
|
||||
镜像构建完成后,可以很容易的在当前宿主上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,[Docker Registry](https://docs.docker.com/registry/) 就是这样的服务。
|
||||
|
||||
一个 **Docker Registry** 中可以包含多个**仓库**(Repository);每个仓库可以包含多个**标签**(Tag);每个标签对应一个镜像。
|
||||
|
||||
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 `<仓库名>:<标签>` 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 `latest` 作为默认标签。
|
||||
|
||||
以 [Ubuntu 镜像](https://hub.docker.com/_/ubuntu/) 为例,`ubuntu` 是仓库的名字,其内包含有不同的版本标签,如,`14.04`, `16.04`。我们可以通过 `ubuntu:14.04`,或者 `ubuntu:16.04` 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 `ubuntu`,那将视为 `ubuntu:latest`。
|
||||
|
||||
仓库名经常以 *两段式路径* 形式出现,比如 `jwilder/nginx-proxy`,前者往往意味着 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/) 的镜像使用的就是这个服务。
|
||||
|
||||
由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 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 的公开服务。比如 [时速云镜像仓库](https://hub.tenxcloud.com/)、[网易云镜像服务](https://c.163.com/hub#/m/library/)、[DaoCloud 镜像市场](https://hub.daocloud.io/)、[阿里云镜像库](https://cr.console.aliyun.com)等。
|
||||
|
||||
### 私有 Docker Registry
|
||||
|
||||
除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 [Docker Registry 镜像](https://hub.docker.com/_/registry/),可以直接使用做为私有 Registry 服务。在后续的相关章节中,会有进一步的搭建私有 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,甚至提供了用户界面以及一些高级功能。比如,[VMWare Harbor](http://vmware.github.io/harbor/index_cn.html) 和 [Sonatype Nexus](https://www.sonatype.com/docker)。
|
||||
30
book.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"title": "Docker -- 从入门到实践",
|
||||
"author": "yeasy",
|
||||
"plugins": [
|
||||
"image-captions",
|
||||
"github-buttons",
|
||||
"page-treeview"
|
||||
],
|
||||
"pluginsConfig": {
|
||||
"image-captions": {
|
||||
"attributes": {
|
||||
"width": "600"
|
||||
},
|
||||
"caption": "图 _PAGE_LEVEL_._PAGE_IMAGE_NUMBER_ - _CAPTION_"
|
||||
},
|
||||
"github-buttons": {
|
||||
"repo": "yeasy/docker_practice",
|
||||
"types": [
|
||||
"star",
|
||||
"watch"
|
||||
],
|
||||
"size": "small"
|
||||
},
|
||||
"page-treeview": {
|
||||
"copyright": "Copyright © yeasy",
|
||||
"minHeaderCount": "2",
|
||||
"minHeaderDeep": "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
9
cases/os/README.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# 操作系统
|
||||
|
||||
目前常用的 Linux 发行版主要包括 Debian/Ubuntu 系列和 CentOS/Fedora 系列。
|
||||
|
||||
前者以自带软件包版本较新而出名;后者则宣称运行更稳定一些。选择哪个操作系统取决于读者的具体需求。同时,社区还推出了完全基于 Docker 的 Linux 发行版 CoreOS。
|
||||
|
||||
使用 Docker,读者只需要一个命令就能快速获取一个 linux 发行版镜像,这是以往包括各种虚拟化技术都难以实现的。这些镜像一般都很精简,但是可以支持完整 linux 系统的大部分功能。
|
||||
|
||||
本章将介绍如何使用 Docker 安装和使用 Busybox、Alphine、Debian/Ubuntu、CentOS/Fedora、CoreOS 等操作系统。
|
||||
BIN
cases/os/_images/alpinelinux-logo.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
cases/os/_images/busybox-logo.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
cases/os/_images/centos-logo.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
cases/os/_images/coreos-login.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
cases/os/_images/coreos-logo.jpg
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
cases/os/_images/coreos_crt.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
cases/os/_images/coreos_list.png
Normal file
|
After Width: | Height: | Size: 8.1 KiB |
BIN
cases/os/_images/coreos_run_ip.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
cases/os/_images/debian-logo.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
BIN
cases/os/_images/docker_version.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
cases/os/_images/fedora-logo.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
cases/os/_images/php_pulling.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
cases/os/_images/ubuntu-logo.jpg
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
cases/os/_images/vmware_coreos.png
Normal file
|
After Width: | Height: | Size: 107 KiB |
73
cases/os/alpine.md
Normal file
@@ -0,0 +1,73 @@
|
||||
## Alpine
|
||||
|
||||
### 简介
|
||||
|
||||

|
||||
|
||||
`Alpine` 操作系统是一个面向安全的轻型 `Linux` 发行版。它不同于通常 `Linux` 发行版,`Alpine` 采用了 `musl libc` 和 `busybox` 以减小系统的体积和运行时资源消耗,但功能上比 `busybox` 又完善的多,因此得到开源社区越来越多的青睐。在保持瘦身的同时,`Alpine` 还提供了自己的包管理工具 `apk`,可以通过 `https://pkgs.alpinelinux.org/packages` 网站上查询包信息,也可以直接通过 `apk` 命令直接查询和安装各种软件。
|
||||
|
||||
`Alpine` 由非商业组织维护的,支持广泛场景的 `Linux`发行版,它特别为资深/重度`Linux`用户而优化,关注安全,性能和资源效能。`Alpine` 镜像可以适用于更多常用场景,并且是一个优秀的可以适用于生产的基础系统/环境。
|
||||
|
||||
`Alpine` Docker 镜像也继承了 Alpine Linux 发行版的这些优势。相比于其他 `Docker` 镜像,它的容量非常小,仅仅只有 5 MB 左右(对比 Ubuntu 系列镜像接近 200 MB),且拥有非常友好的包管理机制。官方镜像来自 `docker-alpine` 项目。
|
||||
|
||||
目前 Docker 官方已开始推荐使用 `Alpine` 替代之前的 `Ubuntu` 做为基础镜像环境。这样会带来多个好处。包括镜像下载速度加快,镜像安全性提高,主机之间的切换更方便,占用更少磁盘空间等。
|
||||
|
||||
下表是官方镜像的大小比较:
|
||||
|
||||
```sh
|
||||
REPOSITORY TAG IMAGE ID VIRTUAL SIZE
|
||||
alpine latest 4e38e38c8ce0 4.799 MB
|
||||
debian latest 4d6ce913b130 84.98 MB
|
||||
ubuntu latest b39b81afc8ca 188.3 MB
|
||||
centos latest 8efe422e6104 210 MB
|
||||
```
|
||||
|
||||
### 获取并使用官方镜像
|
||||
|
||||
由于镜像很小,下载时间往往很短,读者可以直接使用 `docker run` 指令直接运行一个 `Alpine` 容器,并指定运行的 Linux 指令,例如:
|
||||
|
||||
```sh
|
||||
$ docker run alpine echo '123'
|
||||
123
|
||||
```
|
||||
|
||||
笔者使用 time 工具来测试下在本地没有提前 pull 镜像情况下,执行 echo 命令的时间,仅需要 3 秒左右。
|
||||
|
||||
```sh
|
||||
$ time docker run alpine echo '123'Unable to find image 'alpine:latest' locallylatest: Pulling from library/alpine
|
||||
|
||||
e110a4a17941: Pull completeDigest: sha256:3dcdb92d7432d56604d4545cbd324b14e647b313626d99b889d0626de158f73aStatus: Downloaded newer image for alpine:latest123
|
||||
|
||||
real 0m3.367s user 0m0.040s sys 0m0.007s
|
||||
```
|
||||
|
||||
### 迁移至 `Alpine` 基础镜像
|
||||
|
||||
目前,大部分 Docker 官方镜像都已经支持 Alpine 作为基础镜像,可以很容易进行迁移。
|
||||
|
||||
例如:
|
||||
|
||||
* ubuntu/debian -> alpine
|
||||
* python:2.7 -> python:2.7-alpine
|
||||
* ruby:2.3 -> ruby:2.3-alpine
|
||||
|
||||
另外,如果使用 `Alpine` 镜像替换 `Ubuntu` 基础镜像,安装软件包时需要用 apk 包管理器替换 apt 工具,如
|
||||
|
||||
```sh
|
||||
$ apk add --no-cache <package>
|
||||
```
|
||||
|
||||
`Alpine` 中软件安装包的名字可能会与其他发行版有所不同,可以在 `https://pkgs.alpinelinux.org/packages` 网站搜索并确定安装包名称。如果需要的安装包不在主索引内,但是在测试或社区索引中。那么可以按照以下方法使用这些安装包。
|
||||
|
||||
```sh
|
||||
$ echo "http://dl-4.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
|
||||
$ apk --update add --no-cache <package>
|
||||
```
|
||||
|
||||
### 相关资源
|
||||
|
||||
* `Apline` 官网:`http://alpinelinux.org/`
|
||||
* `Apline` 官方仓库:`https://github.com/alpinelinux`
|
||||
* `Apline` 官方镜像:`https://hub.docker.com/_/alpine/`
|
||||
* `Apline` 官方镜像仓库:`https://github.com/gliderlabs/docker-alpine`
|
||||
|
||||
114
cases/os/busybox.md
Normal file
@@ -0,0 +1,114 @@
|
||||
## Busybox
|
||||
|
||||
### 简介
|
||||
|
||||

|
||||
|
||||
BusyBox 是一个集成了一百多个最常用 Linux 命令和工具(如 cat、echo、grep、mount、telnet 等)的精简工具箱,它只需要几 MB 的大小,很方便进行各种快速验证,被誉为“Linux 系统的瑞士军刀”。
|
||||
|
||||
BusyBox 可运行于多款 POSIX 环境的操作系统中,如 Linux(包括 Android)、Hurd、FreeBSD 等。
|
||||
|
||||
### 获取官方镜像
|
||||
|
||||
在 Docker Hub 中搜索 busybox 相关的镜像。
|
||||
|
||||
```sh
|
||||
$ docker search busybox
|
||||
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
|
||||
busybox Busybox base image. 755 [OK]
|
||||
progrium/busybox 63 [OK]
|
||||
radial/busyboxplus Full-chain, Internet enabled, busybox made... 11 [OK]
|
||||
odise/busybox-python 3 [OK]
|
||||
multiarch/busybox multiarch ports of ubuntu-debootstrap 2 [OK]
|
||||
azukiapp/busybox This image is meant to be used as the base... 2 [OK]
|
||||
...
|
||||
```
|
||||
|
||||
读者可以看到最受欢迎的镜像同时带有 OFFICIAL 标记,说明它是官方镜像。用户使用 docker pull 指令下载镜像 `busybox:latest`:
|
||||
|
||||
```sh
|
||||
$ docker pull busybox:latest
|
||||
busybox:latest: The image you are pulling has been verified
|
||||
e433a6c5b276: Pull complete
|
||||
e72ac664f4f0: Pull complete
|
||||
511136ea3c5a: Pull complete
|
||||
df7546f9f060: Pull complete
|
||||
Status: Downloaded newer image for busybox:latest
|
||||
```
|
||||
|
||||
下载后,可以看到 busybox 镜像只有2.433 MB:
|
||||
|
||||
```sh
|
||||
$ docker images
|
||||
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
|
||||
busybox latest e72ac664f4f0 6 weeks ago 2.433 MB
|
||||
```
|
||||
|
||||
### 运行 busybox
|
||||
|
||||
启动一个 busybox 容器,并在容器中执行 grep 命令。
|
||||
|
||||
```sh
|
||||
$ docker run -it busybox
|
||||
/ # grep
|
||||
BusyBox v1.22.1 (2014-05-22 23:22:11 UTC) multi-call binary.
|
||||
|
||||
Usage: grep [-HhnlLoqvsriwFE] [-m N] [-A/B/C N] PATTERN/-e PATTERN.../-f FILE [FILE]...
|
||||
|
||||
Search for PATTERN in FILEs (or stdin)
|
||||
|
||||
-H Add 'filename:' prefix
|
||||
-h Do not add 'filename:' prefix
|
||||
-n Add 'line_no:' prefix
|
||||
-l Show only names of files that match
|
||||
-L Show only names of files that don't match
|
||||
-c Show only count of matching lines
|
||||
-o Show only the matching part of line
|
||||
-q Quiet. Return 0 if PATTERN is found, 1 otherwise
|
||||
-v Select non-matching lines
|
||||
-s Suppress open and read errors
|
||||
-r Recurse
|
||||
-i Ignore case
|
||||
-w Match whole words only
|
||||
-x Match whole lines only
|
||||
-F PATTERN is a literal (not regexp)
|
||||
-E PATTERN is an extended regexp
|
||||
-m N Match up to N times per file
|
||||
-A N Print N lines of trailing context
|
||||
-B N Print N lines of leading context
|
||||
-C N Same as '-A N -B N'
|
||||
-e PTRN Pattern to match
|
||||
-f FILE Read pattern from file
|
||||
```
|
||||
|
||||
查看容器内的挂载信息。
|
||||
|
||||
```sh
|
||||
/ # mount
|
||||
rootfs on / type rootfs (rw)
|
||||
none on / type aufs (rw,relatime,si=b455817946f8505c)
|
||||
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
|
||||
tmpfs on /dev type tmpfs (rw,nosuid,mode=755)
|
||||
shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=65536k)
|
||||
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666)
|
||||
sysfs on /sys type sysfs (ro,nosuid,nodev,noexec,relatime)
|
||||
/dev/disk/by-uuid/b1f2dba7-d91b-4165-a377-bf1a8bed3f61 on /etc/resolv.conf type ext4 (rw,relatime,errors=remount-ro,data=ordered)
|
||||
/dev/disk/by-uuid/b1f2dba7-d91b-4165-a377-bf1a8bed3f61 on /etc/hostname type ext4 (rw,relatime,errors=remount-ro,data=ordered)
|
||||
/dev/disk/by-uuid/b1f2dba7-d91b-4165-a377-bf1a8bed3f61 on /etc/hosts type ext4 (rw,relatime,errors=remount-ro,data=ordered)
|
||||
devpts on /dev/console type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
|
||||
proc on /proc/sys type proc (ro,nosuid,nodev,noexec,relatime)
|
||||
proc on /proc/sysrq-trigger type proc (ro,nosuid,nodev,noexec,relatime)
|
||||
proc on /proc/irq type proc (ro,nosuid,nodev,noexec,relatime)
|
||||
proc on /proc/bus type proc (ro,nosuid,nodev,noexec,relatime)
|
||||
tmpfs on /proc/kcore type tmpfs (rw,nosuid,mode=755)
|
||||
```
|
||||
|
||||
busybox 镜像虽然小巧,但包括了大量常见的 Linux 命令,读者可以用它快速熟悉 Linux 命令。
|
||||
|
||||
### 相关资源
|
||||
|
||||
* `Busybox` 官网:`https://busybox.net/`
|
||||
* `Busybox` 官方仓库:`https://git.busybox.net/busybox/`
|
||||
* `Busybox` 官方镜像:`https://hub.docker.com/_/busybox/`
|
||||
* `Busybox` 官方仓库:`https://github.com/docker-library/busybox`
|
||||
|
||||
76
cases/os/centos.md
Normal file
@@ -0,0 +1,76 @@
|
||||
## CentOS/Fedora
|
||||
|
||||
### CentOS 系统简介
|
||||
|
||||
CentOS 和 Fedora 都是基于 Redhat 的常见 Linux 分支。CentOS 是目前企业级服务器的常用操作系统;Fedora 则主要面向个人桌面用户。
|
||||
|
||||

|
||||
|
||||
CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统),它是基于 Red Hat Enterprise Linux 源代码编译而成。由于 CentOS 与 Redhat Linux 源于相同的代码基础,所以很多成本敏感且需要高稳定性的公司就使用 CentOS 来替代商业版 Red Hat Enterprise Linux。CentOS 自身不包含闭源软件。
|
||||
|
||||
#### 使用 CentOS 官方镜像
|
||||
|
||||
首先使用 `docker search` 命令来搜索标星至少为 25 的 CentOS 相关镜像。
|
||||
|
||||
```sh
|
||||
$ docker search -f stars=25 centos
|
||||
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
|
||||
centos The official... 2543 [OK]
|
||||
jdeathe/centos-ssh 27 [OK]
|
||||
```
|
||||
|
||||
使用 docker run 直接运行最新的 CentOS 镜像,并登录 bash。
|
||||
|
||||
```sh
|
||||
$ docker run -it centos bash
|
||||
Unable to find image 'centos:latest' locally
|
||||
latest: Pulling from library/centos
|
||||
3d8673bd162a: Pull complete
|
||||
Digest: sha256:a66ffcb73930584413de83311ca11a4cb4938c9b2521d331026dad970c19adf4
|
||||
Status: Downloaded newer image for centos:latest
|
||||
[root@43eb3b194d48 /]# cat /etc/redhat-release
|
||||
CentOS Linux release 7.2.1511 (Core)
|
||||
```
|
||||
|
||||
### Fedora 系统简介
|
||||
|
||||

|
||||
|
||||
Fedora 由 Fedora Project 社区开发,红帽公司赞助的 Linux 发行版。它的目标是创建一套新颖、多功能并且自由和开源的操作系统。Fedora 的功能对于用户而言,它是一套功能完备的,可以更新的免费操作系统,而对赞助商 Red Hat 而言,它是许多新技术的测试平台。被认为可用的技术最终会加入到 Red Hat Enterprise Linux中。
|
||||
|
||||
#### 使用 Fedora 官方镜像
|
||||
|
||||
首先使用 `docker search` 命令来搜索标星至少为 2 的 Fedora 相关镜像,结果如下。
|
||||
|
||||
```sh
|
||||
$ docker search -f stars=2 fedora
|
||||
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
|
||||
fedora Official Docker builds of Fedora 433 [OK]
|
||||
dockingbay/fedora-rust Trusted build of Rust programming language... 3 [OK]
|
||||
gluster/gluster-fedora Official GlusterFS image [ Fedora 21 + Glu... 3 [OK]
|
||||
startx/fedora Simple container used for all startx based... 2 [OK]
|
||||
```
|
||||
|
||||
使用 docker run 命令直接运行 Fedora 官方镜像,并登录 bash。
|
||||
|
||||
```sh
|
||||
$ docker run -it fedora bash
|
||||
Unable to find image 'fedora:latest' locally
|
||||
latest: Pulling from library/fedora
|
||||
2bf01635e2a0: Pull complete
|
||||
Digest: sha256:64a02df6aac27d1200c2572fe4b9949f1970d05f74d367ce4af994ba5dc3669e
|
||||
Status: Downloaded newer image for fedora:latest
|
||||
[root@196ca341419b /]# cat /etc/redhat-release
|
||||
Fedora release 24 (Twenty Four)
|
||||
```
|
||||
|
||||
### 相关资源
|
||||
|
||||
* `Fedora` 官网:`https://getfedora.org/`
|
||||
* `Fedora` 官方仓库:`https://github.com/fedora-infra`
|
||||
* `Fedora` 官方镜像:`https://hub.docker.com/_/fedora/`
|
||||
* `Fedora` 官方镜像仓库:`https://github.com/fedora-cloud/docker-brew-fedora`
|
||||
* `CentOS` 官网:`https://getfedora.org/`
|
||||
* `CentOS` 官方仓库:`https://github.com/CentOS`
|
||||
* `CentOS` 官方镜像:`https://hub.docker.com/_/centos/`
|
||||
* `CentOS` 官方镜像仓库:`https://github.com/CentOS/CentOS-Dockerfiles`
|
||||
116
cases/os/coreos.md
Normal file
@@ -0,0 +1,116 @@
|
||||
## CoreOS
|
||||
|
||||
### 简介
|
||||
|
||||

|
||||
|
||||
CoreOS 是一个轻量级容器化 Linux 发行版,专为数据中心场景而设计,旨在通过轻量的系统架构和灵活的应用程序部署能力简化数据中心的维护成本和复杂度。CoreOS 作为 Docker 生态圈中的重要一员,日益得到各大云服务商的重视。CoreOS 于 2014 年 7 月首次发布了稳定版本。
|
||||
|
||||
与其他历史悠久、使用广泛的 Linux 操作系统相比,CoreOS 拥有下面几个优点。
|
||||
|
||||
* CoreOS 通过容器化(Containerized)的运算环境向应用程序提供运算资源。
|
||||
|
||||
传统类 Unix 系统往往提供包管理工具。随着系统安装更多的程序,而程序的依赖要求各不相同,这就容易出现“依赖地狱”(Dependency Hell),系统的更新和安装会非常痛苦。
|
||||
|
||||
CoreOS 的应用程序通过 Docker 运行在容器中,彼此之间共享系统内核和资源,同时互不可见。这种方式使得操作系统、应用程序及运行环境之间的耦合度大大降低。相对于传统的部署方式而言,运维可以更加灵活便捷的在 CoreOS 集群中部署应用程序,同时各运行环境之间的干扰更少,操作系统自身的维护也更加容易。
|
||||
|
||||
* CoreOS 采用双系统分区(Dual Root Partition)设计。
|
||||
|
||||
CoreOs 的两个分区在系统运行期间各司其职,它们分别被设置成主动模式和被动模式。主动分区负责系统运行,被动分区负责系统升级。一旦 CoreOS 发布了新版系统,运维只需下载一个完整的系统安装文件至被动分区,然后设置系统下一次重启时从新版本分区启动,将主、被动分区的职能进行调换即可。在 CoreOS 系统运行期间,系统分区被设置成只读状态,这样也确保了 CoreOS 的安全性。CoreOS 的升级过程在默认条件下将自动完成,并且通过 cgroup 对升级过程中使用到的网络和磁盘资源进行限制,这将系统升级所带来的影响降至最低。
|
||||
|
||||
* CoreOS 使用 Systemd 取代 SysV 作为系统和服务的管理工具。
|
||||
|
||||
与 SysV 相比,Systemd 不仅可以更好的追踪系统进程,还具备优秀的并行化处理能力。Systemd 将自己的按需启动的特性与 Docker 的快速启动能力相结合,在 CoreOS 集群中大规模部署 Docker Containers 的业务中优势明显。Systemd 引入了“target”的概念,每个 target 应用于一个特定的服务,并且可以通过继承一个已有的 target 来扩展额外的功能,即操作系统对系统上运行的服务拥有更好的控制力。
|
||||
|
||||
CoreOS 团队还推出了很多有益的工具,包括 etcd, fleet, flannel 等。
|
||||
|
||||
安装 CoreOS 有几种方法,笔者推荐初学者使用 VMware Workstation 虚拟机方式来运行 CoreOS。VMware Workstation 工具则可以前往其官网`http://www.vmware.com/products/workstation/` 下载获取。
|
||||
|
||||
### 使用官方镜像
|
||||
|
||||
#### 获取虚拟机镜像
|
||||
从官方网站下载 CoreOS 镜像,地址为 [https:\/\/coreos.com\/releases\/](http://alpha.release.core-os.net/amd64-usr/current/coreos_production_vmware_insecure.zip)。
|
||||
|
||||
如果读者已经安装 VMware Workstation,则解压镜像包后双击`vmx` 文件:
|
||||
!
|
||||
|
||||
双击`vmx` 文件后,即可启动 CoreOS 虚拟机,如下图所示:
|
||||
|
||||

|
||||
|
||||
*注意:使用免费版 VMware Player 运行 CoreOS 官方镜像时,可能出现无法通过 DHCP 自动获取 IP 地址的问题,读者可配置静态地址或使用 VMware Workstation 来运行 `vmx` 文件。*
|
||||
|
||||
#### 获取地址信息
|
||||
|
||||
此时CoreOS 系统已经在 VMware Station 中启动,显示登录提示:
|
||||
|
||||

|
||||
|
||||
直接按回车键,获取当前系统的 IP 地址,如下图所示:
|
||||
|
||||

|
||||
|
||||
如上图所示,查看此时 CoreOS 的 IP地址是:`192.168.66.128`。
|
||||
|
||||
#### 使用 SSH 客户端访问镜像
|
||||
|
||||
笔者以 Windows 环境为例,使用 SecureCRT 工具进行连接。此处读者需要确定:
|
||||
|
||||
* CoreOS 虚拟机的 IP地址
|
||||
* CoreOS 虚拟机的文件目录下含有 `insecure_ssh_key` 公钥文件
|
||||
|
||||
打开 SecureCRT,建立新的 SSH 连接,如下图示:
|
||||
|
||||

|
||||
|
||||
点击 ` 属性` 按钮添加 `insecure_ssh_key` 公钥文件后,即可点击 `连接`。
|
||||
|
||||
如果连接成功,则读者可以看到命令行页面,读者在命令行中查看 Docker 的版本信息:
|
||||
|
||||
```sh
|
||||
$ docker version
|
||||
```
|
||||
|
||||
结果如下图示:
|
||||
|
||||

|
||||
|
||||
此时,CoreOS 虚拟机已经成功运行,并且读者可以使用 SSH 客户端方便的操作 CoreOS 虚拟机。 Docker 已经内置于 CoreOS 中,读者可以进行各种 Docker 操作,如下图示:
|
||||
|
||||

|
||||
|
||||
如果读者的本机环境是 Linux 系统,读者可以使用 SSH 公钥(在解压后的根目录下),直接使用 `ssh` 命令连接 CoreOS 虚拟机,并使用 `ip a` 命令查看 IP 地址信息。
|
||||
|
||||
如下所示:
|
||||
|
||||
```sh
|
||||
$ ssh -i ~/insecure_ssh_key core@192.168.6.153
|
||||
CoreOS (alpha)
|
||||
core@localhost ~ $ ls
|
||||
core@localhost ~ $ docker ps
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
core@localhost ~ $ ip a
|
||||
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
|
||||
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
||||
inet 127.0.0.1/8 scope host lo
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 ::1/128 scope host
|
||||
valid_lft forever preferred_lft forever
|
||||
2: enp0s17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
|
||||
link/ether 00:0c:29:ff:73:46 brd ff:ff:ff:ff:ff:ff
|
||||
inet 192.168.6.153/20 brd 192.168.15.255 scope global dynamic enp0s17
|
||||
valid_lft 604500sec preferred_lft 604500sec
|
||||
inet6 fe80::20c:29ff:feff:7346/64 scope link
|
||||
valid_lft forever preferred_lft forever
|
||||
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
|
||||
link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
|
||||
inet 172.17.42.1/16 scope global docker0
|
||||
valid_lft forever preferred_lft forever
|
||||
core@localhost ~ $
|
||||
```
|
||||
|
||||
### 相关资源
|
||||
|
||||
* `CoreOS` 官网:`https://coreos.com/`
|
||||
* `CoreOS` 官方仓库:`https://github.com/coreos/`
|
||||
|
||||
170
cases/os/debian.md
Normal file
@@ -0,0 +1,170 @@
|
||||
## Debian/Ubuntu
|
||||
Debian 和 Ubuntu 都是目前较为流行的 Debian 系的服务器操作系统,十分适合研发场景。Docker Hub 上提供了官方镜像,国内各大容器云服务也基本都提供了相应的支持。
|
||||
|
||||
### Debian 系统简介
|
||||
|
||||

|
||||
|
||||
Debian 是由 GPL 和其他自由软件许可协议授权的自由软件组成的操作系统,由Debian 计划(Debian Project)组织维护。Debian 计划是一个独立的、分散的组织,由 3000 人志愿者组成,接受世界多个非盈利组织的资金支持,Software in the Public Interest 提供支持并持有商标作为保护机构。Debian 以其坚守 Unix 和自由软件的精神,以及其给予用户的众多选择而闻名。现时 Debian 包括了超过 25,000 个软件包并支持 12 个计算机系统结构。
|
||||
|
||||
Debian 作为一个大的系统组织框架,其下有多种不同操作系统核心的分支计划,主要为采用 Linux 核心的 Debian GNU/Linux 系统,其他还有采用 GNU Hurd 核心的 Debian GNU/Hurd 系统、采用 FreeBSD 核心的 Debian GNU/kFreeBSD 系统,以及采用 NetBSD 核心的 Debian GNU/NetBSD 系统。甚至还有利用 Debian 的系统架构和工具,采用 OpenSolaris 核心构建而成的 Nexenta OS 系统。在这些 Debian 系统中,以采用 Linux 核心的 Debian GNU/Linux 最为著名。
|
||||
|
||||
众多的 Linux 发行版,例如 Ubuntu、Knoppix 和 Linspire 及 Xandros 等,都基于 Debian GNU/Linux。
|
||||
|
||||
#### 使用 Debian 官方镜像
|
||||
|
||||
读者可以使用 docker search 搜索 Docker Hub,查找 Debian 镜像:
|
||||
|
||||
```sh
|
||||
$ docker search debian
|
||||
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
|
||||
debian Debian is... 1565 [OK]
|
||||
neurodebian NeuroDebian... 26 [OK]
|
||||
armbuild/debian port of debian 8 [OK]
|
||||
...
|
||||
```
|
||||
|
||||
官方提供了大家熟知的 debian 镜像以及面向科研领域的 neurodebian 镜像。
|
||||
|
||||
可以使用 docker run 直接运行 Debian 镜像。
|
||||
|
||||
```sh
|
||||
$ docker run -it debian bash
|
||||
root@668e178d8d69:/# cat /etc/issue
|
||||
Debian GNU/Linux 8
|
||||
```
|
||||
|
||||
Debian 镜像很适合作为基础镜像,构建自定义镜像。
|
||||
|
||||
### Ubuntu 系统简介
|
||||
|
||||

|
||||
|
||||
Ubuntu 是一个以桌面应用为主的GNU/Linux操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词(官方译名“友帮拓”,另有“吾帮托”、“乌班图”、“有奔头”或“乌斑兔”等译名)。Ubuntu 意思是“人性”以及“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。 Ubuntu 基于 Debian 发行版和 GNOME/Unity 桌面环境,与 Debian 的不同在于它每 6 个月会发布一个新版本,每 2 年推出一个长期支持(Long Term Support,LTS)版本,一般支持 3 年时间。
|
||||
|
||||
#### 使用 Ubuntu 官方镜像
|
||||
|
||||
Ubuntu 相关的镜像有很多,这里使用 `-s 10` 参数,只搜索那些被收藏 10 次以上的镜像。
|
||||
|
||||
```sh
|
||||
$ docker search -s 10 ubuntu
|
||||
|
||||
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
|
||||
ubuntu Official Ubuntu base image 840 [OK]
|
||||
dockerfile/ubuntu Trusted automated Ubuntu (http://www.ubunt... 30 [OK]
|
||||
crashsystems/gitlab-docker A trusted, regularly updated build of GitL... 20 [OK]
|
||||
sylvainlasnier/memcached This is a Memcached 1.4.14 docker images b... 16 [OK]
|
||||
ubuntu-upstart Upstart is an event-based replacement for ... 16 [OK]
|
||||
mbentley/ubuntu-django-uwsgi-nginx 16 [OK]
|
||||
ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with ansible 15 [OK]
|
||||
clue/ttrss The Tiny Tiny RSS feed reader allows you t... 14 [OK]
|
||||
dockerfile/ubuntu-desktop Trusted automated Ubuntu Desktop (LXDE) (h... 14 [OK]
|
||||
tutum/ubuntu Ubuntu image with SSH access. For the root... 12 [OK]
|
||||
```
|
||||
*注意,Docker 1.12 版本中已经不支持 --stars 参数,则可以使用 -f stars=N 参数。*
|
||||
|
||||
根据搜索出来的结果,读者可以自行选择下载镜像并使用。
|
||||
|
||||
下面以 ubuntu 14.04 为例,演示如何使用该镜像安装一些常用软件。
|
||||
|
||||
首先使用 `-ti` 参数启动容器,登录 bash,查看 ubuntu 的发行版本号。
|
||||
|
||||
```sh
|
||||
$ docker run -ti ubuntu:14.04 /bin/bash
|
||||
root@7d93de07bf76:/# lsb_release -a
|
||||
No LSB modules are available.
|
||||
Distributor ID: Ubuntu
|
||||
Description: Ubuntu 14.04.1 LTS
|
||||
Release: 14.04
|
||||
Codename: trusty
|
||||
```
|
||||
|
||||
当试图直接使用 `apt-get` 安装一个软件的时候,会提示 `E: Unable to locate package`。
|
||||
|
||||
```sh
|
||||
root@7d93de07bf76:/# apt-get install curl
|
||||
Reading package lists... Done
|
||||
Building dependency tree
|
||||
Reading state information... Done
|
||||
E: Unable to locate package curl
|
||||
```
|
||||
|
||||
这并非系统不支持 `apt-get` 命令。Docker 镜像在制作时为了精简清除了 apt 仓库信息,因此需要先执行 `apt-get update` 命令来更新仓库信息。更新信息后即可成功通过 apt-get 命令来安装软件。
|
||||
|
||||
```sh
|
||||
root@7d93de07bf76:/# apt-get update
|
||||
Ign http://archive.ubuntu.com trusty InRelease
|
||||
Ign http://archive.ubuntu.com trusty-updates InRelease
|
||||
Ign http://archive.ubuntu.com trusty-security InRelease
|
||||
Ign http://archive.ubuntu.com trusty-proposed InRelease
|
||||
Get:1 http://archive.ubuntu.com trusty Release.gpg [933 B]
|
||||
...
|
||||
```
|
||||
|
||||
首先,安装 curl 工具。
|
||||
|
||||
```sh
|
||||
root@7d93de07bf76:/# apt-get install curl
|
||||
Reading package lists... Done
|
||||
Building dependency tree
|
||||
Reading state information... Done
|
||||
The following extra packages will be installed:
|
||||
ca-certificates krb5-locales libasn1-8-heimdal libcurl3 libgssapi-krb5-2
|
||||
libgssapi3-heimdal libhcrypto4-heimdal libheimbase1-heimdal
|
||||
libheimntlm0-heimdal libhx509-5-heimdal libidn11 libk5crypto3 libkeyutils1
|
||||
libkrb5-26-heimdal libkrb5-3 libkrb5support0 libldap-2.4-2
|
||||
libroken18-heimdal librtmp0 libsasl2-2 libsasl2-modules libsasl2-modules-db
|
||||
libwind0-heimdal openssl
|
||||
...
|
||||
root@7d93de07bf76:/# curl
|
||||
curl: try 'curl --help' or 'curl --manual' for more information
|
||||
```
|
||||
|
||||
接下来,再安装 apache 服务。
|
||||
|
||||
```sh
|
||||
root@7d93de07bf76:/# apt-get install -y apache2
|
||||
Reading package lists... Done
|
||||
Building dependency tree
|
||||
Reading state information... Done
|
||||
The following extra packages will be installed:
|
||||
apache2-bin apache2-data libapr1 libaprutil1 libaprutil1-dbd-sqlite3
|
||||
libaprutil1-ldap libxml2 sgml-base ssl-cert xml-core
|
||||
...
|
||||
```
|
||||
|
||||
启动这个 apache 服务,然后使用 curl 来测试本地访问。
|
||||
|
||||
```
|
||||
root@7d93de07bf76:/# service apache2 start
|
||||
* Starting web server apache2 AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
|
||||
*
|
||||
root@7d93de07bf76:/# curl 127.0.0.1
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<!--
|
||||
Modified from the Debian original for Ubuntu
|
||||
Last updated: 2014-03-19
|
||||
See: https://launchpad.net/bugs/1288690
|
||||
-->
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<title>Apache2 Ubuntu Default Page: It works</title>
|
||||
<style type="text/css" media="screen">
|
||||
...
|
||||
```
|
||||
|
||||
配合使用 `-p` 参数对外映射服务端口,可以允许容器外来访问该服务。
|
||||
|
||||
### 相关资源
|
||||
|
||||
* `Debian` 官网:`https://www.debian.org/`
|
||||
* `Neuro Debian` 官网:`http://neuro.debian.net/`
|
||||
* `Debian` 官方仓库:`https://github.com/Debian`
|
||||
* `Debian` 官方镜像:`https://hub.docker.com/_/debian/`
|
||||
* `Debian` 官方镜像仓库:`https://github.com/tianon/docker-brew-debian/`
|
||||
* `Ubuntu` 官网:`http://www.ubuntu.org.cn/global`
|
||||
* `Ubuntu` 官方仓库:`https://github.com/ubuntu`
|
||||
* `Ubuntu` 官方镜像:`https://hub.docker.com/_/ubuntu/`
|
||||
* `Ubuntu` 官方镜像仓库:`https://github.com/tianon/docker-brew-ubuntu-core`
|
||||
3
cases/os/devops_cases.md
Normal file
@@ -0,0 +1,3 @@
|
||||
docker_book
|
||||
===========
|
||||
Internal usage.
|
||||
12
cases/os/summary.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# 本章小结
|
||||
本章讲解了典型操作系统镜像的下载和使用。
|
||||
|
||||
除了官方的镜像外,在 DockerHub 上还有许多第三方组织或个人上传的 Docker 镜像。
|
||||
|
||||
读者可以根据具体情况来选择。一般来说:
|
||||
|
||||
* 官方镜像体积都比较小,只带有一些基本的组件。 精简的系统有利于安全、稳定和高效的运行,也适合进行定制化。
|
||||
* 个别第三方(如 tutum,已被 Docker 收购)镜像质量也非常高。这些镜像通常针对某个具体应用进行配置,比如:包含 LAMP 组件的 Ubuntu 镜像。
|
||||
* 处于安全考虑,几乎所有官方制作的镜像都没有安装 SSH 服务,无法使用用户名和密码直接登录。
|
||||
|
||||
后续章节中,笔者将介绍如何创建一个带 SSH 服务的 Docker 镜像。
|
||||
5
cloud/README.md
Normal file
@@ -0,0 +1,5 @@
|
||||
# 容器与云计算
|
||||
|
||||
Docker 目前已经得到了众多公有云平台的支持,并成为除虚拟机之外的核心云业务。
|
||||
|
||||
除了 AWS、Google、Azure、Docker 官方云服务等,国内的各大公有云厂商,基本上都同时支持了虚拟机服务和容器服务,甚至还专门推出了容器云业务。
|
||||
BIN
cloud/_images/ECS.jpg
Normal file
|
After Width: | Height: | Size: 445 KiB |
BIN
cloud/_images/aliyun-logo.png
Normal file
|
After Width: | Height: | Size: 54 KiB |