Compare commits
388 Commits
Author | SHA1 | Date |
---|---|---|
Baohua Yang | 99433b2e45 | |
RockChinQ | 32c6a91aa9 | |
RockChinQ | bea7b8d3f4 | |
Baohua Yang | 1be1db5a43 | |
CybCom | 7052cea8a3 | |
CybCom | 584087ad46 | |
Baohua Yang | dd6b022429 | |
CybCom | 46020ff786 | |
Baohua Yang | 3ccba8afb4 | |
lxg | f5e6a67664 | |
Baohua Yang | 439264a87f | |
hellozrh | 41558e73b4 | |
Baohua Yang | f34a985a78 | |
hellozrh | bd8387083a | |
hellozrh | 8d129d0ead | |
Baohua Yang | 85c5a280a4 | |
Zhizhen He | 98044d04b2 | |
Kang Huaishuai | 57873b1143 | |
无数 | 6acf209b9a | |
Kang Huaishuai | ed4b3efd3b | |
ReginaldChen | eb327bf908 | |
Baohua Yang | cc683fdb56 | |
Gao Zhenghua | 13b8e12f44 | |
Kang Huaishuai | ce4428adfb | |
Zhizhen He | 6443ddc07c | |
Kang Huaishuai | ce5ae6a360 | |
Kang Huaishuai | 35b264694b | |
Yue JIN | e76b0b66a0 | |
Yue JIN | d80f3430b2 | |
Baohua Yang | d9c5d2fb43 | |
linhuizi | fe7530c3f6 | |
Baohua Yang | 30f00323e0 | |
WitchElaina | 93ea51ff07 | |
Baohua Yang | 85be3008fa | |
Baohua Yang | 88f9183fd5 | |
mrnyg | 1c4a43e34e | |
Baohua Yang | 7014e4d87c | |
Kang Huaishuai | 18028b8eaa | |
Kang Huaishuai | 7c78d1c256 | |
Baohua Yang | d4c6e590c6 | |
NPM Mirror Bot | 1e415ac76c | |
NPM Mirror Bot | 664ac88c85 | |
Kang Huaishuai | 734079661d | |
Xianxiang Li | 1ed8c2c81f | |
Baohua Yang | b9455b2169 | |
Baohua Yang | 10a77adbe6 | |
Dup4 | 31f3540fbc | |
Kang Huaishuai | d5ce7f048b | |
Kang Huaishuai | a613c78c33 | |
Kang Huaishuai | d1d4f0f47d | |
Kang Huaishuai | d4fc0a9da1 | |
Kang Huaishuai | 8dfdbc5b07 | |
Kang Huaishuai | 5caddf4413 | |
Kang Huaishuai | 95aed0099e | |
Kang Huaishuai | 533f30a939 | |
Kang Huaishuai | 1787c392c6 | |
Kang Huaishuai | ca29ab51b1 | |
Kang Huaishuai | 64b75e997f | |
Kang Huaishuai | 31ea892dfc | |
Kang Huaishuai | 985e295d70 | |
Kang Huaishuai | 330beb4fdb | |
Kang Huaishuai | baeb222455 | |
Kang Huaishuai | 8705cede17 | |
Kang Huaishuai | ba36c90b6c | |
Kang Huaishuai | 96fc5acc75 | |
Kang Huaishuai | 6cfc12eece | |
Kang Huaishuai | da614e8441 | |
Kang Huaishuai | 1e577a8c6f | |
Kang Huaishuai | 9fe6c356f0 | |
Kang Huaishuai | aa08e32003 | |
Kang Huaishuai | bc43b30964 | |
Kang Huaishuai | 7afb8991d3 | |
Kang Huaishuai | 6f810c89f3 | |
Kang Huaishuai | 0a87d2a643 | |
Kang Huaishuai | 8dd3141c57 | |
Kang Huaishuai | ce48a157d5 | |
Kang Huaishuai | ea00e0d82a | |
Kang Huaishuai | 5ebd6fb6f8 | |
Kang Huaishuai | 6265d0274b | |
Kang Huaishuai | d1480092bf | |
WC | d414505835 | |
Kang Huaishuai | aa3d56fce9 | |
Kang Huaishuai | 2cd0fac44b | |
Kang Huaishuai | fb162df033 | |
Kang Huaishuai | cc726421c8 | |
Kang Huaishuai | 47e83e7aa3 | |
Kang Huaishuai | da10b3a7a1 | |
Kang Huaishuai | 9d62668fcf | |
Kang Huaishuai | da09321b0e | |
Kang Huaishuai | 2b7f954c65 | |
Kang Huaishuai | 7b5a21bf6d | |
Kang Huaishuai | e8d45d3be9 | |
Kang Huaishuai | 7d51bacb12 | |
Kang Huaishuai | 00274b0615 | |
Kang Huaishuai | 0b1812aac8 | |
Kang Huaishuai | 17ad494537 | |
Kang Huaishuai | 8e8126756a | |
Kang Huaishuai | f9182e5d19 | |
Kang Huaishuai | 0fdc2d64a9 | |
Kang Huaishuai | bcc901ac9f | |
Kang Huaishuai | 47ec0e2ab8 | |
Kang Huaishuai | c572a399f3 | |
Kang Huaishuai | fd85d5a0e5 | |
Kang Huaishuai | 1b2c480a55 | |
Kang Huaishuai | fc8b8867af | |
Kang Huaishuai | ff1f48a793 | |
Kang Huaishuai | 4751e59a6f | |
Kang Huaishuai | f6ec3b23d2 | |
Kang Huaishuai | 1c932ef567 | |
Kang Huaishuai | 68d85ac31e | |
Kang Huaishuai | 83929dd096 | |
Kang Huaishuai | d071ed7b99 | |
Kang Huaishuai | 58c09788f6 | |
Kang Huaishuai | cbaa24c48f | |
Kang Huaishuai | 5d91c5a39f | |
Kang Huaishuai | 48785525e0 | |
Kang Huaishuai | 6fcf302809 | |
Kang Huaishuai | 4f08e73bfe | |
Kang Huaishuai | 4f7b448f0c | |
Kang Huaishuai | c1c7a7981d | |
Kang Huaishuai | cc210f75a7 | |
Kang Huaishuai | b0ccb74dbd | |
Kang Huaishuai | 90a7316322 | |
Kang Huaishuai | 6ceeec7f45 | |
jackeylv | d1e303d139 | |
Kang Huaishuai | 4b70a27151 | |
Kang Huaishuai | e021b27323 | |
Kang Huaishuai | eac2a57633 | |
Kang Huaishuai | c25c7283cf | |
Kang Huaishuai | 4682ba336f | |
Kang Huaishuai | ee26243625 | |
Kang Huaishuai | 5fb17c90e0 | |
mayingchun | 6eb603a33b | |
Kang Huaishuai | 9bc245dfdc | |
Kang Huaishuai | 9a4660492c | |
Kang Huaishuai | edf1a3a07b | |
Kang Huaishuai | acb8662c43 | |
Kang Huaishuai | 85b2325513 | |
Kang Huaishuai | cf7d53dc9c | |
huiyifyj | 83fbb87fd1 | |
Kang Huaishuai | 61bda4b259 | |
Kang Huaishuai | c815720349 | |
Kang Huaishuai | 4aa20ecce3 | |
Kang Huaishuai | 6efe0297fe | |
Kang Huaishuai | 6c668a94df | |
Kang Huaishuai | 911ce1a2e4 | |
Kang Huaishuai | 8b186fb7e7 | |
Kang Huaishuai | 139b0ca65c | |
Kang Huaishuai | 67213bc2f5 | |
Kang Huaishuai | d4d09f5154 | |
Kang Huaishuai | f0568ebffd | |
Kang Huaishuai | ddec6641b9 | |
staticdax | 4d3d2d21fe | |
Kang Huaishuai | f580130be0 | |
Kang Huaishuai | acc5c6e723 | |
Kang Huaishuai | 1316e41222 | |
Kang Huaishuai | 9cfd1fda2b | |
Kang Huaishuai | 683cf95ca7 | |
Kang Huaishuai | 8952dee0a8 | |
Nie Shicong | bdc8bd618c | |
Baohua Yang | 41da49b127 | |
Kang Huaishuai | 18ab3069a3 | |
Kang Huaishuai | 0fd981acc2 | |
Kang Huaishuai | 4561243c23 | |
Kang Huaishuai | ff28d7219d | |
Daiwj | 34b6b617b9 | |
Kang HuaiShuai | e0797515d3 | |
Kang HuaiShuai | a691aa607a | |
Kang Huaishuai | e9dc8dc974 | |
bob.liu | 44fdf58ba5 | |
Kang HuaiShuai | bd74c85bb7 | |
Kang HuaiShuai | e38ea82f37 | |
Kang HuaiShuai | c887661c08 | |
Kang HuaiShuai | fced7854ee | |
Touko | e4a68ea7e4 | |
Kang HuaiShuai | d8e5cfe097 | |
Kang HuaiShuai | 5634eb2fda | |
Kang HuaiShuai | c720d6959e | |
Kang HuaiShuai | 3a24901664 | |
Kang HuaiShuai | ca5502e208 | |
Kang HuaiShuai | d2f5e120ae | |
Kang HuaiShuai | d887c8bda6 | |
Kang HuaiShuai | 1e026fb3a1 | |
Kang HuaiShuai | 33c2b2216d | |
Kang HuaiShuai | 6c0fc9e416 | |
Kang HuaiShuai | a2e8595c42 | |
Kang HuaiShuai | 5577c9caa6 | |
Kang Huaishuai | 2f46c5180c | |
FirejqWei | 9a0a76a5bb | |
Kang HuaiShuai | 9d450ffc26 | |
Kang HuaiShuai | e77c9ecbab | |
Kang HuaiShuai | 386b1e4cf6 | |
Kang HuaiShuai | 9f0b2c725f | |
Kang HuaiShuai | 0dcc67da1c | |
Kang HuaiShuai | bbfe14e0af | |
Kang Huaishuai | 59317624bb | |
Kang HuaiShuai | 2092debcc0 | |
Kang HuaiShuai | 3ba77a7470 | |
Kang HuaiShuai | fbfab11293 | |
Kang HuaiShuai | f940d22950 | |
Kang HuaiShuai | a601a83c0e | |
Kang HuaiShuai | 0ac24829e1 | |
Kang HuaiShuai | a85ae7da1e | |
Kang HuaiShuai | 83619ad6e3 | |
Kang Huaishuai | 8e38beee0e | |
loopever | c574178a02 | |
Kang Huaishuai | e02f015a23 | |
Kang HuaiShuai | fde5496bb8 | |
Kang HuaiShuai | e1961d62eb | |
Kang HuaiShuai | c836c65a78 | |
Kang HuaiShuai | 5cb92f63cf | |
Kang HuaiShuai | 99e470eb2a | |
Kang HuaiShuai | 61492ff11a | |
Kang HuaiShuai | 6f96aaf5a6 | |
Kang HuaiShuai | 709c77adcb | |
Kang HuaiShuai | 3ba7560b4d | |
Kang HuaiShuai | f44a3ee402 | |
Kang HuaiShuai | eb274b16f6 | |
Kang HuaiShuai | fadf84bb69 | |
Kang HuaiShuai | c788212aad | |
Kang Huaishuai | 7690686ddb | |
uscwifi | a3647ec3a3 | |
Kang HuaiShuai | 008f01592b | |
Kang HuaiShuai | 3923858f00 | |
Kang HuaiShuai | b11cac80fb | |
Kang HuaiShuai | 38e810a407 | |
Kang HuaiShuai | 224fbe9fed | |
Kang HuaiShuai | f260e3ba88 | |
Kang HuaiShuai | f17f29bf41 | |
Kang HuaiShuai | 21a811d265 | |
Kang HuaiShuai | 803b93c1fc | |
Kang HuaiShuai | 4873267f31 | |
Kang HuaiShuai | 1aef2b7734 | |
Kang HuaiShuai | 49ef715e99 | |
Kang HuaiShuai | dd060d026a | |
Kang HuaiShuai | 96aa9b99de | |
Kang Huaishuai | 4e84715725 | |
Kang | 48718d6035 | |
khs1994 | 8666d2683f | |
khs1994 | 84c2183cc8 | |
khs1994 | 7ec38273bb | |
khs1994 | 6bca9e8dff | |
khs1994 | 6c6d2ac973 | |
khs1994 | 8747860b95 | |
khs1994 | 5a00a6b32f | |
khs1994 | 8a3be4634e | |
khs1994 | c075122492 | |
Kang Huaishuai | 593a0c39ff | |
baijunyao | 823239010a | |
Kang HuaiShuai | b8dc1a7b16 | |
Kang HuaiShuai | 710c1ec457 | |
Kang HuaiShuai | b9247c16df | |
khs1994 | 59af28af86 | |
khs1994 | 0baf0fec99 | |
yongchengzhao | d14a0e0c4a | |
yongchengzhao | e7c1782c51 | |
yongchengzhao | 7b02f90f09 | |
khs1994 | 4ed6156a03 | |
khs1994 | a0c7670738 | |
khs1994 | 00ec580e74 | |
khs1994 | 3442dab121 | |
khs1994 | 2e747fe2a5 | |
khs1994 | df2537b721 | |
khs1994 | bf04ac99a3 | |
khs1994 | 77c8ae525a | |
Baohua Yang | f7dcffc7be | |
Baohua Yang | a17f3f6b2f | |
khs1994 | 8576e16b61 | |
khs1994 | 4949de94c4 | |
SmallTianTian | 44e504c604 | |
khs1994 | 0370871867 | |
khs1994 | d3c197ddfc | |
khs1994 | 8fc2003414 | |
khs1994 | c446640591 | |
Baohua Yang | 6a97772e79 | |
Xiang Dai | d4bbcc0cfb | |
khs1994 | 994f6ac101 | |
khs1994 | fbf5a286ab | |
khs1994 | 81e68f241c | |
khs1994 | aff886341f | |
khs1994 | 44530ff366 | |
khs1994 | e2baa6401a | |
khs1994 | 560c23797a | |
khs1994 | efee23eca7 | |
khs1994 | 234ac706a3 | |
khs1994 | 11e2bf1701 | |
khs1994 | c8b73b20c6 | |
khs1994 | 2921a406d6 | |
khs1994 | 944cb0dfd1 | |
khs1994 | 2437dd0158 | |
Baohua Yang | a7660df66e | |
Baohua Yang | e2d5a2dff0 | |
khs1994 | 9899c7028e | |
khs1994 | e1552503ac | |
jxlwqq | 35f4ca76b6 | |
khs1994 | e828a4888d | |
khs1994 | af7663bd61 | |
khs1994 | 4d38aaad3b | |
xufanglu | 89f7f3cf98 | |
khs1994 | 7a45ac029e | |
khs1994 | 6d4702484d | |
khs1994 | a50641d973 | |
khs1994 | 3b798d1e64 | |
khs1994 | 553ca77a07 | |
daixiang0 | e3c46e3b09 | |
long | 86657b8742 | |
long | 39b69945cc | |
khs1994 | 15ce0d8e04 | |
khs1994 | 8bd26974b7 | |
Maple Miao | 38097d47eb | |
Devin-Li | cb5813d10a | |
khs1994 | 2cc1207dc3 | |
Baohua Yang | 6f12336f33 | |
khs1994 | 49841871aa | |
khs1994 | 1b306447ef | |
khs1994 | dfa885f4f0 | |
Baohua Yang | 08dc228718 | |
khs1994 | cabdcdb898 | |
Xiangyu Wu | 627b17d2f5 | |
khs1994 | 33bccf2ac4 | |
khs1994 | 9919fd1c43 | |
khs1994 | b955c79fb9 | |
Ma Huihuang | 1fdb8da844 | |
khs1994 | a43bbd4f44 | |
Xiaowei ZHAO | cbe21e28ec | |
khs1994 | aa8adb4a36 | |
LeonGravel | 7005ba3d88 | |
khs1994 | 276199aa37 | |
khs1994 | ee656ff4bb | |
khs1994 | c6ac96b64e | |
khs1994 | 2e70663bf9 | |
康怀帅 | 80cb2445fc | |
康怀帅 | c3c182e674 | |
khs1994 | fb66c7e5ee | |
khs1994 | 8f46e579f4 | |
khs1994 | c6c0a6f1fe | |
khs1994 | 9f08baaa5c | |
康怀帅 | 7bbc556e6e | |
Baohua Yang | c6118d511d | |
Li Zhaogeng | d242aaf10e | |
康怀帅 | 113b5c2d20 | |
康怀帅 | b97e5e2a8b | |
康怀帅 | 54a8025903 | |
Xi ErDe | 02d4c5704c | |
denwork | e0791a61a2 | |
Baohua Yang | 5002488c24 | |
康怀帅 | 20f19cbafd | |
khs1994 | 86d532630f | |
康怀帅 | fcd9f49e24 | |
康怀帅 | 255292cc01 | |
Baohua Yang | 9b9ab2349a | |
Baohua Yang | 122df6f233 | |
Shude Li | 274cb33e89 | |
康怀帅 | ed816ba448 | |
songjiayang | ca01158e1c | |
康怀帅 | 60fb624a40 | |
khs1994 | 58c6540cdf | |
康怀帅 | 79702eb956 | |
khs1994 | fed0d4f65b | |
康怀帅 | 79801a2389 | |
康怀帅 | c753f3b509 | |
Alex-WZ | 9187715bf0 | |
Baohua Yang | 85f22aff35 | |
Yang,Zhou | 4c2acb419b | |
康怀帅 | 5cfe40a504 | |
康怀帅 | 107b14d6bb | |
yl2014 | 717abe60e7 | |
Baohua Yang | 0ccdc3fcfe | |
康怀帅 | 2c9acf141c | |
康怀帅 | 4abfa103b6 | |
khs1994 | 0db00b9669 | |
康怀帅 | 7594e11f23 | |
康怀帅 | d58af9ad64 | |
khs1994 | 3b59591f14 | |
康怀帅 | 53e917bb08 | |
khs1994 | 9deb181814 | |
khs1994 | 37a9ed4b3b | |
康怀帅 | 81ec7190d6 | |
康怀帅 | 4667ffb091 | |
khs1994 | 3face791c6 | |
康怀帅 | 3de028af98 | |
康怀帅 | 24a24306ae | |
康怀帅 | dcb821d56b | |
康怀帅 | 2d4841b764 | |
康怀帅 | d83d89f927 | |
khs1994 | 45e6dadac8 | |
khs1994 | be6840b9c2 | |
康怀帅 | 8a276c8595 |
|
@ -0,0 +1,22 @@
|
|||
// https://code.visualstudio.com/docs/remote/devcontainerjson-reference
|
||||
|
||||
{
|
||||
"image": "yeasy/docker_practice:latest",
|
||||
"mounts": [
|
||||
"source=dp-code-remote-cache,target=/root/.vscode-server,type=volume"
|
||||
],
|
||||
"settings": {
|
||||
"terminal.integrated.shell.linux": "/bin/sh"
|
||||
},
|
||||
"forwardPorts": [
|
||||
4000
|
||||
],
|
||||
"runArgs": [
|
||||
"--cap-add=SYS_ADMIN"
|
||||
],
|
||||
"postStartCommand": [
|
||||
"sh",
|
||||
"-cx",
|
||||
"pwd ; cd /workspaces/docker_practice ; mkdir -p ${PWD}/node_modules; mkdir -p ${PWD}/_book; mount --bind /srv/gitbook/node_modules ${PWD}/node_modules ; mount --bind /mnt ${PWD}/_book"
|
||||
]
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
#!/usr/bin/env sh
|
||||
|
||||
echo
|
||||
echo
|
||||
echo "Please open your browser: 127.0.0.1:4000"
|
||||
echo
|
||||
echo "欢迎加入 QQ 群:【 145983035 】 分享 Docker 资源,交流 Docker 技术"
|
||||
echo
|
||||
echo
|
||||
|
||||
exec nginx -g "daemon off;"
|
32
.drone.yml
32
.drone.yml
|
@ -1,17 +1,15 @@
|
|||
workspace:
|
||||
base: /srv/gitbook-src
|
||||
path: .
|
||||
pipeline:
|
||||
build:
|
||||
image: yeasy/docker_practice:latest
|
||||
# pull: true
|
||||
environment:
|
||||
- TZ=Asia/Shanghai
|
||||
secrets: [key1, key2]
|
||||
commands:
|
||||
# - echo $${key1}
|
||||
# - echo $KEY2
|
||||
- docker-entrypoint.sh build
|
||||
when:
|
||||
event: [push, pull_request, tag, deployment]
|
||||
branch: master
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: build
|
||||
steps:
|
||||
- name: build
|
||||
image: yeasy/docker_practice:latest
|
||||
pull: if-not-exists # always never
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
commands:
|
||||
- docker-entrypoint.sh build
|
||||
|
||||
trigger:
|
||||
branch:
|
||||
- master
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
# EditorConfig is awesome: https://EditorConfig.org
|
||||
|
||||
root = true
|
||||
|
||||
[*]
|
||||
|
||||
indent_style = space
|
||||
|
||||
indent_size = 2
|
||||
|
||||
end_of_line = lf
|
||||
|
||||
charset = utf-8
|
||||
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
insert_final_newline = true
|
||||
|
||||
[*.md]
|
||||
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.py]
|
||||
|
||||
indent_size = 4
|
||||
|
||||
[Makefile]
|
||||
|
||||
indent_style = tab
|
|
@ -0,0 +1,5 @@
|
|||
* text=auto
|
||||
|
||||
*.sh text eol=lf
|
||||
|
||||
* linguist-language=go
|
|
@ -0,0 +1,39 @@
|
|||
* @yeasy @khs1994
|
||||
/.github/* @khs1994
|
||||
/.travis/* @khs1994
|
||||
/.vuepress/* @khs1994
|
||||
/advanced_network/* @yeasy @khs1994
|
||||
/appendix/* @yeasy @khs1994
|
||||
/archive/* @khs1994
|
||||
/basic_concept/* @yeasy @khs1994
|
||||
/buildx/* @khs1994
|
||||
/cases/* @yeasy @khs1994
|
||||
/cloud/* @khs1994
|
||||
/compose/* @yeasy @khs1994
|
||||
/container/* @yeasy @khs1994
|
||||
/coreos/* @khs1994
|
||||
/data_management/* @khs1994
|
||||
/etcd/* @khs1994
|
||||
/IDE/* @khs1994
|
||||
/image/* @yeasy @khs1994
|
||||
/install/* @khs1994
|
||||
/introduction/* @yeasy @khs1994
|
||||
/kubernetes/* @yeasy @khs1994
|
||||
/network/* @yeasy @khs1994
|
||||
/opensource/* @khs1994
|
||||
/repository/* @khs1994
|
||||
/security/* @yeasy @khs1994
|
||||
/underly/* @yeasy @khs1994
|
||||
/.drone.yml @khs1994
|
||||
/.editorconfig/ @khs1994
|
||||
/.gitattributes @khs1994
|
||||
/.gitignore @khs1994
|
||||
/_config.yml @yeasy @khs1994
|
||||
/book.json @yeasy @khs1994
|
||||
/CHANGELOG.md @yeasy @khs1994
|
||||
/CONTRIBUTING.md @yeasy @khs1994
|
||||
/docker-compose.yml @khs1994
|
||||
/manifest @khs1994
|
||||
/package.json @khs1994
|
||||
/README.md @yeasy @khs1994
|
||||
/SUMMARY.md @yeasy @khs1994
|
|
@ -0,0 +1,13 @@
|
|||
# These are supported funding model platforms
|
||||
|
||||
github: yeasy
|
||||
patreon: # Replace with a single Patreon username
|
||||
open_collective: # Replace with a single Open Collective username
|
||||
ko_fi: # Replace with a single Ko-fi username
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
liberapay: # Replace with a single Liberapay username
|
||||
issuehunt: # Replace with a single IssueHunt username
|
||||
otechie: # Replace with a single Otechie username
|
||||
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
|
||||
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
|
@ -1,29 +0,0 @@
|
|||
* [ ] Have u googled the problem? If no, pls do that first!
|
||||
|
||||
### Environment
|
||||
<!--请提供环境信息,包括操作系统版本等-->
|
||||
<!--Provides env info like OS version-->
|
||||
|
||||
* [x] Linux
|
||||
* [x] CentOS 7
|
||||
* [ ] Ubuntu 16.04
|
||||
* [ ] Ubuntu 17.10
|
||||
* [ ] Debian 9
|
||||
* [ ] Debian 8
|
||||
* [ ] CoreOS
|
||||
* [ ] macOS
|
||||
* [ ] Windows 10
|
||||
* [ ] Raspberry Pi (ARM)
|
||||
* [ ] Others (Pls describe below)
|
||||
|
||||
### Docker Version
|
||||
<!--如果你的 Docker 版本低于 17.09 请尽可能升级到该版本-->
|
||||
<!--if Docker version under 17.09, please upgrade Docker to 17.09-->
|
||||
|
||||
* [x] 17.11 Edge
|
||||
* [ ] 17.09 Stable
|
||||
* [ ] 1.13.0 or Before
|
||||
|
||||
### Problem Description
|
||||
<!--描述你的问题,请贴出操作步骤,终端报错日志-->
|
||||
<!--describe problem with detailed steps and logs-->
|
|
@ -0,0 +1,41 @@
|
|||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
|
||||
---
|
||||
|
||||
* [ ] Have u googled the problem? If no, pls do that first!
|
||||
|
||||
### Environment
|
||||
<!--请提供环境信息,包括操作系统版本等,保留你的操作系统,其他选项删除-->
|
||||
<!--Provides env info like OS version-->
|
||||
|
||||
* [x] Linux
|
||||
* [x] CentOS 7
|
||||
* [x] Fedora
|
||||
* [x] Ubuntu 16.04 +
|
||||
* [x] Debian 9 +
|
||||
* [x] macOS
|
||||
* [x] Windows 10
|
||||
* [x] Raspberry Pi (ARM)
|
||||
* [x] Others (Pls describe below)
|
||||
|
||||
### Docker Version
|
||||
<!--如果你的 Docker 版本低于 20.10 请尽可能升级到该版本,保留你的 Docker 版本,其他选项删除-->
|
||||
<!--if Docker version under 20.10, please upgrade Docker to 20.10-->
|
||||
|
||||
* [x] Test (v20.10)
|
||||
* [x] Stable (v20.10)
|
||||
* [x] 1.13.0 or Before
|
||||
|
||||
### Problem Description
|
||||
<!--描述你的问题,请贴出操作步骤,终端报错截图或文字信息-->
|
||||
<!--describe problem with detailed steps and logs-->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!--提交问题之前请点击预览标签,符合要求之后再提交问题-->
|
|
@ -0,0 +1,41 @@
|
|||
---
|
||||
name: Custom issue template
|
||||
about: Create a issue about Docker
|
||||
|
||||
---
|
||||
|
||||
* [ ] Have u googled the problem? If no, pls do that first!
|
||||
|
||||
### Environment
|
||||
<!--请提供环境信息,包括操作系统版本等,保留你的操作系统,其他选项删除-->
|
||||
<!--Provides env info like OS version-->
|
||||
|
||||
* [x] Linux
|
||||
* [x] CentOS 7
|
||||
* [x] Fedora
|
||||
* [x] Ubuntu 16.04 +
|
||||
* [x] Debian 9 +
|
||||
* [x] macOS
|
||||
* [x] Windows 10
|
||||
* [x] Raspberry Pi (ARM)
|
||||
* [x] Others (Pls describe below)
|
||||
|
||||
### Docker Version
|
||||
<!--如果你的 Docker 版本低于 20.10 请尽可能升级到该版本,保留你的 Docker 版本,其他选项删除-->
|
||||
<!--if Docker version under 20.10, please upgrade Docker to 20.10-->
|
||||
|
||||
* [x] Test (v20.10)
|
||||
* [x] Stable (v20.10)
|
||||
* [x] 1.13.0 or Before
|
||||
|
||||
### Problem Description
|
||||
<!--描述你的问题,请贴出操作步骤,终端报错截图或文字信息-->
|
||||
<!--describe problem with detailed steps and logs-->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!--提交问题之前请点击预览标签,符合要求之后再提交问题-->
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for docker_practice
|
||||
|
||||
---
|
|
@ -1,20 +1,20 @@
|
|||
<!--
|
||||
Thanks for your contribution.
|
||||
Thanks for your contribution.
|
||||
See [CONTRIBUTING](CONTRIBUTING.md) for contribution guidelines.
|
||||
-->
|
||||
|
||||
### Proposed changes (Mandatory)
|
||||
**Proposed changes (Mandatory)**
|
||||
|
||||
<!--
|
||||
Tell us what you did and why:
|
||||
Tell us what you did and why:
|
||||
|
||||
One line short description
|
||||
|
||||
|
||||
And details in other paragraphs.
|
||||
-->
|
||||
|
||||
### Fix issues (Optional)
|
||||
**Fix issues (Optional)**
|
||||
|
||||
<!--
|
||||
Tell us what issues you fixed, e.g., fix #123
|
||||
Tell us what issues you fixed, e.g., fix #123
|
||||
-->
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
name: Check link
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
check-link:
|
||||
name: check-link
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
# search Issues :-(
|
||||
- run: |
|
||||
docker run -i --rm \
|
||||
-v $PWD:/mnt:ro \
|
||||
dkhamsing/awesome_bot \
|
||||
--white-list "localhost","0.0.0.0",\
|
||||
"server","example.com","docker",\
|
||||
"docker.domain.com","YourIP","register",\
|
||||
"172.16.238.100","172.16.238.101","172.16.238.102",\
|
||||
"192.168.199.100",\
|
||||
"github.com/settings",\
|
||||
"github.com/docker/compose/releases/download",\
|
||||
"github.com/etcd-io/etcd/releases/download",\
|
||||
"github.com/tianon/gosu/releases/download",\
|
||||
"github.com/yeasy/docker_practice",\
|
||||
"github.com/AliyunContainerService/k8s-for-docker-desktop/raw",\
|
||||
"dl-cdn.alpinelinux.org/alpine/edge/testing",\
|
||||
"www.w3.org/1999/xhtml",\
|
||||
"cr.console.aliyun.com",\
|
||||
"cloud.tencent.com",\
|
||||
"nodejs.org/dist/",\
|
||||
"c.163.com/hub",\
|
||||
"drone.yeasy.com",\
|
||||
"docs.docker.com",\
|
||||
"dockerhub.azk8s.cn",\
|
||||
"reg-mirror.qiniu.com",\
|
||||
"registry.docker-cn.com",\
|
||||
"mirror.ccs.tencentyun.com",\
|
||||
"vuepress.mirror.docker-practice.com",\
|
||||
"mc.qcloudimg.com/static/img",\
|
||||
"www.daocloud.io/mirror",\
|
||||
"download.docker.com",\
|
||||
"www.ubuntu.com",\
|
||||
"archive.ubuntu.com",\
|
||||
"security.ubuntu.com/ubuntu",\
|
||||
"nginx.com",\
|
||||
"img.shields.io/github/release/yeasy/docker_practice",\
|
||||
"launchpad.net",\
|
||||
"www.w3.org/1999",\
|
||||
"chat.freenode.net",\
|
||||
"en.wikipedia.org/wiki/UnionFS",\
|
||||
"product.china-pub.com",\
|
||||
"union-click.jd.com",\
|
||||
"x.x.x.x/base",\
|
||||
"x.x.x.x:9090",\
|
||||
"yeasy.gitbooks.io",\
|
||||
"download.fastgit.org",\
|
||||
"www.aliyun.com" \
|
||||
--allow-dupe \
|
||||
--skip-save-results \
|
||||
-t 10 \
|
||||
`find . \( -path "./mesos" -o -path "./swarm_mode" \) -prune -o -name "*.md" -exec ls {} \;`
|
||||
name: check-link
|
||||
timeout-minutes: 25
|
|
@ -0,0 +1,156 @@
|
|||
name: CI
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash --noprofile --norc -exo pipefail {0}
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
- name: Build Gitbook
|
||||
uses: docker://yeasy/docker_practice
|
||||
with:
|
||||
args: build
|
||||
- name: Build Gitbook Docker Image
|
||||
if: github.repository == 'docker-practice/docker_practice'
|
||||
run: |
|
||||
sudo chmod -R 777 _book
|
||||
echo "FROM nginx:alpine" >> Dockerfile
|
||||
echo "COPY _book /usr/share/nginx/html" >> Dockerfile
|
||||
echo "COPY .docker/docker-entrypoint.sh /" >> Dockerfile
|
||||
echo "ENTRYPOINT [\"/docker-entrypoint.sh\"]" >> Dockerfile
|
||||
|
||||
export VCS_REF=`git rev-parse --short HEAD`
|
||||
|
||||
docker build \
|
||||
-t dockerpracticesig/docker_practice \
|
||||
-t dockerpracticesig/docker_practice:gitbook \
|
||||
--label org.opencontainers.image.revision=$VCS_REF \
|
||||
--label org.opencontainers.image.source="https://github.com/yeasy/docker_practice" \
|
||||
--label maintainer="https://github.com/docker-practice" \
|
||||
.
|
||||
|
||||
docker run -d --rm -p 4000:80 dockerpracticesig/docker_practice
|
||||
|
||||
sleep 5
|
||||
|
||||
echo "::group::Test"
|
||||
curl 127.0.0.1:4000
|
||||
echo "::endgroup::"
|
||||
|
||||
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
|
||||
docker push dockerpracticesig/docker_practice
|
||||
docker push dockerpracticesig/docker_practice:gitbook
|
||||
env:
|
||||
DOCKER_PASSWORD: ${{secrets.DOCKER_PASSWORD}}
|
||||
DOCKER_USERNAME: ${{secrets.DOCKER_USERNAME}}
|
||||
- name: Upload Gitbook dist
|
||||
uses: docker://pcit/pages
|
||||
if: github.repository == 'docker-practice/docker_practice'
|
||||
env:
|
||||
PCIT_EMAIL: khs1994@khs1994.com
|
||||
PCIT_GIT_TOKEN: ${{ secrets.PCIT_GIT_TOKEN }}
|
||||
PCIT_GIT_URL: github.com/docker-practice/zh-cn
|
||||
PCIT_KEEP_HISTORY: "true"
|
||||
PCIT_LOCAL_DIR: _book
|
||||
PCIT_MESSAGE: Build from yeasy/docker_practice@${{github.sha}}
|
||||
PCIT_TARGET_BRANCH: master
|
||||
PCIT_USERNAME: khs1994
|
||||
- name: vuepress
|
||||
run: |
|
||||
export NODE_OPTIONS=--openssl-legacy-provider
|
||||
sudo rm -rf _book
|
||||
npm i
|
||||
|
||||
git clone https://github.com/docker-practice/.vuepress .vuepress2
|
||||
cp -r .vuepress2/. .vuepress/
|
||||
rm -rf .vuepress2
|
||||
find . \( -path "./mesos" -o -path "./swarm_mode" -o -path "./node_modules" -o -path "./.vuepress" -o -path "./_book" -o -path "./CHANGELOG.md" -o -path "./CONTRIBUTING.md" \) -prune -o -name "*.md" -exec sed -i 'N;2a\<AdSenseTitle/>\n' {} \;
|
||||
|
||||
npx vuepress --version
|
||||
|
||||
npm run vuepress:build
|
||||
echo "vuepress.mirror.docker-practice.com" > .vuepress/dist/CNAME
|
||||
|
||||
cp -r _images .vuepress/dist
|
||||
cp -r advanced_network/_images .vuepress/dist/advanced_network
|
||||
cp -r appendix/_images .vuepress/dist/appendix
|
||||
cp -r cases/ci/drone/_images .vuepress/dist/cases/ci/drone
|
||||
cp -r cases/os/_images .vuepress/dist/cases/os
|
||||
cp -r cloud/_images .vuepress/dist/cloud
|
||||
cp -r data_management/_images .vuepress/dist/data_management
|
||||
cp -r etcd/_images .vuepress/dist/etcd
|
||||
cp -r image/_images .vuepress/dist/image
|
||||
cp -r install/_images .vuepress/dist/install
|
||||
cp -r introduction/_images .vuepress/dist/introduction
|
||||
cp -r kubernetes/_images .vuepress/dist/kubernetes
|
||||
cp -r underly/_images .vuepress/dist/underly
|
||||
|
||||
echo "include: [_images]" > .vuepress/dist/_config.yml
|
||||
- name: Upload Vuepress dist
|
||||
uses: docker://pcit/pages
|
||||
if: github.repository == 'docker-practice/docker_practice'
|
||||
env:
|
||||
PCIT_EMAIL: khs1994@khs1994.com
|
||||
PCIT_GIT_TOKEN: ${{ secrets.PCIT_GIT_TOKEN }}
|
||||
PCIT_GIT_URL: github.com/docker-practice/vuepress
|
||||
PCIT_KEEP_HISTORY: "true"
|
||||
PCIT_LOCAL_DIR: .vuepress/dist
|
||||
PCIT_MESSAGE: Build from yeasy/docker_practice@${{github.sha}}
|
||||
PCIT_TARGET_BRANCH: master
|
||||
PCIT_USERNAME: khs1994
|
||||
# - name: Set coding.net CNAME
|
||||
# run: |
|
||||
# echo "vuepress.mirror.docker-practice.com" > .vuepress/dist/CNAME
|
||||
# - name: Upload Vuepress dist to coding.net
|
||||
# uses: docker://pcit/pages
|
||||
# if: github.repository == 'docker-practice/docker_practice'
|
||||
# env:
|
||||
# PCIT_EMAIL: khs1994@khs1994.com
|
||||
# PCIT_GIT_TOKEN: ${{ secrets.CODING_GIT_TOKEN }}
|
||||
# PCIT_GIT_URL: e.coding.net/dpsigs/docker_practice
|
||||
# PCIT_KEEP_HISTORY: "true"
|
||||
# PCIT_LOCAL_DIR: .vuepress/dist
|
||||
# PCIT_MESSAGE: Build from yeasy/docker_practice@${{github.sha}}
|
||||
# PCIT_TARGET_BRANCH: master
|
||||
# PCIT_USERNAME: ptt0xjqzbke3
|
||||
- name: Build vuepress docker image
|
||||
if: github.repository == 'docker-practice/docker_practice'
|
||||
run: |
|
||||
sudo rm -rf .vuepress/dist/.git
|
||||
|
||||
echo "FROM nginx:alpine" > Dockerfile
|
||||
echo "COPY .vuepress/dist /usr/share/nginx/html" >> Dockerfile
|
||||
echo "COPY .docker/docker-entrypoint.sh /" >> Dockerfile
|
||||
echo "ENTRYPOINT [\"/docker-entrypoint.sh\"]" >> Dockerfile
|
||||
|
||||
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
|
||||
|
||||
VCS_REF=`git rev-parse --short HEAD`
|
||||
|
||||
docker build -t dockerpracticesig/docker_practice:vuepress \
|
||||
--label org.opencontainers.image.revision=$VCS_REF \
|
||||
--label org.opencontainers.image.source="https://github.com/yeasy/docker_practice" \
|
||||
--label maintainer="https://github.com/docker-practice" \
|
||||
.
|
||||
|
||||
docker push dockerpracticesig/docker_practice:vuepress
|
||||
|
||||
docker run -it --rm -d -p 4001:80 dockerpracticesig/docker_practice:vuepress
|
||||
|
||||
sleep 5
|
||||
|
||||
echo "::group::Test"
|
||||
curl 127.0.0.1:4001
|
||||
echo "::endgroup::"
|
||||
env:
|
||||
DOCKER_PASSWORD: ${{secrets.DOCKER_PASSWORD}}
|
||||
DOCKER_USERNAME: ${{secrets.DOCKER_USERNAME}}
|
|
@ -6,4 +6,8 @@ _book/
|
|||
*.swp
|
||||
*.edx
|
||||
.DS_Store
|
||||
|
||||
node_modules/
|
||||
package-lock.json
|
||||
|
||||
docker-compose.override.yml
|
||||
|
|
36
.travis.yml
36
.travis.yml
|
@ -1,36 +0,0 @@
|
|||
language: bash
|
||||
sudo: required
|
||||
services:
|
||||
- docker
|
||||
before_install:
|
||||
- openssl aes-256-cbc -K $encrypted_6cc8cff04075_key -iv $encrypted_6cc8cff04075_iv
|
||||
-in .travis/id_rsa.enc -out ~/.ssh/id_rsa -d
|
||||
- chmod 600 ~/.ssh/id_rsa
|
||||
- export TZ='Asia/Shanghai'
|
||||
- date
|
||||
- git config --global user.name "khs1994"
|
||||
- git config --global user.email "khs1994@khs1994.com"
|
||||
script:
|
||||
- docker run -it --rm -v $PWD:/srv/gitbook-src yeasy/docker_practice build
|
||||
after_success:
|
||||
- sudo chmod -R 777 _book
|
||||
- cd _book
|
||||
- git init
|
||||
- git remote add origin "$REPO"
|
||||
- git add .
|
||||
- COMMIT=`date "+%F %T"`
|
||||
- git commit -m "Travis CI Site updated $COMMIT"
|
||||
- git push -f origin master:"$DEPLOY_BRANCH"
|
||||
env:
|
||||
global:
|
||||
- DEPLOY_BRANCH: pages
|
||||
# - DEPLOY_BRANCH: legacy-pages
|
||||
- REPO: git@github.com:yeasy/docker_practice.git
|
||||
addons:
|
||||
ssh_known_hosts:
|
||||
- github.com
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- dev
|
||||
# - docker-legacy
|
|
@ -1,4 +1,4 @@
|
|||
FROM node:9-alpine
|
||||
FROM node:14.4.0-alpine
|
||||
|
||||
ENV TZ=Asia/Shanghai
|
||||
|
||||
|
@ -8,8 +8,8 @@ COPY book.json book.json
|
|||
|
||||
COPY docker-entrypoint.sh /usr/local/bin/
|
||||
|
||||
RUN apk add --no-cache \
|
||||
tzdata \
|
||||
RUN set -x && apk add --no-cache \
|
||||
tzdata bash \
|
||||
&& npm install -g gitbook-cli \
|
||||
&& gitbook install \
|
||||
&& ln -s /usr/local/bin/docker-entrypoint.sh / \
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
"-livereload",
|
||||
"image-captions",
|
||||
"github",
|
||||
"page-treeview",
|
||||
"page-treeview@2.9.8",
|
||||
"editlink"
|
||||
],
|
||||
"pluginsConfig": {
|
||||
|
|
|
@ -6,14 +6,18 @@ if [ $1 = "sh" ];then sh ; exit 0; fi
|
|||
|
||||
rm -rf node_modules _book
|
||||
|
||||
cp -a . ../gitbook
|
||||
srcDir=$PWD
|
||||
|
||||
cd ../gitbook
|
||||
cp -a . /srv/gitbook
|
||||
|
||||
cd /srv/gitbook
|
||||
|
||||
main(){
|
||||
if [ "$1" = build ];then gitbook build; cp -a _book ../gitbook-src; echo $START; date "+%F %T"; exit 0; fi
|
||||
exec gitbook serve
|
||||
exit 0
|
||||
if [ "$1" = build ];then
|
||||
gitbook build && cp -a _book $srcDir && echo $START && date "+%F %T" && exit 0
|
||||
else
|
||||
exec gitbook serve
|
||||
fi
|
||||
}
|
||||
|
||||
main $1 $2 $3
|
||||
|
|
Binary file not shown.
|
@ -0,0 +1,3 @@
|
|||
/*
|
||||
!.gitignore
|
||||
!config.js
|
|
@ -0,0 +1,462 @@
|
|||
const { config } = require('vuepress-theme-hope')
|
||||
|
||||
module.exports = config({
|
||||
title: 'Docker 从入门到实践',
|
||||
base: '/',
|
||||
head: [['script', {}, `
|
||||
var _hmt = _hmt || [];
|
||||
(function() {
|
||||
var hm = document.createElement("script");
|
||||
hm.src = "//hm.baidu.com/hm.js?81a3490c9cd141dbcf6d00bc18b6edae";
|
||||
var s = document.getElementsByTagName("script")[0];
|
||||
s.parentNode.insertBefore(hm, s);
|
||||
})();
|
||||
`],
|
||||
[
|
||||
'script', {}, `
|
||||
(function(){
|
||||
var bp = document.createElement('script');
|
||||
var curProtocol = window.location.protocol.split(':')[0];
|
||||
if (curProtocol === 'https') {
|
||||
bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
|
||||
}
|
||||
else {
|
||||
bp.src = 'http://push.zhanzhang.baidu.com/push.js';
|
||||
}
|
||||
var s = document.getElementsByTagName("script")[0];
|
||||
s.parentNode.insertBefore(bp, s);
|
||||
})();
|
||||
`
|
||||
]
|
||||
],
|
||||
plugins: {
|
||||
// sitemap: {
|
||||
// hostname: 'https://vuepress.mirror.docker-practice.com'
|
||||
// },
|
||||
// 'git-log': {
|
||||
// additionalArgs: '--no-merge',
|
||||
// onlyFirstAndLastCommit: true,
|
||||
// },
|
||||
},
|
||||
locales: {
|
||||
"/": {
|
||||
lang: "zh-CN"
|
||||
}
|
||||
},
|
||||
themeConfig: {
|
||||
blog: false,
|
||||
// comment: false,
|
||||
comment: {
|
||||
type: "disable", // 使用 Valine
|
||||
appId: "...", // your appId
|
||||
appKey: "...", // your appKey
|
||||
},
|
||||
pageInfo: [
|
||||
// 'author',
|
||||
'reading-time',
|
||||
'word',
|
||||
],
|
||||
footer: {
|
||||
content: "Made with <a target='_blank' href='https://github.com/vuepress-theme-hope/vuepress-theme-hope'>vuepress-theme-hope</a>",
|
||||
display: true,
|
||||
copyright: false,
|
||||
},
|
||||
searchPlaceholder: 'Search',
|
||||
repo: 'yeasy/docker_practice',
|
||||
repoLabel: 'GitHub',
|
||||
repoDisplay: true,
|
||||
hostname: 'https://vuepress.mirror.docker-practice.com',
|
||||
// author: 'yeasy',
|
||||
mdEnhance: {
|
||||
lineNumbers: true,
|
||||
},
|
||||
git: {
|
||||
contributor: false,
|
||||
},
|
||||
themeColor: {
|
||||
blue: '#2196f3',
|
||||
// red: '#f26d6d',
|
||||
// green: '#3eaf7c',
|
||||
// orange: '#fb9b5f'
|
||||
},
|
||||
locales: {
|
||||
"/": {
|
||||
lang: "zh-CN"
|
||||
}
|
||||
},
|
||||
|
||||
darkmode: 'auto-switch',
|
||||
|
||||
//
|
||||
|
||||
showAds: true,
|
||||
|
||||
docsRepo: 'yeasy/docker_practice',
|
||||
docsDir: '/',
|
||||
docsBranch: 'master',
|
||||
editLinks: true,
|
||||
nav: [
|
||||
{
|
||||
text: '微信交流群',
|
||||
link: 'https://docker_practice.gitee.io/pic/dpsig-wechat.jpg',
|
||||
},
|
||||
{
|
||||
text: '小程序',
|
||||
link: 'https://docker_practice.gitee.io/pic/dp-wechat-miniprogram.jpg',
|
||||
},
|
||||
{
|
||||
text: '安装 Docker',
|
||||
link: '/install/',
|
||||
},
|
||||
{
|
||||
text: 'Docker 入门',
|
||||
link: '/'
|
||||
},
|
||||
{
|
||||
text: 'Docker 实战',
|
||||
link: '/cases/os/'
|
||||
},
|
||||
{
|
||||
text: 'CI/CD',
|
||||
link: '/cases/ci/'
|
||||
},
|
||||
{
|
||||
text: 'Compose',
|
||||
link: '/compose/',
|
||||
},
|
||||
{
|
||||
text: 'Kubernetes',
|
||||
link: '/kubernetes/',
|
||||
},
|
||||
{
|
||||
text: "云计算",
|
||||
link: "/cloud/",
|
||||
},
|
||||
// {
|
||||
// text: 'GitHub',
|
||||
// link: 'https://github.com/yeasy/docker_practice'
|
||||
// },
|
||||
// {
|
||||
// text: '捐赠',
|
||||
// link: ''
|
||||
// },
|
||||
{
|
||||
text: '云服务器99/元首年特惠',
|
||||
link: 'https://cloud.tencent.com/act/cps/redirect?redirect=1062&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console'
|
||||
},
|
||||
// {
|
||||
// text: '语言',
|
||||
// items: [{
|
||||
// text: 'English',
|
||||
// link: ''
|
||||
// }]
|
||||
// }
|
||||
],
|
||||
sidebar: {
|
||||
'/cloud/': [
|
||||
'intro',
|
||||
'tencentCloud',
|
||||
'alicloud',
|
||||
'aws',
|
||||
'summary',
|
||||
],
|
||||
'/kubernetes/': [
|
||||
'intro',
|
||||
'concepts',
|
||||
'design',
|
||||
{
|
||||
title: "部署 Kubernetes",
|
||||
collapsable: true,
|
||||
children: [
|
||||
"setup/",
|
||||
"setup/kubeadm",
|
||||
"setup/docker-desktop",
|
||||
"setup/systemd",
|
||||
"setup/dashboard",
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Kubernetes 命令行 kubectl",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'kubectl/'
|
||||
]
|
||||
}
|
||||
],
|
||||
'/compose/': [
|
||||
'introduction',
|
||||
'v2',
|
||||
'install',
|
||||
'usage',
|
||||
'commands',
|
||||
'compose_file',
|
||||
'django',
|
||||
'rails',
|
||||
'wordpress',
|
||||
'lnmp',
|
||||
],
|
||||
'/install/': [
|
||||
'ubuntu',
|
||||
'debian',
|
||||
'fedora',
|
||||
'centos',
|
||||
'raspberry-pi',
|
||||
// 'offline',
|
||||
'mac',
|
||||
'windows',
|
||||
'mirror',
|
||||
'experimental',
|
||||
],
|
||||
'/cases/os/': [
|
||||
{
|
||||
title: "操作系统",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'busybox',
|
||||
'alpine',
|
||||
'debian',
|
||||
'centos',
|
||||
'summary',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "在 IDE 中使用 Docker",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'/ide/',
|
||||
'/ide/vsCode',
|
||||
],
|
||||
},
|
||||
],
|
||||
'/cases/ci/': [
|
||||
'actions/',
|
||||
{
|
||||
title: "Drone",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'drone/',
|
||||
'drone/install'
|
||||
]
|
||||
},
|
||||
],
|
||||
'/': [
|
||||
'/',
|
||||
'/CHANGELOG',
|
||||
'/CONTRIBUTING',
|
||||
{
|
||||
title: "Docker 简介",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'introduction/',
|
||||
'introduction/what',
|
||||
'introduction/why',
|
||||
]
|
||||
}, {
|
||||
title: "基本概念",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'basic_concept/',
|
||||
'basic_concept/image',
|
||||
'basic_concept/container',
|
||||
'basic_concept/repository'
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "使用镜像",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'image/',
|
||||
'image/pull',
|
||||
'image/list',
|
||||
'image/rm',
|
||||
'image/commit',
|
||||
'image/build',
|
||||
'image/other.md',
|
||||
'image/internal.md',
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'Dockerfile',
|
||||
collapsable: true,
|
||||
children: [
|
||||
"image/dockerfile/",
|
||||
'image/dockerfile/copy',
|
||||
'image/dockerfile/add',
|
||||
'image/dockerfile/cmd',
|
||||
'image/dockerfile/entrypoint',
|
||||
'image/dockerfile/env',
|
||||
'image/dockerfile/arg',
|
||||
'image/dockerfile/volume',
|
||||
'image/dockerfile/expose',
|
||||
'image/dockerfile/workdir',
|
||||
'image/dockerfile/user',
|
||||
'image/dockerfile/healthcheck',
|
||||
'image/dockerfile/label',
|
||||
'image/dockerfile/shell',
|
||||
'image/dockerfile/onbuild',
|
||||
'image/dockerfile/references',
|
||||
'image/multistage-builds/',
|
||||
'image/multistage-builds/laravel',
|
||||
'image/manifest',
|
||||
]
|
||||
}, {
|
||||
title: "操作容器",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'container/',
|
||||
'container/run',
|
||||
'container/daemon',
|
||||
'container/stop',
|
||||
'container/attach_exec',
|
||||
'container/import_export',
|
||||
'container/rm',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Docker 仓库",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'repository/',
|
||||
'repository/dockerhub',
|
||||
'repository/registry',
|
||||
'repository/registry_auth',
|
||||
'repository/nexus3_registry',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "数据管理",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'data_management/',
|
||||
'data_management/volume',
|
||||
'data_management/bind-mounts',
|
||||
],
|
||||
}, {
|
||||
title: "使用网络",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'network/',
|
||||
'network/port_mapping',
|
||||
'network/linking',
|
||||
'network/dns',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "高级网络配置",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'advanced_network/',
|
||||
'advanced_network/quick_guide',
|
||||
'advanced_network/access_control',
|
||||
'advanced_network/port_mapping',
|
||||
'advanced_network/bridge',
|
||||
'advanced_network/example',
|
||||
'advanced_network/config_file',
|
||||
'advanced_network/ptp',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Swarm mode",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'swarm_mode/',
|
||||
'swarm_mode/overview',
|
||||
'swarm_mode/create',
|
||||
'swarm_mode/deploy',
|
||||
'swarm_mode/stack',
|
||||
'swarm_mode/secret',
|
||||
'swarm_mode/config',
|
||||
'swarm_mode/rolling_update',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "安全",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'security/',
|
||||
'security/kernel_ns',
|
||||
'security/control_group',
|
||||
'security/daemon_sec',
|
||||
'security/kernel_capability',
|
||||
'security/other_feature',
|
||||
'security/summary',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "底层实现",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'underly/',
|
||||
'underly/arch',
|
||||
'underly/namespace',
|
||||
'underly/cgroups',
|
||||
'underly/ufs',
|
||||
'underly/container_format',
|
||||
'underly/network',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Docker Buildx",
|
||||
collapsable: false,
|
||||
children: [
|
||||
"buildx/",
|
||||
"buildx/buildkit",
|
||||
"buildx/buildx",
|
||||
"buildx/multi-arch-images",
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Etcd",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'etcd/',
|
||||
'etcd/intro',
|
||||
'etcd/install',
|
||||
'etcd/cluster',
|
||||
'etcd/etcdctl',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Fedora CoreOS",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'coreos/',
|
||||
'coreos/intro',
|
||||
'coreos/install',
|
||||
],
|
||||
},
|
||||
'podman/',
|
||||
'appendix/faq/',
|
||||
{
|
||||
title: "热门镜像介绍",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'appendix/repo/',
|
||||
'appendix/repo/ubuntu',
|
||||
'appendix/repo/centos',
|
||||
'appendix/repo/nginx',
|
||||
'appendix/repo/php',
|
||||
'appendix/repo/nodejs',
|
||||
'appendix/repo/mysql',
|
||||
'appendix/repo/wordpress',
|
||||
'appendix/repo/mongodb',
|
||||
'appendix/repo/redis',
|
||||
'appendix/repo/minio',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Docker 命令",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'appendix/command/',
|
||||
'appendix/command/docker',
|
||||
'appendix/command/dockerd',
|
||||
]
|
||||
},
|
||||
'appendix/best_practices',
|
||||
'appendix/debug',
|
||||
'appendix/resources',
|
||||
],
|
||||
},
|
||||
}
|
||||
});
|
23
CHANGELOG.md
23
CHANGELOG.md
|
@ -1,6 +1,27 @@
|
|||
## 主要修订记录
|
||||
# 修订记录
|
||||
|
||||
* 1.3.0 2021-YY-DD
|
||||
* 全面支持 Docker v20.10 新版本
|
||||
* 新增 Docker Compose v2
|
||||
* Docker Hub 自动构建转为付费功能
|
||||
|
||||
* 1.2.0 2020-12-20
|
||||
* 错误修复
|
||||
|
||||
* 1.1.0 2019-12-31
|
||||
* 全面支持 Docker v19.03 新版本
|
||||
* 增加 `BuildKit`
|
||||
* 增加 `docker buildx` 命令使用说明
|
||||
* 增加 `docker manifest` 命令使用说明
|
||||
* 移除 `Ubuntu 14.04` `Debian 8` `Debian 7`
|
||||
|
||||
* 1.0.0: 2018-12-31
|
||||
* 全面支持 Docker v18.x 新版本
|
||||
* 添加如何调试 Docker
|
||||
* 错误修正
|
||||
|
||||
* 0.9.0: 2017-12-31
|
||||
* 对 v1.13.x 旧版本的最后支持
|
||||
|
||||
* 0.9.0-rc2: 2017-12-10
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
## 如何贡献项目
|
||||
# 如何贡献
|
||||
|
||||
领取或创建新的 [Issue](https://github.com/yeasy/docker_practice/issues),如 [issue 235](https://github.com/yeasy/docker_practice/issues/235),添加自己为 `Assignee`。
|
||||
|
||||
|
|
55
README.md
55
README.md
|
@ -1,27 +1,43 @@
|
|||
# Docker — 从入门到实践
|
||||
|
||||
[![](https://img.shields.io/github/stars/yeasy/docker_practice.svg?style=social&label=Stars)](https://github.com/yeasy/docker_practice) [![](https://img.shields.io/docker/pulls/yeasy/docker_practice.svg)](https://store.docker.com/community/images/yeasy/docker_practice) [![](https://travis-ci.org/yeasy/docker_practice.svg?branch=master)](https://travis-ci.org/yeasy/docker_practice) [![](https://img.shields.io/github/release/yeasy/docker_practice/all.svg)](https://github.com/yeasy/docker_practice/releases) [![](https://badges.gitter.im/docker_practice/Lobby.svg)](https://gitter.im/docker_practice/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||
[![](https://img.shields.io/github/stars/yeasy/docker_practice.svg?style=social&label=Stars)](https://github.com/yeasy/docker_practice) [![](https://img.shields.io/github/release/yeasy/docker_practice/all.svg)](https://github.com/yeasy/docker_practice/releases) [![](https://img.shields.io/badge/Based-Docker%20CE%20v20.10-blue.svg)](https://github.com/docker/docker-ce) [![](https://img.shields.io/badge/Docker%20%E6%8A%80%E6%9C%AF%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E6%88%98-jd.com-red.svg)][1]
|
||||
|
||||
0.9.0(2017-12-31)
|
||||
**v1.3.0**
|
||||
|
||||
*修订说明:本书内容已基于 Docker CE v17.MM 进行了重新修订,2017 年底发布了 0.9.0 版本。旧版本(Docker 1.13-)内容,请阅读 [docker-legacy](https://github.com/yeasy/docker_practice/tree/docker-legacy) 分支的内容。*
|
||||
| 语言 | - |
|
||||
| :------------- | :--- |
|
||||
| [简体中文](https://github.com/yeasy/docker_practice) | [阅读](https://vuepress.mirror.docker-practice.com/) |
|
||||
|
||||
[Docker](http://www.docker.com) 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的运行效率,降低了云计算资源供应的成本!使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松!
|
||||
[Docker](https://www.docker.com) 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松!
|
||||
|
||||
无论是应用开发者、运维人员、还是其他信息技术从业人员,都有必要认识和掌握 Docker,节约有限的时间。
|
||||
无论是应用开发者、运维人员、还是其他信息技术从业人员,都有必要认识和掌握 Docker,节约有限的生命。
|
||||
|
||||
本书既适用于具备基础 Linux 知识的 Docker 初学者,也希望可供理解原理和实现的高级用户参考。同时,书中给出的实践案例,可供在进行实际部署时借鉴。前六章为基础内容,供用户理解 Docker 的基本概念和操作;7 ~ 9 章介绍包括数据管理、网络等高级操作;第 10 ~ 13 章介绍了容器生态中的几个核心项目;14、15 章讨论了关于 Docker 安全和实现技术等高级话题。后续章节则分别介绍包括 Etcd、CoreOS、Kubernetes、Mesos、容器云等热门开源项目。最后,展示了使用容器技术的典型的应用场景和实践案例。
|
||||
本书既适用于具备基础 Linux 知识的 Docker 初学者,也希望可供理解原理和实现的高级用户参考。同时,书中给出的实践案例,可供在进行实际部署时借鉴。前六章为基础内容,供用户理解 Docker 的基本概念和操作;7 ~ 9 章介绍包括数据管理、网络等高级操作;第 10 ~ 12 章介绍了容器生态中的几个核心项目;13、14 章讨论了关于 Docker 安全和实现技术等高级话题。后续章节则分别介绍包括 Etcd、Fedora CoreOS、Kubernetes、容器云等相关热门开源项目。最后,还展示了使用容器技术的典型的应用场景和实践案例。
|
||||
|
||||
* 在线阅读:[GitBook](https://www.gitbook.io/book/yeasy/docker_practice),[Github](https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md),[国内镜像](https://github.com/yeasy/docker_practice/wiki/%E9%A1%B9%E7%9B%AE%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F)
|
||||
* 下载:[pdf](https://www.gitbook.com/download/pdf/book/yeasy/docker_practice),[epub](https://www.gitbook.com/download/epub/book/yeasy/docker_practice)
|
||||
* [离线阅读](https://github.com/yeasy/docker_practice/wiki/%E7%A6%BB%E7%BA%BF%E9%98%85%E8%AF%BB%E5%8A%9F%E8%83%BD%E8%AF%A6%E8%A7%A3)
|
||||
* 在线阅读:[docker-practice.com](https://vuepress.mirror.docker-practice.com/),[GitBook](https://yeasy.gitbook.io/docker_practice/),[Github](https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md)
|
||||
* 离线阅读:[`$ docker run -it --rm -p 4000:80 ccr.ccs.tencentyun.com/dockerpracticesig/docker_practice:vuepress`](https://github.com/yeasy/docker_practice/wiki/%E7%A6%BB%E7%BA%BF%E9%98%85%E8%AF%BB%E5%8A%9F%E8%83%BD%E8%AF%A6%E8%A7%A3)
|
||||
|
||||
Docker 自身仍在快速发展中,生态环境也在蓬勃成长。建议初学者使用最新版的 Docker (v17.MM) 进行学习实践。欢迎 [参与维护项目](CONTRIBUTING.md)。
|
||||
Docker 自身仍在快速发展中,生态环境也在蓬勃成长。建议初学者使用最新稳定版本的 Docker 进行学习实践。欢迎 [参与项目维护](CONTRIBUTING.md)。
|
||||
|
||||
* [修订记录](CHANGELOG.md)
|
||||
* [贡献者名单](https://github.com/yeasy/docker_practice/graphs/contributors)
|
||||
|
||||
## 微信小程序
|
||||
|
||||
<p align="center">
|
||||
<img width="200" src="https://docker_practice.gitee.io/pic/dp-wechat-miniprogram.jpg">
|
||||
</p>
|
||||
|
||||
<p align="center"><strong>微信扫码 随时随地阅读~</strong></p>
|
||||
|
||||
## 技术交流
|
||||
|
||||
<p align="center">
|
||||
<img width="200" src="https://docker_practice.gitee.io/pic/dpsig-wechat.jpg">
|
||||
</p>
|
||||
|
||||
<p align="center"><strong>微信扫码 加入群聊~ 或者微信添加 <code>dpsigs</code> 邀请入群</strong></p>
|
||||
|
||||
欢迎加入 Docker 技术交流 QQ 群,分享 Docker 资源,交流 Docker 技术。
|
||||
|
||||
* QQ 群 I (已满):341410255
|
||||
|
@ -35,16 +51,23 @@ Docker 自身仍在快速发展中,生态环境也在蓬勃成长。建议初
|
|||
* QQ 群 IX (已满):571502246
|
||||
* QQ 群 X (可加):145983035
|
||||
|
||||
>如果有容器技术相关的疑问,请通过 [Issues](https://github.com/yeasy/docker_practice/issues/new/choose) 来提出。
|
||||
|
||||
## 进阶学习
|
||||
![](https://github.com/yeasy/docker_practice/raw/master/_images/docker_primer2.png)
|
||||
|
||||
《[Docker 技术入门与实战](http://item.jd.com/12121728.html)》第二版已经正式出版,针对初版进行内容升级,欢迎大家阅读使用并反馈建议。
|
||||
[![](https://github.com/yeasy/docker_practice/raw/master/_images/docker_primer3.png)][1]
|
||||
|
||||
* [京东图书](https://item.jd.com/12121728.html)
|
||||
* [China-Pub](http://product.china-pub.com/5089907)
|
||||
《[Docker 技术入门与实战][1]》第三版已经面世,介绍最新的容器技术栈,欢迎大家阅读使用并反馈建议。
|
||||
|
||||
* [京东图书][1]
|
||||
* [China-Pub](http://product.china-pub.com/8052127)
|
||||
|
||||
## 鼓励项目
|
||||
|
||||
欢迎鼓励项目一杯 coffee~
|
||||
<p align="center">
|
||||
<img width="200" src="https://github.com/yeasy/docker_practice/raw/master/_images/donate.jpeg">
|
||||
</p>
|
||||
|
||||
![](https://github.com/yeasy/docker_practice/raw/master/_images/donate.jpeg)
|
||||
<p align="center"><strong>欢迎鼓励项目一杯 coffee~</strong></p>
|
||||
|
||||
[1]: https://union-click.jd.com/jdc?e=&p=JF8AANADIgZlGF0VAxUDVBJdHDISBFAfWRcCGzcRRANLXSJeEF4aVwkMGQ1eD0kdSVJKSQVJHBIEUB9ZFwIbGAxeB0gyS34PbFlHVHNkI0MQEAoIcSxyBWFLRAtZK1olABYHXR9eHAoQN2UbXCVQfN_jrYOwsw7T_5SOnZUiBmUbXBYBFwBVG14UBBAAZRxbHDJJUjscCEEHEQ4FSA4VBhBQZStrFjIiN1UrWCVAfARQT1gQA0cFAEwOEAcRDlMTDEALQAFTEwwRUhMAUR1cJQATBlES
|
||||
|
|
290
SUMMARY.md
290
SUMMARY.md
|
@ -4,155 +4,169 @@
|
|||
* [修订记录](CHANGELOG.md)
|
||||
* [如何贡献](CONTRIBUTING.md)
|
||||
* [Docker 简介](introduction/README.md)
|
||||
* [什么是 Docker](introduction/what.md)
|
||||
* [为什么要用 Docker](introduction/why.md)
|
||||
* [什么是 Docker](introduction/what.md)
|
||||
* [为什么要用 Docker](introduction/why.md)
|
||||
* [基本概念](basic_concept/README.md)
|
||||
* [镜像](basic_concept/image.md)
|
||||
* [容器](basic_concept/container.md)
|
||||
* [仓库](basic_concept/repository.md)
|
||||
* [镜像](basic_concept/image.md)
|
||||
* [容器](basic_concept/container.md)
|
||||
* [仓库](basic_concept/repository.md)
|
||||
* [安装 Docker](install/README.md)
|
||||
* [Ubuntu](install/ubuntu.md)
|
||||
* [Debian](install/debian.md)
|
||||
* [CentOS](install/centos.md)
|
||||
* [Raspberry Pi](install/raspberry-pi.md)
|
||||
* [macOS](install/mac.md)
|
||||
* [Windows PC](install/windows.md)
|
||||
* [镜像加速器](install/mirror.md)
|
||||
* [Ubuntu](install/ubuntu.md)
|
||||
* [Debian](install/debian.md)
|
||||
* [Fedora](install/fedora.md)
|
||||
* [CentOS](install/centos.md)
|
||||
* [Raspberry Pi](install/raspberry-pi.md)
|
||||
* [Linux 离线安装](install/offline.md)
|
||||
* [macOS](install/mac.md)
|
||||
* [Windows 10](install/windows.md)
|
||||
* [镜像加速器](install/mirror.md)
|
||||
* [开启实验特性](install/experimental.md)
|
||||
* [使用镜像](image/README.md)
|
||||
* [获取镜像](image/pull.md)
|
||||
* [列出镜像](image/list.md)
|
||||
* [删除本地镜像](image/rm.md)
|
||||
* [利用 commit 理解镜像构成](image/commit.md)
|
||||
* [使用 Dockerfile 定制镜像](image/build.md)
|
||||
* [Dockerfile 指令详解](image/dockerfile/README.md)
|
||||
* [COPY 复制文件](image/dockerfile/copy.md)
|
||||
* [ADD 更高级的复制文件](image/dockerfile/add.md)
|
||||
* [CMD 容器启动命令](image/dockerfile/cmd.md)
|
||||
* [ENTRYPOINT 入口点](image/dockerfile/entrypoint.md)
|
||||
* [ENV 设置环境变量](image/dockerfile/env.md)
|
||||
* [ARG 构建参数](image/dockerfile/arg.md)
|
||||
* [VOLUME 定义匿名卷](image/dockerfile/volume.md)
|
||||
* [EXPOSE 暴露端口](image/dockerfile/expose.md)
|
||||
* [WORKDIR 指定工作目录](image/dockerfile/workdir.md)
|
||||
* [USER 指定当前用户](image/dockerfile/user.md)
|
||||
* [HEALTHCHECK 健康检查](image/dockerfile/healthcheck.md)
|
||||
* [ONBUILD 为他人作嫁衣裳](image/dockerfile/onbuild.md)
|
||||
* [参考文档](image/dockerfile/references.md)
|
||||
* [Dockerfile 多阶段构建](image/multistage-builds.md)
|
||||
* [其它制作镜像的方式](image/other.md)
|
||||
* [实现原理](image/internal.md)
|
||||
* [获取镜像](image/pull.md)
|
||||
* [列出镜像](image/list.md)
|
||||
* [删除本地镜像](image/rm.md)
|
||||
* [利用 commit 理解镜像构成](image/commit.md)
|
||||
* [使用 Dockerfile 定制镜像](image/build.md)
|
||||
* [Dockerfile 指令详解](image/dockerfile/README.md)
|
||||
* [COPY 复制文件](image/dockerfile/copy.md)
|
||||
* [ADD 更高级的复制文件](image/dockerfile/add.md)
|
||||
* [CMD 容器启动命令](image/dockerfile/cmd.md)
|
||||
* [ENTRYPOINT 入口点](image/dockerfile/entrypoint.md)
|
||||
* [ENV 设置环境变量](image/dockerfile/env.md)
|
||||
* [ARG 构建参数](image/dockerfile/arg.md)
|
||||
* [VOLUME 定义匿名卷](image/dockerfile/volume.md)
|
||||
* [EXPOSE 暴露端口](image/dockerfile/expose.md)
|
||||
* [WORKDIR 指定工作目录](image/dockerfile/workdir.md)
|
||||
* [USER 指定当前用户](image/dockerfile/user.md)
|
||||
* [HEALTHCHECK 健康检查](image/dockerfile/healthcheck.md)
|
||||
* [ONBUILD 为他人作嫁衣裳](image/dockerfile/onbuild.md)
|
||||
* [LABEL 为镜像添加元数据](image/dockerfile/label.md)
|
||||
* [SHELL 指令](image/dockerfile/shell.md)
|
||||
* [参考文档](image/dockerfile/references.md)
|
||||
* [Dockerfile 多阶段构建](image/multistage-builds/README.md)
|
||||
* [实战多阶段构建 Laravel 镜像](image/multistage-builds/laravel.md)
|
||||
* [构建多种系统架构支持的 Docker 镜像](image/manifest.md)
|
||||
* [其它制作镜像的方式](image/other.md)
|
||||
* [实现原理](image/internal.md)
|
||||
* [操作容器](container/README.md)
|
||||
* [启动](container/run.md)
|
||||
* [守护态运行](container/daemon.md)
|
||||
* [终止](container/stop.md)
|
||||
* [进入容器](container/attach_exec.md)
|
||||
* [导出和导入](container/import_export.md)
|
||||
* [删除](container/rm.md)
|
||||
* [启动](container/run.md)
|
||||
* [守护态运行](container/daemon.md)
|
||||
* [终止](container/stop.md)
|
||||
* [进入容器](container/attach_exec.md)
|
||||
* [导出和导入](container/import_export.md)
|
||||
* [删除](container/rm.md)
|
||||
* [访问仓库](repository/README.md)
|
||||
* [Docker Hub](repository/dockerhub.md)
|
||||
* [私有仓库](repository/registry.md)
|
||||
* [私有仓库高级配置](repository/registry_auth.md)
|
||||
* [Docker Hub](repository/dockerhub.md)
|
||||
* [私有仓库](repository/registry.md)
|
||||
* [私有仓库高级配置](repository/registry_auth.md)
|
||||
* [Nexus 3](repository/nexus3_registry.md)
|
||||
* [数据管理](data_management/README.md)
|
||||
* [数据卷](data_management/volume.md)
|
||||
* [监听主机目录](data_management/bind-mounts.md)
|
||||
* [数据卷](data_management/volume.md)
|
||||
* [挂载主机目录](data_management/bind-mounts.md)
|
||||
* [使用网络](network/README.md)
|
||||
* [外部访问容器](network/port_mapping.md)
|
||||
* [容器互联](network/linking.md)
|
||||
* [配置 DNS](network/dns.md)
|
||||
* [外部访问容器](network/port_mapping.md)
|
||||
* [容器互联](network/linking.md)
|
||||
* [配置 DNS](network/dns.md)
|
||||
* [高级网络配置](advanced_network/README.md)
|
||||
* [快速配置指南](advanced_network/quick_guide.md)
|
||||
* [容器访问控制](advanced_network/access_control.md)
|
||||
* [端口映射实现](advanced_network/port_mapping.md)
|
||||
* [配置 docker0 网桥](advanced_network/docker0.md)
|
||||
* [自定义网桥](advanced_network/bridge.md)
|
||||
* [工具和示例](advanced_network/example.md)
|
||||
* [编辑网络配置文件](advanced_network/config_file.md)
|
||||
* [实例:创建一个点到点连接](advanced_network/ptp.md)
|
||||
* [Docker 三剑客之 Compose 项目](compose/README.md)
|
||||
* [简介](compose/introduction.md)
|
||||
* [安装与卸载](compose/install.md)
|
||||
* [使用](compose/usage.md)
|
||||
* [命令说明](compose/commands.md)
|
||||
* [Compose 模板文件](compose/compose_file.md)
|
||||
* [实战 Django](compose/django.md)
|
||||
* [实战 Rails](compose/rails.md)
|
||||
* [实战 WordPress](compose/wordpress.md)
|
||||
* [Docker 三剑客之 Machine 项目](machine/README.md)
|
||||
* [安装](machine/install.md)
|
||||
* [使用](machine/usage.md)
|
||||
* [Docker 三剑客之 Docker Swarm](swarm/README.md)
|
||||
* [快速配置指南](advanced_network/quick_guide.md)
|
||||
* [容器访问控制](advanced_network/access_control.md)
|
||||
* [端口映射实现](advanced_network/port_mapping.md)
|
||||
* [配置 docker0 网桥](advanced_network/docker0.md)
|
||||
* [自定义网桥](advanced_network/bridge.md)
|
||||
* [工具和示例](advanced_network/example.md)
|
||||
* [编辑网络配置文件](advanced_network/config_file.md)
|
||||
* [配置 HTTP/HTTPS 网络代理](advanced_network/http_https_proxy.md)
|
||||
* [实例:创建一个点到点连接](advanced_network/ptp.md)
|
||||
* [Docker Buildx](buildx/README.md)
|
||||
* [BuildKit](buildx/buildkit.md)
|
||||
* [使用 buildx 构建镜像](buildx/buildx.md)
|
||||
* [使用 buildx 构建多种系统架构支持的 Docker 镜像](buildx/multi-arch-images.md)
|
||||
* [Docker Compose](compose/README.md)
|
||||
* [简介](compose/introduction.md)
|
||||
* [Compose v2](compose/v2.md)
|
||||
* [安装与卸载](compose/install.md)
|
||||
* [使用](compose/usage.md)
|
||||
* [命令说明](compose/commands.md)
|
||||
* [Compose 模板文件](compose/compose_file.md)
|
||||
* [实战 Django](compose/django.md)
|
||||
* [实战 Rails](compose/rails.md)
|
||||
* [实战 WordPress](compose/wordpress.md)
|
||||
* [实战 LNMP](compose/lnmp.md)
|
||||
* [Swarm mode](swarm_mode/README.md)
|
||||
* [基本概念](swarm_mode/overview.md)
|
||||
* [创建 Swarm 集群](swarm_mode/create.md)
|
||||
* [部署服务](swarm_mode/deploy.md)
|
||||
* [使用 compose 文件](swarm_mode/stack.md)
|
||||
* [管理敏感数据](swarm_mode/secret.md)
|
||||
* [管理配置信息](swarm_mode/config.md)
|
||||
* [基本概念](swarm_mode/overview.md)
|
||||
* [创建 Swarm 集群](swarm_mode/create.md)
|
||||
* [部署服务](swarm_mode/deploy.md)
|
||||
* [使用 compose 文件](swarm_mode/stack.md)
|
||||
* [管理密钥](swarm_mode/secret.md)
|
||||
* [管理配置信息](swarm_mode/config.md)
|
||||
* [滚动升级](swarm_mode/rolling_update.md)
|
||||
* [安全](security/README.md)
|
||||
* [内核命名空间](security/kernel_ns.md)
|
||||
* [控制组](security/control_group.md)
|
||||
* [服务端防护](security/daemon_sec.md)
|
||||
* [内核能力机制](security/kernel_capability.md)
|
||||
* [其它安全特性](security/other_feature.md)
|
||||
* [总结](security/summary.md)
|
||||
* [内核命名空间](security/kernel_ns.md)
|
||||
* [控制组](security/control_group.md)
|
||||
* [服务端防护](security/daemon_sec.md)
|
||||
* [内核能力机制](security/kernel_capability.md)
|
||||
* [其它安全特性](security/other_feature.md)
|
||||
* [总结](security/summary.md)
|
||||
* [底层实现](underly/README.md)
|
||||
* [基本架构](underly/arch.md)
|
||||
* [命名空间](underly/namespace.md)
|
||||
* [控制组](underly/cgroups.md)
|
||||
* [联合文件系统](underly/ufs.md)
|
||||
* [容器格式](underly/container_format.md)
|
||||
* [网络](underly/network.md)
|
||||
* [基本架构](underly/arch.md)
|
||||
* [命名空间](underly/namespace.md)
|
||||
* [控制组](underly/cgroups.md)
|
||||
* [联合文件系统](underly/ufs.md)
|
||||
* [容器格式](underly/container_format.md)
|
||||
* [网络](underly/network.md)
|
||||
* [Etcd 项目](etcd/README.md)
|
||||
* [简介](etcd/intro.md)
|
||||
* [安装](etcd/install.md)
|
||||
* [集群](etcd/cluster.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)
|
||||
* [简介](etcd/intro.md)
|
||||
* [安装](etcd/install.md)
|
||||
* [集群](etcd/cluster.md)
|
||||
* [使用 etcdctl](etcd/etcdctl.md)
|
||||
* [Fedora CoreOS](coreos/README.md)
|
||||
* [简介](coreos/intro.md)
|
||||
* [安装](coreos/install.md)
|
||||
* [Kubernetes - 开源容器编排引擎](kubernetes/README.md)
|
||||
* [简介](kubernetes/intro.md)
|
||||
* [基本概念](kubernetes/concepts.md)
|
||||
* [架构设计](kubernetes/design.md)
|
||||
* [部署 Kubernetes](kubernetes/setup/README.md)
|
||||
* [使用 kubeadm 部署 kubernetes(CRI 使用 containerd)](kubernetes/setup/kubeadm.md)
|
||||
* [在 Docker Desktop 使用](kubernetes/setup/docker-desktop.md)
|
||||
* [一步步部署 kubernetes 集群](kubernetes/setup/systemd.md)
|
||||
* [部署 Dashboard](kubernetes/setup/dashboard.md)
|
||||
* [Kubernetes 命令行 kubectl](kubernetes/kubectl/README.md)
|
||||
* [容器与云计算](cloud/README.md)
|
||||
* [简介](cloud/intro.md)
|
||||
* [亚马逊云](cloud/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)
|
||||
* [本章小结](cases/os/summary.md)
|
||||
* [实战案例-CI/CD](cases/ci/README.md)
|
||||
* [Drone](cases/ci/drone.md)
|
||||
* [Docker 开源项目](opensource/README.md)
|
||||
* [LinuxKit](opensource/linuxkit.md)
|
||||
* [简介](cloud/intro.md)
|
||||
* [腾讯云](cloud/tencentCloud.md)
|
||||
* [阿里云](cloud/alicloud.md)
|
||||
* [亚马逊云](cloud/aws.md)
|
||||
* [小结](cloud/summary.md)
|
||||
* [实战案例 - 操作系统](cases/os/README.md)
|
||||
* [Busybox](cases/os/busybox.md)
|
||||
* [Alpine](cases/os/alpine.md)
|
||||
* [Debian Ubuntu](cases/os/debian.md)
|
||||
* [CentOS Fedora](cases/os/centos.md)
|
||||
* [本章小结](cases/os/summary.md)
|
||||
* [实战案例 - CI/CD](cases/ci/README.md)
|
||||
* [GitHub Actions](cases/ci/actions/README.md)
|
||||
* [Drone](cases/ci/drone/README.md)
|
||||
* [部署 Drone](cases/ci/drone/install.md)
|
||||
* [在 IDE 中使用 Docker](ide/README.md)
|
||||
* [VS Code](ide/vsCode.md)
|
||||
* [podman - 下一代 Linux 容器工具](podman/README.md)
|
||||
* [附录](appendix/README.md)
|
||||
* [附录一:常见问题总结](appendix/faq/README.md)
|
||||
* [附录二:热门镜像介绍](appendix/repo/README.md)
|
||||
* [Ubuntu](appendix/repo/ubuntu.md)
|
||||
* [CentOS](appendix/repo/centos.md)
|
||||
* [MySQL](appendix/repo/mysql.md)
|
||||
* [MongoDB](appendix/repo/mongodb.md)
|
||||
* [Redis](appendix/repo/redis.md)
|
||||
* [Nginx](appendix/repo/nginx.md)
|
||||
* [WordPress](appendix/repo/wordpress.md)
|
||||
* [Node.js](appendix/repo/nodejs.md)
|
||||
* [附录三:Docker 命令查询](appendix/command/README.md)
|
||||
* [附录四:Dockerfile 最佳实践](appendix/best_practices.md)
|
||||
* [附录五:资源链接](appendix/resources/README.md)
|
||||
* [附录六:Docker 中文资源](appendix/resources/cn.md)
|
||||
* [附录一:常见问题总结](appendix/faq/README.md)
|
||||
* [附录二:热门镜像介绍](appendix/repo/README.md)
|
||||
* [Ubuntu](appendix/repo/ubuntu.md)
|
||||
* [CentOS](appendix/repo/centos.md)
|
||||
* [Nginx](appendix/repo/nginx.md)
|
||||
* [PHP](appendix/repo/php.md)
|
||||
* [Node.js](appendix/repo/nodejs.md)
|
||||
* [MySQL](appendix/repo/mysql.md)
|
||||
* [WordPress](appendix/repo/wordpress.md)
|
||||
* [MongoDB](appendix/repo/mongodb.md)
|
||||
* [Redis](appendix/repo/redis.md)
|
||||
* [Minio](appendix/repo/minio.md)
|
||||
* [附录三:Docker 命令查询](appendix/command/README.md)
|
||||
* [客户端命令 - docker](appendix/command/docker.md)
|
||||
* [服务端命令 - dockerd](appendix/command/dockerd.md)
|
||||
* [附录四:Dockerfile 最佳实践](appendix/best_practices.md)
|
||||
* [附录五:如何调试 Docker](appendix/debug.md)
|
||||
* [附录六:资源链接](appendix/resources.md)
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 52 KiB |
|
@ -6,10 +6,10 @@
|
|||
|
||||
当 Docker 启动时,会自动在主机上创建一个 `docker0` 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。
|
||||
|
||||
同时,Docker 随机分配一个本地未占用的私有网段(在 [RFC1918](http://tools.ietf.org/html/rfc1918) 中定义)中的一个地址给 `docker0` 接口。比如典型的 `172.17.42.1`,掩码为 `255.255.0.0`。此后启动的容器内的网口也会自动分配一个同一网段(`172.17.0.0/16`)的地址。
|
||||
同时,Docker 随机分配一个本地未占用的私有网段(在 [RFC1918](https://datatracker.ietf.org/doc/html/rfc1918) 中定义)中的一个地址给 `docker0` 接口。比如典型的 `172.17.42.1`,掩码为 `255.255.0.0`。此后启动的容器内的网口也会自动分配一个同一网段(`172.17.0.0/16`)的地址。
|
||||
|
||||
当创建一个 Docker 容器的时候,同时会创建了一对 `veth pair` 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 `eth0`;另一端在本地并被挂载到 `docker0` 网桥,名称以 `veth` 开头(例如 `vethAQI2QT`)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。
|
||||
|
||||
![Docker 网络](_images/network.png)
|
||||
![Docker 网络](./_images/network.png)
|
||||
|
||||
接下来的部分将介绍在一些场景中,Docker 所有的网络定制配置。以及通过 Linux 命令来调整、补充、甚至替换 Docker 默认的网络配置。
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
## 容器访问控制
|
||||
# 容器访问控制
|
||||
|
||||
容器的访问控制,主要通过 Linux 上的 `iptables` 防火墙来进行管理和实现。`iptables` 是 Linux 上默认的防火墙软件,在大部分发行版中都自带。
|
||||
|
||||
### 容器访问外部网络
|
||||
## 容器访问外部网络
|
||||
容器要想访问外部网络,需要本地系统的转发支持。在Linux 系统中,检查转发是否打开。
|
||||
|
||||
```bash
|
||||
|
@ -14,17 +15,17 @@ $sysctl -w net.ipv4.ip_forward=1
|
|||
```
|
||||
如果在启动 Docker 服务的时候设定 `--ip-forward=true`, Docker 就会自动设定系统的 `ip_forward` 参数为 1。
|
||||
|
||||
### 容器之间访问
|
||||
## 容器之间访问
|
||||
容器之间相互访问,需要两方面的支持。
|
||||
* 容器的网络拓扑是否已经互联。默认情况下,所有容器都会被连接到 `docker0` 网桥上。
|
||||
* 本地系统的防火墙软件 -- `iptables` 是否允许通过。
|
||||
|
||||
#### 访问所有端口
|
||||
当启动 Docker 服务时候,默认会添加一条转发策略到 iptables 的 FORWARD 链上。策略为通过(`ACCEPT`)还是禁止(`DROP`)取决于配置`--icc=true`(缺省值)还是 `--icc=false`。当然,如果手动指定 `--iptables=false` 则不会添加 `iptables` 规则。
|
||||
### 访问所有端口
|
||||
当启动 Docker 服务(即 dockerd)的时候,默认会添加一条转发策略到本地主机 iptables 的 FORWARD 链上。策略为通过(`ACCEPT`)还是禁止(`DROP`)取决于配置`--icc=true`(缺省值)还是 `--icc=false`。当然,如果手动指定 `--iptables=false` 则不会添加 `iptables` 规则。
|
||||
|
||||
可见,默认情况下,不同容器之间是允许网络互通的。如果为了安全考虑,可以在 `/etc/default/docker` 文件中配置 `DOCKER_OPTS=--icc=false` 来禁止它。
|
||||
可见,默认情况下,不同容器之间是允许网络互通的。如果为了安全考虑,可以在 `/etc/docker/daemon.json` 文件中配置 `{"icc": false}` 来禁止它。
|
||||
|
||||
#### 访问指定端口
|
||||
### 访问指定端口
|
||||
在通过 `-icc=false` 关闭网络访问后,还可以通过 `--link=CONTAINER_NAME:ALIAS` 选项来访问容器的开放端口。
|
||||
|
||||
例如,在启动 Docker 服务时,可以同时使用 `icc=false --iptables=true` 参数来关闭允许相互的网络访问,并让 Docker 可以修改系统中的 `iptables` 规则。
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
## 自定义网桥
|
||||
# 自定义网桥
|
||||
|
||||
除了默认的 `docker0` 网桥,用户也可以指定网桥来连接各个容器。
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
## 编辑网络配置文件
|
||||
# 编辑网络配置文件
|
||||
|
||||
Docker 1.2.0 开始支持在运行中的容器里编辑 `/etc/hosts`, `/etc/hostname` 和 `/etc/resolve.conf` 文件。
|
||||
Docker 1.2.0 开始支持在运行中的容器里编辑 `/etc/hosts`, `/etc/hostname` 和 `/etc/resolv.conf` 文件。
|
||||
|
||||
但是这些修改是临时的,只在运行的容器中保留,容器终止或重启后并不会被保存下来。也不会被 `docker commit` 提交。
|
||||
但是这些修改是临时的,只在运行的容器中保留,容器终止或重启后并不会被保存下来,也不会被 `docker commit` 提交。
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
## 配置 docker0 网桥
|
||||
# 配置 docker0 网桥
|
||||
|
||||
Docker 服务默认会创建一个 `docker0` 网桥(其上有一个 `docker0` 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。
|
||||
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
## 工具和示例
|
||||
# 工具和示例
|
||||
|
||||
在介绍自定义网络拓扑之前,你可能会对一些外部工具和例子感兴趣:
|
||||
|
||||
### pipework
|
||||
## pipework
|
||||
Jérôme Petazzoni 编写了一个叫 [pipework](https://github.com/jpetazzo/pipework) 的 shell 脚本,可以帮助用户在比较复杂的场景中完成容器的连接。
|
||||
|
||||
### playground
|
||||
Brandon Rhodes 创建了一个提供完整的 Docker 容器网络拓扑管理的 [Python库](https://github.com/brandon-rhodes/fopnp/tree/m/playground),包括路由、NAT 防火墙;以及一些提供 HTTP, SMTP, POP, IMAP, Telnet, SSH, FTP 的服务器。
|
||||
## playground
|
||||
Brandon Rhodes 创建了一个提供完整的 Docker 容器网络拓扑管理的 [Python库](https://github.com/brandon-rhodes/fopnp/tree/m/playground),包括路由、NAT 防火墙;以及一些提供 `HTTP` `SMTP` `POP` `IMAP` `Telnet` `SSH` `FTP` 的服务器。
|
||||
|
|
|
@ -0,0 +1,74 @@
|
|||
# 配置 HTTP/HTTPS 网络代理
|
||||
|
||||
使用Docker的过程中,因为网络原因,通常需要使用 HTTP/HTTPS 代理来加速镜像拉取、构建和使用。下面是常见的三种场景。
|
||||
|
||||
## 为 dockerd 设置网络代理
|
||||
|
||||
"docker pull" 命令是由 dockerd 守护进程执行。而 dockerd 守护进程是由 systemd 管理。因此,如果需要在执行 "docker pull" 命令时使用 HTTP/HTTPS 代理,需要通过 systemd 配置。
|
||||
|
||||
- 为 dockerd 创建配置文件夹。
|
||||
```
|
||||
sudo mkdir -p /etc/systemd/system/docker.service.d
|
||||
```
|
||||
|
||||
- 为 dockerd 创建 HTTP/HTTPS 网络代理的配置文件,文件路径是 /etc/systemd/system/docker.service.d/http-proxy.conf 。并在该文件中添加相关环境变量。
|
||||
```
|
||||
[Service]
|
||||
Environment="HTTP_PROXY=http://proxy.example.com:8080/"
|
||||
Environment="HTTPS_PROXY=http://proxy.example.com:8080/"
|
||||
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
|
||||
```
|
||||
|
||||
- 刷新配置并重启 docker 服务。
|
||||
```
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl restart docker
|
||||
```
|
||||
|
||||
## 为 docker 容器设置网络代理
|
||||
|
||||
在容器运行阶段,如果需要使用 HTTP/HTTPS 代理,可以通过更改 docker 客户端配置,或者指定环境变量的方式。
|
||||
|
||||
- 更改 docker 客户端配置:创建或更改 ~/.docker/config.json,并在该文件中添加相关配置。
|
||||
```
|
||||
{
|
||||
"proxies":
|
||||
{
|
||||
"default":
|
||||
{
|
||||
"httpProxy": "http://proxy.example.com:8080/",
|
||||
"httpsProxy": "http://proxy.example.com:8080/",
|
||||
"noProxy": "localhost,127.0.0.1,.example.com"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- 指定环境变量:运行 "docker run" 命令时,指定相关环境变量。
|
||||
|
||||
| 环境变量 | docker run 示例 |
|
||||
| -------- | ---------------- |
|
||||
| HTTP_PROXY | --env HTTP_PROXY="http://proxy.example.com:8080/" |
|
||||
| HTTPS_PROXY | --env HTTPS_PROXY="http://proxy.example.com:8080/" |
|
||||
| NO_PROXY | --env NO_PROXY="localhost,127.0.0.1,.example.com" |
|
||||
|
||||
## 为 docker build 过程设置网络代理
|
||||
|
||||
在容器构建阶段,如果需要使用 HTTP/HTTPS 代理,可以通过指定 "docker build" 的环境变量,或者在 Dockerfile 中指定环境变量的方式。
|
||||
|
||||
- 使用 "--build-arg" 指定 "docker build" 的相关环境变量
|
||||
```
|
||||
docker build \
|
||||
--build-arg "HTTP_PROXY=http://proxy.example.com:8080/" \
|
||||
--build-arg "HTTPS_PROXY=http://proxy.example.com:8080/" \
|
||||
--build-arg "NO_PROXY=localhost,127.0.0.1,.example.com" .
|
||||
```
|
||||
|
||||
- 在 Dockerfile 中指定相关环境变量
|
||||
|
||||
| 环境变量 | Dockerfile 示例 |
|
||||
| -------- | ---------------- |
|
||||
| HTTP_PROXY | ENV HTTP_PROXY="http://proxy.example.com:8080/" |
|
||||
| HTTPS_PROXY | ENV HTTPS_PROXY="http://proxy.example.com:8080/" |
|
||||
| NO_PROXY | ENV NO_PROXY="localhost,127.0.0.1,.example.com" |
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
## 映射容器端口到宿主主机的实现
|
||||
# 映射容器端口到宿主主机的实现
|
||||
|
||||
默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。
|
||||
|
||||
### 容器访问外部实现
|
||||
## 容器访问外部实现
|
||||
|
||||
容器所有到外部网络的连接,源地址都会被 NAT 成本地系统的 IP 地址。这是使用 `iptables` 的源地址伪装操作实现的。
|
||||
|
||||
|
@ -19,7 +19,7 @@ MASQUERADE all -- 172.17.0.0/16 !172.17.0.0/16
|
|||
|
||||
其中,上述规则将所有源地址在 `172.17.0.0/16` 网段,目标地址为其他网段(外部网络)的流量动态伪装为从系统网卡发出。MASQUERADE 跟传统 SNAT 的好处是它能动态从网卡获取地址。
|
||||
|
||||
### 外部访问容器实现
|
||||
## 外部访问容器实现
|
||||
|
||||
容器允许外部访问,可以在 `docker run` 时候通过 `-p` 或 `-P` 参数来启用。
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
## 示例:创建一个点到点连接
|
||||
# 示例:创建一个点到点连接
|
||||
默认情况下,Docker 会将所有容器连接到由 `docker0` 提供的虚拟子网中。
|
||||
|
||||
用户有时候需要两个容器之间可以直连通信,而不用通过主机网桥进行桥接。
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
## 快速配置指南
|
||||
# 快速配置指南
|
||||
|
||||
下面是一个跟 Docker 网络相关的命令列表。
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# Dockerfile 最佳实践
|
||||
|
||||
本附录是笔者对 Docker 官方文档中 [Best practices for writing Dockerfiles](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/) 的理解与翻译。
|
||||
本附录是笔者对 Docker 官方文档中 [Best practices for writing Dockerfiles](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/) 的理解与翻译。
|
||||
|
||||
## 一般性的指南和建议
|
||||
|
||||
|
@ -94,7 +94,7 @@ LABEL vendor=ACME\ Incorporated \
|
|||
com.example.release-date="2015-02-12"
|
||||
```
|
||||
|
||||
关于标签可以接受的键值对,参考 [Understanding object labels](https://docs.docker.com/engine/userguide/labels-custom-metadata/)。关于查询标签信息,参考 [Managing labels on objects](https://docs.docker.com/engine/userguide/labels-custom-metadata/#managing-labels-on-objects)。
|
||||
关于标签可以接受的键值对,参考 [Understanding object labels](https://docs.docker.com/config/labels-custom-metadata/)。关于查询标签信息,参考 [Managing labels on objects](https://docs.docker.com/config/labels-custom-metadata/)。
|
||||
|
||||
### RUN
|
||||
|
||||
|
@ -118,7 +118,7 @@ RUN apt-get update && apt-get install -y \
|
|||
将 `apt-get update` 放在一条单独的 `RUN` 声明中会导致缓存问题以及后续的 `apt-get install` 失败。比如,假设你有一个 `Dockerfile` 文件:
|
||||
|
||||
```docker
|
||||
FROM ubuntu:14.04
|
||||
FROM ubuntu:18.04
|
||||
|
||||
RUN apt-get update
|
||||
|
||||
|
@ -128,7 +128,7 @@ RUN apt-get install -y curl
|
|||
构建镜像后,所有的层都在 Docker 的缓存中。假设你后来又修改了其中的 `apt-get install` 添加了一个包:
|
||||
|
||||
```docker
|
||||
FROM ubuntu:14.04
|
||||
FROM ubuntu:18.04
|
||||
|
||||
RUN apt-get update
|
||||
|
||||
|
@ -167,9 +167,9 @@ RUN apt-get update && apt-get install -y \
|
|||
&& rm -rf /var/lib/apt/lists/*
|
||||
```
|
||||
|
||||
其中 `s3cmd` 指令指定了一个版本号 `1.1.*`。如果之前的镜像使用的是更旧的版本,指定新的版本会导致 `apt-get udpate` 缓存失效并确保安装的是新版本。
|
||||
其中 `s3cmd` 指令指定了一个版本号 `1.1.*`。如果之前的镜像使用的是更旧的版本,指定新的版本会导致 `apt-get update` 缓存失效并确保安装的是新版本。
|
||||
|
||||
另外,清理掉 apt 缓存 `var/lib/apt/lists` 可以减小镜像大小。因为 `RUN` 指令的开头为 `apt-get udpate`,包缓存总是会在 `apt-get install` 之前刷新。
|
||||
另外,清理掉 apt 缓存 `var/lib/apt/lists` 可以减小镜像大小。因为 `RUN` 指令的开头为 `apt-get update`,包缓存总是会在 `apt-get install` 之前刷新。
|
||||
|
||||
> 注意:官方的 Debian 和 Ubuntu 镜像会自动运行 apt-get clean,所以不需要显式的调用 apt-get clean。
|
||||
|
||||
|
@ -329,7 +329,7 @@ $ docker run --rm -it postgres bash
|
|||
|
||||
如果某个服务不需要特权执行,建议使用 `USER` 指令切换到非 root 用户。先在 `Dockerfile` 中使用类似 `RUN groupadd -r postgres && useradd -r -g postgres postgres` 的指令创建用户和用户组。
|
||||
|
||||
>注意:在镜像中,用户和用户组每次被分配的 UID/GID 都是不确定的,下次重新构建镜像时被分配到的 UID/GID 可能会不一样。如果要依赖确定的 UID/GID,你应该显示的指定一个 UID/GID。
|
||||
>注意:在镜像中,用户和用户组每次被分配的 UID/GID 都是不确定的,下次重新构建镜像时被分配到的 UID/GID 可能会不一样。如果要依赖确定的 UID/GID,你应该显式的指定一个 UID/GID。
|
||||
|
||||
你应该避免使用 `sudo`,因为它不可预期的 TTY 和信号转发行为可能造成的问题比它能解决的问题还多。如果你真的需要和 `sudo` 类似的功能(例如,以 root 权限初始化某个守护进程,以非 root 权限执行它),你可以使用 [gosu](https://github.com/tianon/gosu)。
|
||||
|
||||
|
@ -339,6 +339,6 @@ $ docker run --rm -it postgres bash
|
|||
|
||||
为了清晰性和可靠性,你应该总是在 `WORKDIR` 中使用绝对路径。另外,你应该使用 `WORKDIR` 来替代类似于 `RUN cd ... && do-something` 的指令,后者难以阅读、排错和维护。
|
||||
|
||||
## 官方仓库示例
|
||||
## 官方镜像示例
|
||||
|
||||
这些官方仓库的 Dockerfile 都是参考典范:https://github.com/docker-library/docs
|
||||
这些官方镜像的 Dockerfile 都是参考典范:https://github.com/docker-library/docs
|
||||
|
|
|
@ -10,120 +10,4 @@ Docker 命令有两大类,客户端命令和服务端命令。前者是主要
|
|||
|
||||
可以通过 `man docker` 或 `docker help` 来查看这些命令。
|
||||
|
||||
## 客户端命令选项
|
||||
|
||||
* --config="":指定客户端配置文件,默认为 `/.docker`;
|
||||
* -D=true|false:是否使用 debug 模式。默认不开启;
|
||||
* -H, --host=[]:指定命令对应 Docker 守护进程的监听接口,可以为 unix 套接字(unix:///path/to/socket),文件句柄(fd://socketfd)或 tcp 套接字(tcp://[host[:port]]),默认为 unix:///var/run/docker.sock;
|
||||
* -l, --log-level="debug|info|warn|error|fatal":指定日志输出级别;
|
||||
* --tls=true|false:是否对 Docker 守护进程启用 TLS 安全机制,默认为否;
|
||||
* --tlscacert= /.docker/ca.pem:TLS CA 签名的可信证书文件路径;
|
||||
* --tlscert= /.docker/cert.pem:TLS 可信证书文件路径;
|
||||
* --tlscert= /.docker/key.pem:TLS 密钥文件路径;
|
||||
* --tlsverify=true|false:启用 TLS 校验,默认为否。
|
||||
|
||||
## dockerd 命令选项
|
||||
|
||||
* --api-cors-header="":CORS 头部域,默认不允许 CORS,要允许任意的跨域访问,可以指定为 “*”;
|
||||
* --authorization-plugin="":载入认证的插件;
|
||||
* -b="":将容器挂载到一个已存在的网桥上。指定为 'none' 时则禁用容器的网络,与 --bip 选项互斥;
|
||||
* --bip="":让动态创建的 docker0 网桥采用给定的 CIDR 地址; 与 -b 选项互斥;
|
||||
* --cgroup-parent="":指定 cgroup 的父组,默认 fs cgroup 驱动为 `/docker`,systemd cgroup 驱动为 `system.slice`;
|
||||
* --cluster-store="":构成集群(如 Swarm)时,集群键值数据库服务地址;
|
||||
* --cluster-advertise="":构成集群时,自身的被访问地址,可以为 `host:port` 或 `interface:port`;
|
||||
* --cluster-store-opt="":构成集群时,键值数据库的配置选项;
|
||||
* --config-file="/etc/docker/daemon.json":daemon 配置文件路径;
|
||||
* --containerd="":containerd 文件的路径;
|
||||
* -D, --debug=true|false:是否使用 Debug 模式。缺省为 false;
|
||||
* --default-gateway="":容器的 IPv4 网关地址,必须在网桥的子网段内;
|
||||
* --default-gateway-v6="":容器的 IPv6 网关地址;
|
||||
* --default-ulimit=[]:默认的 ulimit 值;
|
||||
* --disable-legacy-registry=true|false:是否允许访问旧版本的镜像仓库服务器;
|
||||
* --dns="":指定容器使用的 DNS 服务器地址;
|
||||
* --dns-opt="":DNS 选项;
|
||||
* --dns-search=[]:DNS 搜索域;
|
||||
* --exec-opt=[]:运行时的执行选项;
|
||||
* --exec-root="":容器执行状态文件的根路径,默认为 `/var/run/docker`;
|
||||
* --fixed-cidr="":限定分配 IPv4 地址范围;
|
||||
* --fixed-cidr-v6="":限定分配 IPv6 地址范围;
|
||||
* -G, --group="":分配给 unix 套接字的组,默认为 `docker`;
|
||||
* -g, --graph="":Docker 运行时的根路径,默认为 `/var/lib/docker`;
|
||||
* -H, --host=[]:指定命令对应 Docker daemon 的监听接口,可以为 unix 套接字(unix:///path/to/socket),文件句柄(fd://socketfd)或 tcp 套接字(tcp://[host[:port]]),默认为 unix:///var/run/docker.sock;
|
||||
* --icc=true|false:是否启用容器间以及跟 daemon 所在主机的通信。默认为 true。
|
||||
* --insecure-registry=[]:允许访问给定的非安全仓库服务;
|
||||
* --ip="":绑定容器端口时候的默认 IP 地址。缺省为 0.0.0.0;
|
||||
* --ip-forward=true|false:是否检查启动在 Docker 主机上的启用 IP 转发服务,默认开启。注意关闭该选项将不对系统转发能力进行任何检查修改;
|
||||
* --ip-masq=true|false:是否进行地址伪装,用于容器访问外部网络,默认开启;
|
||||
* --iptables=true|false:是否允许 Docker 添加 iptables 规则。缺省为 true;
|
||||
* --ipv6=true|false:是否启用 IPv6 支持,默认关闭;
|
||||
* -l, --log-level="debug|info|warn|error|fatal":指定日志输出级别;
|
||||
* --label="[]":添加指定的键值对标注;
|
||||
* --log-driver="json-file|syslog|journald|gelf|fluentd|awslogs|splunk|etwlogs|gcplogs|none":指定日志后端驱动,默认为 json-file;
|
||||
* --log-opt=[]:日志后端的选项;
|
||||
* --mtu=VALUE:指定容器网络的 mtu;
|
||||
* -p="":指定 daemon 的 PID 文件路径。缺省为 `/var/run/docker.pid`;
|
||||
* --raw-logs:输出原始,未加色彩的日志信息;
|
||||
* --registry-mirror=<scheme>://<host>:指定 `docker pull` 时使用的注册服务器镜像地址;
|
||||
* -s, --storage-driver="":指定使用给定的存储后端;
|
||||
* --selinux-enabled=true|false:是否启用 SELinux 支持。缺省值为 false。SELinux 目前尚不支持 overlay 存储驱动;
|
||||
* --storage-opt=[]:驱动后端选项;
|
||||
* --tls=true|false:是否对 Docker daemon 启用 TLS 安全机制,默认为否;
|
||||
* --tlscacert= /.docker/ca.pem:TLS CA 签名的可信证书文件路径;
|
||||
* --tlscert= /.docker/cert.pem:TLS 可信证书文件路径;
|
||||
* --tlscert= /.docker/key.pem:TLS 密钥文件路径;
|
||||
* --tlsverify=true|false:启用 TLS 校验,默认为否;
|
||||
* --userland-proxy=true|false:是否使用用户态代理来实现容器间和出容器的回环通信,默认为 true;
|
||||
* --userns-remap=default|uid:gid|user:group|user|uid:指定容器的用户命名空间,默认是创建新的 UID 和 GID 映射到容器内进程。
|
||||
|
||||
## 客户端命令
|
||||
|
||||
可以通过 `docker COMMAND --help` 来查看这些命令的具体用法。
|
||||
|
||||
* attach:依附到一个正在运行的容器中;
|
||||
* build:从一个 Dockerfile 创建一个镜像;
|
||||
* commit:从一个容器的修改中创建一个新的镜像;
|
||||
* cp:在容器和本地宿主系统之间复制文件中;
|
||||
* create:创建一个新容器,但并不运行它;
|
||||
* diff:检查一个容器内文件系统的修改,包括修改和增加;
|
||||
* events:从服务端获取实时的事件;
|
||||
* exec:在运行的容器内执行命令;
|
||||
* export:导出容器内容为一个 tar 包;
|
||||
* history:显示一个镜像的历史信息;
|
||||
* images:列出存在的镜像;
|
||||
* import:导入一个文件(典型为 tar 包)路径或目录来创建一个本地镜像;
|
||||
* info:显示一些相关的系统信息;
|
||||
* inspect:显示一个容器的具体配置信息;
|
||||
* kill:关闭一个运行中的容器 (包括进程和所有相关资源);
|
||||
* load:从一个 tar 包中加载一个镜像;
|
||||
* login:注册或登录到一个 Docker 的仓库服务器;
|
||||
* logout:从 Docker 的仓库服务器登出;
|
||||
* logs:获取容器的 log 信息;
|
||||
* network:管理 Docker 的网络,包括查看、创建、删除、挂载、卸载等;
|
||||
* node:管理 swarm 集群中的节点,包括查看、更新、删除、提升/取消管理节点等;
|
||||
* pause:暂停一个容器中的所有进程;
|
||||
* port:查找一个 nat 到一个私有网口的公共口;
|
||||
* ps:列出主机上的容器;
|
||||
* pull:从一个Docker的仓库服务器下拉一个镜像或仓库;
|
||||
* push:将一个镜像或者仓库推送到一个 Docker 的注册服务器;
|
||||
* rename:重命名一个容器;
|
||||
* restart:重启一个运行中的容器;
|
||||
* rm:删除给定的若干个容器;
|
||||
* rmi:删除给定的若干个镜像;
|
||||
* run:创建一个新容器,并在其中运行给定命令;
|
||||
* save:保存一个镜像为 tar 包文件;
|
||||
* search:在 Docker index 中搜索一个镜像;
|
||||
* service:管理 Docker 所启动的应用服务,包括创建、更新、删除等;
|
||||
* start:启动一个容器;
|
||||
* stats:输出(一个或多个)容器的资源使用统计信息;
|
||||
* stop:终止一个运行中的容器;
|
||||
* swarm:管理 Docker swarm 集群,包括创建、加入、退出、更新等;
|
||||
* tag:为一个镜像打标签;
|
||||
* top:查看一个容器中的正在运行的进程信息;
|
||||
* unpause:将一个容器内所有的进程从暂停状态中恢复;
|
||||
* update:更新指定的若干容器的配置信息;
|
||||
* version:输出 Docker 的版本信息;
|
||||
* volume:管理 Docker volume,包括查看、创建、删除等;
|
||||
* wait:阻塞直到一个容器终止,然后输出它的退出符。
|
||||
|
||||
## 一张图总结 Docker 的命令
|
||||
![Docker 命令总结](../_images/cmd_logic.png)
|
||||
接下来的小节对这两个命令进行介绍。
|
||||
|
|
|
@ -0,0 +1,70 @@
|
|||
# 客户端命令(docker)
|
||||
|
||||
## 客户端命令选项
|
||||
|
||||
* `--config=""`:指定客户端配置文件,默认为 `~/.docker`;
|
||||
* `-D=true|false`:是否使用 debug 模式。默认不开启;
|
||||
* `-H, --host=[]`:指定命令对应 Docker 守护进程的监听接口,可以为 unix 套接字 `unix:///path/to/socket`,文件句柄 `fd://socketfd` 或 tcp 套接字 `tcp://[host[:port]]`,默认为 `unix:///var/run/docker.sock`;
|
||||
* `-l, --log-level="debug|info|warn|error|fatal"`:指定日志输出级别;
|
||||
* `--tls=true|false`:是否对 Docker 守护进程启用 TLS 安全机制,默认为否;
|
||||
* `--tlscacert=/.docker/ca.pem`:TLS CA 签名的可信证书文件路径;
|
||||
* `--tlscert=/.docker/cert.pem`:TLS 可信证书文件路径;
|
||||
* `--tlscert=/.docker/key.pem`:TLS 密钥文件路径;
|
||||
* `--tlsverify=true|false`:启用 TLS 校验,默认为否。
|
||||
|
||||
## 客户端命令
|
||||
|
||||
可以通过 `docker COMMAND --help` 来查看这些命令的具体用法。
|
||||
|
||||
* `attach`:依附到一个正在运行的容器中;
|
||||
* `build`:从一个 Dockerfile 创建一个镜像;
|
||||
* `commit`:从一个容器的修改中创建一个新的镜像;
|
||||
* `cp`:在容器和本地宿主系统之间复制文件中;
|
||||
* `create`:创建一个新容器,但并不运行它;
|
||||
* `diff`:检查一个容器内文件系统的修改,包括修改和增加;
|
||||
* `events`:从服务端获取实时的事件;
|
||||
* `exec`:在运行的容器内执行命令;
|
||||
* `export`:导出容器内容为一个 `tar` 包;
|
||||
* `history`:显示一个镜像的历史信息;
|
||||
* `images`:列出存在的镜像;
|
||||
* `import`:导入一个文件(典型为 `tar` 包)路径或目录来创建一个本地镜像;
|
||||
* `info`:显示一些相关的系统信息;
|
||||
* `inspect`:显示一个容器的具体配置信息;
|
||||
* `kill`:关闭一个运行中的容器 (包括进程和所有相关资源);
|
||||
* `load`:从一个 tar 包中加载一个镜像;
|
||||
* `login`:注册或登录到一个 Docker 的仓库服务器;
|
||||
* `logout`:从 Docker 的仓库服务器登出;
|
||||
* `logs`:获取容器的 log 信息;
|
||||
* `network`:管理 Docker 的网络,包括查看、创建、删除、挂载、卸载等;
|
||||
* `node`:管理 swarm 集群中的节点,包括查看、更新、删除、提升/取消管理节点等;
|
||||
* `pause`:暂停一个容器中的所有进程;
|
||||
* `port`:查找一个 nat 到一个私有网口的公共口;
|
||||
* `ps`:列出主机上的容器;
|
||||
* `pull`:从一个Docker的仓库服务器下拉一个镜像或仓库;
|
||||
* `push`:将一个镜像或者仓库推送到一个 Docker 的注册服务器;
|
||||
* `rename`:重命名一个容器;
|
||||
* `restart`:重启一个运行中的容器;
|
||||
* `rm`:删除给定的若干个容器;
|
||||
* `rmi`:删除给定的若干个镜像;
|
||||
* `run`:创建一个新容器,并在其中运行给定命令;
|
||||
* `save`:保存一个镜像为 tar 包文件;
|
||||
* `search`:在 Docker index 中搜索一个镜像;
|
||||
* `service`:管理 Docker 所启动的应用服务,包括创建、更新、删除等;
|
||||
* `start`:启动一个容器;
|
||||
* `stats`:输出(一个或多个)容器的资源使用统计信息;
|
||||
* `stop`:终止一个运行中的容器;
|
||||
* `swarm`:管理 Docker swarm 集群,包括创建、加入、退出、更新等;
|
||||
* `tag`:为一个镜像打标签;
|
||||
* `top`:查看一个容器中的正在运行的进程信息;
|
||||
* `unpause`:将一个容器内所有的进程从暂停状态中恢复;
|
||||
* `update`:更新指定的若干容器的配置信息;
|
||||
* `version`:输出 Docker 的版本信息;
|
||||
* `volume`:管理 Docker volume,包括查看、创建、删除等;
|
||||
* `wait`:阻塞直到一个容器终止,然后输出它的退出符。
|
||||
|
||||
## 一张图总结 Docker 的命令
|
||||
![Docker 命令总结](../_images/cmd_logic.png)
|
||||
|
||||
## 参考
|
||||
|
||||
* [官方文档](https://docs.docker.com/engine/reference/commandline/cli/)
|
|
@ -0,0 +1,58 @@
|
|||
# 服务端命令(dockerd)
|
||||
|
||||
## dockerd 命令选项
|
||||
|
||||
* `--api-cors-header=""`:CORS 头部域,默认不允许 CORS,要允许任意的跨域访问,可以指定为 "*";
|
||||
* `--authorization-plugin=""`:载入认证的插件;
|
||||
* `-b=""`:将容器挂载到一个已存在的网桥上。指定为 `none` 时则禁用容器的网络,与 `--bip` 选项互斥;
|
||||
* `--bip=""`:让动态创建的 `docker0` 网桥采用给定的 CIDR 地址; 与 `-b` 选项互斥;
|
||||
* `--cgroup-parent=""`:指定 cgroup 的父组,默认 fs cgroup 驱动为 `/docker`,systemd cgroup 驱动为 `system.slice`;
|
||||
* `--cluster-store=""`:构成集群(如 `Swarm`)时,集群键值数据库服务地址;
|
||||
* `--cluster-advertise=""`:构成集群时,自身的被访问地址,可以为 `host:port` 或 `interface:port`;
|
||||
* `--cluster-store-opt=""`:构成集群时,键值数据库的配置选项;
|
||||
* `--config-file="/etc/docker/daemon.json"`:daemon 配置文件路径;
|
||||
* `--containerd=""`:containerd 文件的路径;
|
||||
* `-D, --debug=true|false`:是否使用 Debug 模式。缺省为 false;
|
||||
* `--default-gateway=""`:容器的 IPv4 网关地址,必须在网桥的子网段内;
|
||||
* `--default-gateway-v6=""`:容器的 IPv6 网关地址;
|
||||
* `--default-ulimit=[]`:默认的 ulimit 值;
|
||||
* `--disable-legacy-registry=true|false`:是否允许访问旧版本的镜像仓库服务器;
|
||||
* `--dns=""`:指定容器使用的 DNS 服务器地址;
|
||||
* `--dns-opt=""`:DNS 选项;
|
||||
* `--dns-search=[]`:DNS 搜索域;
|
||||
* `--exec-opt=[]`:运行时的执行选项;
|
||||
* `--exec-root=""`:容器执行状态文件的根路径,默认为 `/var/run/docker`;
|
||||
* `--fixed-cidr=""`:限定分配 IPv4 地址范围;
|
||||
* `--fixed-cidr-v6=""`:限定分配 IPv6 地址范围;
|
||||
* `-G, --group=""`:分配给 unix 套接字的组,默认为 `docker`;
|
||||
* `-g, --graph=""`:Docker 运行时的根路径,默认为 `/var/lib/docker`;
|
||||
* `-H, --host=[]`:指定命令对应 Docker daemon 的监听接口,可以为 unix 套接字 `unix:///path/to/socket`,文件句柄 `fd://socketfd` 或 tcp 套接字 `tcp://[host[:port]]`,默认为 `unix:///var/run/docker.sock`;
|
||||
* `--icc=true|false`:是否启用容器间以及跟 daemon 所在主机的通信。默认为 true。
|
||||
* `--insecure-registry=[]`:允许访问给定的非安全仓库服务;
|
||||
* `--ip=""`:绑定容器端口时候的默认 IP 地址。缺省为 `0.0.0.0`;
|
||||
* `--ip-forward=true|false`:是否检查启动在 Docker 主机上的启用 IP 转发服务,默认开启。注意关闭该选项将不对系统转发能力进行任何检查修改;
|
||||
* `--ip-masq=true|false`:是否进行地址伪装,用于容器访问外部网络,默认开启;
|
||||
* `--iptables=true|false`:是否允许 Docker 添加 iptables 规则。缺省为 true;
|
||||
* `--ipv6=true|false`:是否启用 IPv6 支持,默认关闭;
|
||||
* `-l, --log-level="debug|info|warn|error|fatal"`:指定日志输出级别;
|
||||
* `--label="[]"`:添加指定的键值对标注;
|
||||
* `--log-driver="json-file|syslog|journald|gelf|fluentd|awslogs|splunk|etwlogs|gcplogs|none"`:指定日志后端驱动,默认为 `json-file`;
|
||||
* `--log-opt=[]`:日志后端的选项;
|
||||
* `--mtu=VALUE`:指定容器网络的 `mtu`;
|
||||
* `-p=""`:指定 daemon 的 PID 文件路径。缺省为 `/var/run/docker.pid`;
|
||||
* `--raw-logs`:输出原始,未加色彩的日志信息;
|
||||
* `--registry-mirror=<scheme>://<host>`:指定 `docker pull` 时使用的注册服务器镜像地址;
|
||||
* `-s, --storage-driver=""`:指定使用给定的存储后端;
|
||||
* `--selinux-enabled=true|false`:是否启用 SELinux 支持。缺省值为 false。SELinux 目前尚不支持 overlay 存储驱动;
|
||||
* `--storage-opt=[]`:驱动后端选项;
|
||||
* `--tls=true|false`:是否对 Docker daemon 启用 TLS 安全机制,默认为否;
|
||||
* `--tlscacert=/.docker/ca.pem`:TLS CA 签名的可信证书文件路径;
|
||||
* `--tlscert=/.docker/cert.pem`:TLS 可信证书文件路径;
|
||||
* `--tlscert=/.docker/key.pem`:TLS 密钥文件路径;
|
||||
* `--tlsverify=true|false`:启用 TLS 校验,默认为否;
|
||||
* `--userland-proxy=true|false`:是否使用用户态代理来实现容器间和出容器的回环通信,默认为 true;
|
||||
* `--userns-remap=default|uid:gid|user:group|user|uid`:指定容器的用户命名空间,默认是创建新的 UID 和 GID 映射到容器内进程。
|
||||
|
||||
## 参考
|
||||
|
||||
* [官方文档](https://docs.docker.com/engine/reference/commandline/dockerd/)
|
|
@ -0,0 +1,42 @@
|
|||
# 如何调试 Docker
|
||||
|
||||
## 开启 Debug 模式
|
||||
|
||||
在 dockerd 配置文件 daemon.json(默认位于 /etc/docker/)中添加
|
||||
|
||||
```json
|
||||
{
|
||||
"debug": true
|
||||
}
|
||||
```
|
||||
|
||||
重启守护进程。
|
||||
|
||||
```bash
|
||||
$ sudo kill -SIGHUP $(pidof dockerd)
|
||||
```
|
||||
|
||||
此时 dockerd 会在日志中输入更多信息供分析。
|
||||
|
||||
## 检查内核日志
|
||||
|
||||
```bash
|
||||
$ sudo dmesg |grep dockerd
|
||||
$ sudo dmesg |grep runc
|
||||
```
|
||||
|
||||
## Docker 不响应时处理
|
||||
|
||||
可以杀死 dockerd 进程查看其堆栈调用情况。
|
||||
|
||||
```bash
|
||||
$ sudo kill -SIGUSR1 $(pidof dockerd)
|
||||
```
|
||||
|
||||
## 重置 Docker 本地数据
|
||||
|
||||
*注意,本操作会移除所有的 Docker 本地数据,包括镜像和容器等。*
|
||||
|
||||
```bash
|
||||
$ sudo rm -rf /var/lib/docker
|
||||
```
|
|
@ -12,13 +12,13 @@
|
|||
|
||||
### 本地的镜像文件都存放在哪里?
|
||||
|
||||
答:与 Docker 相关的本地资源都存放在 `/var/lib/docker/` 目录下,以 `aufs` 文件系统为例,其中 `container` 目录存放容器信息,`graph` 目录存放镜像信息,`aufs` 目录下存放具体的镜像层文件。
|
||||
答:与 Docker 相关的本地资源默认存放在 `/var/lib/docker/` 目录下,以 `overlay2` 文件系统为例,其中 `containers` 目录存放容器信息,`image` 目录存放镜像信息,`overlay2` 目录下存放具体的镜像层文件。
|
||||
|
||||
### 构建 Docker 镜像应该遵循哪些原则?
|
||||
|
||||
答:整体原则上,尽量保持镜像功能的明确和内容的精简,要点包括
|
||||
|
||||
* 尽量选取满足需求但较小的基础系统镜像,例如大部分时候可以选择 debian:wheezy 或 debian:jessie 镜像,仅有不足百兆大小;
|
||||
* 尽量选取满足需求但较小的基础系统镜像,例如大部分时候可以选择 `alpine` 镜像,仅有不足六兆大小;
|
||||
|
||||
* 清理编译生成文件、安装包的缓存等临时文件;
|
||||
|
||||
|
@ -30,7 +30,7 @@
|
|||
|
||||
* 使用 Dockerfile 创建镜像时候要添加 .dockerignore 文件或使用干净的工作目录。
|
||||
|
||||
更多内容请查看 [Dockerfile 最佳实践](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/)
|
||||
更多内容请查看 [Dockerfile 最佳实践](../best_practices.md)
|
||||
|
||||
### 碰到网络问题,无法 pull 镜像,命令行指定 http_proxy 无效?
|
||||
|
||||
|
@ -38,13 +38,13 @@
|
|||
|
||||
## 容器相关
|
||||
|
||||
### 容器退出后,通过 docker ps 命令查看不到,数据会丢失么?
|
||||
### 容器退出后,通过 docker container ls 命令查看不到,数据会丢失么?
|
||||
|
||||
答:容器退出后会处于终止(exited)状态,此时可以通过 `docker ps -a` 查看。其中的数据也不会丢失,还可以通过 `docker start` 命令来启动它。只有删除掉容器才会清除所有数据。
|
||||
答:容器退出后会处于终止(exited)状态,此时可以通过 `docker container ls -a` 查看。其中的数据也不会丢失,还可以通过 `docker start` 命令来启动它。只有删除掉容器才会清除所有数据。
|
||||
|
||||
### 如何停止所有正在运行的容器?
|
||||
|
||||
答:可以使用 `docker kill $(docker ps -q)` 命令。
|
||||
答:可以使用 `docker stop $(docker container ls -q)` 命令。
|
||||
|
||||
### 如何批量清理已经停止的容器?
|
||||
|
||||
|
@ -52,11 +52,18 @@
|
|||
|
||||
### 如何获取某个容器的 PID 信息?
|
||||
|
||||
答:可以使用 `docker inspect --format '{{ .State.Pid }}' <CONTAINER ID or NAME>` 命令。
|
||||
答:可以使用
|
||||
|
||||
```bash
|
||||
docker inspect --format '{{ .State.Pid }}' <CONTAINER ID or NAME>
|
||||
```
|
||||
|
||||
### 如何获取某个容器的 IP 地址?
|
||||
|
||||
答:可以使用 `docker inspect --format '{{ .NetworkSettings.IPAddress }}' <CONTAINER ID or NAME>` 命令
|
||||
答:可以使用
|
||||
```bash
|
||||
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <CONTAINER ID or NAME>
|
||||
```
|
||||
|
||||
### 如何给容器指定一个固定 IP 地址,而不是每次重启容器 IP 地址都会变?
|
||||
|
||||
|
@ -82,7 +89,7 @@ $ docker run --network=my-net --ip=172.25.3.3 -itd --name=my-container busybox
|
|||
|
||||
### 可以在一个容器中同时运行多个应用进程么?
|
||||
|
||||
答:一般并不推荐在同一个容器内运行多个应用进程。如果有类似需求,可以通过一些额外的进程管理机制,比如 `supervisord` 来管理所运行的进程。可以参考 https://docs.docker.com/engine/admin/multi-service_container/ 。
|
||||
答:一般并不推荐在同一个容器内运行多个应用进程。如果有类似需求,可以通过一些额外的进程管理机制,比如 `supervisord` 来管理所运行的进程。可以参考 https://docs.docker.com/config/containers/multi-service_container/ 。
|
||||
|
||||
### 如何控制容器占用系统资源(CPU、内存)的份额?
|
||||
|
||||
|
@ -100,12 +107,12 @@ $ docker run --network=my-net --ip=172.25.3.3 -itd --name=my-container busybox
|
|||
|
||||
### Docker 的配置文件放在哪里,如何修改配置?
|
||||
|
||||
答:使用 `upstart` 的系统(如 Ubuntu 14.04)的配置文件在 `/etc/default/docker`,使用 `systemd` 的系统(如 Ubuntu 16.04、Centos 等)的配置文件在 `/etc/docker/daemon.json`。
|
||||
答:使用 `systemd` 的系统(如 Ubuntu 16.04、Centos 等)的配置文件在 `/etc/docker/daemon.json`。
|
||||
|
||||
|
||||
### 如何更改 Docker 的默认存储位置?
|
||||
|
||||
答:Docker 的默认存储位置是 `/var/lib/docker`,如果希望将 Docker 的本地文件存储到其他分区,可以使用 Linux 软连接的方式来完成,或者在启动 daemon 时通过 `-g` 参数指定。
|
||||
答:Docker 的默认存储位置是 `/var/lib/docker`,如果希望将 Docker 的本地文件存储到其他分区,可以使用 Linux 软连接的方式来完成,或者在启动 daemon 时通过 `-g` 参数指定,或者修改配置文件 `/etc/docker/daemon.json` 的 "data-root" 项 。可以使用 `docker system info | grep "Root Dir"` 查看当前使用的存储位置。
|
||||
|
||||
例如,如下操作将默认存储位置迁移到 /storage/docker。
|
||||
|
||||
|
@ -126,7 +133,7 @@ lrwxrwxrwx. 1 root root 15 11月 17 13:43 docker -> /storage/docker
|
|||
[root@s26 lib]# service docker start
|
||||
```
|
||||
|
||||
### 使用内存和 swap 限制启动容器时候报警告:“WARNING: Your kernel does not support cgroup swap limit. WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.”?
|
||||
### 使用内存和 swap 限制启动容器时候报警告:"WARNING: Your kernel does not support cgroup swap limit. WARNING: Your kernel does not support swap limit capabilities. Limitation discarded."?
|
||||
|
||||
答:这是因为系统默认没有开启对内存和 swap 使用的统计功能,引入该功能会带来性能的下降。要开启该功能,可以采取如下操作:
|
||||
|
||||
|
@ -142,7 +149,7 @@ lrwxrwxrwx. 1 root root 15 11月 17 13:43 docker -> /storage/docker
|
|||
|
||||
答:LXC 利用 Linux 上相关技术实现了容器。Docker 则在如下的几个方面进行了改进:
|
||||
* 移植性:通过抽象容器配置,容器可以实现从一个平台移植到另一个平台;
|
||||
* 镜像系统:基于 AUFS 的镜像系统为容器的分发带来了很多的便利,同时共同的镜像层只需要存储一份,实现高效率的存储;
|
||||
* 镜像系统:基于 OverlayFS 的镜像系统为容器的分发带来了很多的便利,同时共同的镜像层只需要存储一份,实现高效率的存储;
|
||||
* 版本管理:类似于Git的版本管理理念,用户可以更方便的创建、管理镜像文件;
|
||||
* 仓库系统:仓库系统大大降低了镜像的分发和管理的成本;
|
||||
* 周边工具:各种现有工具(配置管理、云平台)对 Docker 的支持,以及基于 Docker的 PaaS、CI 等系统,让 Docker 的应用更加方便和多样化。
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
## [CentOS](https://store.docker.com/images/centos/)
|
||||
# [CentOS](https://hub.docker.com/_/centos)
|
||||
|
||||
### 基本信息
|
||||
## 基本信息
|
||||
|
||||
[CentOS](https://en.wikipedia.org/wiki/CentOS) 是流行的 Linux 发行版,其软件包大多跟 RedHat 系列保持一致。
|
||||
|
||||
该仓库位于 https://store.docker.com/images/centos/ ,提供了 CentOS 从 5 ~ 7 各个版本的镜像。
|
||||
该仓库位于 `https://hub.docker.com/_/centos` ,提供了 CentOS 从 5 ~ 8 各个版本的镜像。
|
||||
|
||||
### 使用方法
|
||||
## 使用方法
|
||||
|
||||
默认会启动一个最小化的 CentOS 环境。
|
||||
|
||||
|
@ -15,6 +15,6 @@ $ docker run --name centos -it centos bash
|
|||
bash-4.2#
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
## Dockerfile
|
||||
|
||||
请到 https://github.com/docker-library/docs/tree/master/centos 查看。
|
||||
|
|
|
@ -0,0 +1,58 @@
|
|||
# minio
|
||||
|
||||
**MinIO** 是一个基于 Apache License v2.0 开源协议的对象存储服务。它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几 kb 到最大 5T 不等。
|
||||
|
||||
MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。
|
||||
|
||||
[官方文档](https://docs.min.io/)
|
||||
|
||||
## 简单使用
|
||||
|
||||
测试、开发环境下不考虑数据存储的情况下可以使用下面的命令快速开启服务。
|
||||
|
||||
```bash
|
||||
$ docker run -d -p 9000:9000 -p 9090:9090 minio/minio server /data --console-address ':9090'
|
||||
```
|
||||
|
||||
## 离线部署
|
||||
|
||||
许多生产环境是一般是没有公网资源的,这就需要从有公网资源的服务器上把镜像导出,然后导入到需要运行镜像的内网服务器。
|
||||
|
||||
### 导出镜像
|
||||
|
||||
在有公网资源的服务器上下载好`minio/minio`镜像
|
||||
|
||||
```bash
|
||||
$ docker save -o minio.tar minio/minio:latest
|
||||
```
|
||||
|
||||
> 使用docker save 的时候,也可以使用image id 来导出,但是那样导出的时候,就会丢失原来的镜像名称,推荐,还是使用镜像名字+tag来导出镜像
|
||||
|
||||
### 导入镜像
|
||||
|
||||
把压缩文件复制到内网服务器上,使用下面的命令导入镜像
|
||||
|
||||
```bash
|
||||
$ docker load minio.tar
|
||||
```
|
||||
|
||||
### 运行 minio
|
||||
|
||||
- 把 `/mnt/data` 改成要替换的数据目录
|
||||
- 替换 `MINIO_ROOT_USER` 的值
|
||||
- 替换 `MINIO_ROOT_PASSWORD` 的值
|
||||
- 替换 name,minio1(可选)
|
||||
- 如果 9000、9090 端口冲突,替换端口前面的如 `9009:9000`
|
||||
|
||||
```bash
|
||||
$ sudo docker run -d -p 9000:9000 -p 9090:9090 --name minio1 \
|
||||
-e "MINIO_ROOT_USER=改成自己需要的" \
|
||||
-e "MINIO_ROOT_PASSWORD=改成自己需要的" \
|
||||
-v /mnt/data:/data \
|
||||
--restart=always \
|
||||
minio/minio server /data --console-address ':9090'
|
||||
```
|
||||
|
||||
### 访问 web 管理页面
|
||||
|
||||
http://x.x.x.x:9090
|
|
@ -1,12 +1,12 @@
|
|||
## [MongoDB](https://store.docker.com/images/mongo/)
|
||||
# [MongoDB](https://hub.docker.com/_/mongo/)
|
||||
|
||||
### 基本信息
|
||||
## 基本信息
|
||||
|
||||
[MongoDB](https://en.wikipedia.org/wiki/MongoDB) 是开源的 NoSQL 数据库实现。
|
||||
|
||||
该仓库位于 https://store.docker.com/images/mongo/ ,提供了 MongoDB 2.x ~ 3.x 各个版本的镜像。
|
||||
该仓库位于 `https://hub.docker.com/_/mongo/` ,提供了 MongoDB 2.x ~ 4.x 各个版本的镜像。
|
||||
|
||||
### 使用方法
|
||||
## 使用方法
|
||||
|
||||
默认会在 `27017` 端口启动数据库。
|
||||
|
||||
|
@ -29,6 +29,6 @@ $ docker run -it --rm \
|
|||
sh -c 'exec mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/test"'
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
## Dockerfile
|
||||
|
||||
请到 https://github.com/docker-library/docs/tree/master/mongo 查看。
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
## [MySQL](https://store.docker.com/images/mysql/)
|
||||
# [MySQL](https://hub.docker.com/_/mysql/)
|
||||
|
||||
### 基本信息
|
||||
## 基本信息
|
||||
|
||||
[MySQL](https://en.wikipedia.org/wiki/MySQL) 是开源的关系数据库实现。
|
||||
|
||||
该仓库位于 https://store.docker.com/images/mysql/ ,提供了 MySQL 5.5 ~ 8.x 各个版本的镜像。
|
||||
该仓库位于 `https://hub.docker.com/_/mysql/` ,提供了 MySQL 5.5 ~ 8.x 各个版本的镜像。
|
||||
|
||||
### 使用方法
|
||||
## 使用方法
|
||||
|
||||
默认会在 `3306` 端口启动数据库。
|
||||
|
||||
|
@ -20,7 +20,7 @@ $ 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`。
|
||||
或者通过 `mysql` 命令行连接。
|
||||
|
||||
```bash
|
||||
$ docker run -it --rm \
|
||||
|
@ -29,6 +29,6 @@ $ docker run -it --rm \
|
|||
sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
## Dockerfile
|
||||
|
||||
请到 https://github.com/docker-library/docs/tree/master/mysql 查看
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
## [Nginx](https://store.docker.com/images/nginx/)
|
||||
# [Nginx](https://hub.docker.com/_/nginx/)
|
||||
|
||||
### 基本信息
|
||||
## 基本信息
|
||||
|
||||
[Nginx](https://en.wikipedia.org/wiki/Nginx) 是开源的高效的 Web 服务器实现,支持 HTTP、HTTPS、SMTP、POP3、IMAP 等协议。
|
||||
|
||||
该仓库位于 https://store.docker.com/images/nginx/ ,提供了 Nginx 1.0 ~ 1.13.x 各个版本的镜像。
|
||||
该仓库位于 `https://hub.docker.com/_/nginx/` ,提供了 Nginx 1.0 ~ 1.19.x 各个版本的镜像。
|
||||
|
||||
### 使用方法
|
||||
## 使用方法
|
||||
|
||||
下面的命令将作为一个静态页面服务器启动。
|
||||
|
||||
|
@ -16,7 +16,7 @@ $ docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d ngin
|
|||
|
||||
用户也可以不使用这种映射方式,通过利用 Dockerfile 来直接将静态页面内容放到镜像中,内容为
|
||||
|
||||
```bash
|
||||
```docker
|
||||
FROM nginx
|
||||
COPY static-html-directory /usr/share/nginx/html
|
||||
```
|
||||
|
@ -39,10 +39,11 @@ Nginx的默认配置文件路径为 `/etc/nginx/nginx.conf`,可以通过映射
|
|||
```bash
|
||||
$ docker run -d \
|
||||
--name some-nginx \
|
||||
-v /some/nginx.conf:/etc/nginx/nginx.conf:ro \
|
||||
-p 8080:80 \
|
||||
-v /path/nginx.conf:/etc/nginx/nginx.conf:ro \
|
||||
nginx
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
## Dockerfile
|
||||
|
||||
请到 https://github.com/docker-library/docs/tree/master/nginx 查看。
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
## [Node.js](https://store.docker.com/images/node/)
|
||||
# [Node.js](https://hub.docker.com/_/node/)
|
||||
|
||||
### 基本信息
|
||||
## 基本信息
|
||||
|
||||
[Node.js](https://en.wikipedia.org/wiki/Node.js) 是基于 JavaScript 的可扩展服务端和网络软件开发平台。
|
||||
|
||||
该仓库位于 https://store.docker.com/images/node/ ,提供了 Node.js 0.10 ~ 9.x 各个版本的镜像。
|
||||
该仓库位于 `https://hub.docker.com/_/node/` ,提供了 Node.js 0.10 ~ 14.x 各个版本的镜像。
|
||||
|
||||
### 使用方法
|
||||
## 使用方法
|
||||
|
||||
在项目中创建一个 Dockerfile。
|
||||
|
||||
```bash
|
||||
FROM node:9
|
||||
```docker
|
||||
FROM node:12
|
||||
# replace this with your application's default port
|
||||
EXPOSE 8888
|
||||
```
|
||||
|
@ -31,10 +31,10 @@ $ docker run -it --rm \
|
|||
# -v "$(pwd)":/usr/src/myapp \
|
||||
--mount type=bind,src=`$(pwd)`,target=/usr/src/myapp \
|
||||
-w /usr/src/myapp \
|
||||
node:9-alpine \
|
||||
node:12-alpine \
|
||||
node your-daemon-or-script.js
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
## Dockerfile
|
||||
|
||||
请到 https://github.com/docker-library/docs/tree/master/node 查看。
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
# [PHP](https://hub.docker.com/_/php/)
|
||||
|
||||
## 基本信息
|
||||
|
||||
[PHP](https://en.wikipedia.org/wiki/Php)(Hypertext Preprocessor 超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML 中,尤其适合 web 开发。
|
||||
|
||||
该仓库位于 `https://hub.docker.com/_/php/` ,提供了 PHP 5.x ~ 8.x 各个版本的镜像。
|
||||
|
||||
## 使用方法
|
||||
|
||||
下面的命令将运行一个已有的 PHP 脚本。
|
||||
|
||||
```bash
|
||||
$ docker run -it --rm -v "$PWD":/app -w /app php:alpine php your-script.php
|
||||
```
|
||||
|
||||
## Dockerfile
|
||||
|
||||
请到 https://github.com/docker-library/docs/tree/master/php 查看。
|
|
@ -1,23 +1,23 @@
|
|||
## [Redis](https://store.docker.com/images/redis/)
|
||||
# [Redis](https://hub.docker.com/_/redis/)
|
||||
|
||||
### 基本信息
|
||||
## 基本信息
|
||||
|
||||
[Redis](https://en.wikipedia.org/wiki/Redis) 是开源的内存 Key-Value 数据库实现。
|
||||
|
||||
该仓库位于 https://store.docker.com/images/redis/ ,提供了 Redis 3.x ~ 4.x 各个版本的镜像。
|
||||
该仓库位于 `https://hub.docker.com/_/redis/` ,提供了 Redis 3.x ~ 6.x 各个版本的镜像。
|
||||
|
||||
### 使用方法
|
||||
## 使用方法
|
||||
|
||||
默认会在 `6379` 端口启动数据库。
|
||||
|
||||
```bash
|
||||
$ docker run --name some-redis -d redis
|
||||
$ docker run --name some-redis -d -p 6379:6379 redis
|
||||
```
|
||||
|
||||
另外还可以启用 [持久存储](http://redis.io/topics/persistence)。
|
||||
另外还可以启用 [持久存储](https://redis.io/topics/persistence)。
|
||||
|
||||
```bash
|
||||
$ docker run --name some-redis -d redis redis-server --appendonly yes
|
||||
$ docker run --name some-redis -d -p 6379:6379 redis redis-server --appendonly yes
|
||||
```
|
||||
|
||||
默认数据存储位置在 `VOLUME/data`。可以使用 `--volumes-from some-volume-container` 或 `-v /docker/host/dir:/data` 将数据存放到本地。
|
||||
|
@ -37,6 +37,6 @@ $ docker run -it --rm \
|
|||
sh -c 'exec redis-cli -h "$REDIS_PORT_6379_TCP_ADDR" -p "$REDIS_PORT_6379_TCP_PORT"'
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
## Dockerfile
|
||||
|
||||
请到 https://github.com/docker-library/docs/tree/master/redis 查看。
|
||||
|
|
|
@ -1,20 +1,20 @@
|
|||
## [Ubuntu](https://store.docker.com/images/ubuntu/)
|
||||
# [Ubuntu](https://hub.docker.com/_/ubuntu/)
|
||||
|
||||
### 基本信息
|
||||
## 基本信息
|
||||
|
||||
[Ubuntu](https://en.wikipedia.org/wiki/Ubuntu) 是流行的 Linux 发行版,其自带软件版本往往较新一些。
|
||||
|
||||
该仓库位于 https://store.docker.com/images/ubuntu/ ,提供了 Ubuntu 从 12.04 ~ 18.04 各个版本的镜像。
|
||||
该仓库位于 `https://hub.docker.com/_/ubuntu/` ,提供了 Ubuntu 从 12.04 ~ 20.04 各个版本的镜像。
|
||||
|
||||
### 使用方法
|
||||
## 使用方法
|
||||
|
||||
默认会启动一个最小化的 Ubuntu 环境。
|
||||
|
||||
```bash
|
||||
$ docker run --name some-ubuntu -it ubuntu:17.10
|
||||
$ docker run --name some-ubuntu -it ubuntu:20.04
|
||||
root@523c70904d54:/#
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
## Dockerfile
|
||||
|
||||
请到 https://github.com/docker-library/docs/tree/master/ubuntu 查看。
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
## [WordPress](https://store.docker.com/images/wordpress/)
|
||||
# [WordPress](https://hub.docker.com/_/wordpress/)
|
||||
|
||||
### 基本信息
|
||||
## 基本信息
|
||||
|
||||
[WordPress](https://en.wikipedia.org/wiki/WordPress) 是开源的 Blog 和内容管理系统框架,它基于 PHP 和 MySQL。
|
||||
|
||||
该仓库位于 https://store.docker.com/images/wordpress/ ,提供了 WordPress 4.x 版本的镜像。
|
||||
该仓库位于 `https://hub.docker.com/_/wordpress/` ,提供了 WordPress 4.x ~ 5.x 版本的镜像。
|
||||
|
||||
### 使用方法
|
||||
## 使用方法
|
||||
|
||||
启动容器需要 MySQL 的支持,默认端口为 `80`。
|
||||
|
||||
|
@ -20,6 +20,6 @@ $ docker run --name some-wordpress --link some-mysql:mysql -d wordpress
|
|||
* `WORDPRESS_DB_PASSWORD` 缺省为连接 mysql 容器的环境变量 `MYSQL_ROOT_PASSWORD` 的值
|
||||
* `WORDPRESS_DB_NAME` 缺省为 `wordpress`
|
||||
|
||||
### Dockerfile
|
||||
## Dockerfile
|
||||
|
||||
请到 https://github.com/docker-library/docs/tree/master/wordpress 查看。
|
||||
|
|
|
@ -3,12 +3,11 @@
|
|||
## 官方网站
|
||||
|
||||
* Docker 官方主页:https://www.docker.com
|
||||
* Docker 官方博客:https://blog.docker.com/
|
||||
* Docker 官方博客:https://www.docker.com/blog/
|
||||
* Docker 官方文档:https://docs.docker.com/
|
||||
* Docker Store:https://store.docker.com
|
||||
* Docker Cloud:https://cloud.docker.com
|
||||
* Docker Hub:https://hub.docker.com
|
||||
* Docker 的源代码仓库:https://github.com/moby/moby
|
||||
* Docker 路线图 https://github.com/docker/roadmap/projects
|
||||
* Docker 发布版本历史:https://docs.docker.com/release-notes/
|
||||
* Docker 常见问题:https://docs.docker.com/engine/faq/
|
||||
* Docker 远端应用 API:https://docs.docker.com/develop/sdk/
|
|
@ -1,5 +0,0 @@
|
|||
# Docker 中文资源
|
||||
|
||||
* [Docker 问答录(100 问)](https://blog.lab99.org/post/docker-2016-07-14-faq.html)
|
||||
|
||||
* [Docker CE 变更日志中文翻译](https://github.com/allencloud/docker-changelog-chinese)
|
|
@ -0,0 +1,7 @@
|
|||
# 归档项目
|
||||
|
||||
以下项目不被官方支持或内容陈旧,将在下一版本中删除(或已经删除)。
|
||||
|
||||
* [Docker Machine](https://github.com/yeasy/docker_practice/tree/ca29ab51b121f43563f5d6659dedbda5cb6f048d/machine)
|
||||
* [Docker Swarm](https://github.com/yeasy/docker_practice/tree/ca29ab51b121f43563f5d6659dedbda5cb6f048d/swarm)
|
||||
* Mesos
|
|
@ -1,7 +1,8 @@
|
|||
# 基本概念
|
||||
Docker 包括三个基本概念
|
||||
* 镜像(`Image`)
|
||||
* 容器(`Container`)
|
||||
* 仓库(`Repository`)
|
||||
|
||||
理解了这三个概念,就理解了 Docker 的整个生命周期。
|
||||
**Docker** 包括三个基本概念
|
||||
* **镜像**(`Image`)
|
||||
* **容器**(`Container`)
|
||||
* **仓库**(`Repository`)
|
||||
|
||||
理解了这三个概念,就理解了 **Docker** 的整个生命周期。
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
## Docker 容器
|
||||
# Docker 容器
|
||||
|
||||
镜像(`Image`)和容器(`Container`)的关系,就像是面向对象程序设计中的 `类` 和 `实例` 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
|
||||
|
||||
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 [命名空间](https://en.wikipedia.org/wiki/Linux_namespaces)。因此容器可以拥有自己的 `root` 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会混淆容器和虚拟机。
|
||||
|
||||
前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为**容器存储层**。
|
||||
前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为 **容器存储层**。
|
||||
|
||||
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
|
||||
|
||||
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 [数据卷(Volume)](../data_management/volume.md)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
|
||||
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 [数据卷(Volume)](../data_management/volume.md)、或者 [绑定宿主目录](../data_management/bind-mounts.md),在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
|
||||
|
||||
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
## Docker 镜像
|
||||
# Docker 镜像
|
||||
|
||||
我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 `root` 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 `root` 文件系统。比如官方镜像 `ubuntu:16.04` 就包含了完整的一套 Ubuntu 16.04 最小系统的 `root` 文件系统。
|
||||
我们都知道,操作系统分为 **内核** 和 **用户空间**。对于 `Linux` 而言,内核启动后,会挂载 `root` 文件系统为其提供用户空间支持。而 **Docker 镜像**(`Image`),就相当于是一个 `root` 文件系统。比如官方镜像 `ubuntu:18.04` 就包含了完整的一套 Ubuntu 18.04 最小系统的 `root` 文件系统。
|
||||
|
||||
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
|
||||
**Docker 镜像** 是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像 **不包含** 任何动态数据,其内容在构建之后也不会被改变。
|
||||
|
||||
### 分层存储
|
||||
## 分层存储
|
||||
|
||||
因为镜像包含操作系统完整的 `root` 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 [Union FS](https://en.wikipedia.org/wiki/Union_mount) 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
|
||||
因为镜像包含操作系统完整的 `root` 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 [Union FS](https://en.wikipedia.org/wiki/Union_mount) 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 `ISO` 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
|
||||
|
||||
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
|
||||
|
||||
|
|
|
@ -1,29 +1,29 @@
|
|||
## Docker Registry
|
||||
# Docker Registry
|
||||
|
||||
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,[Docker Registry](../repository/registry.md) 就是这样的服务。
|
||||
|
||||
一个 **Docker Registry** 中可以包含多个**仓库**(`Repository`);每个仓库可以包含多个**标签**(`Tag`);每个标签对应一个镜像。
|
||||
一个 **Docker Registry** 中可以包含多个 **仓库**(`Repository`);每个仓库可以包含多个 **标签**(`Tag`);每个标签对应一个镜像。
|
||||
|
||||
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 `<仓库名>:<标签>` 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 `latest` 作为默认标签。
|
||||
|
||||
以 [Ubuntu 镜像](https://store.docker.com/images/ubuntu) 为例,`ubuntu` 是仓库的名字,其内包含有不同的版本标签,如,`14.04`, `16.04`。我们可以通过 `ubuntu:14.04`,或者 `ubuntu:16.04` 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 `ubuntu`,那将视为 `ubuntu:latest`。
|
||||
以 [Ubuntu 镜像](https://hub.docker.com/_/ubuntu) 为例,`ubuntu` 是仓库的名字,其内包含有不同的版本标签,如,`16.04`, `18.04`。我们可以通过 `ubuntu:16.04`,或者 `ubuntu:18.04` 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 `ubuntu`,那将视为 `ubuntu:latest`。
|
||||
|
||||
仓库名经常以 *两段式路径* 形式出现,比如 `jwilder/nginx-proxy`,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。
|
||||
|
||||
### Docker Registry 公开服务
|
||||
## Docker Registry 公开服务
|
||||
|
||||
Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
|
||||
|
||||
最常使用的 Registry 公开服务是官方的 [Docker Hub](https://hub.docker.com/),这也是默认的 Registry,并拥有大量的高质量的官方镜像。除此以外,还有 [CoreOS](https://coreos.com/) 的 [Quay.io](https://quay.io/repository/),CoreOS 相关的镜像存储在这里;Google 的 [Google Container Registry](https://cloud.google.com/container-registry/),[Kubernetes](http://kubernetes.io/) 的镜像使用的就是这个服务。
|
||||
最常使用的 Registry 公开服务是官方的 [Docker Hub](https://hub.docker.com/),这也是默认的 Registry,并拥有大量的高质量的 [官方镜像](https://hub.docker.com/search?q=&type=image&image_filter=official)。除此以外,还有 Red Hat 的 [Quay.io](https://quay.io/repository/);Google 的 [Google Container Registry](https://cloud.google.com/container-registry/),[Kubernetes](https://kubernetes.io/) 的镜像使用的就是这个服务;代码托管平台 [GitHub](https://github.com) 推出的 [ghcr.io](https://docs.github.com/cn/packages/working-with-a-github-packages-registry/working-with-the-container-registry)。
|
||||
|
||||
由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务(`Registry Mirror`),这些镜像服务被称为**加速器**。常见的有 [阿里云加速器](https://cr.console.aliyun.com/#/accelerator)、[DaoCloud 加速器](https://www.daocloud.io/mirror#accelerator-doc) 等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从 Docker Hub 下载速度会提高很多。在 [安装 Docker](../install/mirror.md) 一节中有详细的配置方法。
|
||||
由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务(`Registry Mirror`),这些镜像服务被称为 **加速器**。常见的有 [阿里云加速器](https://www.aliyun.com/product/acr?source=5176.11533457&userCode=8lx5zmtu)、[DaoCloud 加速器](https://www.daocloud.io/mirror#accelerator-doc) 等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从 Docker Hub 下载速度会提高很多。在 [安装 Docker](../install/mirror.md) 一节中有详细的配置方法。
|
||||
|
||||
国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 [时速云镜像仓库](https://hub.tenxcloud.com/)、[网易云镜像服务](https://c.163.com/hub#/m/library/)、[DaoCloud 镜像市场](https://hub.daocloud.io/)、[阿里云镜像库](https://cr.console.aliyun.com) 等。
|
||||
国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 [网易云镜像服务](https://c.163.com/hub#/m/library/)、[DaoCloud 镜像市场](https://hub.daocloud.io/)、[阿里云镜像库](https://www.aliyun.com/product/acr?source=5176.11533457&userCode=8lx5zmtu) 等。
|
||||
|
||||
### 私有 Docker Registry
|
||||
## 私有 Docker Registry
|
||||
|
||||
除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 [Docker Registry](https://store.docker.com/images/registry/) 镜像,可以直接使用做为私有 Registry 服务。在 [私有仓库](../repository/registry.md) 一节中,会有进一步的搭建私有 Registry 服务的讲解。
|
||||
除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 [Docker Registry](https://hub.docker.com/_/registry/) 镜像,可以直接使用做为私有 Registry 服务。在 [私有仓库](../repository/registry.md) 一节中,会有进一步的搭建私有 Registry 服务的讲解。
|
||||
|
||||
开源的 Docker Registry 镜像只提供了 [Docker Registry API](https://docs.docker.com/registry/spec/api/) 的服务端实现,足以支持 `docker` 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。在官方的商业化版本 [Docker Trusted Registry](https://docs.docker.com/datacenter/dtr/2.0/) 中,提供了这些高级功能。
|
||||
开源的 Docker Registry 镜像只提供了 [Docker Registry API](https://docs.docker.com/registry/spec/api/) 的服务端实现,足以支持 `docker` 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。
|
||||
|
||||
除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,[VMWare Harbor](https://github.com/vmware/harbor) 和 [Sonatype Nexus](https://www.sonatype.com/docker)。
|
||||
除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,[Harbor](https://github.com/goharbor/harbor) 和 [Sonatype Nexus](../repository/nexus3_registry.md)。
|
||||
|
|
20
bin/offline
20
bin/offline
|
@ -1,20 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
if [ -f offline ];then echo "请在项目根目录执行 $0"; exit 1; fi
|
||||
|
||||
command -v docker-compose > /dev/null 2>&1
|
||||
|
||||
if [ $? != 0 ];then echo "请安装 docker-compose"; exit 1; fi
|
||||
|
||||
if [ "$1" = update ];then
|
||||
status=`git status -s`
|
||||
if [ -z "$status" ];then
|
||||
git fetch --depth=1 origin master
|
||||
git reset --hard origin/master
|
||||
else
|
||||
echo "您已修改项目,请提交或恢复原状!"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
docker-compose up server
|
|
@ -11,7 +11,7 @@
|
|||
"-livereload",
|
||||
"image-captions",
|
||||
"github",
|
||||
"page-treeview",
|
||||
"page-treeview@2.9.8",
|
||||
"editlink"
|
||||
],
|
||||
"pluginsConfig": {
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
# Docker Buildx
|
||||
|
||||
Docker Buildx 是一个 docker CLI 插件,其扩展了 docker 命令,支持 [Moby BuildKit](buildkit.md) 提供的功能。提供了与 docker build 相同的用户体验,并增加了许多新功能。
|
||||
|
||||
> 该功能仅适用于 Docker v19.03+ 版本
|
|
@ -0,0 +1,154 @@
|
|||
# 使用 `BuildKit` 构建镜像
|
||||
|
||||
**BuildKit** 是下一代的镜像构建组件,在 https://github.com/moby/buildkit 开源。
|
||||
|
||||
**注意:如果您的镜像构建使用的是云服务商提供的镜像构建服务(腾讯云容器服务、阿里云容器服务等),由于上述服务提供商的 Docker 版本低于 18.09,BuildKit 无法使用,将造成镜像构建失败。建议使用 BuildKit 构建镜像时使用一个新的 Dockerfile 文件(例如 Dockerfile.buildkit)**
|
||||
|
||||
目前,Docker Hub 自动构建已经支持 buildkit,具体请参考 https://github.com/docker-practice/docker-hub-buildx
|
||||
|
||||
## `Dockerfile` 新增指令详解
|
||||
|
||||
启用 `BuildKit` 之后,我们可以使用下面几个新的 `Dockerfile` 指令来加快镜像构建。
|
||||
|
||||
### `RUN --mount=type=cache`
|
||||
|
||||
目前,几乎所有的程序都会使用依赖管理工具,例如 `Go` 中的 `go mod`、`Node.js` 中的 `npm` 等等,当我们构建一个镜像时,往往会重复的从互联网中获取依赖包,难以缓存,大大降低了镜像的构建效率。
|
||||
|
||||
例如一个前端工程需要用到 `npm`:
|
||||
|
||||
```docker
|
||||
FROM node:alpine as builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY package.json /app/
|
||||
|
||||
RUN npm i --registry=https://registry.npm.taobao.org \
|
||||
&& rm -rf ~/.npm
|
||||
|
||||
COPY src /app/src
|
||||
|
||||
RUN npm run build
|
||||
|
||||
FROM nginx:alpine
|
||||
|
||||
COPY --from=builder /app/dist /app/dist
|
||||
```
|
||||
|
||||
使用多阶段构建,构建的镜像中只包含了目标文件夹 `dist`,但仍然存在一些问题,当 `package.json` 文件变动时,`RUN npm i && rm -rf ~/.npm` 这一层会重新执行,变更多次后,生成了大量的中间层镜像。
|
||||
|
||||
为解决这个问题,进一步的我们可以设想一个类似 **数据卷** 的功能,在镜像构建时把 `node_modules` 文件夹挂载上去,在构建完成后,这个 `node_modules` 文件夹会自动卸载,实际的镜像中并不包含 `node_modules` 这个文件夹,这样我们就省去了每次获取依赖的时间,大大增加了镜像构建效率,同时也避免了生成了大量的中间层镜像。
|
||||
|
||||
`BuildKit` 提供了 `RUN --mount=type=cache` 指令,可以实现上边的设想。
|
||||
|
||||
```docker
|
||||
# syntax = docker/dockerfile:experimental
|
||||
FROM node:alpine as builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY package.json /app/
|
||||
|
||||
RUN --mount=type=cache,target=/app/node_modules,id=my_app_npm_module,sharing=locked \
|
||||
--mount=type=cache,target=/root/.npm,id=npm_cache \
|
||||
npm i --registry=https://registry.npm.taobao.org
|
||||
|
||||
COPY src /app/src
|
||||
|
||||
RUN --mount=type=cache,target=/app/node_modules,id=my_app_npm_module,sharing=locked \
|
||||
# --mount=type=cache,target=/app/dist,id=my_app_dist,sharing=locked \
|
||||
npm run build
|
||||
|
||||
FROM nginx:alpine
|
||||
|
||||
# COPY --from=builder /app/dist /app/dist
|
||||
|
||||
# 为了更直观的说明 from 和 source 指令,这里使用 RUN 指令
|
||||
RUN --mount=type=cache,target=/tmp/dist,from=builder,source=/app/dist \
|
||||
# --mount=type=cache,target/tmp/dist,from=my_app_dist,sharing=locked \
|
||||
mkdir -p /app/dist && cp -r /tmp/dist/* /app/dist
|
||||
```
|
||||
|
||||
**由于 `BuildKit` 为实验特性,每个 `Dockerfile` 文件开头都必须加上如下指令**
|
||||
|
||||
```docker
|
||||
# syntax = docker/dockerfile:experimental
|
||||
```
|
||||
|
||||
第一个 `RUN` 指令执行后,`id` 为 `my_app_npm_module` 的缓存文件夹挂载到了 `/app/node_modules` 文件夹中。多次执行也不会产生多个中间层镜像。
|
||||
|
||||
第二个 `RUN` 指令执行时需要用到 `node_modules` 文件夹,`node_modules` 已经挂载,命令也可以正确执行。
|
||||
|
||||
第三个 `RUN` 指令将上一阶段产生的文件复制到指定位置,`from` 指明缓存的来源,这里 `builder` 表示缓存来源于构建的第一阶段,`source` 指明缓存来源的文件夹。
|
||||
|
||||
上面的 `Dockerfile` 中 `--mount=type=cache,...` 中指令作用如下:
|
||||
|
||||
|Option |Description|
|
||||
|---------------------|-----------|
|
||||
|`id` | `id` 设置一个标志,以便区分缓存。|
|
||||
|`target` (必填项) | 缓存的挂载目标文件夹。|
|
||||
|`ro`,`readonly` | 只读,缓存文件夹不能被写入。 |
|
||||
|`sharing` | 有 `shared` `private` `locked` 值可供选择。`sharing` 设置当一个缓存被多次使用时的表现,由于 `BuildKit` 支持并行构建,当多个步骤使用同一缓存时(同一 `id`)会发生冲突。`shared` 表示多个步骤可以同时读写,`private` 表示当多个步骤使用同一缓存时,每个步骤使用不同的缓存,`locked` 表示当一个步骤完成释放缓存后,后一个步骤才能继续使用该缓存。|
|
||||
|`from` | 缓存来源(构建阶段),不填写时为空文件夹。|
|
||||
|`source` | 来源的文件夹路径。|
|
||||
|
||||
### `RUN --mount=type=bind`
|
||||
|
||||
该指令可以将一个镜像(或上一构建阶段)的文件挂载到指定位置。
|
||||
|
||||
```docker
|
||||
# syntax = docker/dockerfile:experimental
|
||||
RUN --mount=type=bind,from=php:alpine,source=/usr/local/bin/docker-php-entrypoint,target=/docker-php-entrypoint \
|
||||
cat /docker-php-entrypoint
|
||||
```
|
||||
|
||||
### `RUN --mount=type=tmpfs`
|
||||
|
||||
该指令可以将一个 `tmpfs` 文件系统挂载到指定位置。
|
||||
|
||||
```docker
|
||||
# syntax = docker/dockerfile:experimental
|
||||
RUN --mount=type=tmpfs,target=/temp \
|
||||
mount | grep /temp
|
||||
```
|
||||
|
||||
### `RUN --mount=type=secret`
|
||||
|
||||
该指令可以将一个文件(例如密钥)挂载到指定位置。
|
||||
|
||||
```docker
|
||||
# syntax = docker/dockerfile:experimental
|
||||
RUN --mount=type=secret,id=aws,target=/root/.aws/credentials \
|
||||
cat /root/.aws/credentials
|
||||
```
|
||||
|
||||
```bash
|
||||
$ docker build -t test --secret id=aws,src=$HOME/.aws/credentials .
|
||||
```
|
||||
|
||||
### `RUN --mount=type=ssh`
|
||||
|
||||
该指令可以挂载 `ssh` 密钥。
|
||||
|
||||
```docker
|
||||
# syntax = docker/dockerfile:experimental
|
||||
FROM alpine
|
||||
RUN apk add --no-cache openssh-client
|
||||
RUN mkdir -p -m 0700 ~/.ssh && ssh-keyscan gitlab.com >> ~/.ssh/known_hosts
|
||||
RUN --mount=type=ssh ssh git@gitlab.com | tee /hello
|
||||
```
|
||||
|
||||
```bash
|
||||
$ eval $(ssh-agent)
|
||||
$ ssh-add ~/.ssh/id_rsa
|
||||
(Input your passphrase here)
|
||||
$ docker build -t test --ssh default=$SSH_AUTH_SOCK .
|
||||
```
|
||||
|
||||
## docker-compose build 使用 Buildkit
|
||||
|
||||
设置 `COMPOSE_DOCKER_CLI_BUILD=1` 环境变量即可使用。
|
||||
|
||||
## 官方文档
|
||||
|
||||
* https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md
|
|
@ -0,0 +1,17 @@
|
|||
# 使用 Buildx 构建镜像
|
||||
|
||||
## 使用
|
||||
|
||||
你可以直接使用 `docker buildx build` 命令构建镜像。
|
||||
|
||||
```bash
|
||||
$ docker buildx build .
|
||||
[+] Building 8.4s (23/32)
|
||||
=> ...
|
||||
```
|
||||
|
||||
Buildx 使用 [BuildKit 引擎](buildkit.md) 进行构建,支持许多新的功能,具体参考 [Buildkit](buildkit.md) 一节。
|
||||
|
||||
## 官方文档
|
||||
|
||||
* https://docs.docker.com/engine/reference/commandline/buildx/
|
|
@ -0,0 +1,126 @@
|
|||
# 使用 buildx 构建多种系统架构支持的 Docker 镜像
|
||||
|
||||
在之前的版本中构建多种系统架构支持的 Docker 镜像,要想使用统一的名字必须使用 [`$ docker manifest`](../image/manifest.md) 命令。
|
||||
|
||||
在 Docker 19.03+ 版本中可以使用 `$ docker buildx build` 命令使用 `BuildKit` 构建镜像。该命令支持 `--platform` 参数可以同时构建支持多种系统架构的 Docker 镜像,大大简化了构建步骤。
|
||||
|
||||
## 新建 `builder` 实例
|
||||
|
||||
Docker for Linux 不支持构建 `arm` 架构镜像,我们可以运行一个新的容器让其支持该特性,Docker 桌面版无需进行此项设置。
|
||||
|
||||
```bash
|
||||
$ docker run --rm --privileged tonistiigi/binfmt:latest --install all
|
||||
```
|
||||
|
||||
由于 Docker 默认的 `builder` 实例不支持同时指定多个 `--platform`,我们必须首先创建一个新的 `builder` 实例。同时由于国内拉取镜像较缓慢,我们可以使用配置了 [镜像加速地址](https://github.com/moby/buildkit/blob/master/docs/buildkitd.toml.md) 的 [`dockerpracticesig/buildkit:master`](https://github.com/docker-practice/buildx) 镜像替换官方镜像。
|
||||
|
||||
> 如果你有私有的镜像加速器,可以基于 https://github.com/docker-practice/buildx 构建自己的 buildkit 镜像并使用它。
|
||||
|
||||
```bash
|
||||
# 适用于国内环境
|
||||
$ docker buildx create --use --name=mybuilder-cn --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master
|
||||
|
||||
# 适用于腾讯云环境(腾讯云主机、coding.net 持续集成)
|
||||
$ docker buildx create --use --name=mybuilder-cn --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master-tencent
|
||||
|
||||
# $ docker buildx create --name mybuilder --driver docker-container
|
||||
|
||||
$ docker buildx use mybuilder
|
||||
```
|
||||
|
||||
## 构建镜像
|
||||
|
||||
新建 Dockerfile 文件。
|
||||
|
||||
```docker
|
||||
FROM --platform=$TARGETPLATFORM alpine
|
||||
|
||||
RUN uname -a > /os.txt
|
||||
|
||||
CMD cat /os.txt
|
||||
```
|
||||
|
||||
使用 `$ docker buildx build` 命令构建镜像,注意将 `myusername` 替换为自己的 Docker Hub 用户名。
|
||||
|
||||
`--push` 参数表示将构建好的镜像推送到 Docker 仓库。
|
||||
|
||||
```bash
|
||||
$ docker buildx build --platform linux/arm,linux/arm64,linux/amd64 -t myusername/hello . --push
|
||||
|
||||
# 查看镜像信息
|
||||
$ docker buildx imagetools inspect myusername/hello
|
||||
```
|
||||
|
||||
在不同架构运行该镜像,可以得到该架构的信息。
|
||||
|
||||
```bash
|
||||
# arm
|
||||
$ docker run -it --rm myusername/hello
|
||||
Linux buildkitsandbox 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 armv7l Linux
|
||||
|
||||
# arm64
|
||||
$ docker run -it --rm myusername/hello
|
||||
Linux buildkitsandbox 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 aarch64 Linux
|
||||
|
||||
# amd64
|
||||
$ docker run -it --rm myusername/hello
|
||||
Linux buildkitsandbox 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 x86_64 Linux
|
||||
```
|
||||
|
||||
## 架构相关变量
|
||||
|
||||
`Dockerfile` 支持如下架构相关的变量
|
||||
|
||||
**TARGETPLATFORM**
|
||||
|
||||
构建镜像的目标平台,例如 `linux/amd64`, `linux/arm/v7`, `windows/amd64`。
|
||||
|
||||
**TARGETOS**
|
||||
|
||||
`TARGETPLATFORM` 的 OS 类型,例如 `linux`, `windows`
|
||||
|
||||
**TARGETARCH**
|
||||
|
||||
`TARGETPLATFORM` 的架构类型,例如 `amd64`, `arm`
|
||||
|
||||
**TARGETVARIANT**
|
||||
|
||||
`TARGETPLATFORM` 的变种,该变量可能为空,例如 `v7`
|
||||
|
||||
**BUILDPLATFORM**
|
||||
|
||||
构建镜像主机平台,例如 `linux/amd64`
|
||||
|
||||
**BUILDOS**
|
||||
|
||||
`BUILDPLATFORM` 的 OS 类型,例如 `linux`
|
||||
|
||||
**BUILDARCH**
|
||||
|
||||
`BUILDPLATFORM` 的架构类型,例如 `amd64`
|
||||
|
||||
**BUILDVARIANT**
|
||||
|
||||
`BUILDPLATFORM` 的变种,该变量可能为空,例如 `v7`
|
||||
|
||||
### 使用举例
|
||||
|
||||
例如我们要构建支持 `linux/arm/v7` 和 `linux/amd64` 两种架构的镜像。假设已经生成了两个平台对应的二进制文件:
|
||||
|
||||
* `bin/dist-linux-arm`
|
||||
* `bin/dist-linux-amd64`
|
||||
|
||||
那么 `Dockerfile` 可以这样书写:
|
||||
|
||||
```docker
|
||||
FROM scratch
|
||||
|
||||
# 使用变量必须申明
|
||||
ARG TARGETOS
|
||||
|
||||
ARG TARGETARCH
|
||||
|
||||
COPY bin/dist-${TARGETOS}-${TARGETARCH} /dist
|
||||
|
||||
ENTRYPOINT ["dist"]
|
||||
```
|
Binary file not shown.
Before Width: | Height: | Size: 86 KiB |
|
@ -1,7 +1,7 @@
|
|||
# CI/CD
|
||||
|
||||
持续集成(Continuous integration)是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
|
||||
**持续集成(Continuous integration)** 是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
|
||||
|
||||
持续部署(continuous deployment)是通过自动化的构建、测试和部署循环来快速交付高质量的产品。
|
||||
**持续部署(continuous deployment)** 是通过自动化的构建、测试和部署循环来快速交付高质量的产品。
|
||||
|
||||
与 `Jenkins` 不同的是,基于 Docker 的 CI/CD 每一步都运行在 Docker 镜像中,所以理论上支持所有的编程语言。
|
||||
与 `Jenkins` 不同的是,基于 Docker 的 CI/CD 每一步都运行在 Docker 容器中,所以理论上支持所有的编程语言。
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
# GitHub Actions
|
||||
|
||||
GitHub [Actions](https://github.com/features/actions) 是 GitHub 推出的一款 CI/CD 工具。
|
||||
|
||||
我们可以在每个 `job` 的 `step` 中使用 Docker 执行构建步骤。
|
||||
|
||||
```yaml
|
||||
on: push
|
||||
|
||||
name: CI
|
||||
|
||||
jobs:
|
||||
my-job:
|
||||
name: Build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@master
|
||||
with:
|
||||
fetch-depth: 2
|
||||
- name: run docker container
|
||||
uses: docker://golang:alpine
|
||||
with:
|
||||
args: go version
|
||||
```
|
||||
|
||||
## 参考资料
|
||||
|
||||
* [Actions Docs](https://docs.github.com/en/actions)
|
|
@ -1,17 +0,0 @@
|
|||
workspace:
|
||||
base: /srv/drone-demo
|
||||
path: .
|
||||
|
||||
pipeline:
|
||||
build:
|
||||
image: golang:alpine
|
||||
# pull: true
|
||||
environment:
|
||||
- KEY=VALUE
|
||||
secrets: [key1, key2]
|
||||
commands:
|
||||
# - echo $$KEY
|
||||
- pwd
|
||||
- ls
|
||||
- CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
|
||||
- ./app
|
|
@ -1,35 +0,0 @@
|
|||
version: '3'
|
||||
services:
|
||||
|
||||
drone-server:
|
||||
image: drone/drone:0.8-alpine
|
||||
ports:
|
||||
- 443:443
|
||||
# - "${PRO_PUBLIC_IP}:8000:8000"
|
||||
volumes:
|
||||
- drone-data:/var/lib/drone/:rw
|
||||
# - ${SSL_PATH}:/etc/certs
|
||||
restart: always
|
||||
environment:
|
||||
- DRONE_SECRET=drone
|
||||
- DRONE_OPEN=false
|
||||
- DRONE_ADMIN=GITHUB_SERNAME
|
||||
- DRONE_HOST=https://drone.yeasy.com
|
||||
- DRONE_GITHUB=true
|
||||
- DRONE_GITHUB_CLIENT=${DRONE_GITHUB_CLIENT_PRO}
|
||||
- DRONE_GITHUB_SECRET=${DRONE_GITHUB_SECRET_PRO}
|
||||
|
||||
drone-agent:
|
||||
image: drone/agent:0.8-alpine
|
||||
restart: always
|
||||
depends_on:
|
||||
- drone-server
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:rw
|
||||
environment:
|
||||
- DRONE_SECRET=drone
|
||||
- DRONE_SERVER=drone-server:9000
|
||||
dns: 114.114.114.114
|
||||
|
||||
volumes:
|
||||
drone-data:
|
|
@ -1,183 +0,0 @@
|
|||
## Drone
|
||||
|
||||
基于 `Docker` 的 `CI/CD` 工具 `Drone` 所有编译、测试的流程都在 `Docker` 容器中进行。
|
||||
|
||||
开发者只需在项目中包含 `.drone.yml` 文件,将代码推送到 git 仓库,`Drone` 就能够自动化的进行编译、测试、发布。
|
||||
|
||||
本小节以 `GitHub` + `Drone` 来演示 `Drone` 的工作流程。当然在实际开发过程中,你的代码也许不在 GitHub 托管,那么你可以尝试使用 `Gogs` + `Drone` 来进行 `CI/CD`。
|
||||
|
||||
### 要求
|
||||
|
||||
* 拥有公网 IP、域名 (如果你不满足要求,可以尝试在本地使用 Gogs + Drone)
|
||||
|
||||
* 域名 SSL 证书 (目前国内有很多云服务商提供免费证书)
|
||||
|
||||
* 熟悉 `Docker` 以及 `Docker Compose`
|
||||
|
||||
* 熟悉 `Git` 基本命令
|
||||
|
||||
* 对 `CI/CD` 有一定了解
|
||||
|
||||
### 新建 GitHub 应用
|
||||
|
||||
登录 GitHub,在 https://github.com/settings/applications/new 新建一个应用。
|
||||
|
||||
![](../.image/drone-github.png)
|
||||
|
||||
接下来查看这个应用的详情,记录 `Client ID` 和 `Client Secret`,之后配置 Drone 会用到。
|
||||
|
||||
### 配置 Drone
|
||||
|
||||
我们通过使用 `Docker Compose` 来启动 `Drone`,编写 `docker-compose.yml` 文件。
|
||||
|
||||
```yaml
|
||||
version: '3'
|
||||
services:
|
||||
|
||||
drone-server:
|
||||
image: drone/drone:0.8-alpine
|
||||
ports:
|
||||
- 443:443
|
||||
# - "${PRO_PUBLIC_IP}:8000:8000"
|
||||
volumes:
|
||||
- drone-data:/var/lib/drone/:rw
|
||||
- ${SSL_PATH}:/etc/certs:rw
|
||||
restart: always
|
||||
environment:
|
||||
- DRONE_SECRET=drone
|
||||
- DRONE_OPEN=false
|
||||
- DRONE_ADMIN=${GITHUB_SERNAME}
|
||||
- DRONE_HOST=${DRONE_HOST}
|
||||
- DRONE_GITHUB=true
|
||||
- DRONE_GITHUB_CLIENT=${DRONE_GITHUB_CLIENT}
|
||||
- DRONE_GITHUB_SECRET=${DRONE_GITHUB_SECRET}
|
||||
- DRONE_SERVER_CERT=/etc/certs/drone.domain.com.crt
|
||||
- DRONE_SERVER_KEY=/etc/certs/drone.domain.com.key
|
||||
|
||||
drone-agent:
|
||||
image: drone/agent:0.8-alpine
|
||||
restart: always
|
||||
depends_on:
|
||||
- drone-server
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:rw
|
||||
environment:
|
||||
- DRONE_SECRET=drone
|
||||
- DRONE_SERVER=drone-server:9000
|
||||
dns: 114.114.114.114
|
||||
|
||||
volumes:
|
||||
drone-data:
|
||||
```
|
||||
|
||||
替换 `${SSL_PATH}` 为你网站的 SSL 证书路径。
|
||||
|
||||
替换 `${GITHUB_SERNAME}` 为你 GitHub 的用户名,该用户将成为 Drone 的管理员。
|
||||
|
||||
替换 `${DRONE_HOST}` 为你部署 Drone 的域名。
|
||||
|
||||
替换 `${DRONE_GITHUB_CLIENT}` 为你 GitHub 应用的 `Client ID`
|
||||
|
||||
替换 `${DRONE_GITHUB_SECRET}` 为你 GitHub 应用的 `Client Secret`
|
||||
|
||||
*注意:* 如果你的服务器占用了 `443` 端口,请配置 Nginx 代理,这里不再赘述。
|
||||
|
||||
#### 启动 Drone
|
||||
|
||||
```bash
|
||||
$ docker-compose up -d
|
||||
```
|
||||
|
||||
### Drone 关联项目
|
||||
|
||||
在 Github 新建一个名为 `drone-demo` 的仓库。
|
||||
|
||||
打开我们已经部署好的 Drone 网站,使用 GitHub 账号登录,在界面中关联刚刚新建的 `drone-demo` 仓库。
|
||||
|
||||
### 编写项目源代码
|
||||
|
||||
在本机初始化一个 git 仓库
|
||||
|
||||
```bash
|
||||
$ mkdir drone-demo
|
||||
|
||||
$ cd drone-demo
|
||||
|
||||
$ git init
|
||||
|
||||
$ git remote add origin git@github.com/username/drone-demo.git
|
||||
```
|
||||
|
||||
这里以一个简单的 `Go` 程序为例,该程序输出 `Hello World!`
|
||||
|
||||
编写 `app.go` 文件
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main(){
|
||||
fmt.Printf("Hello World!");
|
||||
}
|
||||
```
|
||||
|
||||
编写 `.drone.yml` 文件
|
||||
|
||||
```yaml
|
||||
workspace:
|
||||
base: /srv/drone-demo
|
||||
path: .
|
||||
|
||||
pipeline:
|
||||
build:
|
||||
image: golang:alpine
|
||||
# pull: true
|
||||
environment:
|
||||
- KEY=VALUE
|
||||
secrets: [key1, key2]
|
||||
commands:
|
||||
- echo $$KEY
|
||||
- pwd
|
||||
- ls
|
||||
- CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
|
||||
- ./app
|
||||
```
|
||||
|
||||
`workspace` 指明 git 源代码克隆的目标路径,本例中 git 源代码将被克隆到 golang 容器中的 `/srv/drone-demo` 目录中。
|
||||
|
||||
`pipeline` 指明构建所需的 Docker 镜像,环境变量,编译指令等。
|
||||
|
||||
现在目录结构如下
|
||||
|
||||
```bash
|
||||
.
|
||||
├── .drone.yml
|
||||
└── app.go
|
||||
```
|
||||
|
||||
### 推送项目源代码到 GitHub
|
||||
|
||||
```bash
|
||||
$ git add .
|
||||
|
||||
$ git commit -m "test drone ci"
|
||||
|
||||
$ git push origin master
|
||||
```
|
||||
|
||||
### 查看项目构建过程及结果
|
||||
|
||||
打开我们部署好的 `Drone` 网站,即可看到构建结果。
|
||||
|
||||
![](../.image/drone-build.png)
|
||||
|
||||
当然我们也可以把构建结果上传到 GitHub,Docker Registry,云服务商提供的对象存储,或者生产环境中。
|
||||
|
||||
本书 GitBook 也使用 Drone 进行 CI/CD,具体配置信息请查看本书根目录 [`.drone.yml`](https://github.com/yeasy/docker_practice/blob/master/.drone.yml) 文件。
|
||||
|
||||
## 参考链接
|
||||
|
||||
* [Drone Github](https://github.com/drone/drone)
|
||||
|
||||
* [Drone 文档](http://docs.drone.io/)
|
|
@ -0,0 +1,6 @@
|
|||
DRONE_SERVER_HOST=
|
||||
DRONE_SERVER_PROTO=
|
||||
DRONE_RPC_SECRET=
|
||||
HOSTNAME=
|
||||
DRONE_GITHUB_CLIENT_ID=
|
||||
DRONE_GITHUB_CLIENT_SECRET=
|
|
@ -0,0 +1,2 @@
|
|||
.env
|
||||
ssl/*
|
|
@ -0,0 +1,99 @@
|
|||
# Drone
|
||||
|
||||
基于 `Docker` 的 `CI/CD` 工具 `Drone` 所有编译、测试的流程都在 `Docker` 容器中进行。
|
||||
|
||||
开发者只需在项目中包含 `.drone.yml` 文件,将代码推送到 git 仓库,`Drone` 就能够自动化的进行编译、测试、发布。
|
||||
|
||||
本小节以 `GitHub` + `Drone` 来演示 `Drone` 的工作流程。当然在实际开发过程中,你的代码也许不在 GitHub 托管,那么你可以尝试使用 `Gogs` + `Drone` 来进行 `CI/CD`。
|
||||
|
||||
## Drone 关联项目
|
||||
|
||||
在 Github 新建一个名为 `drone-demo` 的仓库。
|
||||
|
||||
打开我们已经 [部署好的 Drone 网站](install.md) 或者 [Drone Cloud](https://cloud.drone.io),使用 GitHub 账号登录,在界面中关联刚刚新建的 `drone-demo` 仓库。
|
||||
|
||||
## 编写项目源代码
|
||||
|
||||
初始化一个 git 仓库
|
||||
|
||||
```bash
|
||||
$ mkdir drone-demo
|
||||
|
||||
$ cd drone-demo
|
||||
|
||||
$ git init
|
||||
|
||||
$ git remote add origin git@github.com:username/drone-demo.git
|
||||
```
|
||||
|
||||
这里以一个简单的 `Go` 程序为例,该程序输出 `Hello World!`
|
||||
|
||||
编写 `app.go` 文件
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main(){
|
||||
fmt.Printf("Hello World!\n");
|
||||
}
|
||||
```
|
||||
|
||||
编写 `.drone.yml` 文件
|
||||
|
||||
```yaml
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: build
|
||||
steps:
|
||||
- name: build
|
||||
image: golang:alpine
|
||||
pull: if-not-exists # always never
|
||||
environment:
|
||||
KEY: VALUE
|
||||
commands:
|
||||
- echo $KEY
|
||||
- pwd
|
||||
- ls
|
||||
- CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
|
||||
- ./app
|
||||
|
||||
trigger:
|
||||
branch:
|
||||
- master
|
||||
```
|
||||
|
||||
现在目录结构如下
|
||||
|
||||
```bash
|
||||
.
|
||||
├── .drone.yml
|
||||
└── app.go
|
||||
```
|
||||
|
||||
## 推送项目源代码到 GitHub
|
||||
|
||||
```bash
|
||||
$ git add .
|
||||
|
||||
$ git commit -m "test drone ci"
|
||||
|
||||
$ git push origin master
|
||||
```
|
||||
|
||||
## 查看项目构建过程及结果
|
||||
|
||||
打开我们部署好的 `Drone` 网站或者 Drone Cloud,即可看到构建结果。
|
||||
|
||||
![](./_images/drone-build.png)
|
||||
|
||||
当然我们也可以把构建结果上传到 GitHub,Docker Registry,云服务商提供的对象存储,或者生产环境中。
|
||||
|
||||
本书 GitBook 也使用 Drone 进行 CI/CD,具体配置信息请查看本书根目录 [`.drone.yml`](https://github.com/yeasy/docker_practice/blob/master/.drone.yml) 文件。
|
||||
|
||||
## 参考链接
|
||||
|
||||
* [Drone Github](https://github.com/drone/drone)
|
||||
* [Drone 文档](https://docs.drone.io/)
|
||||
* [Drone 示例](https://github.com/docker-practice/drone-demo)
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 72 KiB |
|
@ -0,0 +1,19 @@
|
|||
kind: pipeline
|
||||
type: docker
|
||||
name: build
|
||||
steps:
|
||||
- name: build
|
||||
image: golang:alpine
|
||||
pull: if-not-exists # always never
|
||||
environment:
|
||||
KEY: VALUE
|
||||
commands:
|
||||
- echo $KEY
|
||||
- pwd
|
||||
- ls
|
||||
- CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
|
||||
- ./app
|
||||
|
||||
trigger:
|
||||
branch:
|
||||
- master
|
|
@ -0,0 +1 @@
|
|||
# Drone Demo
|
|
@ -3,5 +3,5 @@ package main
|
|||
import "fmt"
|
||||
|
||||
func main(){
|
||||
fmt.Printf("Hello World!");
|
||||
fmt.Printf("Hello World!\n");
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
version: '3'
|
||||
|
||||
services:
|
||||
|
||||
drone-server:
|
||||
image: drone/drone:2.3.1
|
||||
ports:
|
||||
- 443:443
|
||||
- 80:80
|
||||
volumes:
|
||||
- drone-data:/data:rw
|
||||
- ./ssl:/etc/certs
|
||||
restart: always
|
||||
environment:
|
||||
- DRONE_SERVER_HOST=${DRONE_SERVER_HOST:-drone.domain.com}
|
||||
- DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO:-https}
|
||||
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET:-secret}
|
||||
- DRONE_GITHUB_SERVER=https://github.com
|
||||
- DRONE_GITHUB_CLIENT_ID=${DRONE_GITHUB_CLIENT_ID}
|
||||
- DRONE_GITHUB_CLIENT_SECRET=${DRONE_GITHUB_CLIENT_SECRET}
|
||||
|
||||
drone-agent:
|
||||
image: drone/drone-runner-docker:1
|
||||
restart: always
|
||||
depends_on:
|
||||
- drone-server
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:rw
|
||||
environment:
|
||||
- DRONE_RPC_PROTO=http
|
||||
- DRONE_RPC_HOST=drone-server
|
||||
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET:-secret}
|
||||
- DRONE_RUNNER_NAME=${HOSTNAME:-demo}
|
||||
- DRONE_RUNNER_CAPACITY=2
|
||||
dns: 114.114.114.114
|
||||
|
||||
volumes:
|
||||
drone-data:
|
|
@ -0,0 +1,86 @@
|
|||
# 部署 Drone
|
||||
|
||||
## 要求
|
||||
|
||||
* 拥有公网 IP、域名 (如果你不满足要求,可以尝试在本地使用 Gogs + Drone)
|
||||
|
||||
* 域名 SSL 证书 (目前国内有很多云服务商提供免费证书)
|
||||
|
||||
* 熟悉 `Docker` 以及 `Docker Compose`
|
||||
|
||||
* 熟悉 `Git` 基本命令
|
||||
|
||||
* 对 `CI/CD` 有一定了解
|
||||
|
||||
## 新建 GitHub 应用
|
||||
|
||||
登录 GitHub,在 https://github.com/settings/applications/new 新建一个应用。
|
||||
|
||||
![](https://docs.drone.io/screenshots/github_application_create.png)
|
||||
|
||||
接下来查看这个应用的详情,记录 `Client ID` 和 `Client Secret`,之后配置 Drone 会用到。
|
||||
|
||||
## 配置 Drone
|
||||
|
||||
我们通过使用 `Docker Compose` 来启动 `Drone`,编写 `docker-compose.yml` 文件。
|
||||
|
||||
```yaml
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
|
||||
drone-server:
|
||||
image: drone/drone:2.3.1
|
||||
ports:
|
||||
- 443:443
|
||||
- 80:80
|
||||
volumes:
|
||||
- drone-data:/data:rw
|
||||
- ./ssl:/etc/certs
|
||||
restart: always
|
||||
environment:
|
||||
- DRONE_SERVER_HOST=${DRONE_SERVER_HOST:-https://drone.yeasy.com}
|
||||
- DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO:-https}
|
||||
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET:-secret}
|
||||
- DRONE_GITHUB_SERVER=https://github.com
|
||||
- DRONE_GITHUB_CLIENT_ID=${DRONE_GITHUB_CLIENT_ID}
|
||||
- DRONE_GITHUB_CLIENT_SECRET=${DRONE_GITHUB_CLIENT_SECRET}
|
||||
|
||||
drone-agent:
|
||||
image: drone/drone-runner-docker:1
|
||||
restart: always
|
||||
depends_on:
|
||||
- drone-server
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:rw
|
||||
environment:
|
||||
- DRONE_RPC_PROTO=http
|
||||
- DRONE_RPC_HOST=drone-server
|
||||
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET:-secret}
|
||||
- DRONE_RUNNER_NAME=${HOSTNAME:-demo}
|
||||
- DRONE_RUNNER_CAPACITY=2
|
||||
dns: 114.114.114.114
|
||||
|
||||
volumes:
|
||||
drone-data:
|
||||
```
|
||||
|
||||
新建 `.env` 文件,输入变量及其值
|
||||
|
||||
```bash
|
||||
# 必填 服务器地址,例如 drone.domain.com
|
||||
DRONE_SERVER_HOST=
|
||||
DRONE_SERVER_PROTO=https
|
||||
DRONE_RPC_SECRET=secret
|
||||
HOSTNAME=demo
|
||||
# 必填 在 GitHub 应用页面查看
|
||||
DRONE_GITHUB_CLIENT_ID=
|
||||
# 必填 在 GitHub 应用页面查看
|
||||
DRONE_GITHUB_CLIENT_SECRET=
|
||||
```
|
||||
|
||||
### 启动 Drone
|
||||
|
||||
```bash
|
||||
$ docker-compose up -d
|
||||
```
|
|
@ -1,9 +1,9 @@
|
|||
# 操作系统
|
||||
|
||||
目前常用的 Linux 发行版主要包括 Debian/Ubuntu 系列和 CentOS/Fedora 系列。
|
||||
目前常用的 Linux 发行版主要包括 `Debian/Ubuntu` 系列和 `CentOS/Fedora` 系列。
|
||||
|
||||
前者以自带软件包版本较新而出名;后者则宣称运行更稳定一些。选择哪个操作系统取决于读者的具体需求。
|
||||
|
||||
使用 Docker,读者只需要一个命令就能快速获取一个 Linux 发行版镜像,这是以往包括各种虚拟化技术都难以实现的。这些镜像一般都很精简,但是可以支持完整 Linux 系统的大部分功能。
|
||||
|
||||
本章将介绍如何使用 Docker 安装和使用 Busybox、Alphine、Debian/Ubuntu、CentOS/Fedora 等操作系统。
|
||||
本章将介绍如何使用 Docker 安装和使用 `Busybox`、`Alphine`、`Debian/Ubuntu`、`CentOS/Fedora` 等操作系统。
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
## Alpine
|
||||
# Alpine
|
||||
|
||||
### 简介
|
||||
## 简介
|
||||
|
||||
![Apline Linux 操作系统](_images/alpinelinux-logo.png)
|
||||
![Alpine Linux 操作系统](./_images/alpinelinux-logo.png)
|
||||
|
||||
`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` 项目。
|
||||
`Alpine` Docker 镜像也继承了 `Alpine Linux` 发行版的这些优势。相比于其他 `Docker` 镜像,它的容量非常小,仅仅只有 **5 MB** 左右(对比 `Ubuntu` 系列镜像接近 `200 MB`),且拥有非常友好的包管理机制。官方镜像来自 `docker-alpine` 项目。
|
||||
|
||||
目前 Docker 官方已开始推荐使用 `Alpine` 替代之前的 `Ubuntu` 做为基础镜像环境。这样会带来多个好处。包括镜像下载速度加快,镜像安全性提高,主机之间的切换更方便,占用更少磁盘空间等。
|
||||
|
||||
|
@ -22,7 +22,7 @@ ubuntu latest b39b81afc8ca 188.3 MB
|
|||
centos latest 8efe422e6104 210 MB
|
||||
```
|
||||
|
||||
### 获取并使用官方镜像
|
||||
## 获取并使用官方镜像
|
||||
|
||||
由于镜像很小,下载时间往往很短,读者可以直接使用 `docker run` 指令直接运行一个 `Alpine` 容器,并指定运行的 Linux 指令,例如:
|
||||
|
||||
|
@ -31,17 +31,17 @@ $ docker run alpine echo '123'
|
|||
123
|
||||
```
|
||||
|
||||
### 迁移至 `Alpine` 基础镜像
|
||||
## 迁移至 `Alpine` 基础镜像
|
||||
|
||||
目前,大部分 Docker 官方镜像都已经支持 Alpine 作为基础镜像,可以很容易进行迁移。
|
||||
目前,大部分 Docker 官方镜像都已经支持 `Alpine` 作为基础镜像,可以很容易进行迁移。
|
||||
|
||||
例如:
|
||||
|
||||
* ubuntu/debian -> alpine
|
||||
* python:2.7 -> python:2.7-alpine
|
||||
* ruby:2.3 -> ruby:2.3-alpine
|
||||
* `ubuntu/debian` -> `alpine`
|
||||
* `python:3` -> `python:3-alpine`
|
||||
* `ruby:2.6` -> `ruby:2.6-alpine`
|
||||
|
||||
另外,如果使用 `Alpine` 镜像替换 `Ubuntu` 基础镜像,安装软件包时需要用 apk 包管理器替换 apt 工具,如
|
||||
另外,如果使用 `Alpine` 镜像替换 `Ubuntu` 基础镜像,安装软件包时需要用 `apk` 包管理器替换 `apt` 工具,如
|
||||
|
||||
```bash
|
||||
$ apk add --no-cache <package>
|
||||
|
@ -50,13 +50,20 @@ $ apk add --no-cache <package>
|
|||
`Alpine` 中软件安装包的名字可能会与其他发行版有所不同,可以在 `https://pkgs.alpinelinux.org/packages` 网站搜索并确定安装包名称。如果需要的安装包不在主索引内,但是在测试或社区索引中。那么可以按照以下方法使用这些安装包。
|
||||
|
||||
```bash
|
||||
$ echo "http://dl-4.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
|
||||
$ echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
|
||||
$ apk --update add --no-cache <package>
|
||||
```
|
||||
|
||||
### 相关资源
|
||||
由于在国内访问 `apk` 仓库较缓慢,建议在使用 `apk` 之前先替换仓库地址为国内镜像。
|
||||
|
||||
* `Alpine` 官网:http://alpinelinux.org/
|
||||
```docker
|
||||
RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories \
|
||||
&& apk add --no-cache <package>
|
||||
```
|
||||
|
||||
## 相关资源
|
||||
|
||||
* `Alpine` 官网:https://www.alpinelinux.org/
|
||||
* `Alpine` 官方仓库:https://github.com/alpinelinux
|
||||
* `Alpine` 官方镜像:https://hub.docker.com/_/alpine/
|
||||
* `Alpine` 官方镜像仓库:https://github.com/gliderlabs/docker-alpine
|
||||
|
|
|
@ -1,42 +1,27 @@
|
|||
## Busybox
|
||||
# Busybox
|
||||
|
||||
### 简介
|
||||
## 简介
|
||||
|
||||
![Busybox - Linux 瑞士军刀](_images/busybox-logo.png)
|
||||
![Busybox - Linux 瑞士军刀](./_images/busybox-logo.png)
|
||||
|
||||
BusyBox 是一个集成了一百多个最常用 Linux 命令和工具(如 cat、echo、grep、mount、telnet 等)的精简工具箱,它只需要几 MB 的大小,很方便进行各种快速验证,被誉为“Linux 系统的瑞士军刀”。
|
||||
`BusyBox` 是一个集成了一百多个最常用 Linux 命令和工具(如 `cat`、`echo`、`grep`、`mount`、`telnet` 等)的精简工具箱,它只需要几 MB 的大小,很方便进行各种快速验证,被誉为“Linux 系统的瑞士军刀”。
|
||||
|
||||
BusyBox 可运行于多款 POSIX 环境的操作系统中,如 Linux(包括 Android)、Hurd、FreeBSD 等。
|
||||
`BusyBox` 可运行于多款 `POSIX` 环境的操作系统中,如 `Linux`(包括 `Android`)、`Hurd`、`FreeBSD` 等。
|
||||
|
||||
### 获取官方镜像
|
||||
## 获取官方镜像
|
||||
|
||||
在 Docker Hub 中搜索 busybox 相关的镜像。
|
||||
|
||||
```bash
|
||||
$ 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`:
|
||||
可以使用 `docker pull` 指令下载 `busybox:latest` 镜像:
|
||||
|
||||
```bash
|
||||
$ 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
|
||||
latest: Pulling from library/busybox
|
||||
5c4213be9af9: Pull complete
|
||||
Digest: sha256:c6b45a95f932202dbb27c31333c4789f45184a744060f6e569cc9d2bf1b9ad6f
|
||||
Status: Downloaded newer image for busybox:latest
|
||||
docker.io/library/busybox:latest
|
||||
```
|
||||
|
||||
下载后,可以看到 busybox 镜像只有2.433 MB:
|
||||
下载后,可以看到 `busybox` 镜像只有 **2.433 MB**:
|
||||
|
||||
```bash
|
||||
$ docker image ls
|
||||
|
@ -44,9 +29,9 @@ REPOSITORY TAG IMAGE ID CREATED
|
|||
busybox latest e72ac664f4f0 6 weeks ago 2.433 MB
|
||||
```
|
||||
|
||||
### 运行 busybox
|
||||
## 运行 busybox
|
||||
|
||||
启动一个 busybox 容器,并在容器中执行 grep 命令。
|
||||
启动一个 `busybox` 容器,并在容器中执行 `grep` 命令。
|
||||
|
||||
```bash
|
||||
$ docker run -it busybox
|
||||
|
@ -85,27 +70,44 @@ Search for PATTERN in FILEs (or stdin)
|
|||
|
||||
```bash
|
||||
/ # mount
|
||||
rootfs on / type rootfs (rw)
|
||||
none on / type aufs (rw,relatime,si=b455817946f8505c)
|
||||
overlay on / type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay2/l/BOTCI5RF24AMC4A2UWF4N6ZWFP:/var/lib/docker/overlay2/l/TWVP5T5DMKJGXZOROR7CAPWGFP,upperdir=/var/lib/docker/overlay2/801ef0bf6cce35288dbb8fe00a4f9cc47760444693bfdf339ed0bdcf926e12a3/diff,workdir=/var/lib/docker/overlay2/801ef0bf6cce35288dbb8fe00a4f9cc47760444693bfdf339ed0bdcf926e12a3/work)
|
||||
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)
|
||||
tmpfs on /dev type tmpfs (rw,nosuid,size=65536k,mode=755)
|
||||
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)
|
||||
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,relatime,mode=755)
|
||||
cgroup on /sys/fs/cgroup/systemd type cgroup (ro,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd)
|
||||
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (ro,nosuid,nodev,noexec,relatime,net_cls,net_prio)
|
||||
cgroup on /sys/fs/cgroup/freezer type cgroup (ro,nosuid,nodev,noexec,relatime,freezer)
|
||||
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (ro,nosuid,nodev,noexec,relatime,cpu,cpuacct)
|
||||
cgroup on /sys/fs/cgroup/cpuset type cgroup (ro,nosuid,nodev,noexec,relatime,cpuset)
|
||||
cgroup on /sys/fs/cgroup/blkio type cgroup (ro,nosuid,nodev,noexec,relatime,blkio)
|
||||
cgroup on /sys/fs/cgroup/perf_event type cgroup (ro,nosuid,nodev,noexec,relatime,perf_event)
|
||||
cgroup on /sys/fs/cgroup/memory type cgroup (ro,nosuid,nodev,noexec,relatime,memory)
|
||||
cgroup on /sys/fs/cgroup/devices type cgroup (ro,nosuid,nodev,noexec,relatime,devices)
|
||||
cgroup on /sys/fs/cgroup/pids type cgroup (ro,nosuid,nodev,noexec,relatime,pids)
|
||||
mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime)
|
||||
shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=65536k)
|
||||
/dev/vda1 on /etc/resolv.conf type ext3 (rw,noatime,data=ordered)
|
||||
/dev/vda1 on /etc/hostname type ext3 (rw,noatime,data=ordered)
|
||||
/dev/vda1 on /etc/hosts type ext3 (rw,noatime,data=ordered)
|
||||
devpts on /dev/console type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666)
|
||||
proc on /proc/bus type proc (ro,relatime)
|
||||
proc on /proc/fs type proc (ro,relatime)
|
||||
proc on /proc/irq type proc (ro,relatime)
|
||||
proc on /proc/sys type proc (ro,relatime)
|
||||
proc on /proc/sysrq-trigger type proc (ro,relatime)
|
||||
tmpfs on /proc/acpi type tmpfs (ro,relatime)
|
||||
tmpfs on /proc/kcore type tmpfs (rw,nosuid,size=65536k,mode=755)
|
||||
tmpfs on /proc/keys type tmpfs (rw,nosuid,size=65536k,mode=755)
|
||||
tmpfs on /proc/timer_list type tmpfs (rw,nosuid,size=65536k,mode=755)
|
||||
tmpfs on /proc/sched_debug type tmpfs (rw,nosuid,size=65536k,mode=755)
|
||||
tmpfs on /sys/firmware type tmpfs (ro,relatime)
|
||||
```
|
||||
|
||||
busybox 镜像虽然小巧,但包括了大量常见的 Linux 命令,读者可以用它快速熟悉 Linux 命令。
|
||||
`busybox` 镜像虽然小巧,但包括了大量常见的 `Linux` 命令,读者可以用它快速熟悉 `Linux` 命令。
|
||||
|
||||
### 相关资源
|
||||
## 相关资源
|
||||
|
||||
* `Busybox` 官网:https://busybox.net/
|
||||
* `Busybox` 官方仓库:https://git.busybox.net/busybox/
|
||||
|
|
|
@ -1,57 +1,37 @@
|
|||
## CentOS/Fedora
|
||||
# CentOS/Fedora
|
||||
|
||||
### CentOS 系统简介
|
||||
## CentOS 系统简介
|
||||
|
||||
CentOS 和 Fedora 都是基于 Redhat 的常见 Linux 分支。CentOS 是目前企业级服务器的常用操作系统;Fedora 则主要面向个人桌面用户。
|
||||
`CentOS` 和 `Fedora` 都是基于 `Redhat` 的常见 Linux 分支。`CentOS` 是目前企业级服务器的常用操作系统;`Fedora` 则主要面向个人桌面用户。
|
||||
|
||||
![CentOS 操作系统](_images/centos-logo.png)
|
||||
![CentOS 操作系统](./_images/centos-logo.png)
|
||||
|
||||
CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统),它是基于 Red Hat Enterprise Linux 源代码编译而成。由于 CentOS 与 Redhat Linux 源于相同的代码基础,所以很多成本敏感且需要高稳定性的公司就使用 CentOS 来替代商业版 Red Hat Enterprise Linux。CentOS 自身不包含闭源软件。
|
||||
CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统),它是基于 `Red Hat Enterprise Linux` 源代码编译而成。由于 `CentOS` 与 `Redhat Linux` 源于相同的代码基础,所以很多成本敏感且需要高稳定性的公司就使用 `CentOS` 来替代商业版 `Red Hat Enterprise Linux`。`CentOS` 自身不包含闭源软件。
|
||||
|
||||
#### 使用 CentOS 官方镜像
|
||||
### 使用 CentOS 官方镜像
|
||||
|
||||
首先使用 `docker search` 命令来搜索标星至少为 25 的 CentOS 相关镜像。
|
||||
使用 `docker run` 直接运行 `CentOS 7` 镜像,并登录 `bash`。
|
||||
|
||||
```bash
|
||||
$ 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。
|
||||
|
||||
```bash
|
||||
$ docker run -it centos bash
|
||||
$ docker run -it centos:7 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)
|
||||
CentOS Linux release 7.9.2009 (Core)
|
||||
```
|
||||
|
||||
### Fedora 系统简介
|
||||
## Fedora 系统简介
|
||||
|
||||
![Fedora 操作系统](_images/fedora-logo.png)
|
||||
![Fedora 操作系统](./_images/fedora-logo.png)
|
||||
|
||||
Fedora 由 Fedora Project 社区开发,红帽公司赞助的 Linux 发行版。它的目标是创建一套新颖、多功能并且自由和开源的操作系统。Fedora 的功能对于用户而言,它是一套功能完备的,可以更新的免费操作系统,而对赞助商 Red Hat 而言,它是许多新技术的测试平台。被认为可用的技术最终会加入到 Red Hat Enterprise Linux中。
|
||||
`Fedora` 由 `Fedora Project` 社区开发,红帽公司赞助的 `Linux` 发行版。它的目标是创建一套新颖、多功能并且自由和开源的操作系统。`Fedora` 的功能对于用户而言,它是一套功能完备的,可以更新的免费操作系统,而对赞助商 `Red Hat` 而言,它是许多新技术的测试平台。被认为可用的技术最终会加入到 `Red Hat Enterprise Linux` 中。
|
||||
|
||||
#### 使用 Fedora 官方镜像
|
||||
### 使用 Fedora 官方镜像
|
||||
|
||||
首先使用 `docker search` 命令来搜索标星至少为 2 的 Fedora 相关镜像,结果如下。
|
||||
|
||||
```bash
|
||||
$ 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。
|
||||
使用 `docker run` 命令直接运行 `Fedora` 官方镜像,并登录 `bash`。
|
||||
|
||||
```bash
|
||||
$ docker run -it fedora bash
|
||||
|
@ -64,13 +44,13 @@ Status: Downloaded newer image for fedora:latest
|
|||
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://www.centos.org
|
||||
* `CentOS` 官方仓库:https://github.com/CentOS
|
||||
* `CentOS` 官方镜像:https://hub.docker.com/_/centos/
|
||||
* `CentOS` 官方镜像仓库:https://github.com/CentOS/CentOS-Dockerfiles
|
||||
|
|
|
@ -1,32 +1,20 @@
|
|||
## Debian/Ubuntu
|
||||
Debian 和 Ubuntu 都是目前较为流行的 Debian 系的服务器操作系统,十分适合研发场景。Docker Hub 上提供了官方镜像,国内各大容器云服务也基本都提供了相应的支持。
|
||||
# Debian/Ubuntu
|
||||
|
||||
### Debian 系统简介
|
||||
`Debian` 和 `Ubuntu` 都是目前较为流行的 **Debian 系** 的服务器操作系统,十分适合研发场景。`Docker Hub` 上提供了官方镜像,国内各大容器云服务也基本都提供了相应的支持。
|
||||
|
||||
![Debian 操作系统](_images/debian-logo.png)
|
||||
## Debian 系统简介
|
||||
|
||||
Debian 是由 GPL 和其他自由软件许可协议授权的自由软件组成的操作系统,由Debian 计划(Debian Project)组织维护。Debian 计划是一个独立的、分散的组织,由 3000 人志愿者组成,接受世界多个非盈利组织的资金支持,Software in the Public Interest 提供支持并持有商标作为保护机构。Debian 以其坚守 Unix 和自由软件的精神,以及其给予用户的众多选择而闻名。现时 Debian 包括了超过 25,000 个软件包并支持 12 个计算机系统结构。
|
||||
![Debian 操作系统](./_images/debian-logo.png)
|
||||
|
||||
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 最为著名。
|
||||
`Debian` 是由 `GPL` 和其他自由软件许可协议授权的自由软件组成的操作系统,由 **Debian 计划(Debian Project)** 组织维护。**Debian 计划** 是一个独立的、分散的组织,由 `3000` 人志愿者组成,接受世界多个非盈利组织的资金支持,`Software in the Public Interest` 提供支持并持有商标作为保护机构。`Debian` 以其坚守 `Unix` 和自由软件的精神,以及其给予用户的众多选择而闻名。现时 `Debian` 包括了超过 `25,000` 个软件包并支持 `12` 个计算机系统结构。
|
||||
|
||||
众多的 Linux 发行版,例如 Ubuntu、Knoppix 和 Linspire 及 Xandros 等,都基于 Debian GNU/Linux。
|
||||
`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` 最为著名。
|
||||
|
||||
#### 使用 Debian 官方镜像
|
||||
众多的 `Linux` 发行版,例如 `Ubuntu`、`Knoppix` 和 `Linspire` 及 `Xandros` 等,都基于 `Debian GNU/Linux`。
|
||||
|
||||
读者可以使用 docker search 搜索 Docker Hub,查找 Debian 镜像:
|
||||
### 使用 Debian 官方镜像
|
||||
|
||||
```bash
|
||||
$ 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 镜像。
|
||||
官方提供了大家熟知的 `debian` 镜像以及面向科研领域的 `neurodebian` 镜像。可以使用 `docker run` 直接运行 `Debian` 镜像。
|
||||
|
||||
```bash
|
||||
$ docker run -it debian bash
|
||||
|
@ -34,49 +22,35 @@ root@668e178d8d69:/# cat /etc/issue
|
|||
Debian GNU/Linux 8
|
||||
```
|
||||
|
||||
Debian 镜像很适合作为基础镜像,构建自定义镜像。
|
||||
`Debian` 镜像很适合作为基础镜像,构建自定义镜像。
|
||||
|
||||
### Ubuntu 系统简介
|
||||
## Ubuntu 系统简介
|
||||
|
||||
![Ubuntu 操作系统](_images/ubuntu-logo.jpg)
|
||||
![Ubuntu 操作系统](./_images/ubuntu-logo.jpg)
|
||||
|
||||
Ubuntu 是一个以桌面应用为主的GNU/Linux操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词(官方译名“友帮拓”,另有“吾帮托”、“乌班图”、“有奔头”或“乌斑兔”等译名)。Ubuntu 意思是“人性”以及“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。 Ubuntu 基于 Debian 发行版和 GNOME/Unity 桌面环境,与 Debian 的不同在于它每 6 个月会发布一个新版本,每 2 年推出一个长期支持(Long Term Support,LTS)版本,一般支持 3 年时间。
|
||||
`Ubuntu` 是一个以桌面应用为主的 `GNU/Linux` 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词(官方译名“友帮拓”,另有“吾帮托”、“乌班图”、“有奔头”或“乌斑兔”等译名)。`Ubuntu` 意思是“人性”以及“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。 `Ubuntu` 基于 `Debian` 发行版和 `GNOME/Unity` 桌面环境,与 `Debian` 的不同在于它每 6 个月会发布一个新版本,每 2 年推出一个长期支持 **(Long Term Support,LTS)** 版本,一般支持 3 年时间。
|
||||
|
||||
#### 使用 Ubuntu 官方镜像
|
||||
### 使用 Ubuntu 官方镜像
|
||||
|
||||
Ubuntu 相关的镜像有很多,这里使用 `-s 10` 参数,只搜索那些被收藏 10 次以上的镜像。
|
||||
下面以 `ubuntu:18.04` 为例,演示如何使用该镜像安装一些常用软件。
|
||||
|
||||
首先使用 `-ti` 参数启动容器,登录 `bash`,查看 `ubuntu` 的发行版本号。
|
||||
|
||||
```bash
|
||||
$ 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 的发行版本号。
|
||||
|
||||
```bash
|
||||
$ 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
|
||||
$ docker run -ti ubuntu:18.04 /bin/bash
|
||||
root@7d93de07bf76:/# cat /etc/os-release
|
||||
NAME="Ubuntu"
|
||||
VERSION="18.04.1 LTS (Bionic Beaver)"
|
||||
ID=ubuntu
|
||||
ID_LIKE=debian
|
||||
PRETTY_NAME="Ubuntu 18.04.1 LTS"
|
||||
VERSION_ID="18.04"
|
||||
HOME_URL="https://www.ubuntu.com/"
|
||||
SUPPORT_URL="https://help.ubuntu.com/"
|
||||
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
|
||||
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
|
||||
VERSION_CODENAME=bionic
|
||||
UBUNTU_CODENAME=bionic
|
||||
```
|
||||
|
||||
当试图直接使用 `apt-get` 安装一个软件的时候,会提示 `E: Unable to locate package`。
|
||||
|
@ -89,51 +63,60 @@ Reading state information... Done
|
|||
E: Unable to locate package curl
|
||||
```
|
||||
|
||||
这并非系统不支持 `apt-get` 命令。Docker 镜像在制作时为了精简清除了 apt 仓库信息,因此需要先执行 `apt-get update` 命令来更新仓库信息。更新信息后即可成功通过 apt-get 命令来安装软件。
|
||||
这并非系统不支持 `apt-get` 命令。Docker 镜像在制作时为了精简清除了 `apt` 仓库信息,因此需要先执行 `apt-get update` 命令来更新仓库信息。更新信息后即可成功通过 `apt-get` 命令来安装软件。
|
||||
|
||||
```bash
|
||||
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]
|
||||
...
|
||||
Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
|
||||
Get:2 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
|
||||
Get:3 http://security.ubuntu.com/ubuntu bionic-security/multiverse amd64 Packages [7348 B]
|
||||
Get:4 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [823 kB]
|
||||
Get:5 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
|
||||
Get:6 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
|
||||
Get:7 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages [11.3 MB]
|
||||
Get:8 http://security.ubuntu.com/ubuntu bionic-security/restricted amd64 Packages [31.0 kB]
|
||||
Get:9 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [835 kB]
|
||||
Get:10 http://archive.ubuntu.com/ubuntu bionic/restricted amd64 Packages [13.5 kB]
|
||||
Get:11 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages [1344 kB]
|
||||
Get:12 http://archive.ubuntu.com/ubuntu bionic/multiverse amd64 Packages [186 kB]
|
||||
Get:13 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [1127 kB]
|
||||
Get:14 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [1350 kB]
|
||||
Get:15 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 Packages [11.4 kB]
|
||||
Get:16 http://archive.ubuntu.com/ubuntu bionic-updates/restricted amd64 Packages [44.7 kB]
|
||||
Get:17 http://archive.ubuntu.com/ubuntu bionic-backports/main amd64 Packages [2496 B]
|
||||
Get:18 http://archive.ubuntu.com/ubuntu bionic-backports/universe amd64 Packages [4252 B]
|
||||
Fetched 17.6 MB in 1min 25s (207 kB/s)
|
||||
Reading package lists... Done
|
||||
```
|
||||
|
||||
首先,安装 curl 工具。
|
||||
首先,安装 `curl` 工具。
|
||||
|
||||
```bash
|
||||
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
|
||||
The following additional packages will be installed:
|
||||
ca-certificates krb5-locales libasn1-8-heimdal libcurl4 libgssapi-krb5-2 libgssapi3-heimdal libhcrypto4-heimdal libheimbase1-heimdal libheimntlm0-heimdal libhx509-5-heimdal
|
||||
libk5crypto3 libkeyutils1 libkrb5-26-heimdal libkrb5-3 libkrb5support0 libldap-2.4-2 libldap-common libnghttp2-14 libpsl5 libroken18-heimdal librtmp1 libsasl2-2 libsasl2-modules libsasl2-modules-db libsqlite3-0 libssl1.1 libwind0-heimdal openssl publicsuffix
|
||||
...
|
||||
root@7d93de07bf76:/# curl
|
||||
curl: try 'curl --help' or 'curl --manual' for more information
|
||||
```
|
||||
|
||||
接下来,再安装 apache 服务。
|
||||
接下来,再安装 `apache` 服务。
|
||||
|
||||
```bash
|
||||
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
|
||||
The following additional packages will be installed:
|
||||
apache2-bin apache2-data apache2-utils file libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libexpat1 libgdbm-compat4 libgdbm5 libicu60 liblua5.2-0 libmagic-mgc libmagic1 libperl5.26 libxml2 mime-support netbase perl perl-modules-5.26 ssl-cert xz-utils
|
||||
...
|
||||
```
|
||||
|
||||
启动这个 apache 服务,然后使用 curl 来测试本地访问。
|
||||
启动这个 `apache` 服务,然后使用 `curl` 来测试本地访问。
|
||||
|
||||
```bash
|
||||
root@7d93de07bf76:/# service apache2 start
|
||||
|
@ -145,7 +128,7 @@ root@7d93de07bf76:/# curl 127.0.0.1
|
|||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<!--
|
||||
Modified from the Debian original for Ubuntu
|
||||
Last updated: 2014-03-19
|
||||
Last updated: 2016-11-16
|
||||
See: https://launchpad.net/bugs/1288690
|
||||
-->
|
||||
<head>
|
||||
|
@ -157,14 +140,14 @@ root@7d93de07bf76:/# curl 127.0.0.1
|
|||
|
||||
配合使用 `-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://ubuntu.com
|
||||
* `Ubuntu` 官方仓库:https://github.com/ubuntu
|
||||
* `Ubuntu` 官方镜像:https://hub.docker.com/_/ubuntu/
|
||||
* `Ubuntu` 官方镜像仓库:https://github.com/tianon/docker-brew-ubuntu-core
|
||||
|
|
|
@ -2,10 +2,10 @@
|
|||
|
||||
本章讲解了典型操作系统镜像的下载和使用。
|
||||
|
||||
除了官方的镜像外,在 Docker Hub 上还有许多第三方组织或个人上传的 Docker 镜像。
|
||||
除了官方的镜像外,在 `Docker Hub` 上还有许多第三方组织或个人上传的 Docker 镜像。
|
||||
|
||||
读者可以根据具体情况来选择。一般来说:
|
||||
|
||||
* 官方镜像体积都比较小,只带有一些基本的组件。 精简的系统有利于安全、稳定和高效的运行,也适合进行定制化。
|
||||
* 官方镜像体积都比较小,只带有一些基本的组件。 精简的系统有利于安全、稳定和高效的运行,也适合进行个性化定制。
|
||||
|
||||
* 出于安全考虑,几乎所有官方制作的镜像都没有安装 SSH 服务,无法通过用户名和密码直接登录到容器中。
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
|
||||
Docker 目前已经得到了众多公有云平台的支持,并成为除虚拟机之外的核心云业务。
|
||||
|
||||
除了 AWS、Google、Azure、Docker 官方云服务等,国内的各大公有云厂商,基本上都同时支持了虚拟机服务和容器服务,甚至还专门推出了容器云业务。
|
||||
除了 AWS、Google、Azure 等,国内的各大公有云厂商,基本上都同时支持了虚拟机服务和基于 Kubernetes 的容器云业务。有的还推出了其他服务,例如 [容器镜像服务](https://cloud.tencent.com/act/cps/redirect?redirect=11588&cps_key=3a5255852d5db99dcd5da4c72f05df61) 让用户在云上享有安全高效的镜像托管、分发等服务。
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
## 阿里云
|
||||
# 阿里云
|
||||
|
||||
![阿里云](_images/aliyun-logo.png)
|
||||
![阿里云](./_images/aliyun-logo.png)
|
||||
|
||||
阿里云创立于 2009 年,是中国较早的云计算平台。阿里云致力于提供安全、可靠的计算和数据处理能力。
|
||||
[阿里云](https://www.aliyun.com?source=5176.11533457&userCode=8lx5zmtu&type=copy) 创立于 2009 年,是中国较早的云计算平台。阿里云致力于提供安全、可靠的计算和数据处理能力。
|
||||
|
||||
阿里云的客户群体中,活跃着微博、知乎、魅族、锤子科技、小咖秀等一大批明星互联网公司。在天猫双 11 全球狂欢节等极富挑战的应用场景中,阿里云保持着良好的运行纪录。
|
||||
[阿里云](https://www.aliyun.com?source=5176.11533457&userCode=8lx5zmtu&type=copy) 的客户群体中,活跃着微博、虎牙、魅族、优酷等一大批明星互联网公司。在天猫双 11 全球狂欢节等极富挑战的应用场景中,阿里云保持着良好的运行纪录。
|
||||
|
||||
阿里云容器服务提供了高性能、可伸缩的容器应用管理服务,支持在一组云服务器上通过 Docker 容器来进行应用生命周期管理。容器服务极大简化了用户对容器管理集群的搭建工作,无缝整合了阿里云虚拟化、存储、网络和安全能力。容器服务提供了多种应用发布方式和流水线般的持续交付能力,原生支持微服务架构,助力用户无缝上云和跨云管理。
|
||||
[阿里云容器服务 Kubernetes 版 ACK](https://www.aliyun.com/product/kubernetes?source=5176.11533457&userCode=8lx5zmtu&type=copy) 提供了高性能、可伸缩的容器应用管理服务,支持在一组云服务器上通过 Docker 容器来进行应用生命周期管理。容器服务极大简化了用户对容器管理集群的搭建工作,无缝整合了阿里云虚拟化、存储、网络和安全能力。容器服务提供了多种应用发布方式和流水线般的持续交付能力,原生支持微服务架构,助力用户无缝上云和跨云管理。
|
||||
|
||||
![](https://img.alicdn.com/tps/TB10yjtPpXXXXacXXXXXXXXXXXX-1531-1140.png)
|
||||
|
|
10
cloud/aws.md
10
cloud/aws.md
|
@ -1,13 +1,11 @@
|
|||
## 亚马逊云
|
||||
# 亚马逊云
|
||||
|
||||
![AWS](_images/aws-logo.jpg)
|
||||
![AWS](./_images/aws-logo.jpg)
|
||||
|
||||
AWS,即 Amazon Web Services,是亚马逊(Amazon)公司的 IaaS 和 PaaS 平台服务。AWS 提供了一整套基础设施和应用程序服务,使用户几乎能够在云中运行一切应用程序:从企业应用程序和大数据项目,到社交游戏和移动应用程序。AWS 面向用户提供包括弹性计算、存储、数据库、应用程序在内的一整套云计算服务,能够帮助企业降低 IT 投入成本和维护成本。
|
||||
[AWS](https://www.amazonaws.cn),即 Amazon Web Services,是亚马逊(Amazon)公司的 IaaS 和 PaaS 平台服务。AWS 提供了一整套基础设施和应用程序服务,使用户几乎能够在云中运行一切应用程序:从企业应用程序和大数据项目,到社交游戏和移动应用程序。AWS 面向用户提供包括弹性计算、存储、数据库、应用程序在内的一整套云计算服务,能够帮助企业降低 IT 投入成本和维护成本。
|
||||
|
||||
自 2006 年初起,亚马逊 AWS 开始在云中为各种规模的公司提供技术服务平台。利用亚马逊 AWS,软件开发人员可以轻松购买计算、存储、数据库和其他基于 Internet 的服务来支持其应用程序。开发人员能够灵活选择任何开发平台或编程环境,以便于其尝试解决问题。由于开发人员只需按使用量付费,无需前期资本支出,亚马逊 AWS 是向最终用户交付计算资源、保存的数据和其他应用程序的一种经济划算的方式。
|
||||
|
||||
2015 年 AWS 正式发布了 EC2 容器服务(ECS)。ECS 的目的是让 Docker 容器变的更加简单,它提供了一个集群和编排的层,用来控制主机上的容器部署,以及部署之后的集群内的容器的生命周期管理。ECS 是诸如 Docker Swarm、Kubernetes、Mesos 等工具的替代,它们工作在同一个层,除了作为一个服务来提供。这些工具和 ECS 不同的地方在于,前者需要用户自己来部署和管理,而 ECS 是“作为服务”来提供的。
|
||||
|
||||
|
||||
![AWS 容器服务](_images/ECS.jpg)
|
||||
|
||||
![AWS 容器服务](./_images/ECS.jpg)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
## 简介
|
||||
# 简介
|
||||
|
||||
目前与容器相关的云计算主要分为两种类型。
|
||||
|
||||
一种是传统的 IaaS 服务商提供对容器相关的服务,包括镜像下载、容器托管等。
|
||||
|
||||
另一种是直接基于容器技术对外提供容器云服务,所谓 Container as a Service(CaaS)。
|
||||
另一种是直接基于容器技术对外提供容器云服务,所谓 Container as a Service(CaaS)。
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
## 腾讯云
|
||||
|
||||
![腾讯云](_images/qcloud-logo.jpg)
|
||||
|
||||
腾讯云在架构方面经过多年积累,并且有着多年对海量互联网服务的经验。不管是社交、游戏还是其他领域,都有多年的成熟产品来提供产品服务。腾讯在云端完成重要部署,为开发者及企业提供云服务、云数据、云运营等整体一站式服务方案。
|
||||
|
||||
具体包括云服务器、云存储、云数据库和弹性 web 引擎等基础云服务;腾讯云分析(MTA)、腾讯云推送(信鸽)等腾讯整体大数据能力;以及 QQ互联、QQ 空间、微云、微社区等云端链接社交体系。这些正是腾讯云可以提供给这个行业的差异化优势,造就了可支持各种互联网使用场景的高品质的腾讯云技术平台。
|
||||
|
||||
腾讯云容器服务是高度可扩展的高性能容器管理服务,用户可以在托管的云服务器实例集群上轻松运行应用程序。使用该服务,将无需安装、运维、扩展用户的集群管理基础设施,只需进行简单的API调用,便可启动和停止Docker应用程序,查询集群的完整状态,以及使用各种云服务。用户可以根据用户的资源需求和可用性要求在用户的集群中安排容器的置放,满足业务或应用程序的特定要求。
|
||||
|
||||
![](https://mc.qcloudimg.com/static/img/0581dbeb97c869bbe6e62025dbc592d7/image.png)
|
|
@ -1,4 +1,5 @@
|
|||
## 本章小结
|
||||
# 本章小结
|
||||
|
||||
本章介绍了公有云服务对 Docker 的积极支持,以及新出现的容器云平台。
|
||||
|
||||
事实上,Docker 技术的出现自身就极大推动了云计算行业的发展。
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
# 腾讯云
|
||||
|
||||
![腾讯云](./_images/qcloud-logo.jpg)
|
||||
|
||||
[腾讯云](https://cloud.tencent.com/act/cps/redirect?redirect=1040&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console) 在架构方面经过多年积累,并且有着多年对海量互联网服务的经验。不管是社交、游戏还是其他领域,都有多年的成熟产品来提供产品服务。腾讯在云端完成重要部署,为开发者及企业提供云服务、云数据、云运营等整体一站式服务方案。
|
||||
|
||||
具体包括 [云服务器](https://cloud.tencent.com/act/cps/redirect?redirect=1001&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console)、[云存储](https://cloud.tencent.com/act/cps/redirect?redirect=1020&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console)、[云数据库](https://cloud.tencent.com/act/cps/redirect?redirect=1003&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console)、[视频与CDN](https://cloud.tencent.com/act/cps/redirect?redirect=1019&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console) 和 [域名注册](https://dnspod.cloud.tencent.com) 等基础云服务;腾讯云分析(MTA)、腾讯云推送(信鸽)等腾讯整体大数据能力;以及 QQ互联、QQ 空间、微云、微社区等云端链接社交体系。这些正是腾讯云可以提供给这个行业的差异化优势,造就了可支持各种互联网使用场景的高品质的腾讯云技术平台。
|
||||
|
||||
[腾讯云容器服务 TKE](https://cloud.tencent.com/act/cps/redirect?redirect=10058&cps_key=3a5255852d5db99dcd5da4c72f05df61) 是高度可扩展的高性能容器管理服务,用户可以在托管的云服务器实例集群上轻松运行应用程序。使用该服务,将无需安装、运维、扩展用户的集群管理基础设施,只需进行简单的 API 调用,便可启动和停止 Docker 应用程序,查询集群的完整状态,以及使用各种云服务。用户可以根据用户的资源需求和可用性要求在用户的集群中安排容器的置放,满足业务或应用程序的特定要求。
|
||||
|
||||
![](https://mc.qcloudimg.com/static/img/0581dbeb97c869bbe6e62025dbc592d7/image.png)
|
|
@ -1,5 +1,5 @@
|
|||
# Docker Compose 项目
|
||||
|
||||
`Docker Compose` 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用。
|
||||
`Docker Compose` 是 Docker 官方编排(Orchestration)项目之一,负责快速的部署分布式应用。
|
||||
|
||||
本章将介绍 `Compose` 项目情况以及安装和使用。
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
## Compose 命令说明
|
||||
# Compose 命令说明
|
||||
|
||||
## 命令对象与格式
|
||||
|
||||
### 命令对象与格式
|
||||
对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。
|
||||
|
||||
执行 `docker-compose [COMMAND] --help` 或者 `docker-compose help [COMMAND]` 可以查看具体某个命令的使用格式。
|
||||
|
@ -11,23 +12,19 @@
|
|||
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
|
||||
```
|
||||
|
||||
### 命令选项
|
||||
## 命令选项
|
||||
|
||||
* `-f, --file FILE` 指定使用的 Compose 模板文件,默认为 `docker-compose.yml`,可以多次指定。
|
||||
|
||||
* `-p, --project-name NAME` 指定项目名称,默认将使用所在目录名称作为项目名。
|
||||
|
||||
* `--x-networking` 使用 Docker 的可拔插网络后端特性
|
||||
|
||||
* `--x-network-driver DRIVER` 指定网络后端的驱动,默认为 `bridge`
|
||||
|
||||
* `--verbose` 输出更多调试信息。
|
||||
|
||||
* `-v, --version` 打印版本并退出。
|
||||
|
||||
### 命令使用说明
|
||||
## 命令使用说明
|
||||
|
||||
#### `build`
|
||||
### `build`
|
||||
|
||||
格式为 `docker-compose build [options] [SERVICE...]`。
|
||||
|
||||
|
@ -45,27 +42,28 @@ docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
|
|||
|
||||
* `--pull` 始终尝试通过 pull 来获取更新版本的镜像。
|
||||
|
||||
#### `config`
|
||||
### `config`
|
||||
|
||||
验证 Compose 文件格式是否正确,若正确则显示配置,若格式错误显示错误原因。
|
||||
|
||||
#### `down`
|
||||
### `down`
|
||||
|
||||
此命令将会停止 `up` 命令所启动的容器,并移除网络
|
||||
|
||||
#### `exec`
|
||||
### `exec`
|
||||
|
||||
进入指定的容器。
|
||||
|
||||
#### `help`
|
||||
### `help`
|
||||
|
||||
获得一个命令的帮助。
|
||||
|
||||
#### `images`
|
||||
### `images`
|
||||
|
||||
列出 Compose 文件中包含的镜像。
|
||||
|
||||
#### `kill`
|
||||
### `kill`
|
||||
|
||||
格式为 `docker-compose kill [options] [SERVICE...]`。
|
||||
|
||||
通过发送 `SIGKILL` 信号来强制停止服务容器。
|
||||
|
@ -76,19 +74,22 @@ docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
|
|||
$ docker-compose kill -s SIGINT
|
||||
```
|
||||
|
||||
#### `logs`
|
||||
### `logs`
|
||||
|
||||
格式为 `docker-compose logs [options] [SERVICE...]`。
|
||||
|
||||
查看服务容器的输出。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 `--no-color` 来关闭颜色。
|
||||
|
||||
该命令在调试问题的时候十分有用。
|
||||
|
||||
#### `pause`
|
||||
### `pause`
|
||||
|
||||
格式为 `docker-compose pause [SERVICE...]`。
|
||||
|
||||
暂停一个服务容器。
|
||||
|
||||
#### `port`
|
||||
### `port`
|
||||
|
||||
格式为 `docker-compose port [options] SERVICE PRIVATE_PORT`。
|
||||
|
||||
打印某个容器端口所映射的公共端口。
|
||||
|
@ -99,7 +100,8 @@ $ docker-compose kill -s SIGINT
|
|||
|
||||
* `--index=index` 如果同一服务存在多个容器,指定命令对象容器的序号(默认为 1)。
|
||||
|
||||
#### `ps`
|
||||
### `ps`
|
||||
|
||||
格式为 `docker-compose ps [options] [SERVICE...]`。
|
||||
|
||||
列出项目中目前的所有容器。
|
||||
|
@ -108,7 +110,8 @@ $ docker-compose kill -s SIGINT
|
|||
|
||||
* `-q` 只打印容器的 ID 信息。
|
||||
|
||||
#### `pull`
|
||||
### `pull`
|
||||
|
||||
格式为 `docker-compose pull [options] [SERVICE...]`。
|
||||
|
||||
拉取服务依赖的镜像。
|
||||
|
@ -117,11 +120,12 @@ $ docker-compose kill -s SIGINT
|
|||
|
||||
* `--ignore-pull-failures` 忽略拉取镜像过程中的错误。
|
||||
|
||||
#### `push`
|
||||
### `push`
|
||||
|
||||
推送服务依赖的镜像到 Docker 镜像仓库。
|
||||
|
||||
#### `restart`
|
||||
### `restart`
|
||||
|
||||
格式为 `docker-compose restart [options] [SERVICE...]`。
|
||||
|
||||
重启项目中的服务。
|
||||
|
@ -130,7 +134,8 @@ $ docker-compose kill -s SIGINT
|
|||
|
||||
* `-t, --timeout TIMEOUT` 指定重启前停止容器的超时(默认为 10 秒)。
|
||||
|
||||
#### `rm`
|
||||
### `rm`
|
||||
|
||||
格式为 `docker-compose rm [options] [SERVICE...]`。
|
||||
|
||||
删除所有(停止状态的)服务容器。推荐先执行 `docker-compose stop` 命令来停止容器。
|
||||
|
@ -141,7 +146,7 @@ $ docker-compose kill -s SIGINT
|
|||
|
||||
* `-v` 删除容器所挂载的数据卷。
|
||||
|
||||
#### `run`
|
||||
### `run`
|
||||
格式为 `docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]`。
|
||||
|
||||
在指定服务上执行一个命令。
|
||||
|
@ -194,7 +199,8 @@ $ docker-compose run --no-deps web python manage.py shell
|
|||
|
||||
* `-T` 不分配伪 tty,意味着依赖 tty 的指令将无法运行。
|
||||
|
||||
#### `scale`
|
||||
### `scale`
|
||||
|
||||
格式为 `docker-compose scale [options] [SERVICE=NUM...]`。
|
||||
|
||||
设置指定服务运行的容器个数。
|
||||
|
@ -213,12 +219,14 @@ $ docker-compose scale web=3 db=2
|
|||
|
||||
* `-t, --timeout TIMEOUT` 停止容器时候的超时(默认为 10 秒)。
|
||||
|
||||
#### `start`
|
||||
### `start`
|
||||
|
||||
格式为 `docker-compose start [SERVICE...]`。
|
||||
|
||||
启动已经存在的服务容器。
|
||||
|
||||
#### `stop`
|
||||
### `stop`
|
||||
|
||||
格式为 `docker-compose stop [options] [SERVICE...]`。
|
||||
|
||||
停止已经处于运行状态的容器,但不删除它。通过 `docker-compose start` 可以再次启动这些容器。
|
||||
|
@ -227,16 +235,18 @@ $ docker-compose scale web=3 db=2
|
|||
|
||||
* `-t, --timeout TIMEOUT` 停止容器时候的超时(默认为 10 秒)。
|
||||
|
||||
#### `top`
|
||||
### `top`
|
||||
|
||||
查看各个服务容器内运行的进程。
|
||||
|
||||
#### `unpause`
|
||||
### `unpause`
|
||||
|
||||
格式为 `docker-compose unpause [SERVICE...]`。
|
||||
|
||||
恢复处于暂停状态中的服务。
|
||||
|
||||
#### `up`
|
||||
### `up`
|
||||
|
||||
格式为 `docker-compose up [options] [SERVICE...]`。
|
||||
|
||||
该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
|
||||
|
@ -269,7 +279,12 @@ $ docker-compose scale web=3 db=2
|
|||
|
||||
* `-t, --timeout TIMEOUT` 停止容器时候的超时(默认为 10 秒)。
|
||||
|
||||
#### `version`
|
||||
### `version`
|
||||
|
||||
格式为 `docker-compose version`。
|
||||
|
||||
打印版本信息。
|
||||
|
||||
## 参考资料
|
||||
|
||||
* [官方文档](https://docs.docker.com/compose/reference/overview/)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
## Compose 模板文件
|
||||
# Compose 模板文件
|
||||
|
||||
模板文件是使用 `Compose` 的核心,涉及到的指令关键字也比较多。但大家不用担心,这里面大部分指令跟 `docker run` 相关参数的含义都是类似的。
|
||||
|
||||
|
@ -18,11 +18,11 @@ services:
|
|||
|
||||
注意每个服务都必须通过 `image` 指令指定镜像或 `build` 指令(需要 Dockerfile)等来自动构建生成镜像。
|
||||
|
||||
如果使用 `build` 指令,在 `Dockerfile` 中设置的选项(例如:`CMD`, `EXPOSE`, `VOLUME`, `ENV` 等) 将会自动被获取,无需在 `docker-compose.yml` 中再次设置。
|
||||
如果使用 `build` 指令,在 `Dockerfile` 中设置的选项(例如:`CMD`, `EXPOSE`, `VOLUME`, `ENV` 等) 将会自动被获取,无需在 `docker-compose.yml` 中重复设置。
|
||||
|
||||
下面分别介绍各个指令的用法。
|
||||
|
||||
### `build`
|
||||
## `build`
|
||||
|
||||
指定 `Dockerfile` 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 `Compose` 将会利用它自动构建这个镜像,然后使用这个镜像。
|
||||
|
||||
|
@ -62,7 +62,7 @@ build:
|
|||
- corp/web_app:3.14
|
||||
```
|
||||
|
||||
### `cap_add, cap_drop`
|
||||
## `cap_add, cap_drop`
|
||||
|
||||
指定容器的内核能力(capacity)分配。
|
||||
|
||||
|
@ -80,7 +80,7 @@ cap_drop:
|
|||
- NET_ADMIN
|
||||
```
|
||||
|
||||
### `command`
|
||||
## `command`
|
||||
|
||||
覆盖容器启动后默认执行的命令。
|
||||
|
||||
|
@ -88,11 +88,11 @@ cap_drop:
|
|||
command: echo "hello world"
|
||||
```
|
||||
|
||||
### `configs`
|
||||
## `configs`
|
||||
|
||||
仅用于 `Swarm mode`,详细内容请查看 [`Swarm mode`](../swarm_mode/) 一节。
|
||||
|
||||
### `cgroup_parent`
|
||||
## `cgroup_parent`
|
||||
|
||||
指定父 `cgroup` 组,意味着将继承该组的资源限制。
|
||||
|
||||
|
@ -102,7 +102,7 @@ command: echo "hello world"
|
|||
cgroup_parent: cgroups_1
|
||||
```
|
||||
|
||||
### `container_name`
|
||||
## `container_name`
|
||||
|
||||
指定容器名称。默认将会使用 `项目名称_服务名称_序号` 这样的格式。
|
||||
|
||||
|
@ -112,11 +112,11 @@ container_name: docker-web-container
|
|||
|
||||
>注意: 指定容器名称后,该服务将无法进行扩展(scale),因为 Docker 不允许多个容器具有相同的名称。
|
||||
|
||||
### `deploy`
|
||||
## `deploy`
|
||||
|
||||
仅用于 `Swarm mode`,详细内容请查看 [`Swarm mode`](../swarm_mode/) 一节
|
||||
|
||||
### `devices`
|
||||
## `devices`
|
||||
|
||||
指定设备映射关系。
|
||||
|
||||
|
@ -125,7 +125,7 @@ devices:
|
|||
- "/dev/ttyUSB1:/dev/ttyUSB0"
|
||||
```
|
||||
|
||||
### `depends_on`
|
||||
## `depends_on`
|
||||
|
||||
解决容器的依赖、启动先后的问题。以下例子中会先启动 `redis` `db` 再启动 `web`
|
||||
|
||||
|
@ -148,7 +148,7 @@ services:
|
|||
|
||||
>注意:`web` 服务不会等待 `redis` `db` 「完全启动」之后才启动。
|
||||
|
||||
### `dns`
|
||||
## `dns`
|
||||
|
||||
自定义 `DNS` 服务器。可以是一个值,也可以是一个列表。
|
||||
|
||||
|
@ -160,7 +160,7 @@ dns:
|
|||
- 114.114.114.114
|
||||
```
|
||||
|
||||
### `dns_search`
|
||||
## `dns_search`
|
||||
|
||||
配置 `DNS` 搜索域。可以是一个值,也可以是一个列表。
|
||||
|
||||
|
@ -172,7 +172,7 @@ dns_search:
|
|||
- domain2.example.com
|
||||
```
|
||||
|
||||
### `tmpfs`
|
||||
## `tmpfs`
|
||||
|
||||
挂载一个 tmpfs 文件系统到容器。
|
||||
|
||||
|
@ -183,7 +183,7 @@ tmpfs:
|
|||
- /tmp
|
||||
```
|
||||
|
||||
### `env_file`
|
||||
## `env_file`
|
||||
|
||||
从文件中获取环境变量,可以为单独的文件路径或列表。
|
||||
|
||||
|
@ -207,7 +207,7 @@ env_file:
|
|||
PROG_ENV=development
|
||||
```
|
||||
|
||||
### `environment`
|
||||
## `environment`
|
||||
|
||||
设置环境变量。你可以使用数组或字典两种格式。
|
||||
|
||||
|
@ -223,13 +223,13 @@ environment:
|
|||
- SESSION_SECRET
|
||||
```
|
||||
|
||||
如果变量名称或者值中用到 `true|false,yes|no` 等表达 [布尔](http://yaml.org/type/bool.html) 含义的词汇,最好放到引号里,避免 YAML 自动解析某些内容为对应的布尔语义。这些特定词汇,包括
|
||||
如果变量名称或者值中用到 `true|false,yes|no` 等表达 [布尔](https://yaml.org/type/bool.html) 含义的词汇,最好放到引号里,避免 YAML 自动解析某些内容为对应的布尔语义。这些特定词汇,包括
|
||||
|
||||
```bash
|
||||
y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF
|
||||
```
|
||||
|
||||
### `expose`
|
||||
## `expose`
|
||||
|
||||
暴露端口,但不映射到宿主机,只被连接的服务访问。
|
||||
|
||||
|
@ -241,7 +241,7 @@ expose:
|
|||
- "8000"
|
||||
```
|
||||
|
||||
### `external_links`
|
||||
## `external_links`
|
||||
|
||||
>注意:不建议使用该指令。
|
||||
|
||||
|
@ -254,7 +254,7 @@ external_links:
|
|||
- project_db_1:postgresql
|
||||
```
|
||||
|
||||
### `extra_hosts`
|
||||
## `extra_hosts`
|
||||
|
||||
类似 Docker 中的 `--add-host` 参数,指定额外的 host 名称映射信息。
|
||||
|
||||
|
@ -271,7 +271,7 @@ extra_hosts:
|
|||
52.1.157.61 dockerhub
|
||||
```
|
||||
|
||||
### `healthcheck`
|
||||
## `healthcheck`
|
||||
|
||||
通过命令检查容器是否健康运行。
|
||||
|
||||
|
@ -283,9 +283,9 @@ healthcheck:
|
|||
retries: 3
|
||||
```
|
||||
|
||||
### `image`
|
||||
## `image`
|
||||
|
||||
指定为镜像名称或镜像 ID。如果镜像在本地不存在,`Compose` 将会尝试拉去这个镜像。
|
||||
指定为镜像名称或镜像 ID。如果镜像在本地不存在,`Compose` 将会尝试拉取这个镜像。
|
||||
|
||||
```yaml
|
||||
image: ubuntu
|
||||
|
@ -293,7 +293,7 @@ image: orchardup/postgresql
|
|||
image: a4bc65fd
|
||||
```
|
||||
|
||||
### `labels`
|
||||
## `labels`
|
||||
|
||||
为容器添加 Docker 元数据(metadata)信息。例如可以为容器添加辅助说明信息。
|
||||
|
||||
|
@ -304,11 +304,11 @@ labels:
|
|||
com.startupteam.release: "rc3 for v1.0"
|
||||
```
|
||||
|
||||
### `links`
|
||||
## `links`
|
||||
|
||||
>注意:不推荐使用该指令。
|
||||
|
||||
### `logging`
|
||||
## `logging`
|
||||
|
||||
配置日志选项。
|
||||
|
||||
|
@ -335,7 +335,7 @@ options:
|
|||
max-file: "10"
|
||||
```
|
||||
|
||||
### `network_mode`
|
||||
## `network_mode`
|
||||
|
||||
设置网络模式。使用和 `docker run` 的 `--network` 参数一样的值。
|
||||
|
||||
|
@ -347,7 +347,7 @@ network_mode: "service:[service name]"
|
|||
network_mode: "container:[container name/id]"
|
||||
```
|
||||
|
||||
### `networks`
|
||||
## `networks`
|
||||
|
||||
配置容器连接的网络。
|
||||
|
||||
|
@ -365,7 +365,7 @@ networks:
|
|||
other-network:
|
||||
```
|
||||
|
||||
### `pid`
|
||||
## `pid`
|
||||
|
||||
跟主机系统共享进程命名空间。打开该选项的容器之间,以及容器和宿主机系统之间可以通过进程 ID 来相互访问和操作。
|
||||
|
||||
|
@ -373,7 +373,7 @@ networks:
|
|||
pid: "host"
|
||||
```
|
||||
|
||||
### `ports`
|
||||
## `ports`
|
||||
|
||||
暴露端口信息。
|
||||
|
||||
|
@ -389,12 +389,12 @@ ports:
|
|||
|
||||
*注意:当使用 `HOST:CONTAINER` 格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为 `YAML` 会自动解析 `xx:yy` 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。*
|
||||
|
||||
### `secrets`
|
||||
## `secrets`
|
||||
|
||||
存储敏感数据,例如 `mysql` 服务密码。
|
||||
|
||||
```bash
|
||||
version: "3"
|
||||
```yaml
|
||||
version: "3.1"
|
||||
services:
|
||||
|
||||
mysql:
|
||||
|
@ -412,7 +412,7 @@ secrets:
|
|||
external: true
|
||||
```
|
||||
|
||||
### `security_opt`
|
||||
## `security_opt`
|
||||
|
||||
指定容器模板标签(label)机制的默认属性(用户、角色、类型、级别等)。例如配置标签的用户名和角色名。
|
||||
|
||||
|
@ -422,7 +422,7 @@ security_opt:
|
|||
- label:role:ROLE
|
||||
```
|
||||
|
||||
### `stop_signal`
|
||||
## `stop_signal`
|
||||
|
||||
设置另一个信号来停止容器。在默认情况下使用的是 SIGTERM 停止容器。
|
||||
|
||||
|
@ -430,7 +430,7 @@ security_opt:
|
|||
stop_signal: SIGUSR1
|
||||
```
|
||||
|
||||
### `sysctls`
|
||||
## `sysctls`
|
||||
|
||||
配置容器内核参数。
|
||||
|
||||
|
@ -444,7 +444,7 @@ sysctls:
|
|||
- net.ipv4.tcp_syncookies=0
|
||||
```
|
||||
|
||||
### `ulimits`
|
||||
## `ulimits`
|
||||
|
||||
指定容器的 ulimits 限制值。
|
||||
|
||||
|
@ -458,9 +458,9 @@ sysctls:
|
|||
hard: 40000
|
||||
```
|
||||
|
||||
### `volumes`
|
||||
## `volumes`
|
||||
|
||||
数据卷所挂载路径设置。可以设置宿主机路径 (`HOST:CONTAINER`) 或加上访问模式 (`HOST:CONTAINER:ro`)。
|
||||
数据卷所挂载路径设置。可以设置为宿主机路径(`HOST:CONTAINER`)或者数据卷名称(`VOLUME:CONTAINER`),并且可以设置访问模式 (`HOST:CONTAINER:ro`)。
|
||||
|
||||
该指令中路径支持相对路径。
|
||||
|
||||
|
@ -471,7 +471,22 @@ volumes:
|
|||
- ~/configs:/etc/configs/:ro
|
||||
```
|
||||
|
||||
### 其它指令
|
||||
如果路径为数据卷名称,必须在文件中配置数据卷。
|
||||
|
||||
```yaml
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
my_src:
|
||||
image: mysql:8.0
|
||||
volumes:
|
||||
- mysql_data:/var/lib/mysql
|
||||
|
||||
volumes:
|
||||
mysql_data:
|
||||
```
|
||||
|
||||
## 其它指令
|
||||
|
||||
此外,还有包括 `domainname, entrypoint, hostname, ipc, mac_address, privileged, read_only, shm_size, restart, stdin_open, tty, user, working_dir` 等指令,基本跟 `docker run` 中对应参数的功能一致。
|
||||
|
||||
|
@ -531,7 +546,7 @@ stdin_open: true
|
|||
tty: true
|
||||
```
|
||||
|
||||
### 读取变量
|
||||
## 读取变量
|
||||
|
||||
Compose 模板文件支持动态读取主机的系统环境变量和当前目录下的 `.env` 文件中的变量。
|
||||
|
||||
|
@ -557,3 +572,8 @@ MONGO_VERSION=3.6
|
|||
```
|
||||
|
||||
执行 `docker-compose up` 则会启动一个 `mongo:3.6` 镜像的容器。
|
||||
|
||||
## 参考资料
|
||||
|
||||
* [官方文档](https://docs.docker.com/compose/compose-file/)
|
||||
* [awesome-compose](https://github.com/docker/awesome-compose)
|
||||
|
|
|
@ -1 +1,2 @@
|
|||
django_example
|
||||
manage.py
|
||||
|
|
|
@ -3,13 +3,13 @@ services:
|
|||
|
||||
db:
|
||||
image: postgres
|
||||
environment:
|
||||
POSTGRES_PASSWORD: 'postgres'
|
||||
|
||||
web:
|
||||
build: .
|
||||
command: python3 manage.py runserver 0.0.0.0:8000
|
||||
command: python manage.py runserver 0.0.0.0:8000
|
||||
volumes:
|
||||
- .:/code
|
||||
ports:
|
||||
- "8000:8000"
|
||||
links:
|
||||
- db
|
||||
|
|
|
@ -1,22 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
import os
|
||||
import sys
|
||||
|
||||
if __name__ == "__main__":
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_example.settings")
|
||||
try:
|
||||
from django.core.management import execute_from_command_line
|
||||
except ImportError:
|
||||
# The above import may fail for some other reason. Ensure that the
|
||||
# issue is really that Django is missing to avoid masking other
|
||||
# exceptions on Python 2.
|
||||
try:
|
||||
import django
|
||||
except ImportError:
|
||||
raise ImportError(
|
||||
"Couldn't import Django. Are you sure it's installed and "
|
||||
"available on your PYTHONPATH environment variable? Did you "
|
||||
"forget to activate a virtual environment?"
|
||||
)
|
||||
raise
|
||||
execute_from_command_line(sys.argv)
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue