From 36ab0b98622443d115ae6411e8b66eb69069319c Mon Sep 17 00:00:00 2001 From: Baohua Yang Date: Sat, 10 Dec 2016 17:00:25 +0800 Subject: [PATCH] Update appendix section --- README.md | 4 +- SUMMARY.md | 24 +- appendix/README.md | 1 + {_images => appendix/_images}/cmd_logic.dot | 112 ++++---- appendix/_images/cmd_logic.dot.bak | 93 +++++++ appendix/_images/cmd_logic.graffle/data.plist | Bin 0 -> 6461 bytes .../_images/cmd_logic.graffle/image10.pdf | Bin 0 -> 8040 bytes .../_images/cmd_logic.graffle/image11.pdf | Bin 0 -> 8218 bytes .../_images/cmd_logic.graffle/image12.pdf | Bin 0 -> 17786 bytes .../_images/cmd_logic.graffle/image13.pdf | Bin 0 -> 14933 bytes appendix/_images/cmd_logic.graffle/image4.pdf | Bin 0 -> 9820 bytes appendix/_images/cmd_logic.graffle/image5.pdf | Bin 0 -> 12025 bytes appendix/_images/cmd_logic.graffle/image6.pdf | Bin 0 -> 11523 bytes appendix/_images/cmd_logic.graffle/image7.pdf | Bin 0 -> 9792 bytes appendix/_images/cmd_logic.graffle/image9.pdf | Bin 0 -> 48691 bytes {_images => appendix/_images}/cmd_logic.png | Bin appendix/_images/container_status.dot | 51 ++++ appendix/_images/container_status.png | Bin 0 -> 68168 bytes appendix/command/README.md | 126 +++++++++ appendix/faq/README.md | 187 +++++++++++++ appendix/repo/README.md | 2 + appendix/repo/centos.md | 58 ++++ appendix/repo/mongodb.md | 263 ++++++++++++++++++ appendix/repo/mysql.md | 124 +++++++++ appendix/repo/nginx.md | 101 +++++++ appendix/repo/nodejs.md | 151 ++++++++++ appendix/repo/redis.md | 141 ++++++++++ appendix/repo/ubuntu.md | 142 ++++++++++ appendix/repo/wordpress.md | 117 ++++++++ appendix/resources/README.md | 23 ++ appendix_repo/README.md | 2 - appendix_repo/centos.md | 17 -- appendix_repo/mongodb.md | 26 -- appendix_repo/mysql.md | 23 -- appendix_repo/nginx.md | 34 --- appendix_repo/nodejs.md | 28 -- appendix_repo/redis.md | 29 -- appendix_repo/ubuntu.md | 17 -- appendix_repo/wordpress.md | 19 -- appendix_resources/README.md | 7 - 40 files changed, 1652 insertions(+), 270 deletions(-) create mode 100644 appendix/README.md rename {_images => appendix/_images}/cmd_logic.dot (97%) create mode 100644 appendix/_images/cmd_logic.dot.bak create mode 100644 appendix/_images/cmd_logic.graffle/data.plist create mode 100644 appendix/_images/cmd_logic.graffle/image10.pdf create mode 100644 appendix/_images/cmd_logic.graffle/image11.pdf create mode 100644 appendix/_images/cmd_logic.graffle/image12.pdf create mode 100644 appendix/_images/cmd_logic.graffle/image13.pdf create mode 100644 appendix/_images/cmd_logic.graffle/image4.pdf create mode 100644 appendix/_images/cmd_logic.graffle/image5.pdf create mode 100644 appendix/_images/cmd_logic.graffle/image6.pdf create mode 100644 appendix/_images/cmd_logic.graffle/image7.pdf create mode 100644 appendix/_images/cmd_logic.graffle/image9.pdf rename {_images => appendix/_images}/cmd_logic.png (100%) create mode 100644 appendix/_images/container_status.dot create mode 100644 appendix/_images/container_status.png create mode 100644 appendix/command/README.md create mode 100644 appendix/faq/README.md create mode 100644 appendix/repo/README.md create mode 100644 appendix/repo/centos.md create mode 100644 appendix/repo/mongodb.md create mode 100644 appendix/repo/mysql.md create mode 100644 appendix/repo/nginx.md create mode 100644 appendix/repo/nodejs.md create mode 100644 appendix/repo/redis.md create mode 100644 appendix/repo/ubuntu.md create mode 100644 appendix/repo/wordpress.md create mode 100644 appendix/resources/README.md delete mode 100644 appendix_repo/README.md delete mode 100644 appendix_repo/centos.md delete mode 100644 appendix_repo/mongodb.md delete mode 100644 appendix_repo/mysql.md delete mode 100644 appendix_repo/nginx.md delete mode 100644 appendix_repo/nodejs.md delete mode 100644 appendix_repo/redis.md delete mode 100644 appendix_repo/ubuntu.md delete mode 100644 appendix_repo/wordpress.md delete mode 100644 appendix_resources/README.md diff --git a/README.md b/README.md index d64ceb2..066b375 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Docker — 从入门到实践 -0.7.4 +0.7.5 [Docker](http://www.docker.com) 是个划时代的开源项目,它彻底释放了虚拟化的威力,极大提高了应用的运行效率,降低了云计算资源供应的成本,同时让应用的部署、测试和分发都变得前所未有的高效和轻松! @@ -38,6 +38,8 @@ * 0.8.0: 2016-MM-DD * 修正文字内容 + * 根据最新版本修订安装使用 + * 补充附录章节 * 0.7.0: 2016-06-12 * 根据最新版本进行命令调整 diff --git a/SUMMARY.md b/SUMMARY.md index 7c26058..4694c1f 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -121,14 +121,16 @@ * [原理与架构](mesos/architecture.md) * [配置项解析](mesos/configuration.md) * [常见框架](mesos/framework.md) -* [附录一:命令查询](appendix_command/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) -* [附录三:有用的资源](appendix_resources/README.md) +* [附录](appendix/README.md) + * [附录一:常见问题总结](appendix/faq/README.md) + * [附录二:热门镜像介绍](appendix/repo/README.md) + * [Ubuntu](appendix/repo/ubuntu.md) + * [CentOS](appendix/repo/centos.md) + * [MySQL](appendix/repo/mysql.md) + * [MongoDB](appendix/repo/mongodb.md) + * [Redis](appendix/repo/redis.md) + * [Nginx](appendix/repo/nginx.md) + * [WordPress](appendix/repo/wordpress.md) + * [Node.js](appendix/repo/nodejs.md) + * [附录三:Docker 命令查询](appendix/command/README.md) + * [附录四:资源链接](appendix/resources/README.md) diff --git a/appendix/README.md b/appendix/README.md new file mode 100644 index 0000000..f33bdc5 --- /dev/null +++ b/appendix/README.md @@ -0,0 +1 @@ +# 附录 \ No newline at end of file diff --git a/_images/cmd_logic.dot b/appendix/_images/cmd_logic.dot similarity index 97% rename from _images/cmd_logic.dot rename to appendix/_images/cmd_logic.dot index 01d859d..426fc9b 100644 --- a/_images/cmd_logic.dot +++ b/appendix/_images/cmd_logic.dot @@ -1,56 +1,56 @@ -//dot -Tpng xx.dot -o xx.png -digraph G { - rankdir=TB; - fontname = "Microsoft YaHei"; - fontsize = 14; - penwidth = 3; - compound=true; - rankdir=LR; - - node [shape = record]; - edge [fontname = "Arial", fontsize = 12, color="darkgreen" ]; - - image[label="Image",color=blue]; - registry[label="Registry",color=blue]; - tar[label="Tar files",color=blue]; - - subgraph cluster_container { - label = "Container"; - style = "bold"; - color = blue; - edge [fontname = "Arial", fontsize = 11, color="skyblue" ]; - //node [style=filled]; - run[label="Running",shape=circle, style=filled, fillcolor=green]; - stop[label="Stopped",shape=circle, style=filled, fillcolor=red]; - pause[label="Paused",shape=circle, style=filled, fillcolor=blue]; - - run->pause[label="pause"]; - pause->run[label="unpause"]; - run->run[label="restart"]; - run->stop[label="kill"]; - stop->run[label="start"]; - } - - run->image[label="commit",ltail=cluster_container]; - image->run[label="start"]; - - image->tar[label="export|save"]; - tar->image[label="import"]; - - image->registry[label="push"]; - registry->image[label="pull"]; - - //heat[label="heat commands",color=blue]; - //heatshell[label="heatclient.shell.HeatShell",color=blue]; - //shell[label="{heatclient.v1.shell|+do_stack_create\l+do_stack_show\l+do_stack_update\l...\l+do_event_list\l...\l+do_resource_list\l...\l+do_resource_type_show\l...\l+do_template_show\l...\l}",color=blue]; - //heatclient[label="heatclient.client.Client",color=blue]; - //client[label="heatclient.v1.client.Client",color=blue]; - //httpclient[label="heatclient.common.http.HTTPClient",color=blue]; - - - - //openstackservices[label="{OpenStack Services|+Nova\l+Neutron\l+Keystone\l...}",color=blue]; - - //{rank=same; image cluster_container} - //{rank=same; rpcproxy apimixin} -} +//dot -Tpng xx.dot -o xx.png +digraph G { + rankdir=TB; + fontname = "Microsoft YaHei"; + fontsize = 14; + penwidth = 3; + compound=true; + rankdir=LR; + + node [shape = record]; + edge [fontname = "Arial", fontsize = 12, color="darkgreen" ]; + + image[label="Image",color=blue]; + registry[label="Registry",color=blue]; + tar[label="Tar files",color=blue]; + + subgraph cluster_container { + label = "Container"; + style = "bold"; + color = blue; + edge [fontname = "Arial", fontsize = 11, color="skyblue" ]; + //node [style=filled]; + run[label="Running",shape=circle, style=filled, fillcolor=green]; + stop[label="Stopped",shape=circle, style=filled, fillcolor=red]; + pause[label="Paused",shape=circle, style=filled, fillcolor=blue]; + + run->pause[label="pause"]; + pause->run[label="unpause"]; + run->run[label="restart"]; + run->stop[label="kill"]; + stop->run[label="start"]; + } + + run->image[label="commit",ltail=cluster_container]; + image->run[label="start"]; + + image->tar[label="export|save"]; + tar->image[label="import"]; + + image->registry[label="push"]; + registry->image[label="pull"]; + + //heat[label="heat commands",color=blue]; + //heatshell[label="heatclient.shell.HeatShell",color=blue]; + //shell[label="{heatclient.v1.shell|+do_stack_create\l+do_stack_show\l+do_stack_update\l...\l+do_event_list\l...\l+do_resource_list\l...\l+do_resource_type_show\l...\l+do_template_show\l...\l}",color=blue]; + //heatclient[label="heatclient.client.Client",color=blue]; + //client[label="heatclient.v1.client.Client",color=blue]; + //httpclient[label="heatclient.common.http.HTTPClient",color=blue]; + + + + //openstackservices[label="{OpenStack Services|+Nova\l+Neutron\l+Keystone\l...}",color=blue]; + + //{rank=same; image cluster_container} + //{rank=same; rpcproxy apimixin} +} diff --git a/appendix/_images/cmd_logic.dot.bak b/appendix/_images/cmd_logic.dot.bak new file mode 100644 index 0000000..3c40f8a --- /dev/null +++ b/appendix/_images/cmd_logic.dot.bak @@ -0,0 +1,93 @@ +//dot -Tpng cmd_logic.dot -o cmd_logic.png +digraph G { + rankdir=TB; + rankdir=LR; + nodesep=1; +//ranksep=1 + fontname = "Microsoft YaHei"; + fontsize = 28; + penwidth = 4; + compound=true; + + node [shape = record]; + edge [fontname = "Arial", fontsize = 20, color="darkgreen" ]; + + user[label="User",color=blue,shape=ellipse, style=filled, fillcolor=green]; + dockerfile[label="Dockerfile",color=blue]; + daemon[label="Daemon",color=blue]; + image[label="Image",color=blue]; + registry[label="Registry",color=blue]; + tar[label="Tar files",color=blue]; + network[label="Network",color=blue] + service[label="Service",color=blue] + swarm[label="Swarm",color=blue] + volume[label="Volume",color=blue] + + subgraph cluster_container { + label = "Container"; + labelloc = "c"; + nodesep=.5; + style = "bold"; + color = blue; + edge [fontname = "Arial", fontsize = 20, color="skyblue" ]; + //node [style=filled]; + create[label="Created",shape=circle, style=filled, fillcolor=lightblue]; + run[label="Running",shape=circle, style=filled, fillcolor=green]; + pause[label="Paused",shape=circle, style=filled, fillcolor=blue]; + stop[label="Stopped",shape=circle, style=filled, fillcolor=red]; + exit[label="Exited",shape=circle, style=filled, fillcolor=gray]; + + create->run[label=<start>]; + run->pause[label="pause"]; + pause->run[label="unpause"]; + run->run[label="restart"]; + run->stop[label="stop"]; + run->exit[label="kill"]; + stop->run[label="start"]; + } + + //dockerfile + dockerfile->image[label="build"]; + + //container + run->image[headlabel="commit", labeldistance=7.5, ltail=cluster_container]; + run->tar[label="export",ltail=cluster_container]; + run->network[label="connect | disconnect",ltail=cluster_container]; + + //image + image->create[label="create"]; + image->run[label="run"]; + image->tar[label="save"]; + image->registry[label="push"]; + + //tar + tar->image[label="import | load"]; + image->registry[label="push"]; + + //registry + registry->image[label="pull"]; + + //network + network->network[label="create | rm | ls | inspect"] + + //user + user->run[label="attach | cp | diff | exec | inspect | logs | ps | rename | rm | stats | top | update | wait",lhead=cluster_container] + user->image[label="history | images | rmi | tag"] + user->daemon[label="event | info | version"] + user->registry[label="login | logout | search"] + + //heat[label="heat commands",color=blue]; + //heatshell[label="heatclient.shell.HeatShell",color=blue]; + //shell[label="{heatclient.v1.shell|+do_stack_create\l+do_stack_show\l+do_stack_update\l...\l+do_event_list\l...\l+do_resource_list\l...\l+do_resource_type_show\l...\l+do_template_show\l...\l}",color=blue]; + //heatclient[label="heatclient.client.Client",color=blue]; + //client[label="heatclient.v1.client.Client",color=blue]; + //httpclient[label="heatclient.common.http.HTTPClient",color=blue]; + + + + //openstackservices[label="{OpenStack Services|+Nova\l+Neutron\l+Keystone\l...}",color=blue]; + + //{rank=same; image registry dockerfile tar} + //{rank=same; container} + //{rank=same; user} +} diff --git a/appendix/_images/cmd_logic.graffle/data.plist b/appendix/_images/cmd_logic.graffle/data.plist new file mode 100644 index 0000000000000000000000000000000000000000..26324d3c498156be59e5c1096d3a51c419c0250b GIT binary patch literal 6461 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 XnCSFhJ0Uz}Z(sdCLcS;J4NJ%KDD2+&WH_{?4 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ΞFRFk z!M(C6jV9riO2tZ4N^>9$sW+cJUYmUjn$J&+P0Zrp$?whYv<)ubFYlLTK}D2aH{lUu ztA>5#&4SB(XtNz$*Q0nY*&C~lgl5r4IWzN#v==k>h+q=q} zt2O$lTdwBkZDXur%8_}mtCdUa6b5s@W`7N$i%DIq{_6K`Ep4oMe7JVnF`yqe8t)UK z_!UZqs(_X~P5UA#$4{t-x+$AkOB*7?;ttIvkbyUQNf#DrGJzAn@u@^l=hl0Ax}qimrG%U{W$K*e5l-fLVS(^`dcyJL zw*?x0K>`FvxRRrI=M_b-og=XD8{MrdSJDaNEKpMP`_g#+8tWRq-b|&Z1)ENz@%Mvv zp=qHdktNe{Sur!)H>tFG50VRu)4G|H5^|{%)72vS$_7;M1`3zex#HS8FLKvY?RBlp zT#g`WUyED+slLlp>l-=I8_uXv=R|ecpLU;At7E|atqNr=;o-jRJA#RAhRuF{FsKle z;{WubcW*PBnEEvd;)gw)D^x{9RRp3{Bi68YC^NiEEeSJvPV^rbt>emy;!$qhGq4!f zcZgr-xu1CKteV_6IDDG(-m>C+_|)}X-I{QT;Ws-Bn<}MdCGV9`0r>kd2Yq)y-dDAD z^5gw6Q%eeFW<``!1XK8ay)L;VYKL|n2tS5PuX?|;tUPLA5*+rhxmcD>6S$$jUp`{_ zB`&W;$M!SobG@>E!DF*jSN+A{$@Vg%#~mQ17^~Xc&iO#XK#B6AsyzJ8K4Af#=hWX+ zZrVE)=Sz(hry6RJ93vl#n8vhlI94V#BwlSN`{0>L+fJ?A)Vs_YP-N|Eb75=*zcQU> zEH-1ZZxusu$!A2ON*K0Cz%Xtypl$Ist4`sItSpl{HJ8O;zOqQRW;!ylv09#Alm*!m z9P+Upg<#a^yXY|KBNQ{&931tUrkd-yR*pz>iA!zkD+39gQQV`e7G&Q_X zBx3Fxk(}AK>DfT+&2(AJ7`LD0+=}yO!=5qiu~%6+Uw;JkFtOH4w1{`~y`SkR`1$;2 zzEhrA9?ihCh+QzP$O~qFPXFu2?EY;2uw&H-jNu2yV`h`2nmBHJp~{Ww43-hU5;GLV zWQ57>LHi6oHXZdgzj>O4#G|UC*P`^Ll<&>1B;?LlZ>|#Wc9I@nuD*nUl-a4h@#ES8 zU*bK_LXbu<+@$*{xDZ2aIG&O4LYu#(X=H~f*VFjvLUM$+aC!urV)#a+Mq~3V59nQb z)xPOIYv~KT?>`eL;KIV69dD?zwD8QP3A^gc?LaV3dOA(+5=@glS1R-z;%}q6Ia*Rs z!a;netpaH>s1Qcg$xGF}z|QYgQQZ)k#awfr@!=P#slysM&q-3p^;@!GzZyhV^l#tF zqwrrN|6WTs7P_f^XOZW5B;ofD)w4@kit_|M#XhnJUCW+yT4dc6bp^t#z(MXn0a z{VEoq6ES1_Mcs?umN3L|_5Kfa>kNQFz zmla0B5qxkSxDXrx=i}u!g2UN><1fxLMyz!Jj%MXy380iGIsrgQ1^_29fK9U4t%nnt zSYXcC>YxAr-p25DLt8`OP$Uup|LX_k=i}qygIYs>(*$_4F9%8050$+4GI54hX7LG51R#ekiZ-MOdiG! zW$S=;JAtotY<+<>M?zuR&dxxFW3%`KVzhP!(*5*a7D#we0U>KNFWQP9Da4PkK%@Ei t;6j3EBofUd#KX^nLRg4H{yPf*%>rrUjsep7B#8ugc>!RZMNUH=@;|YuP+b53 literal 0 HcmV?d00001 diff --git a/appendix/_images/cmd_logic.graffle/image11.pdf b/appendix/_images/cmd_logic.graffle/image11.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0d4a6323e366d5da1825edd11fa479cd1fa07d4f GIT binary patch literal 8218 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 literal 0 HcmV?d00001 diff --git a/appendix/_images/cmd_logic.graffle/image12.pdf b/appendix/_images/cmd_logic.graffle/image12.pdf new file mode 100644 index 0000000000000000000000000000000000000000..61d01d3a1ec3be7ae739a71bf970ad9fe7adc66a GIT binary patch literal 17786 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 literal 0 HcmV?d00001 diff --git a/appendix/_images/cmd_logic.graffle/image13.pdf b/appendix/_images/cmd_logic.graffle/image13.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ed7078a1916009e858c1bc8e3fc4deff894d52f7 GIT binary patch literal 14933 zcmbum1yoy2*9Hn9xI0Ay#XY#YdkYkIcZwIMSaH`DDDG0+9g4eap|})^Yq_EC+fV@%6nJlPMGii8vsn3)}ks(1Tr`>^o*^F(hy5(kJC!PE>SB!uMb;$&uIhvWgR9@B!>&59y< z?c0~};*7$|2oCYfWY`PIZSwqJ>eHtMa#4`yum=T@C z7isp02c3HyU!I%1KuRPEj&%i8@URF~=Qvk|IEY1AMyb~0SQg+VYP!0uo(be`FIQoB z-O};plu-*D&PZQ+6XcMQj?dG9)+|d|(&kGqI&{BF4?GrqX-nAtg-Tv2@EOU>-t=!z zA!pAWeD2lr5zNW^T=;y-_Ah-`d*^5dVo@=&`2Fc*X72)G|0@o!&72)volMM}L0o?U z;tuvMkaB0xbL=32QZzHQG7@v}0O_zo01kG@TMr2mslQu!zUxnfRh%45RLxvKI*_I$ zq(CgPc8~_e{yvKTeUt_1fmp;HY#p3b9gR%PK+lgx+!+kw{@om;Virjc7im=&$Yc3k zCJiYAKQ|5WMcSDS1P1?Y2x8GxHnui1artc~YX=7L{3-dTd(Y4x_x>ILynog8S4jR; z!J_JF?D9KEznuoLXjqv-1`9hY8;C{5%*w(N60qlUSx9i4937qq4U&tKDqGARKtfPyoku8WtRnf@V1_b^)>S9(d&X7`Z2Rlaxdx$L(&;K5g$4NRB z$9zbVI_j%sV{c&W?dUXKC5Ga2p$7^^k4e7)Bn(2;KHY};g&{ngbUY#6XBF9%i5QXw zR7D)pbHuyn7w)%H=0I@0#&yqET5Ofh4J5C3QTF2h+3L;V(OqL%V zHwCz~&Bo(fCy%a#ie%TV%pC|VH(C@fGrLXpU$0EnwJ>W>fw3uPn7i+)LeB7ZRLPXB`D$JDG5uC_XY?h~+ z&Ei0xX=2^lN(rW8pkNV*fh9-YTv4V5%TP(4bJ(d8`QN04?B-y>H1ujg*KUq~6yV zJ&f#(FhDkp)Ve3x19JjsQjjBtj1$gJE=?!|)0Y^2u+t3YM9{tvG}V_d4vv5i$cFu) zH8`w}Ee6T~g9kxDAU1Uhg%F^Q(5u^dw0j(oAKi<|`__!u`YG2A$Jf(gig zZzv3XLE!fcQU3Z67d|wR^w6WA0ZOr01rnf&)eA)oo^2gPsi_F?fOFJ_PSk4@HZlG` zAhxINFY|>=-ggQC6Tfbzw~yoO;Q%TM^Dr$qFczZxcl19wxf4M@ihTopb5ZH39)SgT zVG#(ui0KuS7MX|i%VTB6pZdE$6c7&Wt3WWF2ozw)VwPb50R$BgC~|VV(9aHwAYyn& z#RfnS`6kzSHU3HE*xKI$asdJfkoB+*h(iIC0UH0>4TrPEsgA29Xs5R9bCZv%zLO zH+38=_%B&oNuzrEFgTa2L{4vJ9J>n-fFt+?e6h?=I~QB;^@I?aMMZ>sWKF}8%N6AO z8~Zgm-z&iZLQ3PaGi1<1_7Y#m>8TFK_&cGFxd?~yCXM%>3v2;{8OWg%B(dhS=|+M+ zh7QQZx*tk*ptoS&A8MeFsvGr$F-}zbQsMbeEWan!judk+=vAittQ!_KMw9$T3|T1) zA$&>?$PqEAZkc9?`bDd0xYM99Zevw5Rko$h$aori+2^M#U%(gCG<&b)0I;rXwYg|+ zMNsELyi8(BvgxC{*7^~Crz~~4(V8)(|>@;qD9+I>dTBJN4o~I7m z(Bj(q94<8mkY5e-ceLxI0;=;x(v4Grv@)B}Y}8XuM~GD;uH@{gbiTaq_}M0dP#7L2 zEzu_o5O#->s|Wf5#xV?+*{sC?$CJpC2t<%)EBtsUBAsW6P)k$sidsYFv*7zMgWz9? z?Bo-qwX%p3LBOS&)HC(HPppCg{oa?Gw2_#WC{(|uHIYqGF>VNd_~X!p0NZ!4p4O`9 z@(6+L)XOp(s+0kh(6Ajbw(rKZ4PaIiq?Rf=`f+ZBm_BhvwnaNd&CMNdx@yL;%!{X& zbvoK*S->*T#8+%Bu+!Cz^v==~yHSbtXtAXj^|G>Nx$4nOyL}A2^X`RLZ)Qw@`2aY9`S%Hn$F7=bKAVb4-}t8eEt1J51-wYmdcSf@_NgPHlx0y>W7Q*yVzq-T~DskYq#cTtW$t^)&? zvsdDQ_VT#5?D2&*260g;HtK*126{|%7zQvqG4>p6@Ea=DR!9Wr)orIuzMx81x{>u7EVJ@kCt%!d}h zJb}$_^OBUe5#YEj{eBj=#lWVb9@8Mne_bq{w#AtH?G62=HPKHh#8&3l^(nqv8GM)Q zk!K~qPj4o5=fXOg##JWQVkm^?WL`B?~p$n-l z5?s5tO&124s%@|xm!zDvV(3yo3IGMma+;W+3z=pIJV(U77seeL;VL3*34O9Y<$}g9`OaJ1z#|esTs18K~5(0yk_i*M|xvmC#c2lvdL99}pCZSa6CiX;H z@i}eaC@1gt{_p{7xSU}PcD=n*ioJ8>))*LAjmJiv%GqF})KDWMt8S2?Qm084QF{F^ zqTqg^#U*i6fF7_v*^RMucwzh-82z{`OA^uFpCRDNm(aKFxO-xO+{^}@69EN-b^U;) z3);be&VVXp-4AzD5cnPu<-}1V$4FJrm8vUbE%v>Ch`*^`5}44dK{r3a;!ZIu3nNwL zTT|AK14_&A(P))oUOkmz`v$itLlw8yqcVfZo=9i7zi%lK(i`e07eaM7p%;YWNPss$ zI4-Ts__@5KFFAaE*o+6>cFSkOgdb|fxK*0tjJHdQ#>mog#!?zqHMO^C7+mCt#$6ap zwq4M0wrx*LZkkHpIFu1+-!6LNayzVB6Y06yYCNjdoOvUq3urdc7dlTcSa@;wP|N?q z`OSUxa-F@8Zwwl?) zfwD|R5A8Hw7X?OKtfnajQ!nSz`C=`>kDxlX^Fou&!q@>^J@RGQGW~tQEImb`VY>Cy zMs?4|{EwO?6i&x&;kzh8l`Bi*O7_c=U)vALqh}w7rtazT90OGbZW&9tjk~i*?Su2T zji{-&w|%A3Z|KO+Bwlr2F(xSMwmFPsToc~BsC2)n2@()-C-mw_EEV4ecnA&J!WcxGuJX^5O)D_K|H1|X)wX;O zUZPUwzNdro=mxhZI~9)pZK5No)mc*fS$?@+ewt46+Ond`xvB$oM>l@f!`Mp_-&a!| z+(%*#J0+jF-PEUr4<9KtZp0E-+^X7GxUf;pDrEMXhN(^R%F4}Ofs1_EFh<*Jy3& zLs>gvy@}brvh)dk(hDDcUnDyfUsq(h223pb{=_Rnc{8cS2%9@)m5N#U4^I-N zScV_Ed&lW=xZULT$u7*D=w$}BTuArj#AL}#mgCmOiy>bB&k}^eEe^6BIT_g(=F8Dj zBTRbx#{~tq#V+yedT5k|PpleFD(N!kZXD+JO>z$0oTJM537__zK)jEkP4R(K66p=O zVCP|V&z52mpJasF%KA4) z`3Y-&rsrQ@(eq!ucA!oYV+m5*`96BFc@X7(P&6;~Qh&cHd*xnspHj!u;ok4(qV|Ui zcK=d_zTy;S^kc*Po_ddYjr;_)eZ8oxu43&E+|Ev?9*)*uCrYM_NNI+oY^T3gEqKxv za=|IaZ-zq*llOX|A6}YtZbLec`64an~wGmzAV+mS@AW zwQn4bjoMtPJ1^B9j@GJiM_hE1l;aXl^H?gnaW4?1@RlNv66M@p)KVO)pq8GFJn|Kv zY&^4VJ!W!VTo@OjW3v!!?ZkE=Ntw$s-pO5wOFU&;>Gu3L%BYdLpK=9CD_uO6i2^V*uBeF#F~HErUy@0h_v)mr6VIwJnE_d=2;|;-8rV z)^zS)7~sQ>k+Vj0j@J+(q|PF{LRRFRo!PRl4**@fz)eIMduvAOc6@pN>Kzd1O~A>O1z;XJ^qXskOM3m zvlc0&1>1^ue(LPJT_{L(4*~&)Fss^%!F5g(tSHdV0FwrjOtUro_ZYMioe!Tm-Ul}t z;Q~T{92(!_Y!(P#Kf~YC6VrqDATTvBk>-1f{S*lW2CZo4N%X}K6_ha+1irZ5EHRvV zNr54w)Oq=#tT%zZmlT)?EMxA|kzSN2=8 zKAEN;#46JHAkqzlPp5(fSRn?HL`!Gas)6AGm;t2om}QHzEL|8fGN2pNhaoD{2r2{w z#GBPV95bW&AW;x*0NvM3Jq}!>5fKrw&U@N|J$XVJIKVpu1>S_zoOht_K!6$9qcLELsm3 z$SyCQxQ~&jrb-nbpaH145>{Vjz{n)WPzKHNj&Ne5XN5zyI3ueML9<#Y2))=c9tbZO z`_SKq^J5QGom&YWwGv#A%7Ts&x4?M3Xx7KFpz(Sd_v&5G30IVWt>LUu{SlR-YN7yJ zFa5r8doQsL-{&2wc9w6h=sPli)qG3x7azP3B|(IlrK>G_LAanDG+;c7o1_Q2SQ-U$#KcA`32_YSPV_q(3E|7HVNYrY)x~$ z6oWblpcSH=r$e5at#ini5#GTP) zOlJr~v-&XOJ70hf)7H-D&U(KfiG6$Wa(%~c{qB+HGF9Hs1d*}Pm9MkB2&AA>X~V41 z@oBmUc*w5qUA>DPjlsh^^Z=rOI&`Bq?%V?pLH@CwWl?&S6&O557?#+YCmhCn)~eeK zkP+3(=y*xr;~^U)!V+-sb#tR5h5RQ5E9JK@Q*|7uMij8n*nm1_nfGR6@ zr~S2wiBQO@=92~0+wE}Jw+JItAl?8iu=Ah_31AwrH*4)88SIF4BWyou#P{Fa-ZNqK z%wchG@^Jp4-F_2E|3Pel|7Ps|zcE|?9lX*kW3< zPv_$sse~``ap|xf&#m!?tlx7GV+5dn4=VShtNo-h7pTS&@y{b?!ncEZ;>CQSOhBId+xl&PFhG&87{c$Jl5unK7LT8+pG9R$32BbUd$HM z(&sBwwr^6>v#Z526a#PXlN33q;vVbk(q~>?eLxE3ei{pLsV?8fYj&;3% z3VeFIINHZO-jg4ANd_ zA6#Lwz&@Nwl_2z&5?h$sHEKF942&KRjRyefd+BLW}z~XfJR14}+kRM=+wPI<#+O#Wpj>BBh7(2eZ zR?KT(%I54id|e>6U#kQK#6&R&EaI7#i`0PKFouSbr53QH>MMn@+1-EW#fC_!V|A|DSz(fym3N&-(^tu)0R9XV zQHJ4kV1Y?XAtw*?EBfHZLC78){domW~O1b{o0tJSahtirf1%_^k zS`R|nd%!HS63aXK{?remR%Wmm&}VBlmQ#p0uq^ zO@J28Z^sR>ah6mqsZ5XZc0QuO*Y)LWY8{v#mn*#(#v(h;W_rUtf~4UCi>b9@MZ@IvOz{vX}ZLEj2S+ zTiuJOIa6;zq^a7KYMNXFE5UPUCG7Kf+NnDu1{qi>a1&yB#X4;hfV;0eNU}<5H35c`I(N<&$)O#1)tUbG7vc(H`gGSF9{so&)J2b3va?sUN{4Wk+R6nHbo9tELyVC{L=A zF{Li&6K^6UbSV@q6|twjB@ExOG}_t1xW^aH$d1YkM$V1M+bG3E*w_IvWCD^0Y1--< z&%jWq8HoKZSU+|Zof$r&9Y2E<%ybL@QgEQ1<-YKKc^~fE6@1mX zAGRjWxS|;wbk%OYZB)3rKzSs-HY`P#uhZ%1PhWCFW~O+X(mr6tiGfQwPe@hb5^>rKBb=TcM z-i(4)iQWxMHyiK#aZ*(U?bEAxhL=G~^p3A&eC=9(G8>b`WZN*FD+I_}g_ZfNwXjxM zk3t0kqDwWbg~^+IVFcN7BGvf9zURcRRGcMl-C+@>d*hR8mrpe1eTo>Dt>FC?hf52( zm5AEdtp23yrRFpWRCotQ(Rc|HZzEXXx_mWfD`Z?F_s%P-AdiJh5bfG5etD!;6*^x--9j@CXbSY0Ib*Ai{P);#IC9tzBO5yj>dTMxstX!^-Y!e*;)9H4?Qq=j)9;M&%FMI<*tZg*=DwD8;A3;lP_J_fvlGWmrYG7QJ z(9$V+!Px2_Q7lJ3sLbCM@wGtf66}=NHYrJUjXXz$i|k7W;N(;RA|qiX``Hb#0+EJE z-o%ho^4^CN0E2^TV{Di@F{m81T>Xi^JtZI~!e zR<4K!y0q41zC2x0NX6ma6miFY)-CQrgTD8(#-%-3;Q1Bl7JXoDt$^lH3|7#o;}0c+ zu8kP&v59uwoEr1nA;Q;FC2>R8sD$ndhR-r%nmP7&#dLF*@LNrcMGjaZAVmx>?Q}KN zcne#L9(p>ErGr)yLN7?l^Q-IwT_Rl3cS7|d^0!~>A1d*G6jiFLo{UCdf>l0G_Naal z-`>!bXjbR0gi)S#`e8vw*nbV2W9gagJeAg6TfJ^GZ*c)MSEaZWF|ar|@50!s<-?aG z%2S4Fpk05P&@Qk4LbqY4rlu8Ya%`#58DF|Mh^S8OR+VTYD#BbJ@!{I0o$yDiT>#ur z9Za5zzjfBQ|A6u+ZeF*_Eg_b>)ps5IE?YTY6dicY;uM^Eq%NFq_qC+BG#?c^;$wd- z5Zt?VP7ustFG##9dhf3h82a7-;bT3IvIsucs|GB=MqkU$cuxVD3RI9`b><-9X* zBf{Z_VBTE-sLF5jj}Zo?Pn2goruz3J~;IpLhZkXgfMLM{rKx=W0` zX(&(NyH$6aL}lya`ZP`BS9|~rW?M@YKm|&$Y3VHEsEh))njs%>q@ce zG`qoFCmB7lRxS46Y>Rxw;4>ZsjcmE=5q{o=PL#QPO z046#>=?~SsqOG+fOpa>+dt*fu=iE*Xf#sMi8A4RXrOE1HiNGKDm@`q9WF^EpP=x_Y*MDqnJ^*E7`pFr?i z>kLb9u#6tiKCpO{GV0dZSqdVyg6&#q+HhX|Ut!__YK3!8Tk(cguaOsN<*D`6CiCZ> zhI3+3mS*mp(;%Ge<+^owLdT z4?2L$v?MNUoGo1>9?y9~a}RI9cYjU#&Qe<->z4s>rN*^dAROQ0Qj?`1x`pT4wY_V? z3)MuX%24?n^+KK$U7Gs&9$0*N=6G!4gXBFsgY#d&6RgAT&0mf&HN@BvRPFp%A45@> z4(l%}BIeK+hm)CiB@d+!_2f0O9HxhgFADfUtJk-LP?SG4=F~ikP#pIp^lPS6Nf2|- zS+w@kFj3l6QijyR_Cv3cIvl-wg24o3`)_+OoYhpTNWM8WZp~dNAE0-@A|W0AY#c}? z5S24SI;ToTcg2v%iGz1&>F)77{hDFY>B(5ZQ$-rifLA8H84iCK&}iJ9E=2aL%+6X@ zb9|{Fnli#iV3(Tq^cW507o9TY9ac1pqs^GfYQQHe?r$#%QP<%G6wT5x#53C;6X<_W$kM`S`Z**5Q&+1)y%tCgQY2FEQ`Kro$#COzHRM9p1A6xS91tUIGXL;q# z!+vB8(!Sewy$z>|ALciDCsQ?mJh^;0Ou5lEuc9|@aRROATDR^u_F?s?=e;t& z!PykNC)+l=N0f4`oDxi!M#g)H!`sK2^mvou{WM?`B_5W=JSJbY(Qj23Wjv_V7)X55 zq-~cN^coj`VZh!U6X%;qUrAK$4tk9EWse3|m%C9bU3T_6IU=jTRrhPVBw^SH3N*2% z-DY7Yxit~%08O>%0cw@YT#I$Fz0>rB5U1~Hi_S}}^touQ?WnxuiEL=jhrAYv@f@s= zFlUtbRR2x#{3dUHvpnov|48Bbo%i&I<@t-&`Dbzzi>RoI0-vZT$lS=*`FHZ#-zizY zGo=1s?=mrh&`JMHkOKe79Q&6PIq=`9U`miAF&5G1JURR4Y^=X&q1V!ol&=4kK9`Z~ zuBN((7dqa?-8O+m0iwDf^h5+r@yp->Uxmr~s{lfRsNE!BrEoCm-k7R&LQ98Im`LIv z2fjC+M?Aw&>F;_aA-TO8X@huD&UwC;{`ggEeQ~#8e$nE@XTBLq<>5WB+eH)FpCeln z=f`1}E*AE1?=^q`0~$>ex^u(a94LJw0hoDc6HH4hlIgFx`oZjP+Oo{pp+fCE_v9Bx z!7WY+2Zba#%O&7TjlT^@RITZI!S)0kx=5m93jwp?Wh3U4QGD;Mw7n|aVQ3jlO`+b( zCe#{x(aMn-*`l(RPPLI63Cz|_rTS)(>kV(#rY4&XwS7%HJ$>^@0g4qT&0u7gI@>mk zO%mtDkFYZU6hdMzZ>tkp#4WF7CX`2k#a1{lOxCynb3WB-dvCz}?q`katudG(u}5*^ zgNMR6WcLxxitk_PkSqyJrDd098FySxe0;1mw_|zRvA9m^tNJK7;CZk9llo{pQ#3MD zYu)y!jHL|^>WWhPBS}qrk~&na9h}JaMw#*n2!yfm2)_aGcju77KwBaB3Z}WUiT^WrPyN+iB4SXOWlOL?fMzVSDN>N%?1mo!7Y+Oi-wYcZOIHIZpI}~< zMp^g)2SF(DmoSv}!kz%1Lmdn-(m;EwWqDksa}1m3uiZN`WZiK44FypO)txJp7*i*z z9L5*9>p`|%0IXPem(NHX0nDrbMnhC$e|AThH4s#gzYGRUG7Pf}z)A#IEh@ACg(M1I zfOZSCc7&P<@SFfDz2|a-(*=cYLazl_A-q4uz|9dYiN(u9PZOKN zAks#7CoZbOg9Fni9u|ucFLFCUT|_`1SduNSB6#uAg|HbxFYxX&`~-*t?h)E22s0Hh zZG^f2Rqwx8#ZQbN-97wG!UOjcJbvf$hFl|_5L!bw{sz%06l1VKcLIXQ00PXUlqLev zPYJPDO-g7?a+^4cJV3EzdMsKVQB#ym+}kY}xX^5)R06#I7vDp*A~%fR7|j{WvCgKN zq`pzW-{CUHU=O%`pKm<-r9hLWOxO*P3-ehF^8_?$?Tl^1uP&cT5dbHB7;helj?{Yph_9kyf@+0;mU5_E_@1TiA)CStT zM<-7PQQA_fVGtthB0L6Rc5}Q6C{lKz2*G&Qt7}a6C3-=$RhF1qDFH_|gcAQXC0$x= zfSRl|g&wsabsKrYAfKtU6M>e9zH$X+7RZ1KJziKPk(L@qS&mpzY*C3?!9d-v`SRO5<#j4pY3SloRJu+*1sgvuF&+{p5ZX zJTwAcb%}JT2IN+~$(Guv?G_A{l}yh`GX7wkZX9MDxXIb~imEj}Aie=hxmaYsYKkhK zoKS2!|J_t$tzs?TlGzd~i8OcK{dB^9-v!xT+XbQ-m6^^q?Kbf?;daf?Yq)M!!yES3 zFY+T3B3mM3&N+6P#=nm*b5&aDKef^&-O}6BdnZvOnI}Of#gr(hJIvzDW|Y{KD9^B3 zQ(GHZFIwNvGM7e;7mmAUj%OHfJZ(LM9#l1lc{bizU-ldb9wZQ^6Sfn+AXFzz;ppdl zk#3(pn7*C9%kj0=QX9DrsJ*SdTc^*Ol=fpp&77(xf;YRo;<%7$QYde=RIuEns7BKw zSE*(UTQ8njhg-Bkw?WliOj({qlf|I&)k(I{tE}>@ybkFO9lxQ@3DA;Zgy_evqU`YO z4x>z?+zpeLC2^&b^tsx({QW#8^>4#}3Vqk1t_sVLjhBrYR8(D)VRXhX6V@6e`Lq;+!IxSdDyV`@Q zyPl=qbQ?VrpRXa--%V=93RZXO%8QxS-8zna_|x^OR`FVtTE?%?t|;!Q@4@hbp&p@a zXx9raZnP~yKC_sIdmD{oKO?`x(|FN*nU*bF&(Ip98$%t-MMl9t#h+m!aGHF((MaqR z$85?RY2e|QJ)^#y^j-V#ZbWfDYS*pTu6K1oaPhJ6o&jARJx)5}Yhq!-F5x(`{)d!G zjW~_UhWKma6YG;gAwHonp(r8jcDMFYAC?=VN5G@o-Rk-L>F(Y9y)uvoScbTVln0ao zzJV7)W<$h+bp`fxL3g#hCu5m1pwykg1Bg9{y9Em%a-!(r-Z>L6GjfzsAH8c-_we;_ z2QnE;N{IKi$ixgx4M;~s;mPBq2j`z z$$c9*pU@I|AHUnrup9ML@5byQ4ww>D9W*JC(yJF{B3mJgEBhUwEL!)?wc6k;V5>MW zHZhluy?C;C)GDa}gZI9i=A7=X7VU1oLLRy}f7qav z2hUaLE;lK;>vc76T(%#^*n#Y17EgzzhNH}g*6qXBW?p@MRn=~2S#z?}FV-aXYNL&5 zOb5-j&lcDAc-6e7+Q<-Wd{%~E(N8@&NDy^kw3lH)R0tjQ$ zciIlT8jdrTzAn#qtlRlbLr1~%!3&Y%5V!gbT&viWi`w-Wt!$L_j34G4GM5lb z6})=P%cI+2eRl8k?pfBZntisTpE8JG zBH-?RFt>X>>8}Xx`>Z`q!WX0K3y*m6JX$`Q9DUEBK~kpAED2PGq^!MNnx?lCzNt2~n zzV7#J7RH0Ur#6#^X~J@AMeV$Ib60k|rh8k{?p7xSh2d+Z?ZQ_9kJnC%~beEyL&Ktu+z;^JaP&Ss{d-;3DS zAiaMWJ&OtctbqSc`v?D}4q*BJv8WAJUw2qm!x0K|c%6qQ4APVi4ex_cL^@4GgysEk zvI+Uea(Mas3-pv*eB5EhMDWY|^(D$)0o-s8&?1X4=rRK2sBp$!i&vesvZ|r%6=CyZXx#f(BM~=`YkjB$rlXj8i5h6yhajDuz$h z%*eyclQF?Zo!j~#B1gd+?e$Nl)FboH{sGh$^jj6%879+$-D#SO}IZK0)0Sv)F z!iKs%Q8R^kTuphrk<<7FOU&B_@Dn=oN7suZy+FR~N8tt?Zz{?oZj>6F` ze|Uf4+Va*S*wHCIZuT6!GkFag`-)=GrHXW|SICcSY5e*z19WyRN!^KL!)TD~pclh< za{ZJ0)PCjWo)(x(3$QJj_)D=_t5ZiVa0Krbgj@MocHoGY^=4ih*XMRh?@36!RKjC2 zo-LN+&r``{OYCiv;u4@@8wd*S88!k_C{JP8uD;`q`TjL1vKqgQDd$x_|JO>#j=?XQ z!m5kV4`jwQN328^*m+gl3m=aV=A6_Q>h&v5Zlc>>I#bBqmw$F_9ko)Rjwu@OE(6BvSPxfwfdx3O_~czYhT z8e#X9tIEE=zWZjO@(a_0-D?29p=Wq<_Ry(YH=@T&5))15%y}hp5?4f7AK9W(va5{{&wO+>qE5wQ58;;0ck?vR@>Vx1S$PapvYIu%?7+XyZU@m_pV6*b^eY0a!pc-J`%;0SPt zo-f=wT8?a~+Z@*ruEt_zNhKYk_fR97-mG*e?kETD_%XMc6*a7?&M{OChI9-aG6$5%8DIZJWEfGFxzQs(e-J_ayuB zo2xDjlOF!p>fyPLN%*w(2XG;1rBmLX7 z^_S-9AJf*eIOxx;_1A9yS+V8(e`~Owl}D}+l@S=kB5!5t3=v)Zr9RU8*UkN()RE`S z{a-bT8@U+SI#~QA26O(S0()cT6pI=1 zW&^!)HF9$C1VMCOzXf9+E_8o-%JwYK`hAlG9~&!}la-y7mlX_&1&1~(D-GoR56eG> z&)z|_W2UYq5JleaHX$M^aflGl1>%#$GxhMhP6(*zVEV7u|D-WIoXpITSV3%TNUZ;O zfw(w1**QVxpuaFM2OAfpKhH0a{ofcXD;qZ?Yv$iDFbC_i5C4WiF4!R9{SSX?Os-1UJgi<{uAT<&wIga-2c_?a})nZ zegD-rFe@v^fA$wr-+%QD%*OMab@Xq(K>Eh@Ul<3N^*?R z+rcI zBx!)AMQZFf+EF^LI%a_q*>U&0tm4CxzzdBRW|Yk8CnF;7bmTst@rLt-`RdekO5rBL z>P`k|<6Yi3;9hG|U$CCUt!*ZQjnDB;de}|p#icrNnubVbgu6HAX2=B^v8(6n-Q@o=-SatHGLWsr7p zh9lbDfwyTx0ehxpfM06?c(U-rsWE=umaxhinKcf$p3RX#K0g~Z@9b`9I+!m+vE{# zklU#dYms+{0wIuJjzEx}nz_A|1^lO*q7wut@Vn*T%eyuGUf!?07yN6izf$sh2#}VC zIs9jmel8jadT3{fs1t}F6bMqVva_*;1EGjjfD{qQadUOKtrsk~n+GDDe+vb2n{vc5 zZ=Dbs2B}*i66*^0fH?v|S}HJi2O#8E)}`#=?ub@t7bjO2XM``7!2d4B?dhk_#`*9g zVDmRw$(j!~K!wRBSPlL2J8lHLGSTm%vSO)(sr}~Yu~*KN9fy|G?899Lm)Ba#x$M$q z@-}KDG_5sbCZ6y61B1uFFUn~!hT!aLNv_tYpO3Ej16RK*HO;i-b>5xx_wbGA#9ptn z5$(-T8|8jgRyFjnXuItTFMP7>eXHZpXWG&f`W8R9F%J9bh)#|%gN>Nw!|G5P&*tO+ z8nhPL&h6vp8QZ-5#q4O>; z-M2g&ctdf2ZIuZA?p@8EPVfa#z9K%=EH3n`=_X&udpRb<8LyU>gclvtTR(mn@Z*Qp zaL-?$3C-PX=Uc!Z2dc!Wx>*MooepoVR#D@b1gRyq&Y=J3Kh|EL?Hz*ef7k=_0gAX2 zMnx8*Fbi0w%bspPT=)rDvyzh1C8G0Yr_-qqJrT|4;&{&p2o-{P3@Gz0=CJn!iGa+) zfJk4Wt@VAveE}jM!|hWSw&(g;uQwmVHeq6VkW5@=diK6g2rUsfJ4x?SO0;ioFD;T5 z8DZEvhdH8#`6fGUr0)YBhXD#0S%72tTc4UN98obM)XkK-V@Vh2iGZAv$hp*3lA=tQ z5$Zw3D7RfukJA~*q=H*^sVvwLeH{O%D{|gFBK+?ftEeGCUCfvfMy=l3@3;FmijM&0 zyX0yp3bKhv=lYlo8yZ&^F%}%CPh?74HRIN_MZfnBa7d6rQLII&p-0}~lLLS-S~WAY z>Z^G9Zo^dWs_$9g0<5d!&htw1>T{1g1=MOI@u>Z^2d!=liN2Hba`Miw){dx}ly$LY$q&DuYkr~UAU&n!!GSA3T=rrx^<;*dApoKHbg z0pt;>ruw7%Tc~FYnDH4Y5{cBECT6I%SL_K2#9-=ltIHDjm|rmC%YB=Jcv>?N?*0?* zBkxXZ4qQ%g!Uz%M{)`O2q5LII&|bFy%nbH4#O(itQI5^GuJu&z#e zkA>fFgWW5U7VF3!S8VqTnUVVX3yaFF`!agQV#epB;~Yu_@6a)9#k_Msx#%0>W!g$) z7}f|&yvRGF2sSxze~Q*%iE(u?!b(G~vfq~iSYCUuy?-+LB4@uka!bJ`ETVwAhSiCH zV%%q;SzFfDY%SPO>t1efc%)02Pgn#gb#q$;0ma-Gh0t=b`prlJLwYBZ7c}&x*YE54 zLJJbc*^is4sjVB17uku3h$b&C$$Od4%%^%kT6DY@ew+|O2Y>{MgRZvTxUMqy?nG`X zk>oO|E#S|SVu&XeCfYMxVv#0u$f_g;sRytnmA|NVe4|%uymdU;=&Ij$7uCF7_%PDp zEtY5M^toM4&)`Is>`CCXep1d|)PVB^6D!;s^SL$GhFGhrhP}vMXNIL0^iAJp2k~%$ zYYpkT!^29XHY})bgPR;d0lZ?ufX0$a*l-?78K8I{+A1D9X?ihX~Wkd${* z8l3}D7n+ZmK~EEB+gg~5B8$=R`<2xBhhN3RvO2tVmC zP5OD*r!oNvWwU1bEWAn!?(zo`FmLU1SF)&}L?Xp!51twXN3i<(tdUt@7`@1Y46mEB zx~hZ)G`q(Jqm~xgn(-SLViBp0xIN0|#2|`|N9FRx!Fr*l;i}KHjqxHXo{CXumY^qQ zcrfJ3QU%B>_2u#Usk#Jp?#Duw3RYlLyb5_e3D%bUdS{jeu!3G9z|-|ikq$p5e%aU_ ze-F@x2gSfZeSc2StUwM(YGsoGIiHK$pmYE}sC_%+6v08chq{VGK#c-L=}|+YC?5c5 z1q9T4;Gi6!JPtcBS>{A(L^`KMvq9+@A{U)w6t_e|M!}c(^;6e+XxRPx;g`8qYN1Qi z1{j0{zyJsjo%|%stlKb>3pnq>* z=#yF}@)7ocU6km$OE4iH!4p&_zWL>N$5Is_3EtvW6=gRfVC5$T157VJy=C<2d0VMy zU$D8QZP{oWHYW9){DbKpF?PH3i5~b)VXE)R9E1luxqf|m)0U6N`~CEUv4?-?X<_b4 zsn@jYBi#4W*}02Zd|!R*`)KBbBaFE0AFxPBKX zetsi$ps)2Os=9>=x99;PAPD&lcz*r~{|`t3`GuAK-!R3$5d;=U#>&&q!b;u^=JOA% z0sISV{3mQcAfEq;VYiK)Qo@1wydeZn%uwja+A!o^2LJ2Ub^HTcF_7lt%eD15e<0X> z4cc0~ZcTn9$ujdSQxm``UMkWTx$k|H2ZIYn7uSCbe>h8U2@$X6#hf6Nm!f@UTYh+z zK{7UB3mUwua~~jGu)2+^zFop3qZ9l7NW`&bVGTfiC#*%;8pThi=PD)m!$2o-`*U|j z0UXodx6Oy#j=<)NpqaYM!J(iX0yOXQ!4?PHkXI(3qJPlDoT@1WU$@D=DBorI!dDmb zptZi!sWyLM%(|ZE5f#RHjD|GUo!V5j(-0IiiFTUqyM8#yI}DVD)j><6QrbIY<>Zy1 z@S1SlTDDK3z;24-eVIj!!6G4R1zeu}*VY;Wr?m+v{D=J{PbkaGIw6fVd?*eW^849S zL0GZoNiPNFxR+>36hZ3b$T=6J>-{;@82O5^*Z$d5X&zX#@k?LKMA)E&?qI7urE*K= z_WKm$fpTQeR5XiaNFOJrYlkMwz7S&;V!@D0iYLj2E7Eb7ps{W;I_>qIoh?H8@3G@Q z!~bH=Vv!({O8@qQ)}WmH($@6lw589AUr%Ep#S0HcSU}9g2yk&rLI4)2|^1S zVTd3rY8j@p*Tm7`3(Fh(z^qQD;udBSXx3|{iLFbr3%F--G4Ku=Z{_cf)>Wyf-iRFQ zdTPV>W`dhcH}Sb`DEktOrKW6YUij*fx*b6nF^?+|CF2SVTvJw}!ETm2EQP_^nsLoc z;YJP6njvw();~+td5U?b?<(Vz;&}0u#(T5QOn>V`h&7O8uu2yohje6oW4}QIIg29= z_;wc9xaWRfgK2p8LW3X4mF|f*AxqcZ^;;T`xlo?REt~Sj=tn_mEKC}ebOO$rSb8K5 zsM7jP*3`aP=wVs%_5O*n(;=gP`X~C@1YK1{9#*&r=tth{q-dK8)%bOL-+<3Rsv3uJdBEC{S>(bG^*7k-3WNXgz4)fMMlqZ5o{ zpov}?50lNhw_JcG+gvkT=@atb5sTEYu`vwA0MfFh9{n(eQUVQr}E>TI;lH)F|t> z3w#2UneCPv^K&!{J4!tcklk;rWgMRRzCMd@yX0=O(E8+#DCb-Y~FJb{q@PbGM!ZGv(z2U%$qCb=3=dQ;&I<2^qMiObu5rv< z3u<{6RaxB;i$3jM!)|?6IEh*}*Gl&)Il)cBd2jA8$G z>j&$N7pn3ttHy!IB-PR{m!g5y0Sh6z$GJ!$Gw6DINJmxY*_FrA!$TzA9KCo_yRf#8 z!)he89KENseae_8Fb8Df$sWh!DUROyenLa4N1L;9>-?2IMsU7SL-QwISf{{FIc8fb zY0FFj-3neUuY@D-d41e1F8?RxokKUGUn`8{I${>oUhDhZ?<@}y_faUM7#5kg(+(@e z_Hk-eM>SttmhZ7_{c`uEny({0QpaM9*(Sbs?kR_3nU|gK;~fc}Xj61;V7n$pZVWOA zW144~g9^XmMw^~wmnTDL!9yucX6UM?Anm|KNfi{=H09q_8RQ+#4l5tmf3EIV`~75m zM_d#-*e+K(hi+G;FKxCR5 z$s<($fX$}YSLH7g!1EjA^6x@V+Q6)sPJpDr)V^7=0hsb@=-kUNxK6%n6FER=R(0@joZ?s>!gE2a+%RD_!_-y8JXlpIs z&NG*h;^B#}+$#9I`p9!Ps?UxJSUqgn?f8#HuL{wQC*8Nd6Yw23L>SPC>Gbz^@WE9! zR2%KPEJG`DF&m$mwN3IXMQ2)Yxlpw{Ml}yzN_(k8Zyxtul85*>)MkS16)z#=BJa5= z4~~bYFlCW}B{cN1MV}To)npG-pz;fjQNn0+<(Ff|1d}JJm26j^Uk4WVkX`+WJAUGc zpTI+qm+xP|$z`%e<<7eDipF8ROqvVbAR{5M+y z`AsAJjVgou;)PTZj1frkmM?R@rDlF16-{{rzw^Inv~Znymlt2Z6hvro(aim( zPFkxKwIbO{6&3u}JMd_kwo!E!8$8XKwK|NBFZu=N1=obvOlD+6P3>wj$#tHjzJ8lE z#E_EoiX=H(C3>`KOzF

kU=Tg#J(WxY~$M2R9d~qA~in6Lx;6p3t}W#(W)#qEl;i zCZ_TyKf}=&7;|{9MAU+Qd1m(k?d#$Fz0Z6ofY*RD{}=bXN4l9sRcXaBpAEBZ5|?2# zqKPz4T7y2oOz)8OBrWPVQ`Xa2CsdUs!rX=yL2-{hKyL83o_ic^8Heg!z9_7-sKtw# zV?WVujuM}!Il8~6RAE|Prw9u~J&Qw}xBzb&jiZu8fB4**ys2p!(HzMFJJKf3 zJdHx(?sC_b-by`jttsRy8uO|xFr^J)K?VQh^DPXeHlen=s90`JLd0yJ{aKC=8`V6t zNrY6@53VHqS)OPNPVG`$e2V)Kky)X{enhV}4B;`{CIq4r+IsMhioJ4h5Z}5h(udY? zHn`pF-~hjRbog{O#;KdH!nx~x``Ki9CFhlsCP3KCH##-9Z_l$G)0>`3)Cl=ABkrcl zg8uNd=5%F#;rH|4VS1)E@gA{((YnRq(jR$0N}P*Li%G}kh3&)0g^L*c+5FkBS^Sy( zLD$OBaQ%9^YX;+#<^(QO!G_(Y9L7n%a#I-LY_zfMxI+#vvzBU~-!kb+@>S#2I}yqX zqB>LRq*u#Lds~<%pKz|Jn#kZ-RrV@1ew_O#WIT9`Xjy0zUD};tui+&6GdW2`ntVN7 zlSlNgJdIwgq(*xSWk)kBMD50?b##B@27JhFJTp0Cswld1{3D4FEF`qx#G%aC!~HEw z=#j4M5f=RU@F(K{wE4SvimyGt@bwWtoGLFZXT^NnR|_>Bmyaa=#6vu^!oufO+tePD z&(Iu7_iSBq?y_0da~8*G$51Bnrd@bb*VeF@(0?2MxP@XmVo&w)DtBHC`f+{Jx3zqQ zWwZn>p^EuSstu)Yv+xfi-a)52L(DS5H2f4dZ}};NP3dk(Myw9S^^qQV|CdwmHV8+%4lhoXfoK)}NnR`!F$Ov+F-mkEDJTg3=DxLk{A})g#*3Y%{t? z*xzvqAj3z#tB2gWXl;!me3bJgN;b>83a{qD@m_Wxb&47l4 zB|FY162L^d0!Y@X>LiEWp!6N3utFmsP?B8Cyf<`99p#QEuU6R`dehUGmUAie2gw_G zvSS<6=Q0@=^J7tRjnWwxZ1NwYTQzAbW+JVevV8u0_Cgs6Oq5|du*Q_@7zLFjBHxKR z03cx`cL+AR-HkaHw9Q8HF0xsUMu}21FCv&ow_927vA)=^(mFSXuqS_1S$yKHJaklz z^9)QHRPK^0i_EC+lwq5&U3PzaTmQ?d?Rm@8JavH9wP=s;rOrOn)=;)&Y_|Tq4rf1Wz;icP@2>i%7+T=@p5&tz=hMsI(a~r1CgzVDUyGic8uf(F|t+Idk~l1^*&1SihYjWLgdJbymS zu?=u99v%J?izk>14B#-sy&uHwdS?!Z6c(g_e<$@0mjb{}0_B~g*d!8`BxDlVGt}M{ zX)M@x7)3RN&lSxGhD$yaZN6n-Um#F4ztuWDlP>PqH+gqyR5N>I*)l0fvvX zq`Cmnolfbfc>F|(^I@i9GPcmtTxoUDBYHSRJ%(}U#Y^;IAP?F#vVRysI^Z)5cM|D+ z&{T!+eGK{b{skFt;uq+otuu=cYDvWIerP9Mq})T|2sdp{!jR~}xHBTBhe5e7BNea5 zfJ{K^kU&=eD3Q&Kzgs|A_f#R_(efR%$Xr-D8A%uUQlx(DqPZ^Yi}?fac)CTpt}^K= zpEW*r@Oem~`FLfK9`hS@bJogdlah^!_nB0ah!i6jNHrN)Gpd8N747Ma znM9eIXp?${EalzE^d(Hx-ZJC>O&ReL#nqEpn26LK+?SP_QWbnqC*dREBVDM8TkJfh zSDId*WuVq1bhsS*;sd8k*rNw==nEWKB6|b7p&-LYHElf}9dps;uKOPBflX>Qt&W2DWFihuKfr zUygIVemeAO$SZp&%arG4`6}{zMSYZS?S=jE$M2%wlPEGNnkmRBbSTnzx_HSmoilqg zS2EXlx~pvsuxn5ZRt(l^Ou#7_I|JI*j8!p$xn*y+UvZ9z70kXCEwd=D(zD4|tr{dW zPUJG=m;7M#LCZ@@O$nq2GA-BG%@xzgDa$Enk#8{!>}wqcPMgI@K5r||jm~X>WyA6p zE$B-VUXQTl8{`Xj30S;;6umFDWXMzzm8F=d__S9=YjSK(+pK=5dI-m1)s~6pHE%3N**^ZcA0TQo*5CW~a2#FS&3LyL2hgGQfKA63t(`g_I2$LWqt z2V)EW?g;xOi>kq**;NFm!8z~Qvh6RNX z-mbZ0Ix{It2AdZHDicrFJUg5^W+z3bu4^yZ@s#iq50sB>$ZZWFG@wya2BR?&fYg<=XSfI^FOD(sg*zD+2hSU(EuUH)?*MNv6i#zl z8R?D&g}9#49{HH3BuXS+a=r4Mvg7h9vVO8@vPx-s9Qswuar+8cJe622Zz= z)6rR_$fd1sSW7!x+(xNYThneeD<%CyZ{tnd^dGTNQ_@h)xjm0L;LBqR_ zosPtg+q2eHW%e^^bS5Lm=KbHIzo{{PP28N<_kVakJ8%-V-Bfr|cuIO`T8a5eF2}HpR(WlM$qRhszEAF@#i;>k77?UGOPM* zl!g)piC;Vy%<&31km?HGkBK6U6nY33tFK-j&3aq$cCJ4-t=we4&aGso>GDb^?X}HY zL1SV6EdQqMi0h|cs2j3VO}7H*LKHw{GZF_C8wUoz8t= z>WNKUM6ERFCgr?b?IY??$q>6-wcL04GWns{^VnJ6%A?M`{@Aq7OW`f7Ki;3FjJ(bX z@VacWG4Jiza~Rpo5PvXN+$?zU<-}>ta((%;m)&mBtLVAc&EhA)*SVJ#N8JevkTe@ip|0cvkS?B77`ty18h@9nqp z4fp>p$hegucpxMP5Fkj&&e9#B!1zmwVEp%&```b~xJAi-@dwf{ILy(-<}YQ4`)^5z zu9cg+or^ON1mWWOTYuw0_q`j8C-}j6sX|=bA$T=5u%Tu>Je`^>+evZ zw`z^sFj!=SpkN3um>VnzhCq0^xedTzX2kbjp1&P$SBDUiSbA6>lsP}=L?|kx5rP~z zVofr))Wgp)5k?gk%fCPWo5t{Vv$Dnl1EEkX@V`DlK3-mKUZ6GbmrW4DgV>te577Cy z4GiT&LIS>#O_+!n2h=BjI zuOI}Bc>Vhw2iy&2=V;~jQ?jLH=Zn~Lgbqj3#RXB}h|&Ji*jT$D%Kfi<8AQR0@bH^k z@L58@=KOq?*8G;dg4UK+0+uj-3rk+80H2kh7}o!GL1>c@W#kS=l=IIb5`;n#VlqZq IH94&R1B^cy7XSbN literal 0 HcmV?d00001 diff --git a/appendix/_images/cmd_logic.graffle/image5.pdf b/appendix/_images/cmd_logic.graffle/image5.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a193b9977b7a353949485f210e04481c7ee0c0e1 GIT binary patch literal 12025 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 R0s^@?`EVE*WK?8v{twJV2{Qly literal 0 HcmV?d00001 diff --git a/appendix/_images/cmd_logic.graffle/image6.pdf b/appendix/_images/cmd_logic.graffle/image6.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3ba6c48a52af83cfabcb7810cf201ce61a1250c4 GIT binary patch literal 11523 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 HmGZv;^fH-a literal 0 HcmV?d00001 diff --git a/appendix/_images/cmd_logic.graffle/image7.pdf b/appendix/_images/cmd_logic.graffle/image7.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0bff3b5ea3f57acf2918d8ca8b0f625e363b2da3 GIT binary patch literal 9792 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 v2@$9Lg|H3smgl5HZQ-};G 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[label="create"]; + image->run[label="run"]; + + edge [fontname = "Arial", fontsize = 20, color="skyblue" ]; + //node [style=filled]; + create[label="Created",shape=circle, style=filled, fillcolor=lightblue]; + run[label="Running",shape=circle, style=filled, fillcolor=green]; + pause[label="Paused",shape=circle, style=filled, fillcolor=blue]; + stop[label="Stopped",shape=circle, style=filled, fillcolor=red]; + exit[label="Exited",shape=circle, style=filled, fillcolor=gray]; + + create->run[label=<start>]; + run->pause[label="pause"]; + pause->run[label="unpause"]; + run->run[label="restart"]; + run->stop[label="stop"]; + run->exit[label="kill"]; + stop->run[label="start"]; + + + //heat[label="heat commands",color=blue]; + //heatshell[label="heatclient.shell.HeatShell",color=blue]; + //shell[label="{heatclient.v1.shell|+do_stack_create\l+do_stack_show\l+do_stack_update\l...\l+do_event_list\l...\l+do_resource_list\l...\l+do_resource_type_show\l...\l+do_template_show\l...\l}",color=blue]; + //heatclient[label="heatclient.client.Client",color=blue]; + //client[label="heatclient.v1.client.Client",color=blue]; + //httpclient[label="heatclient.common.http.HTTPClient",color=blue]; + + + + //openstackservices[label="{OpenStack Services|+Nova\l+Neutron\l+Keystone\l...}",color=blue]; + + //{rank=same; image registry dockerfile tar} + //{rank=same; container} + //{rank=same; user} +} diff --git a/appendix/_images/container_status.png b/appendix/_images/container_status.png new file mode 100644 index 0000000000000000000000000000000000000000..9cf8842c00544dd199e8d580a0debb769795bbdf GIT binary patch literal 68168 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 *pLptyR~d7vXi^ag8xq(Hp2TkHC|!(NNQ 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 YQybnxku9>CL%@IXx0Ge_qzwK32Uj*UCIA2c literal 0 HcmV?d00001 diff --git a/appendix/command/README.md b/appendix/command/README.md new file mode 100644 index 0000000..0923406 --- /dev/null +++ b/appendix/command/README.md @@ -0,0 +1,126 @@ +# Docker 命令查询 + +## 基本语法 +Docker 命令有两大类,客户端命令和服务端命令。前者是主要的操作接口,后者用来启动 Docker daemon。 + +* 客户端命令:基本命令格式为 `docker [OPTIONS] COMMAND [arg...]`; +* 服务端命令:基本命令格式为 `docker daemon [OPTIONS]`。 + +可以通过 `man docker` 或 `docker help` 来查看这些命令。 + +## 客户端命令选项 + +* --config="":指定客户端配置文件,默认为 `/.docker`; +* -D=true|false:是否使用 debug 模式。默认不开启; +* -H, --host=[]:指定命令对应 Docker daemon 的监听接口,可以为 unix 套接字(unix:///path/to/socket),文件句柄(fd://socketfd)或 tcp 套接字(tcp://[host[:port]]),默认为 unix:///var/run/docker.sock; +* -l, --log-level="debug|info|warn|error|fatal":指定日志输出级别; +* --tls=true|false:是否对 Docker daemon 启用 TLS 安全机制,默认为否; +* --tlscacert= /.docker/ca.pem:TLS CA 签名的可信证书文件路径; +* --tlscert= /.docker/cert.pem:TLS 可信证书文件路径; +* --tlscert= /.docker/key.pem:TLS 密钥文件路径; +* --tlsverify=true|false:启用 TLS 校验,默认为否。 + +## daemon 命令选项 +* --api-cors-header="":CORS 头部域,默认不允许 CORS,要允许任意的跨域访问,可以指定为 “*”; +* --authorization-plugin="":载入认证的插件; +* -b="":将容器挂载到一个已存在的网桥上。指定为 'none' 时则禁用容器的网络,与 --bip 选项互斥; +* --bip="":让动态创建的 docker0 网桥采用给定的 CIDR 地址; 与 -b 选项互斥; +* --cgroup-parent="":指定 cgroup 的父组,默认 fs cgroup 驱动为 `/docker`,systemd cgroup 驱动为 `system.slice`; +* --cluster-store="":构成集群(如 Swarm)时,集群键值数据库服务地址; +* --cluster-advertise="":构成集群时,自身的被访问地址,可以为 `host:port` 或 `interface:port`; +* --cluster-store-opt="":构成集群时,键值数据库的配置选项; +* --config-file="/etc/docker/daemon.json":daemon 配置文件路径; +* --containerd="":containerd 文件的路径; +* -D, --debug=true|false:是否使用 Debug 模式。缺省为 false; +* --default-gateway="":容器的 IPv4 网关地址,必须在网桥的子网段内; +* --default-gateway-v6="":容器的 IPv6 网关地址; +* --default-ulimit=[]:默认的 ulimit 值; +* --disable-legacy-registry=true|false:是否允许访问旧版本的镜像仓库服务器; +* --dns="":指定容器使用的 DNS 服务器地址; +* --dns-opt="":DNS 选项; +* --dns-search=[]:DNS 搜索域; +* --exec-opt=[]:运行时的执行选项; +* --exec-root="":容器执行状态文件的根路径,默认为 `/var/run/docker`; +* --fixed-cidr="":限定分配 IPv4 地址范围; +* --fixed-cidr-v6="":限定分配 IPv6 地址范围; +* -G, --group="":分配给 unix 套接字的组,默认为 `docker`; +* -g, --graph="":Docker 运行时的根路径,默认为 `/var/lib/docker`; +* -H, --host=[]:指定命令对应 Docker daemon 的监听接口,可以为 unix 套接字(unix:///path/to/socket),文件句柄(fd://socketfd)或 tcp 套接字(tcp://[host[:port]]),默认为 unix:///var/run/docker.sock; +* --icc=true|false:是否启用容器间以及跟 daemon 所在主机的通信。默认为 true。 +* --insecure-registry=[]:允许访问给定的非安全仓库服务; +* --ip="":绑定容器端口时候的默认 IP 地址。缺省为 0.0.0.0; +* --ip-forward=true|false:是否检查启动在 Docker 主机上的启用 IP 转发服务,默认开启。注意关闭该选项将不对系统转发能力进行任何检查修改; +* --ip-masq=true|false:是否进行地址伪装,用于容器访问外部网络,默认开启; +* --iptables=true|false:是否允许 Docker 添加 iptables 规则。缺省为 true; +* --ipv6=true|false:是否启用 IPv6 支持,默认关闭; +* -l, --log-level="debug|info|warn|error|fatal":指定日志输出级别; +* --label="[]":添加指定的键值对标注; +* --log-driver="json-file|syslog|journald|gelf|fluentd|awslogs|splunk|etwlogs|gcplogs|none":指定日志后端驱动,默认为 json-file; +* --log-opt=[]:日志后端的选项; +* --mtu=VALUE:指定容器网络的 mtu; +* -p="":指定 daemon 的 PID 文件路径。缺省为 `/var/run/docker.pid`; +* --raw-logs:输出原始,未加色彩的日志信息; +* --registry-mirror=://:指定 `docker pull` 时使用的注册服务器镜像地址; +* -s, --storage-driver="":指定使用给定的存储后端; +* --selinux-enabled=true|false:是否启用 SELinux 支持。缺省值为 false。SELinux 目前尚不支持 overlay 存储驱动; +* --storage-opt=[]:驱动后端选项; +* --tls=true|false:是否对 Docker daemon 启用 TLS 安全机制,默认为否; +* --tlscacert= /.docker/ca.pem:TLS CA 签名的可信证书文件路径; +* --tlscert= /.docker/cert.pem:TLS 可信证书文件路径; +* --tlscert= /.docker/key.pem:TLS 密钥文件路径; +* --tlsverify=true|false:启用 TLS 校验,默认为否; +* --userland-proxy=true|false:是否使用用户态代理来实现容器间和出容器的回环通信,默认为 true; +* --userns-remap=default|uid:gid|user:group|user|uid:指定容器的用户命名空间,默认是创建新的 UID 和 GID 映射到容器内进程。 + +## 客户端命令 + +可以通过 `man docker-COMMAND` 或 `docker help COMMAND` 来查看这些命令的具体用法。 + +* attach:依附到一个正在运行的容器中; +* build:从一个 Dockerfile 创建一个镜像; +* commit:从一个容器的修改中创建一个新的镜像; +* cp:在容器和本地宿主系统之间复制文件中; +* create:创建一个新容器,但并不运行它; +* diff:检查一个容器内文件系统的修改,包括修改和增加; +* events:从服务端获取实时的事件; +* exec:在运行的容器内执行命令; +* export:导出容器内容为一个 tar 包; +* history:显示一个镜像的历史信息; +* images:列出存在的镜像; +* import:导入一个文件(典型为 tar 包)路径或目录来创建一个本地镜像; +* info:显示一些相关的系统信息; +* inspect:显示一个容器的具体配置信息; +* kill:关闭一个运行中的容器 (包括进程和所有相关资源); +* load:从一个 tar 包中加载一个镜像; +* login:注册或登录到一个 Docker 的仓库服务器; +* logout:从 Docker 的仓库服务器登出; +* logs:获取容器的 log 信息; +* network:管理 Docker 的网络,包括查看、创建、删除、挂载、卸载等; +* node:管理 swarm 集群中的节点,包括查看、更新、删除、提升/取消管理节点等; +* pause:暂停一个容器中的所有进程; +* port:查找一个 nat 到一个私有网口的公共口; +* ps:列出主机上的容器; +* pull:从一个Docker的仓库服务器下拉一个镜像或仓库; +* push:将一个镜像或者仓库推送到一个 Docker 的注册服务器; +* rename:重命名一个容器; +* restart:重启一个运行中的容器; +* rm:删除给定的若干个容器; +* rmi:删除给定的若干个镜像; +* run:创建一个新容器,并在其中运行给定命令; +* save:保存一个镜像为 tar 包文件; +* search:在 Docker index 中搜索一个镜像; +* service:管理 Docker 所启动的应用服务,包括创建、更新、删除等; +* start:启动一个容器; +* stats:输出(一个或多个)容器的资源使用统计信息; +* stop:终止一个运行中的容器; +* swarm:管理 Docker swarm 集群,包括创建、加入、退出、更新等; +* tag:为一个镜像打标签; +* top:查看一个容器中的正在运行的进程信息; +* unpause:将一个容器内所有的进程从暂停状态中恢复; +* update:更新指定的若干容器的配置信息; +* version:输出 Docker 的版本信息; +* volume:管理 Docker volume,包括查看、创建、删除等; +* wait:阻塞直到一个容器终止,然后输出它的退出符。 + +## 一张图总结 Docker 的命令 +![Docker 命令总结](../_images/cmd_logic.png) diff --git a/appendix/faq/README.md b/appendix/faq/README.md new file mode 100644 index 0000000..a4ef2be --- /dev/null +++ b/appendix/faq/README.md @@ -0,0 +1,187 @@ +# 常见问题总结 + +## 镜像相关 +### 如何批量清理临时镜像文件 +答:可以使用 `docker rmi $(docker images -q -f dangling=true)` 命令。 + +### 如何查看镜像支持的环境变量? +答:可以使用 `docker run IMAGE env` 命令。 + +### 本地的镜像文件都存放在哪里? +答:与 Docker 相关的本地资源都存放在 `/var/lib/docker/` 目录下,以 aufs 文件系统为例,其中 container 目录存放容器信息,graph 目录存放镜像信息,aufs 目录下存放具体的镜像层文件。 + +### 构建 Docker 镜像应该遵循哪些原则? +答:整体原则上,尽量保持镜像功能的明确和内容的精简,要点包括 + +* 尽量选取满足需求但较小的基础系统镜像,例如大部分时候可以选择 debian:wheezy 或 debian:jessie 镜像,仅有不足百兆大小; +* 清理编译生成文件、安装包的缓存等临时文件; +* 安装各个软件时候要指定准确的版本号,并避免引入不需要的依赖; +* 从安全角度考虑,应用要尽量使用系统的库和依赖; +* 如果安装应用时候需要配置一些特殊的环境变量,在安装后要还原不需要保持的变量值; +* 使用 Dockerfile 创建镜像时候要添加 .dockerignore 文件或使用干净的工作目录。 + +### 碰到网络问题,无法 pull 镜像,命令行指定 http_proxy 无效? +答:在 Docker 配置文件中添加 `export http_proxy="http://:"`,之后重启 Docker 服务即可。 + +## 容器相关 +### 容器退出后,通过 docker ps 命令查看不到,数据会丢失么? +答:容器退出后会处于终止(exited)状态,此时可以通过 `docker ps -a` 查看。其中的数据也不会丢失,还可以通过 `docker start` 命令来启动它。只有删除掉容器才会清除所有数据。 + +### 如何停止所有正在运行的容器 +答:可以使用 `docker kill $(docker ps -q)` 命令。 + +### 如何清理批量后台停止的容器? +答:可以使用 `docker rm -f $(docker ps -qa)` 命令。 + +### 如何获取某个容器的 PID 信息? +答:可以使用 `docker inspect --format '{{ .State.Pid }}' ` 命令。 + +### 如何获取某个容器的 IP 地址? +答:可以使用 `docker inspect --format '{{ .NetworkSettings.IPAddress }}' ` 命令 + +### 如何给容器指定一个固定 IP 地址,而不是每次重启容器 IP 地址都会变? +答:目前 Docker 并没有提供直接的对容器 IP 地址的管理支持,用户可以考虑参考第三部分中高级网络配置章节中介绍的创建点对点连接例子,来手动配置容器的静态 IP。或者在启动容器后,再手动进行修改(可参考其它类的问题 “*如何进入 Docker 容器的网络命名空间?*”)。 + +### 如何临时退出一个正在交互的容器的终端,而不终止它? +答:按 `Ctrl-p Ctrl-q`。如果按 `Ctrl-c` 往往会让容器内应用进程终止,进而会终止容器。 + +### 使用 `docker port` 命令映射容器的端口时,系统报错“Error: No public port '80' published for xxx”? +答: + +* 创建镜像时 Dockerfile 要通过 EXPOSE 指定正确的开放端口; +* 容器启动时指定 `PublishAllPort = true`。 + +### 可以在一个容器中同时运行多个应用进程么? +答:一般并不推荐在同一个容器内运行多个应用进程。如果有类似需求,可以通过一些额外的进程管理机制,比如 supervisord 来管理所运行的进程。可以参考 https://docs.docker.com/articles/using_supervisord/。 + +### 如何控制容器占用系统资源(CPU、内存)的份额? +答:在使用 `docker create` 命令创建容器或使用 `docker run` 创建并启动容器的时候,可以使用 -c|--cpu-shares[=0] 参数来调整容器使用 CPU 的权重;使用 -m|--memory[=MEMORY] 参数来调整容器使用内存的大小。 + +## 仓库相关 +### 仓库(Repository)、注册服务器(Registry)、注册索引(Index) 有何关系? +首先,仓库是存放一组关联镜像的集合,比如同一个应用的不同版本的镜像。 + +注册服务器是存放实际的镜像文件的地方。注册索引则负责维护用户的账号、权限、搜索、标签等的管理。因此,注册服务器利用注册索引来实现认证等管理。 + +### 从非官方仓库(例如 non-official-repo.com)下载镜像时候,有时候会提示“Error: Invalid registry endpoint https://non-official-repo.com/v1/……”? +答:Docker 自 1.3.0 版本往后,加强了对镜像安全性的验证,需要添加私有仓库证书,或者手动添加对非官方仓库的信任。 +编辑 Docker 配置文件,在其中添加: + +```sh +DOCKER_OPTS="--insecure-registry non-official-repo" +``` +之后,重启 Docker 服务即可。 + +## 配置相关 +### Docker 的配置文件放在哪里,如何修改配置? +答:使用 upstart 的系统(如Ubuntu 14.04)的配置文件在 `/etc/default/docker`,使用systemd 的系统(如 Ubuntu 16.04、Centos 等)的配置文件在 `/etc/systemd/system/docker.service.d/docker.conf`。 + +Ubuntu 下面的配置文件内容如下,读者可以参考配。(如果出现该文件不存在的情况,重启或者自己新建一个文件都可以解决。) + +```sh +# Customize location of Docker binary (especially for development testing). +#DOCKERD="/usr/local/bin/dockerd" + +# Use DOCKER_OPTS to modify the daemon startup options. +#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4" + +# If you need Docker to use an HTTP proxy, it can also be specified here. +#export http_proxy="http://127.0.0.1:3128/" + +# This is also a handy place to tweak where Docker's temporary files go. +#export TMPDIR="/mnt/bigdrive/docker-tmp" +``` + +### 如何更改 Docker 的默认存储位置? +答:Docker 的默认存储位置是 `/var/lib/docker`,如果希望将 Docker 的本地文件存储到其他分区,可以使用 Linux 软连接的方式来完成,或者在启动 daemon 时通过 `-g` 参数指定。 + +例如,如下操作将默认存储位置迁移到 /storage/docker。 + +```sh +[root@s26 ~]# df -h +Filesystem Size Used Avail Use% Mounted on +/dev/mapper/VolGroup-lv_root 50G 5.3G 42G 12% / +tmpfs 48G 228K 48G 1% /dev/shm +/dev/sda1 485M 40M 420M 9% /boot +/dev/mapper/VolGroup-lv_home 222G 188M 210G 1% /home +/dev/sdb2 2.7T 323G 2.3T 13% /storage +[root@s26 ~]# service docker stop +[root@s26 ~]# cd /var/lib/ +[root@s26 lib]# mv docker /storage/ +[root@s26 lib]# ln -s /storage/docker/ docker +[root@s26 lib]# ls -la docker +lrwxrwxrwx. 1 root root 15 11月 17 13:43 docker -> /storage/docker +[root@s26 lib]# service docker start +``` + +### 使用内存和 swap 限制启动容器时候报警告:“WARNING: Your kernel does not support cgroup swap limit. WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.”? +答:这是因为系统默认没有开启对内存和 swap 使用的统计功能,引入该功能会带来性能的下降。要开启该功能,可以采取如下操作: + +* 编辑 `/etc/default/grub` 文件(Ubuntu 系统为例),配置 `GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"`; +* 更新 grub:`$ sudo update-grub`; +* 重启系统,即可。 + +## Docker 与虚拟化 + +### Docker 与 LXC(Linux Container)有何不同? +答:LXC 利用 Linux 上相关技术实现了容器。Docker 则在如下的几个方面进行了改进: +* 移植性:通过抽象容器配置,容器可以实现从一个平台移植到另一个平台; +* 镜像系统:基于 AUFS 的镜像系统为容器的分发带来了很多的便利,同时共同的镜像层只需要存储一份,实现高效率的存储; +* 版本管理:类似于Git的版本管理理念,用户可以更方便的创建、管理镜像文件; +* 仓库系统:仓库系统大大降低了镜像的分发和管理的成本; +* 周边工具:各种现有工具(配置管理、云平台)对 Docker 的支持,以及基于 Docker的 PaaS、CI 等系统,让 Docker 的应用更加方便和多样化。 + +### Docker 与 Vagrant 有何不同? +答:两者的定位完全不同。 + +* Vagrant 类似 Boot2Docker(一款运行 Docker 的最小内核),是一套虚拟机的管理环境。Vagrant 可以在多种系统上和虚拟机软件中运行,可以在 Windows,Mac 等非 Linux 平台上为 Docker 提供支持,自身具有较好的包装性和移植性。 + +* 原生的 Docker 自身只能运行在 Linux 平台上,但启动和运行的性能都比虚拟机要快,往往更适合快速开发和部署应用的场景。 + +简单说:Vagrant 适合用来管理虚拟机,而 Docker 适合用来管理应用环境。 + +### 开发环境中 Docker 和 Vagrant 该如何选择? +答: +Docker 不是虚拟机,而是进程隔离,对于资源的消耗很少,但是目前需要 Linux 环境支持。Vagrant 是虚拟机上做的封装,虚拟机本身会消耗资源。 + +如果本地使用的 Linux 环境,推荐都使用 Docker。 + +如果本地使用的是 OSX 或者 Windows 环境,那就需要开虚拟机,单一开发环境下 Vagrant 更简单;多环境开发下推荐在 Vagrant 里面再使用 Docker 进行环境隔离。 + +## 其它 + +### Docker 能在非 Linux 平台(比如 Windows 或 MacOS)上运行么? +答:可以。目前需要使用 docker for mac、boot2docker 等软件创建一个轻量级的 Linux 虚拟机层。 + +### 如何将一台宿主主机的 docker 环境迁移到另外一台宿主主机 +答:停止 Docker 服务。将整个 Docker 存储文件夹复制到另外一台宿主主机,然后调整另外一台宿主主机的配置即可。 + +### 如何进入 Docker 容器的网络命名空间? +答:Docker 在创建容器后,删除了宿主主机上 `/var/run/netns` 目录中的相关的网络命名空间文件。因此,在宿主主机上是无法看到或访问容器的网络命名空间的。 + +用户可以通过如下方法来手动恢复它。 + +首先,使用下面的命令查看容器进程信息,比如这里的1234。 + +```sh +$ docker inspect --format='{{. State.Pid}} ' $container_id +1234 +``` +接下来,在 /proc 目录下,把对应的网络命名空间文件链接到 /var/run/netns 目录。 + +```sh +$ sudo ln -s /proc/1234/ns/net /var/run/netns/ +``` + +然后,在宿主主机上就可以看到容器的网络命名空间信息。例如 + +```sh +$ sudo ip netns show +1234 +``` + +此时,用户可以通过正常的系统命令来查看或操作容器的命名空间了。例如修改容器的 IP 地址信息为 `172.17.0.100/16`。 + +```sh +$ sudo ip netns exec 1234 ifconfig eth0 172.17.0.100/16 +``` diff --git a/appendix/repo/README.md b/appendix/repo/README.md new file mode 100644 index 0000000..765be42 --- /dev/null +++ b/appendix/repo/README.md @@ -0,0 +1,2 @@ +# 热门镜像介绍 +本章将介绍一些热门镜像的功能,使用方法和生成它们的 Dockerfile 等。包括 Ubuntu、CentOS、MySQL、MongoDB、Redis、Nginx、Wordpress、Node.js 等。 diff --git a/appendix/repo/centos.md b/appendix/repo/centos.md new file mode 100644 index 0000000..44db1ab --- /dev/null +++ b/appendix/repo/centos.md @@ -0,0 +1,58 @@ +## [CentOS](https://hub.docker.com/_/centos/) + +### 基本信息 +[CentOS](https://en.wikipedia.org/wiki/CentOS) 是流行的 Linux 发行版,其软件包大多跟 RedHat 系列保持一致。 + +该仓库位于 https://hub.docker.com/_/centos/,提供了 CentOS 从 5 ~ 7 各个版本的镜像。 + +### 使用方法 +默认会启动一个最小化的 CentOS 环境。 + +```sh +$ docker run --name some-centos -i -t centos bash +bash-4.2# +``` + +### Dockerfile + +#### CentOS 5 版本 +``` +FROM scratch +MAINTAINER The CentOS Project +ADD c5-docker.tar.xz / +LABEL name="CentOS Base Image" \ + vendor="CentOS" \ + license="GPLv2" \ + build-date="2016-03-31" + +# Default command +CMD ["/bin/bash"] +``` + +#### CentOS 6 版本 +``` +FROM scratch +MAINTAINER https://github.com/CentOS/sig-cloud-instance-images +ADD centos-6-docker.tar.xz / + +LABEL name="CentOS Base Image" \ + vendor="CentOS" \ + license="GPLv2" \ + build-date="20160729" + +CMD ["/bin/bash"] +``` + +#### CentOS 7 版本 +``` +FROM scratch +MAINTAINER https://github.com/CentOS/sig-cloud-instance-images +ADD centos-7-docker.tar.xz / + +LABEL name="CentOS Base Image" \ + vendor="CentOS" \ + license="GPLv2" \ + build-date="20160729" + +CMD ["/bin/bash"] +``` diff --git a/appendix/repo/mongodb.md b/appendix/repo/mongodb.md new file mode 100644 index 0000000..3ee4452 --- /dev/null +++ b/appendix/repo/mongodb.md @@ -0,0 +1,263 @@ +## [MongoDB](https://hub.docker.com/_/mongo/) + +### 基本信息 +[MongoDB](https://en.wikipedia.org/wiki/MongoDB) 是开源的 NoSQL 数据库实现。 + +该仓库位于 https://hub.docker.com/_/mongo/,提供了 MongoDB 2.x ~ 3.x 各个版本的镜像。 + +### 使用方法 +默认会在 `27017` 端口启动数据库。 + +```sh +$ docker run --name some-mongo -d mongo +``` + +使用其他应用连接到容器,可以用 + +```sh +$ docker run --name some-app --link some-mongo:mongo -d application-that-uses-mongo +``` + +或者通过 `mongo` + +```sh +$ docker run -it --link some-mongo:mongo --rm mongo sh -c 'exec mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/test"' +``` + +### Dockerfile + +#### 2.6 版本 +``` +FROM debian:wheezy + +# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added +RUN groupadd -r mongodb && useradd -r -g mongodb mongodb + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + ca-certificates wget \ + numactl \ + && rm -rf /var/lib/apt/lists/* + +# grab gosu for easy step-down from root +ENV GOSU_VERSION 1.7 +RUN set -x \ + && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \ + && wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \ + && export GNUPGHOME="$(mktemp -d)" \ + && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \ + && gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \ + && rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \ + && chmod +x /usr/local/bin/gosu \ + && gosu nobody true + +ENV MONGO_VERSION 2.6.12 + +RUN set -x \ + && wget -O mongo.tgz "https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-$MONGO_VERSION.tgz" \ + && wget -O mongo.tgz.sig "https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-$MONGO_VERSION.tgz.sig" \ + && export GNUPGHOME="$(mktemp -d)" \ + && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys DFFA3DCF326E302C4787673A01C4E7FAAAB2461C \ + && gpg --batch --verify mongo.tgz.sig mongo.tgz \ + && rm -r "$GNUPGHOME" mongo.tgz.sig \ + && tar -xvf mongo.tgz -C /usr/local --strip-components=1 \ + && rm mongo.tgz + +RUN mkdir -p /data/db /data/configdb \ + && chown -R mongodb:mongodb /data/db /data/configdb +VOLUME /data/db /data/configdb + +COPY docker-entrypoint.sh /entrypoint.sh +ENTRYPOINT ["/entrypoint.sh"] + +EXPOSE 27017 +CMD ["mongod"] +``` + +#### 3.0 版本 +``` +FROM debian:wheezy + +# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added +RUN groupadd -r mongodb && useradd -r -g mongodb mongodb + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + numactl \ + && rm -rf /var/lib/apt/lists/* + +# grab gosu for easy step-down from root +ENV GOSU_VERSION 1.7 +RUN set -x \ + && apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \ + && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \ + && wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \ + && export GNUPGHOME="$(mktemp -d)" \ + && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \ + && gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \ + && rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \ + && chmod +x /usr/local/bin/gosu \ + && gosu nobody true \ + && apt-get purge -y --auto-remove ca-certificates wget + +# gpg: key 7F0CEB10: public key "Richard Kreuter " imported +RUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys 492EAFE8CD016A07919F1D2B9ECBEC467F0CEB10 + +ENV MONGO_MAJOR 3.0 +ENV MONGO_VERSION 3.0.12 + +RUN echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/$MONGO_MAJOR main" > /etc/apt/sources.list.d/mongodb-org.list + +RUN set -x \ + && apt-get update \ + && apt-get install -y \ + mongodb-org=$MONGO_VERSION \ + mongodb-org-server=$MONGO_VERSION \ + mongodb-org-shell=$MONGO_VERSION \ + mongodb-org-mongos=$MONGO_VERSION \ + mongodb-org-tools=$MONGO_VERSION \ + && rm -rf /var/lib/apt/lists/* \ + && rm -rf /var/lib/mongodb \ + && mv /etc/mongod.conf /etc/mongod.conf.orig + +RUN mkdir -p /data/db /data/configdb \ + && chown -R mongodb:mongodb /data/db /data/configdb +VOLUME /data/db /data/configdb + +COPY docker-entrypoint.sh /entrypoint.sh +ENTRYPOINT ["/entrypoint.sh"] + +EXPOSE 27017 +CMD ["mongod"] +``` + +#### 3.2 版本 + +``` +FROM debian:wheezy + +# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added +RUN groupadd -r mongodb && useradd -r -g mongodb mongodb + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + numactl \ + && rm -rf /var/lib/apt/lists/* + +# grab gosu for easy step-down from root +ENV GOSU_VERSION 1.7 +RUN set -x \ + && apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \ + && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \ + && wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \ + && export GNUPGHOME="$(mktemp -d)" \ + && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \ + && gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \ + && rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \ + && chmod +x /usr/local/bin/gosu \ + && gosu nobody true \ + && apt-get purge -y --auto-remove ca-certificates wget + +# pub 4096R/AAB2461C 2014-02-25 [expires: 2016-02-25] +# Key fingerprint = DFFA 3DCF 326E 302C 4787 673A 01C4 E7FA AAB2 461C +# uid MongoDB 2.6 Release Signing Key +# +# pub 4096R/EA312927 2015-10-09 [expires: 2017-10-08] +# Key fingerprint = 42F3 E95A 2C4F 0827 9C49 60AD D68F A50F EA31 2927 +# uid MongoDB 3.2 Release Signing Key +# +ENV GPG_KEYS \ + DFFA3DCF326E302C4787673A01C4E7FAAAB2461C \ + 42F3E95A2C4F08279C4960ADD68FA50FEA312927 +RUN set -ex \ + && for key in $GPG_KEYS; do \ + apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \ + done + +ENV MONGO_MAJOR 3.2 +ENV MONGO_VERSION 3.2.8 + +RUN echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/$MONGO_MAJOR main" > /etc/apt/sources.list.d/mongodb-org.list + +RUN set -x \ + && apt-get update \ + && apt-get install -y \ + mongodb-org=$MONGO_VERSION \ + mongodb-org-server=$MONGO_VERSION \ + mongodb-org-shell=$MONGO_VERSION \ + mongodb-org-mongos=$MONGO_VERSION \ + mongodb-org-tools=$MONGO_VERSION \ + && rm -rf /var/lib/apt/lists/* \ + && rm -rf /var/lib/mongodb \ + && mv /etc/mongod.conf /etc/mongod.conf.orig + +RUN mkdir -p /data/db /data/configdb \ + && chown -R mongodb:mongodb /data/db /data/configdb +VOLUME /data/db /data/configdb + +COPY docker-entrypoint.sh /entrypoint.sh +ENTRYPOINT ["/entrypoint.sh"] + +EXPOSE 27017 +CMD ["mongod"] +``` + +#### 3.3 版本 + +``` +FROM debian:jessie + +# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added +RUN groupadd -r mongodb && useradd -r -g mongodb mongodb + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + numactl \ + && rm -rf /var/lib/apt/lists/* + +# grab gosu for easy step-down from root +ENV GOSU_VERSION 1.7 +RUN set -x \ + && apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \ + && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \ + && wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \ + && export GNUPGHOME="$(mktemp -d)" \ + && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \ + && gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \ + && rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \ + && chmod +x /usr/local/bin/gosu \ + && gosu nobody true \ + && apt-get purge -y --auto-remove ca-certificates wget + +# pub 4096R/A15703C6 2016-01-11 [expires: 2018-01-10] +# Key fingerprint = 0C49 F373 0359 A145 1858 5931 BC71 1F9B A157 03C6 +# uid MongoDB 3.4 Release Signing Key +RUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys 0C49F3730359A14518585931BC711F9BA15703C6 + +ENV MONGO_MAJOR 3.3 +ENV MONGO_VERSION 3.3.10 + +RUN echo "deb http://repo.mongodb.org/apt/debian jessie/mongodb-org/$MONGO_MAJOR main" > /etc/apt/sources.list.d/mongodb-org.list + +RUN set -x \ + && apt-get update \ + && apt-get install -y \ + mongodb-org-unstable=$MONGO_VERSION \ + mongodb-org-unstable-server=$MONGO_VERSION \ + mongodb-org-unstable-shell=$MONGO_VERSION \ + mongodb-org-unstable-mongos=$MONGO_VERSION \ + mongodb-org-unstable-tools=$MONGO_VERSION \ + && rm -rf /var/lib/apt/lists/* \ + && rm -rf /var/lib/mongodb \ + && mv /etc/mongod.conf /etc/mongod.conf.orig + +RUN mkdir -p /data/db /data/configdb \ + && chown -R mongodb:mongodb /data/db /data/configdb +VOLUME /data/db /data/configdb + +COPY docker-entrypoint.sh /entrypoint.sh +ENTRYPOINT ["/entrypoint.sh"] + +EXPOSE 27017 +CMD ["mongod"] +``` \ No newline at end of file diff --git a/appendix/repo/mysql.md b/appendix/repo/mysql.md new file mode 100644 index 0000000..de5b6b4 --- /dev/null +++ b/appendix/repo/mysql.md @@ -0,0 +1,124 @@ +## [MySQL](https://hub.docker.com/_/mysql/) + +### 基本信息 +[MySQL](https://en.wikipedia.org/wiki/MySQL) 是开源的关系数据库实现。 + +该仓库位于 https://hub.docker.com/_/mysql/,提供了 MySQL 各个版本的镜像,包括 5.6 系列、5.7 系列等。 + +### 使用方法 +默认会在 `3306` 端口启动数据库。 + +``` +$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql +``` +之后就可以使用其它应用来连接到该容器。 + +``` +$ docker run --name some-app --link some-mysql:mysql -d application-that-uses-mysql +``` +或者通过 `mysql`。 + +``` +$ docker run -it --link some-mysql:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"' +``` + +### Dockerfile +#### 5.6 版本 +``` +FROM debian:wheezy + +# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added +RUN groupadd -r mysql && useradd -r -g mysql mysql + +# FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db: +# File::Basename +# File::Copy +# Sys::Hostname +# Data::Dumper +RUN apt-get update && apt-get install -y perl --no-install-recommends && rm -rf /var/lib/apt/lists/* + +# mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory +RUN apt-get update && apt-get install -y libaio1 && rm -rf /var/lib/apt/lists/* + +# gpg: key 5072E1F5: public key "MySQL Release Engineering " imported +RUN gpg --keyserver pgp.mit.edu --recv-keys A4A9406876FCBD3C456770C88C718D3B5072E1F5 + +ENV MYSQL_MAJOR 5.6 +ENV MYSQL_VERSION 5.6.20 + +# note: we're pulling the *.asc file from mysql.he.net instead of dev.mysql.com because the official mirror 404s that file for whatever reason - maybe it's at a different path? +RUN apt-get update && apt-get install -y curl --no-install-recommends && rm -rf /var/lib/apt/lists/* \ + && curl -SL "http://dev.mysql.com/get/Downloads/MySQL-$MYSQL_MAJOR/mysql-$MYSQL_VERSION-linux-glibc2.5-x86_64.tar.gz" -o mysql.tar.gz \ + && curl -SL "http://mysql.he.net/Downloads/MySQL-$MYSQL_MAJOR/mysql-$MYSQL_VERSION-linux-glibc2.5-x86_64.tar.gz.asc" -o mysql.tar.gz.asc \ + && apt-get purge -y --auto-remove curl \ + && gpg --verify mysql.tar.gz.asc \ + && mkdir /usr/local/mysql \ + && tar -xzf mysql.tar.gz -C /usr/local/mysql --strip-components=1 \ + && rm mysql.tar.gz* \ + && rm -rf /usr/local/mysql/mysql-test /usr/local/mysql/sql-bench \ + && rm -rf /usr/local/mysql/bin/*-debug /usr/local/mysql/bin/*_embedded \ + && find /usr/local/mysql -type f -name "*.a" -delete \ + && apt-get update && apt-get install -y binutils && rm -rf /var/lib/apt/lists/* \ + && { find /usr/local/mysql -type f -executable -exec strip --strip-all '{}' + || true; } \ + && apt-get purge -y --auto-remove binutils +ENV PATH $PATH:/usr/local/mysql/bin:/usr/local/mysql/scripts + +WORKDIR /usr/local/mysql +VOLUME /var/lib/mysql + +COPY docker-entrypoint.sh /entrypoint.sh +ENTRYPOINT ["/entrypoint.sh"] + +EXPOSE 3306 +CMD ["mysqld", "--datadir=/var/lib/mysql", "--user=mysql"] +``` + +#### 5.7 版本 +``` +FROM debian:wheezy + +# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added +RUN groupadd -r mysql && useradd -r -g mysql mysql + +# FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db: +# File::Basename +# File::Copy +# Sys::Hostname +# Data::Dumper +RUN apt-get update && apt-get install -y perl --no-install-recommends && rm -rf /var/lib/apt/lists/* + +# mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory +RUN apt-get update && apt-get install -y libaio1 && rm -rf /var/lib/apt/lists/* + +# gpg: key 5072E1F5: public key "MySQL Release Engineering " imported +RUN gpg --keyserver pgp.mit.edu --recv-keys A4A9406876FCBD3C456770C88C718D3B5072E1F5 + +ENV MYSQL_MAJOR 5.7 +ENV MYSQL_VERSION 5.7.4-m14 + +# note: we're pulling the *.asc file from mysql.he.net instead of dev.mysql.com because the official mirror 404s that file for whatever reason - maybe it's at a different path? +RUN apt-get update && apt-get install -y curl --no-install-recommends && rm -rf /var/lib/apt/lists/* \ + && curl -SL "http://dev.mysql.com/get/Downloads/MySQL-$MYSQL_MAJOR/mysql-$MYSQL_VERSION-linux-glibc2.5-x86_64.tar.gz" -o mysql.tar.gz \ + && curl -SL "http://mysql.he.net/Downloads/MySQL-$MYSQL_MAJOR/mysql-$MYSQL_VERSION-linux-glibc2.5-x86_64.tar.gz.asc" -o mysql.tar.gz.asc \ + && apt-get purge -y --auto-remove curl \ + && gpg --verify mysql.tar.gz.asc \ + && mkdir /usr/local/mysql \ + && tar -xzf mysql.tar.gz -C /usr/local/mysql --strip-components=1 \ + && rm mysql.tar.gz* \ + && rm -rf /usr/local/mysql/mysql-test /usr/local/mysql/sql-bench \ + && rm -rf /usr/local/mysql/bin/*-debug /usr/local/mysql/bin/*_embedded \ + && find /usr/local/mysql -type f -name "*.a" -delete \ + && apt-get update && apt-get install -y binutils && rm -rf /var/lib/apt/lists/* \ + && { find /usr/local/mysql -type f -executable -exec strip --strip-all '{}' + || true; } \ + && apt-get purge -y --auto-remove binutils +ENV PATH $PATH:/usr/local/mysql/bin:/usr/local/mysql/scripts + +WORKDIR /usr/local/mysql +VOLUME /var/lib/mysql + +COPY docker-entrypoint.sh /entrypoint.sh +ENTRYPOINT ["/entrypoint.sh"] + +EXPOSE 3306 +CMD ["mysqld", "--datadir=/var/lib/mysql", "--user=mysql"] +``` diff --git a/appendix/repo/nginx.md b/appendix/repo/nginx.md new file mode 100644 index 0000000..ff88922 --- /dev/null +++ b/appendix/repo/nginx.md @@ -0,0 +1,101 @@ +## [Nginx](https://hub.docker.com/_/nginx/) + +### 基本信息 +[Nginx](https://en.wikipedia.org/wiki/Nginx) 是开源的高效的 Web 服务器实现,支持 HTTP、HTTPS、SMTP、POP3、IMAP 等协议。 + +该仓库位于 https://hub.docker.com/_/nginx/,提供了 Nginx 1.0 ~ 1.11.x 各个版本的镜像。 + +### 使用方法 +下面的命令将作为一个静态页面服务器启动。 + +``` +$ docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx +``` +用户也可以不使用这种映射方式,通过利用 Dockerfile 来直接将静态页面内容放到镜像中,内容为 + +``` +FROM nginx +COPY static-html-directory /usr/share/nginx/html +``` +之后生成新的镜像,并启动一个容器。 + +``` +$ docker build -t some-content-nginx . +$ docker run --name some-nginx -d some-content-nginx +``` +开放端口,并映射到本地的 `8080` 端口。 + +``` +docker run --name some-nginx -d -p 8080:80 some-content-nginx +``` + +Nginx的默认配置文件路径为 `/etc/nginx/nginx.conf`,可以通过映射它来使用本地的配置文件,例如 + +``` +docker run --name some-nginx -v /some/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx +``` +使用配置文件时,为了在容器中正常运行,需要保持 `daemon off;`。 + +### Dockerfile +#### stable 版本 +``` +FROM debian:jessie + +MAINTAINER NGINX Docker Maintainers "docker-maint@nginx.com" + +ENV NGINX_VERSION 1.10.1-1~jessie + +RUN apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 \ + && echo "deb http://nginx.org/packages/debian/ jessie nginx" >> /etc/apt/sources.list \ + && apt-get update \ + && apt-get install --no-install-recommends --no-install-suggests -y \ + ca-certificates \ + nginx=${NGINX_VERSION} \ + nginx-module-xslt \ + nginx-module-geoip \ + nginx-module-image-filter \ + nginx-module-perl \ + nginx-module-njs \ + gettext-base \ + && rm -rf /var/lib/apt/lists/* + +# forward request and error logs to docker log collector +RUN ln -sf /dev/stdout /var/log/nginx/access.log \ + && ln -sf /dev/stderr /var/log/nginx/error.log + +EXPOSE 80 443 + +CMD ["nginx", "-g", "daemon off;"] +``` + +#### 1.11.x 版本 + +``` +FROM debian:jessie + +MAINTAINER NGINX Docker Maintainers "docker-maint@nginx.com" + +ENV NGINX_VERSION 1.11.1-1~jessie + +RUN apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 \ + && echo "deb http://nginx.org/packages/mainline/debian/ jessie nginx" >> /etc/apt/sources.list \ + && apt-get update \ + && apt-get install --no-install-recommends --no-install-suggests -y \ + ca-certificates \ + nginx=${NGINX_VERSION} \ + nginx-module-xslt \ + nginx-module-geoip \ + nginx-module-image-filter \ + nginx-module-perl \ + nginx-module-njs \ + gettext-base \ + && rm -rf /var/lib/apt/lists/* + +# forward request and error logs to docker log collector +RUN ln -sf /dev/stdout /var/log/nginx/access.log \ + && ln -sf /dev/stderr /var/log/nginx/error.log + +EXPOSE 80 443 + +CMD ["nginx", "-g", "daemon off;"] +``` diff --git a/appendix/repo/nodejs.md b/appendix/repo/nodejs.md new file mode 100644 index 0000000..55295a6 --- /dev/null +++ b/appendix/repo/nodejs.md @@ -0,0 +1,151 @@ +## [Node.js](https://hub.docker.com/_/node/) + +### 基本信息 +[Node.js](https://en.wikipedia.org/wiki/Node.js)是基于 JavaScript 的可扩展服务端和网络软件开发平台。 + +该仓库位于 https://hub.docker.com/_/node/,提供了 Node.js 0.10 ~ 6.3.x 各个版本的镜像。 + +### 使用方法 +在项目中创建一个 Dockerfile。 + +``` +FROM node:0.10-onbuild +# replace this with your application's default port +EXPOSE 8888 +``` +然后创建镜像,并启动容器。 + +``` +$ docker build -t my-nodejs-app +$ docker run -it --rm --name my-running-app my-nodejs-app +``` + +也可以直接运行一个简单容器。 + +``` +$ docker run -it --rm --name my-running-script -v "$(pwd)":/usr/src/myapp -w /usr/src/myapp node:0.10 node your-daemon-or-script.js +``` + +### Dockerfile + +#### 0.10 版本 +``` +FROM buildpack-deps + +RUN apt-get update && apt-get install -y \ + ca-certificates \ + curl + +# verify gpg and sha256: http://nodejs.org/dist/v0.10.31/SHASUMS256.txt.asc +# gpg: aka "Timothy J Fontaine (Work) " +RUN gpg --keyserver pgp.mit.edu --recv-keys 7937DFD2AB06298B2293C3187D33FF9D0246406D + +ENV NODE_VERSION 0.10.32 + +RUN curl -SLO "http://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz" \ + && curl -SLO "http://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ + && gpg --verify SHASUMS256.txt.asc \ + && grep " node-v$NODE_VERSION-linux-x64.tar.gz\$" SHASUMS256.txt.asc | sha256sum -c - \ + && tar -xzf "node-v$NODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1 \ + && rm "node-v$NODE_VERSION-linux-x64.tar.gz" SHASUMS256.txt.asc + +CMD [ "node" ] +``` + +#### 4.x 版本 +``` +FROM buildpack-deps:jessie + +# gpg keys listed at https://github.com/nodejs/node +RUN set -ex \ + && for key in \ + 9554F04D7259F04124DE6B476D5A82AC7E37093B \ + 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \ + 0034A06D9D9B0064CE8ADF6BF1747F4AD2306D93 \ + FD3A5288F042B6850C66B31F09FE44734EB7990E \ + 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \ + DD8F2338BAE7501E3DD5AC78C273792F7D83545D \ + B9AE9905FFD7803F25714661B63B535A4C206CA9 \ + C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \ + ; do \ + gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \ + done + +ENV NPM_CONFIG_LOGLEVEL info +ENV NODE_VERSION 4.4.7 + +RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \ + && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ + && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \ + && grep " node-v$NODE_VERSION-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - \ + && tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \ + && rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt + +CMD [ "node" ] +``` + +#### 5.x 版本 + +``` +FROM buildpack-deps:jessie + +# gpg keys listed at https://github.com/nodejs/node +RUN set -ex \ + && for key in \ + 9554F04D7259F04124DE6B476D5A82AC7E37093B \ + 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \ + 0034A06D9D9B0064CE8ADF6BF1747F4AD2306D93 \ + FD3A5288F042B6850C66B31F09FE44734EB7990E \ + 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \ + DD8F2338BAE7501E3DD5AC78C273792F7D83545D \ + B9AE9905FFD7803F25714661B63B535A4C206CA9 \ + C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \ + ; do \ + gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \ + done + +ENV NPM_CONFIG_LOGLEVEL info +ENV NODE_VERSION 5.12.0 + +RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \ + && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ + && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \ + && grep " node-v$NODE_VERSION-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - \ + && tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \ + && rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt + +CMD [ "node" ] +``` + +#### 6.x 版本 +``` +FROM buildpack-deps:jessie + +# gpg keys listed at https://github.com/nodejs/node +RUN set -ex \ + && for key in \ + 9554F04D7259F04124DE6B476D5A82AC7E37093B \ + 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \ + 0034A06D9D9B0064CE8ADF6BF1747F4AD2306D93 \ + FD3A5288F042B6850C66B31F09FE44734EB7990E \ + 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \ + DD8F2338BAE7501E3DD5AC78C273792F7D83545D \ + B9AE9905FFD7803F25714661B63B535A4C206CA9 \ + C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \ + ; do \ + gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \ + done + +ENV NPM_CONFIG_LOGLEVEL info +ENV NODE_VERSION 6.3.1 + +RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \ + && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ + && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \ + && grep " node-v$NODE_VERSION-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - \ + && tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \ + && rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt + +CMD [ "node" ] +``` + diff --git a/appendix/repo/redis.md b/appendix/repo/redis.md new file mode 100644 index 0000000..cadeefc --- /dev/null +++ b/appendix/repo/redis.md @@ -0,0 +1,141 @@ +## [Redis](https://hub.docker.com/_/redis/) + +### 基本信息 +[Redis](https://en.wikipedia.org/wiki/Redis) 是开源的内存 Key-Value 数据库实现。 + +该仓库位于 https://hub.docker.com/_/redis/,提供了 Redis 3.x 各个版本的镜像。 + +### 使用方法 +默认会在 `6379` 端口启动数据库。 + +``` +$ docker run --name some-redis -d redis +``` +另外还可以启用 [持久存储](http://redis.io/topics/persistence)。 + +``` +$ docker run --name some-redis -d redis redis-server --appendonly yes +``` + +默认数据存储位置在 `VOLUME/data`。可以使用 `--volumes-from some-volume-container` 或 `-v /docker/host/dir:/data` 将数据存放到本地。 + +使用其他应用连接到容器,可以用 + +``` +$ docker run --name some-app --link some-redis:redis -d application-that-uses-redis +``` +或者通过 `redis-cli` + +``` +$ docker run -it --link some-redis:redis --rm redis sh -c 'exec redis-cli -h "$REDIS_PORT_6379_TCP_ADDR" -p "$REDIS_PORT_6379_TCP_PORT"' +``` + +### Dockerfile +#### 3.0 版本 +``` +FROM debian:jessie + +# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added +RUN groupadd -r redis && useradd -r -g redis redis + +RUN apt-get update && apt-get install -y --no-install-recommends \ + ca-certificates \ + wget \ + && rm -rf /var/lib/apt/lists/* + +# grab gosu for easy step-down from root +ENV GOSU_VERSION 1.7 +RUN set -x \ + && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \ + && wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \ + && export GNUPGHOME="$(mktemp -d)" \ + && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \ + && gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \ + && rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \ + && chmod +x /usr/local/bin/gosu \ + && gosu nobody true + +ENV REDIS_VERSION 3.0.7 +ENV REDIS_DOWNLOAD_URL http://download.redis.io/releases/redis-3.0.7.tar.gz +ENV REDIS_DOWNLOAD_SHA1 e56b4b7e033ae8dbf311f9191cf6fdf3ae974d1c + +# for redis-sentinel see: http://redis.io/topics/sentinel +RUN buildDeps='gcc libc6-dev make' \ + && set -x \ + && apt-get update && apt-get install -y $buildDeps --no-install-recommends \ + && rm -rf /var/lib/apt/lists/* \ + && wget -O redis.tar.gz "$REDIS_DOWNLOAD_URL" \ + && echo "$REDIS_DOWNLOAD_SHA1 *redis.tar.gz" | sha1sum -c - \ + && mkdir -p /usr/src/redis \ + && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \ + && rm redis.tar.gz \ + && make -C /usr/src/redis \ + && make -C /usr/src/redis install \ + && rm -r /usr/src/redis \ + && apt-get purge -y --auto-remove $buildDeps + +RUN mkdir /data && chown redis:redis /data +VOLUME /data +WORKDIR /data + +COPY docker-entrypoint.sh /usr/local/bin/ +RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat +ENTRYPOINT ["docker-entrypoint.sh"] + +EXPOSE 6379 +CMD [ "redis-server" ] +``` + +#### 3.2 版本 +``` +FROM debian:jessie + +# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added +RUN groupadd -r redis && useradd -r -g redis redis + +RUN apt-get update && apt-get install -y --no-install-recommends \ + ca-certificates \ + wget \ + && rm -rf /var/lib/apt/lists/* + +# grab gosu for easy step-down from root +ENV GOSU_VERSION 1.7 +RUN set -x \ + && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \ + && wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \ + && export GNUPGHOME="$(mktemp -d)" \ + && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \ + && gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \ + && rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \ + && chmod +x /usr/local/bin/gosu \ + && gosu nobody true + +ENV REDIS_VERSION 3.2.3 +ENV REDIS_DOWNLOAD_URL http://download.redis.io/releases/redis-3.2.3.tar.gz +ENV REDIS_DOWNLOAD_SHA1 92d6d93ef2efc91e595c8bf578bf72baff397507 + +# for redis-sentinel see: http://redis.io/topics/sentinel +RUN buildDeps='gcc libc6-dev make' \ + && set -x \ + && apt-get update && apt-get install -y $buildDeps --no-install-recommends \ + && rm -rf /var/lib/apt/lists/* \ + && wget -O redis.tar.gz "$REDIS_DOWNLOAD_URL" \ + && echo "$REDIS_DOWNLOAD_SHA1 *redis.tar.gz" | sha1sum -c - \ + && mkdir -p /usr/src/redis \ + && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \ + && rm redis.tar.gz \ + && make -C /usr/src/redis \ + && make -C /usr/src/redis install \ + && rm -r /usr/src/redis \ + && apt-get purge -y --auto-remove $buildDeps + +RUN mkdir /data && chown redis:redis /data +VOLUME /data +WORKDIR /data + +COPY docker-entrypoint.sh /usr/local/bin/ +ENTRYPOINT ["docker-entrypoint.sh"] + +EXPOSE 6379 +CMD [ "redis-server" ] +``` diff --git a/appendix/repo/ubuntu.md b/appendix/repo/ubuntu.md new file mode 100644 index 0000000..2253678 --- /dev/null +++ b/appendix/repo/ubuntu.md @@ -0,0 +1,142 @@ +## [Ubuntu](https://hub.docker.com/_/ubuntu/) + +### 基本信息 +[Ubuntu](https://en.wikipedia.org/wiki/Ubuntu) 是流行的 Linux 发行版,其自带软件版本往往较新一些。 + +该仓库位于 https://hub.docker.com/_/ubuntu/,提供了 Ubuntu 从 12.04 ~ 16.10 各个版本的镜像。 + +### 使用方法 +默认会启动一个最小化的 Ubuntu 环境。 + +``` +$ docker run --name some-ubuntu -i -t ubuntu +root@523c70904d54:/# +``` + +### Dockerfile + +#### 12.04 版本 +``` +FROM scratch +ADD precise-core-amd64.tar.gz / + +# a few minor docker-specific tweaks +# see https://github.com/dotcloud/docker/blob/master/contrib/mkimage/debootstrap +RUN echo '#!/bin/sh' > /usr/sbin/policy-rc.d \ + && echo 'exit 101' >> /usr/sbin/policy-rc.d \ + && chmod +x /usr/sbin/policy-rc.d \ + \ + && dpkg-divert --local --rename --add /sbin/initctl \ + && cp -a /usr/sbin/policy-rc.d /sbin/initctl \ + && sed -i 's/^exit.*/exit 0/' /sbin/initctl \ + \ + && echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \ + \ + && echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean \ + && echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean \ + && echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \ + \ + && echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages \ + \ + && echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes + +# delete all the apt list files since they're big and get stale quickly +RUN rm -rf /var/lib/apt/lists/* +# this forces "apt-get update" in dependent images, which is also good + +# enable the universe +RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list + +# upgrade packages for now, since the tarballs aren't updated frequently enough +RUN apt-get update && apt-get dist-upgrade -y && rm -rf /var/lib/apt/lists/* + +# overwrite this with 'CMD []' in a dependent Dockerfile +CMD ["/bin/bash"] +``` + +#### 14.04 版本 +``` +FROM scratch +ADD trusty-core-amd64.tar.gz / + +# a few minor docker-specific tweaks +# see https://github.com/dotcloud/docker/blob/master/contrib/mkimage/debootstrap +RUN echo '#!/bin/sh' > /usr/sbin/policy-rc.d \ + && echo 'exit 101' >> /usr/sbin/policy-rc.d \ + && chmod +x /usr/sbin/policy-rc.d \ + \ + && dpkg-divert --local --rename --add /sbin/initctl \ + && cp -a /usr/sbin/policy-rc.d /sbin/initctl \ + && sed -i 's/^exit.*/exit 0/' /sbin/initctl \ + \ + && echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \ + \ + && echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean \ + && echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean \ + && echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \ + \ + && echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages \ + \ + && echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes + +# delete all the apt list files since they're big and get stale quickly +RUN rm -rf /var/lib/apt/lists/* +# this forces "apt-get update" in dependent images, which is also good + +# enable the universe +RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list + +# upgrade packages for now, since the tarballs aren't updated frequently enough +RUN apt-get update && apt-get dist-upgrade -y && rm -rf /var/lib/apt/lists/* + +# overwrite this with 'CMD []' in a dependent Dockerfile +CMD ["/bin/bash"] +``` + +#### 16.04 版本 + +``` +FROM scratch +ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz / + +# a few minor docker-specific tweaks +# see https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap +RUN set -xe \ + \ +# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L40-L48 + && echo '#!/bin/sh' > /usr/sbin/policy-rc.d \ + && echo 'exit 101' >> /usr/sbin/policy-rc.d \ + && chmod +x /usr/sbin/policy-rc.d \ + \ +# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L54-L56 + && dpkg-divert --local --rename --add /sbin/initctl \ + && cp -a /usr/sbin/policy-rc.d /sbin/initctl \ + && sed -i 's/^exit.*/exit 0/' /sbin/initctl \ + \ +# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L71-L78 + && echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \ + \ +# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L85-L105 + && echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean \ + && echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean \ + && echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \ + \ +# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L109-L115 + && echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages \ + \ +# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L118-L130 + && echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes \ + \ +# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L134-L151 + && echo 'Apt::AutoRemove::SuggestsImportant "false";' > /etc/apt/apt.conf.d/docker-autoremove-suggests + +# delete all the apt list files since they're big and get stale quickly +RUN rm -rf /var/lib/apt/lists/* +# this forces "apt-get update" in dependent images, which is also good + +# enable the universe +RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list + +# overwrite this with 'CMD []' in a dependent Dockerfile +CMD ["/bin/bash"] +``` diff --git a/appendix/repo/wordpress.md b/appendix/repo/wordpress.md new file mode 100644 index 0000000..1250db5 --- /dev/null +++ b/appendix/repo/wordpress.md @@ -0,0 +1,117 @@ +## [WordPress](https://hub.docker.com/_/wordpress/) + +### 基本信息 +[WordPress](https://en.wikipedia.org/wiki/WordPress) 是开源的 Blog 和内容管理系统框架,它基于 PhP 和 MySQL。 + +该仓库位于 https://hub.docker.com/_/wordpress/,提供了 WordPress 4.x 版本的镜像。 + +### 使用方法 +启动容器需要 MySQL 的支持,默认端口为 `80`。 + +``` +$ docker run --name some-wordpress --link some-mysql:mysql -d wordpress +``` +启动 WordPress 容器时可以指定的一些环境参数包括: + +* `-e WORDPRESS_DB_USER=...` 缺省为 “root” +* `-e WORDPRESS_DB_PASSWORD=...` 缺省为连接 mysql 容器的环境变量 `MYSQL_ROOT_PASSWORD` 的值 +* `-e WORDPRESS_DB_NAME=...` 缺省为 “wordpress” +* `-e WORDPRESS_AUTH_KEY=...`, `-e WORDPRESS_SECURE_AUTH_KEY=...`, `-e WORDPRESS_LOGGED_IN_KEY=...`, `-e WORDPRESS_NONCE_KEY=...`, `-e WORDPRESS_AUTH_SALT=...`, `-e WORDPRESS_SECURE_AUTH_SALT=...`, `-e WORDPRESS_LOGGED_IN_SALT=...`, `-e WORDPRESS_NONCE_SALT=...` 缺省为随机 sha1 串 + +### Dockerfile +#### 4.0 版本 +``` +FROM debian:wheezy + +RUN apt-get update && apt-get install -y \ + apache2 \ + curl \ + libapache2-mod-php5 \ + php5-curl \ + php5-gd \ + php5-mysql \ + rsync \ + wget \ + && rm -rf /var/lib/apt/lists/* +RUN a2enmod rewrite + +# copy a few things from apache's init script that it requires to be setup +ENV APACHE_CONFDIR /etc/apache2 +ENV APACHE_ENVVARS $APACHE_CONFDIR/envvars +# and then a few more from $APACHE_CONFDIR/envvars itself +ENV APACHE_RUN_USER www-data +ENV APACHE_RUN_GROUP www-data +ENV APACHE_RUN_DIR /var/run/apache2 +ENV APACHE_PID_FILE $APACHE_RUN_DIR/apache2.pid +ENV APACHE_LOCK_DIR /var/lock/apache2 +ENV APACHE_LOG_DIR /var/log/apache2 +ENV LANG C +RUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIR + +# make CustomLog (access log) go to stdout instead of files +# and ErrorLog to stderr +RUN find "$APACHE_CONFDIR" -type f -exec sed -ri ' \ + s!^(\s*CustomLog)\s+\S+!\1 /proc/self/fd/1!g; \ + s!^(\s*ErrorLog)\s+\S+!\1 /proc/self/fd/2!g; \ +' '{}' ';' + +RUN rm -rf /var/www/html && mkdir /var/www/html +VOLUME /var/www/html +WORKDIR /var/www/html + +ENV WORDPRESS_VERSION 4.0.0 +ENV WORDPRESS_UPSTREAM_VERSION 4.0 + +# upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress +RUN curl -SL http://wordpress.org/wordpress-${WORDPRESS_UPSTREAM_VERSION}.tar.gz | tar -xzC /usr/src/ + +COPY docker-apache.conf /etc/apache2/sites-available/wordpress +RUN a2dissite 000-default && a2ensite wordpress + +COPY docker-entrypoint.sh /entrypoint.sh + +ENTRYPOINT ["/entrypoint.sh"] +EXPOSE 80 +CMD ["apache2", "-DFOREGROUND"] +``` + +#### 4.5 版本 +``` +FROM php:5.6-apache + +RUN a2enmod rewrite expires + +# install the PHP extensions we need +RUN apt-get update && apt-get install -y libpng12-dev libjpeg-dev && rm -rf /var/lib/apt/lists/* \ + && docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \ + && docker-php-ext-install gd mysqli opcache + +# set recommended PHP.ini settings +# see https://secure.php.net/manual/en/opcache.installation.php +RUN { \ + echo 'opcache.memory_consumption=128'; \ + echo 'opcache.interned_strings_buffer=8'; \ + echo 'opcache.max_accelerated_files=4000'; \ + echo 'opcache.revalidate_freq=60'; \ + echo 'opcache.fast_shutdown=1'; \ + echo 'opcache.enable_cli=1'; \ + } > /usr/local/etc/php/conf.d/opcache-recommended.ini + +VOLUME /var/www/html + +ENV WORDPRESS_VERSION 4.5.3 +ENV WORDPRESS_SHA1 835b68748dae5a9d31c059313cd0150f03a49269 + +# upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress +RUN curl -o wordpress.tar.gz -SL https://wordpress.org/wordpress-${WORDPRESS_VERSION}.tar.gz \ + && echo "$WORDPRESS_SHA1 *wordpress.tar.gz" | sha1sum -c - \ + && tar -xzf wordpress.tar.gz -C /usr/src/ \ + && rm wordpress.tar.gz \ + && chown -R www-data:www-data /usr/src/wordpress + +COPY docker-entrypoint.sh /entrypoint.sh + +# grr, ENTRYPOINT resets CMD now +ENTRYPOINT ["/entrypoint.sh"] +CMD ["apache2-foreground"] +``` \ No newline at end of file diff --git a/appendix/resources/README.md b/appendix/resources/README.md new file mode 100644 index 0000000..3a03d74 --- /dev/null +++ b/appendix/resources/README.md @@ -0,0 +1,23 @@ +# 资源链接 + +## 官方网站 +* Docker 官方主页: https://www.docker.com +* Docker 官方博客: https://blog.docker.com/ +* Docker 官方文档: https://docs.docker.com/ +* Docker Hub: https://hub.docker.com +* Docker 的源代码仓库: https://github.com/docker/docker +* Docker 发布版本历史:https://docs.docker.com/release-notes/ +* Docker 常见问题:https://docs.docker.com/engine/faq/ +* Docker 远端应用 API: https://docs.docker.com/reference/api/docker_remote_api/ + +## 实践参考 +* Dockerfile 参考:https://docs.docker.com/reference/builder/ +* Dockerfile 最佳实践:https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/ + +## 技术交流 +* Docker 邮件列表: https://groups.google.com/forum/#!forum/docker-user +* Docker 的 IRC 频道: https://chat.freenode.net#docker +* Docker 的 Twitter 主页: https://twitter.com/docker + +## 其它 +* Docker 的 StackOverflow 问答主页: https://stackoverflow.com/search?q=docker \ No newline at end of file diff --git a/appendix_repo/README.md b/appendix_repo/README.md deleted file mode 100644 index 6045f0d..0000000 --- a/appendix_repo/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# 常见仓库介绍 -本章将介绍常见的一些仓库和镜像的功能,使用方法和生成它们的 Dockerfile 等。包括 Ubuntu、CentOS、MySQL、MongoDB、Redis、Nginx、Wordpress、Node.js 等。 diff --git a/appendix_repo/centos.md b/appendix_repo/centos.md deleted file mode 100644 index 875c81f..0000000 --- a/appendix_repo/centos.md +++ /dev/null @@ -1,17 +0,0 @@ -## [CentOS](https://registry.hub.docker.com/_/centos/) - -### 基本信息 -[CentOS](https://en.wikipedia.org/wiki/CentOS) 是流行的 Linux 发行版,其软件包大多跟 RedHat 系列保持一致。 -该仓库提供了 CentOS 从 5 ~ 7 各个版本的镜像。 - -### 使用方法 -默认会启动一个最小化的 CentOS 环境。 -``` -$ sudo docker run --name some-centos -i -t centos bash -bash-4.2# -``` - -### Dockerfile -* [CentOS 5 版本](https://github.com/CentOS/sig-cloud-instance-images/blob/2e5a9c4e8b7191b393822e4b9e98820db5638a77/docker/Dockerfile) -* [CentOS 6 版本](https://github.com/CentOS/sig-cloud-instance-images/blob/8717e33ea5432ecb33d7ecefe8452a973715d037/docker/Dockerfile) -* [CentOS 7 版本](https://github.com/CentOS/sig-cloud-instance-images/blob/af7a1b9f8f30744360a10fe44c53a1591bef26f9/docker/Dockerfile) diff --git a/appendix_repo/mongodb.md b/appendix_repo/mongodb.md deleted file mode 100644 index 50fabae..0000000 --- a/appendix_repo/mongodb.md +++ /dev/null @@ -1,26 +0,0 @@ -## [MongoDB](https://registry.hub.docker.com/_/mongo/) - -### 基本信息 -[MongoDB](https://en.wikipedia.org/wiki/MongoDB) 是开源的 NoSQL 数据库实现。 -该仓库提供了 MongoDB 2.2 ~ 2.7 各个版本的镜像。 - -### 使用方法 -默认会在 `27017` 端口启动数据库。 -``` -$ sudo docker run --name some-mongo -d mongo -``` - -使用其他应用连接到容器,可以用 -``` -$ sudo docker run --name some-app --link some-mongo:mongo -d application-that-uses-mongo -``` -或者通过 `mongo` -``` -$ sudo docker run -it --link some-mongo:mongo --rm mongo sh -c 'exec mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/test"' -``` - -### Dockerfile -* [2.2 版本](https://github.com/docker-library/mongo/blob/77c841472ccb6cc87fea1218269d097405edc6cb/2.2/Dockerfile) -* [2.4 版本](https://github.com/docker-library/mongo/blob/807078cb7b5f0289f6dabf9f6875d5318122bc30/2.4/Dockerfile) -* [2.6 版本](https://github.com/docker-library/mongo/blob/77c841472ccb6cc87fea1218269d097405edc6cb/2.6/Dockerfile) -* [2.7 版本](https://github.com/docker-library/mongo/blob/807078cb7b5f0289f6dabf9f6875d5318122bc30/2.7/Dockerfile) diff --git a/appendix_repo/mysql.md b/appendix_repo/mysql.md deleted file mode 100644 index 37bb789..0000000 --- a/appendix_repo/mysql.md +++ /dev/null @@ -1,23 +0,0 @@ -## [MySQL](https://registry.hub.docker.com/_/mysql/) - -### 基本信息 -[MySQL](https://en.wikipedia.org/wiki/MySQL) 是开源的关系数据库实现。 -该仓库提供了 MySQL 各个版本的镜像,包括 5.6 系列、5.7 系列等。 - -### 使用方法 -默认会在 `3306` 端口启动数据库。 -``` -$ sudo docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql -``` -之后就可以使用其它应用来连接到该容器。 -``` -$ sudo docker run --name some-app --link some-mysql:mysql -d application-that-uses-mysql -``` -或者通过 `mysql`。 -``` -$ sudo docker run -it --link some-mysql:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"' -``` - -### Dockerfile -* [5.6 版本](https://github.com/docker-library/mysql/blob/7461a52b43f06839a4d8723ae8841f4cb616b3d0/5.6/Dockerfile) -* [5.7 版本](https://github.com/docker-library/mysql/blob/7461a52b43f06839a4d8723ae8841f4cb616b3d0/5.7/Dockerfile) diff --git a/appendix_repo/nginx.md b/appendix_repo/nginx.md deleted file mode 100644 index 11ba856..0000000 --- a/appendix_repo/nginx.md +++ /dev/null @@ -1,34 +0,0 @@ -## [Nginx](https://registry.hub.docker.com/_/nginx/) - -### 基本信息 -[Nginx](https://en.wikipedia.org/wiki/Nginx) 是开源的高效的 Web 服务器实现,支持 HTTP、HTTPS、SMTP、POP3、IMAP 等协议。 -该仓库提供了 Nginx 1.0 ~ 1.7 各个版本的镜像。 - -### 使用方法 -下面的命令将作为一个静态页面服务器启动。 -``` -$ sudo docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx -``` -用户也可以不使用这种映射方式,通过利用 Dockerfile 来直接将静态页面内容放到镜像中,内容为 -``` -FROM nginx -COPY static-html-directory /usr/share/nginx/html -``` -之后生成新的镜像,并启动一个容器。 -``` -$ sudo docker build -t some-content-nginx . -$ sudo docker run --name some-nginx -d some-content-nginx -``` -开放端口,并映射到本地的 `8080` 端口。 -``` -sudo docker run --name some-nginx -d -p 8080:80 some-content-nginx -``` - -Nginx的默认配置文件路径为 `/etc/nginx/nginx.conf`,可以通过映射它来使用本地的配置文件,例如 -``` -docker run --name some-nginx -v /some/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx -``` -使用配置文件时,为了在容器中正常运行,需要保持 `daemon off;`。 - -### Dockerfile -* [1 ~ 1.7 版本](https://github.com/nginxinc/docker-nginx/blob/3713a0157083eb4776e71f5a5aef4b2a5bc03ab1/Dockerfile) diff --git a/appendix_repo/nodejs.md b/appendix_repo/nodejs.md deleted file mode 100644 index 88044a2..0000000 --- a/appendix_repo/nodejs.md +++ /dev/null @@ -1,28 +0,0 @@ -## [Node.js](https://registry.hub.docker.com/_/node/) - -### 基本信息 -[Node.js](https://en.wikipedia.org/wiki/Node.js)是基于 JavaScript 的可扩展服务端和网络软件开发平台。 -该仓库提供了 Node.js 0.8 ~ 0.11 各个版本的镜像。 - -### 使用方法 -在项目中创建一个 Dockerfile。 -``` -FROM node:0.10-onbuild -# replace this with your application's default port -EXPOSE 8888 -``` -然后创建镜像,并启动容器 -``` -$ sudo docker build -t my-nodejs-app -$ sudo docker run -it --rm --name my-running-app my-nodejs-app -``` - -也可以直接运行一个简单容器。 -``` -$ sudo docker run -it --rm --name my-running-script -v "$(pwd)":/usr/src/myapp -w /usr/src/myapp node:0.10 node your-daemon-or-script.js -``` - -### Dockerfile -* [0.8 版本](https://github.com/docker-library/node/blob/d017d679e92e84a810c580cdb29fcdbba23c2bb9/0.8/Dockerfile) -* [0.10 版本](https://github.com/docker-library/node/blob/913a225f2fda34d6a811fac1466e4f09f075fcf6/0.10/Dockerfile) -* [0.11 版本](https://github.com/docker-library/node/blob/d017d679e92e84a810c580cdb29fcdbba23c2bb9/0.11/Dockerfile) diff --git a/appendix_repo/redis.md b/appendix_repo/redis.md deleted file mode 100644 index 3002c7b..0000000 --- a/appendix_repo/redis.md +++ /dev/null @@ -1,29 +0,0 @@ -## [Redis](https://registry.hub.docker.com/_/redis/) - -### 基本信息 -[Redis](https://en.wikipedia.org/wiki/Redis) 是开源的内存 Key-Value 数据库实现。 -该仓库提供了 Redis 2.6 ~ 2.8.9 各个版本的镜像。 - -### 使用方法 -默认会在 `6379` 端口启动数据库。 -``` -$ sudo docker run --name some-redis -d redis -``` -另外还可以启用 [持久存储](http://redis.io/topics/persistence)。 -``` -$ sudo docker run --name some-redis -d redis redis-server --appendonly yes -``` -默认数据存储位置在 `VOLUME/data`。可以使用 `--volumes-from some-volume-container` 或 `-v /docker/host/dir:/data` 将数据存放到本地。 - -使用其他应用连接到容器,可以用 -``` -$ sudo docker run --name some-app --link some-redis:redis -d application-that-uses-redis -``` -或者通过 `redis-cli` -``` -$ sudo docker run -it --link some-redis:redis --rm redis sh -c 'exec redis-cli -h "$REDIS_PORT_6379_TCP_ADDR" -p "$REDIS_PORT_6379_TCP_PORT"' -``` - -### Dockerfile -* [2.6 版本](https://github.com/docker-library/redis/blob/02d9cd887a4e0d50db4bb085eab7235115a6fe4a/2.6.17/Dockerfile) -* [最新 2.8 版本](https://github.com/docker-library/redis/blob/d0665bb1bbddd4cc035dbc1fc774695fa534d648/2.8.13/Dockerfile) diff --git a/appendix_repo/ubuntu.md b/appendix_repo/ubuntu.md deleted file mode 100644 index a5ce196..0000000 --- a/appendix_repo/ubuntu.md +++ /dev/null @@ -1,17 +0,0 @@ -## [Ubuntu](https://registry.hub.docker.com/_/ubuntu/) - -### 基本信息 -[Ubuntu](https://en.wikipedia.org/wiki/Ubuntu) 是流行的 Linux 发行版,其自带软件版本往往较新一些。 -该仓库提供了 Ubuntu从12.04 ~ 14.10 各个版本的镜像。 - -### 使用方法 -默认会启动一个最小化的 Ubuntu 环境。 -``` -$ sudo docker run --name some-ubuntu -i -t ubuntu -root@523c70904d54:/# -``` - -### Dockerfile -* [12.04 版本](https://github.com/tianon/docker-brew-ubuntu-core/blob/2b105575647a7e2030ff344d427c3920b89e17a9/precise/Dockerfile) -* [14.04 版本](https://github.com/tianon/docker-brew-ubuntu-core/blob/2b105575647a7e2030ff344d427c3920b89e17a9/trusty/Dockerfile) -* [14.10 版本](https://github.com/tianon/docker-brew-ubuntu-core/blob/2b105575647a7e2030ff344d427c3920b89e17a9/utopic/Dockerfile) diff --git a/appendix_repo/wordpress.md b/appendix_repo/wordpress.md deleted file mode 100644 index 27ee00e..0000000 --- a/appendix_repo/wordpress.md +++ /dev/null @@ -1,19 +0,0 @@ -## [WordPress](https://registry.hub.docker.com/_/wordpress/) - -### 基本信息 -[WordPress](https://en.wikipedia.org/wiki/WordPress) 是开源的 Blog 和内容管理系统框架,它基于 PhP 和 MySQL。 -该仓库提供了 WordPress 4.0 版本的镜像。 - -### 使用方法 -启动容器需要 MySQL 的支持,默认端口为 `80`。 -``` -$ sudo docker run --name some-wordpress --link some-mysql:mysql -d wordpress -``` -启动 WordPress 容器时可以指定的一些环境参数包括 -* `-e WORDPRESS_DB_USER=...` 缺省为 “root” -* `-e WORDPRESS_DB_PASSWORD=...` 缺省为连接 mysql 容器的环境变量 `MYSQL_ROOT_PASSWORD` 的值 -* `-e WORDPRESS_DB_NAME=...` 缺省为 “wordpress” -* `-e WORDPRESS_AUTH_KEY=...`, `-e WORDPRESS_SECURE_AUTH_KEY=...`, `-e WORDPRESS_LOGGED_IN_KEY=...`, `-e WORDPRESS_NONCE_KEY=...`, `-e WORDPRESS_AUTH_SALT=...`, `-e WORDPRESS_SECURE_AUTH_SALT=...`, `-e WORDPRESS_LOGGED_IN_SALT=...`, `-e WORDPRESS_NONCE_SALT=...` 缺省为随机 sha1 串 - -### Dockerfile -* [4.0 版本](https://github.com/docker-library/wordpress/blob/aee00669e7c43f435f021cb02871bffd63d5677a/Dockerfile) diff --git a/appendix_resources/README.md b/appendix_resources/README.md deleted file mode 100644 index 4fafe69..0000000 --- a/appendix_resources/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# 资源链接 -* Docker 主站点: https://www.docker.io -* Docker 注册中心API: http://docs.docker.com/reference/api/registry_api/ -* Docker Hub API: http://docs.docker.com/reference/api/docker-io_api/ -* Docker 远端应用API: http://docs.docker.com/reference/api/docker_remote_api/ -* Dockerfile 参考:https://docs.docker.com/reference/builder/ -* Dockerfile 最佳实践:https://docs.docker.com/articles/dockerfile_best-practices/