{"id":92246,"date":"2026-08-09T20:17:20","date_gmt":"2026-08-09T12:17:20","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/92246.html"},"modified":"2026-08-09T20:17:20","modified_gmt":"2026-08-09T12:17:20","slug":"06-docker%e5%ad%98%e5%82%a8%e4%b8%8e%e6%95%b0%e6%8d%ae%e6%8c%81%e4%b9%85%e5%8c%96","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/92246.html","title":{"rendered":"06-Docker\u5b58\u50a8\u4e0e\u6570\u636e\u6301\u4e45\u5316"},"content":{"rendered":"<h2>Docker\u5b58\u50a8\u4e0e\u6570\u636e\u6301\u4e45\u5316<\/h2>\n<p>\u672c\u6587\u662fDocker\u4e13\u680f\u7684\u7b2c\u516d\u7bc7\u6587\u7ae0,\u5c06\u5168\u9762\u6df1\u5165\u5730\u8bb2\u89e3Docker\u5b58\u50a8\u4f53\u7cfb\u3001\u5b58\u50a8\u9a71\u52a8\u3001\u6570\u636e\u5377\u3001\u7ed1\u5b9a\u6302\u8f7d\u3001tmpfs\u6302\u8f7d\u3001\u6570\u636e\u5377\u8fdb\u9636\u64cd\u4f5c\u3001Dockerfile\u5b58\u50a8\u914d\u7f6e\u3001\u6570\u636e\u5e93\u6301\u4e45\u5316\u65b9\u6848\u3001\u5b58\u50a8\u5b89\u5168\u4e0e\u5907\u4efd\u7b56\u7565\u4ee5\u53ca\u6545\u969c\u6392\u67e5\u7b49\u5168\u90e8\u77e5\u8bc6\u3002\u5168\u6587\u8d85\u8fc73\u4e07\u5b57,\u5305\u542b\u5927\u91cf\u5b9e\u6218\u6848\u4f8b\u4e0e\u4ee3\u7801\u793a\u4f8b,\u9002\u5408\u6709\u4e00\u5b9aDocker\u57fa\u7840\u7684\u5f00\u53d1\u8005\u6df1\u5165\u5b66\u4e60\u548c\u53c2\u8003\u3002<\/p>\n<hr \/>\n<h3>\u524d\u8a00<\/h3>\n<p>\u5728Docker\u7684\u4e16\u754c\u91cc,\u5bb9\u5668\u7684\u751f\u547d\u5468\u671f\u901a\u5e38\u662f\u77ed\u6682\u7684\u3002\u4e00\u4e2a\u5bb9\u5668\u53ef\u4ee5\u88ab\u521b\u5efa\u3001\u542f\u52a8\u3001\u505c\u6b62\u3001\u5220\u9664,\u800c\u5f53\u5bb9\u5668\u88ab\u5220\u9664\u65f6,\u5bb9\u5668\u5185\u90e8\u5199\u5165\u7684\u6240\u6709\u6570\u636e\u4e5f\u4f1a\u968f\u4e4b\u6d88\u5931\u3002\u8fd9\u79cd&#034;\u4e34\u65f6\u6027&#034;\u662f\u5bb9\u5668\u8bbe\u8ba1\u7684\u6838\u5fc3\u7279\u5f81\u4e4b\u4e00,\u5b83\u4f7f\u5f97\u5bb9\u5668\u53ef\u4ee5\u968f\u65f6\u88ab\u91cd\u5efa\u548c\u66ff\u6362,\u4f46\u4e5f\u5e26\u6765\u4e86\u4e00\u4e2a\u4e25\u5cfb\u7684\u6311\u6218\u2014\u2014\u5982\u4f55\u6301\u4e45\u5316\u4fdd\u5b58\u6570\u636e?<\/p>\n<p>\u60f3\u8c61\u8fd9\u6837\u4e00\u4e2a\u573a\u666f:\u4f60\u8fd0\u884c\u4e86\u4e00\u4e2aMySQL\u5bb9\u5668,\u4e1a\u52a1\u7cfb\u7edf\u6301\u7eed\u5199\u5165\u6570\u636e\u3002\u67d0\u5929\u56e0\u4e3a\u914d\u7f6e\u53d8\u66f4\u9700\u8981\u5220\u9664\u5e76\u91cd\u5efa\u5bb9\u5668,\u7ed3\u679c\u6240\u6709\u6570\u636e\u5e93\u6570\u636e\u5168\u90e8\u4e22\u5931\u3002\u53c8\u6216\u8005,\u4f60\u5728\u5f00\u53d1\u73af\u5883\u4e2d\u4fee\u6539\u4e86\u4ee3\u7801,\u4f46\u56e0\u4e3a\u5bb9\u5668\u7684\u9694\u79bb\u6027,\u4fee\u6539\u65e0\u6cd5\u53cd\u6620\u5230\u5bb9\u5668\u5185\u8fd0\u884c\u7684\u5e94\u7528\u4e2d\u3002\u8fd9\u4e9b\u95ee\u9898\u90fd\u6307\u5411\u540c\u4e00\u4e2a\u6838\u5fc3\u6982\u5ff5\u2014\u2014Docker\u5b58\u50a8\u4e0e\u6570\u636e\u6301\u4e45\u5316\u3002<\/p>\n<p>Docker\u63d0\u4f9b\u4e86\u591a\u79cd\u5b58\u50a8\u673a\u5236\u6765\u89e3\u51b3\u8fd9\u4e9b\u95ee\u9898,\u5305\u62ecVolume(\u6570\u636e\u5377)\u3001Bind Mount(\u7ed1\u5b9a\u6302\u8f7d)\u548ctmpfs Mount(\u4e34\u65f6\u6587\u4ef6\u7cfb\u7edf\u6302\u8f7d)\u3002\u540c\u65f6,Docker\u5e95\u5c42\u8fd8\u4f9d\u8d56\u5b58\u50a8\u9a71\u52a8(Storage Driver)\u6765\u7ba1\u7406\u955c\u50cf\u5c42\u548c\u5bb9\u5668\u53ef\u5199\u5c42\u3002\u7406\u89e3\u8fd9\u4e9b\u673a\u5236\u7684\u539f\u7406\u548c\u4f7f\u7528\u65b9\u6cd5,\u662f\u6bcf\u4e00\u4f4dDocker\u4f7f\u7528\u8005\u7684\u5fc5\u4fee\u8bfe\u3002<\/p>\n<p>\u672c\u6587\u5c06\u4ece\u5e95\u5c42\u539f\u7406\u51fa\u53d1,\u5168\u9762\u8bb2\u89e3Docker\u5b58\u50a8\u7684\u65b9\u65b9\u9762\u9762,\u5e2e\u52a9\u4f60\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u6b63\u786e\u3001\u9ad8\u6548\u5730\u7ba1\u7406\u6570\u636e\u3002<\/p>\n<hr \/>\n<h3>\u7b2c\u4e00\u7ae0 Docker\u5b58\u50a8\u4f53\u7cfb\u6982\u89c8<\/h3>\n<h4>1.1 \u5bb9\u5668\u5b58\u50a8\u7684\u6311\u6218<\/h4>\n<h5>1.1.1 \u5bb9\u5668\u6587\u4ef6\u7cfb\u7edf\u7684\u4e34\u65f6\u6027<\/h5>\n<p>Docker\u5bb9\u5668\u57fa\u4e8e\u955c\u50cf\u8fd0\u884c,\u800c\u955c\u50cf\u662f\u53ea\u8bfb\u7684\u3002\u5f53\u5bb9\u5668\u542f\u52a8\u65f6,Docker\u4f1a\u5728\u955c\u50cf\u7684\u6700\u9876\u5c42\u6dfb\u52a0\u4e00\u4e2a\u53ef\u5199\u5c42(Writable Layer),\u4e5f\u79f0\u4e3a\u5bb9\u5668\u5c42(Container Layer)\u3002\u6240\u6709\u7684\u5199\u64cd\u4f5c\u2014\u2014\u521b\u5efa\u6587\u4ef6\u3001\u4fee\u6539\u6587\u4ef6\u3001\u5220\u9664\u6587\u4ef6\u2014\u2014\u90fd\u53d1\u751f\u5728\u8fd9\u4e2a\u53ef\u5199\u5c42\u4e2d\u3002<\/p>\n<p>\u8fd9\u4e2a\u8bbe\u8ba1\u5e26\u6765\u4e86\u4e00\u4e2a\u6839\u672c\u6027\u7684\u95ee\u9898:\u5f53\u5bb9\u5668\u88ab\u5220\u9664\u65f6,\u53ef\u5199\u5c42\u4e5f\u4f1a\u88ab\u5220\u9664,\u6240\u6709\u5199\u5165\u7684\u6570\u636e\u90fd\u4f1a\u4e22\u5931\u3002<\/p>\n<p>\u8ba9\u6211\u4eec\u901a\u8fc7\u4e00\u4e2a\u7b80\u5355\u7684\u5b9e\u9a8c\u6765\u9a8c\u8bc1\u8fd9\u4e00\u70b9:<\/p>\n<p><span class=\"token comment\"># \u542f\u52a8\u4e00\u4e2aUbuntu\u5bb9\u5668,\u5728\u5bb9\u5668\u5185\u521b\u5efa\u4e00\u4e2a\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> test-container ubuntu:22.04 <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><\/p>\n<p><span class=\"token comment\"># \u8fdb\u5165\u5bb9\u5668,\u521b\u5efa\u4e00\u4e2a\u6d4b\u8bd5\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> test-container <span class=\"token function\">bash<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;echo &#034;Hello Docker Storage&#034; &gt; \/tmp\/test.txt&#039;<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u6587\u4ef6\u5185\u5bb9<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> test-container <span class=\"token function\">cat<\/span> \/tmp\/test.txt<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: Hello Docker Storage<\/span><\/p>\n<p><span class=\"token comment\"># \u5220\u9664\u5bb9\u5668<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-f<\/span> test-container<\/p>\n<p><span class=\"token comment\"># \u91cd\u65b0\u542f\u52a8\u4e00\u4e2a\u540c\u540d\u5bb9\u5668,\u5c1d\u8bd5\u67e5\u770b\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> test-container ubuntu:22.04 <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> test-container <span class=\"token function\">cat<\/span> \/tmp\/test.txt<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: cat: \/tmp\/test.txt: No such file or directory<\/span><\/p>\n<p>\u5982\u4e0a\u6240\u793a,\u6587\u4ef6\u5df2\u7ecf\u4e22\u5931\u3002\u8fd9\u662f\u56e0\u4e3a\u65b0\u5bb9\u5668\u62e5\u6709\u5168\u65b0\u7684\u53ef\u5199\u5c42,\u4e0e\u4e4b\u524d\u7684\u5bb9\u5668\u6ca1\u6709\u4efb\u4f55\u5173\u8054\u3002<\/p>\n<h5>1.1.2 \u6570\u636e\u4e22\u5931\u5e26\u6765\u7684\u95ee\u9898<\/h5>\n<p>\u5bb9\u5668\u5b58\u50a8\u7684\u4e34\u65f6\u6027\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\u4f1a\u5bfc\u81f4\u591a\u79cd\u95ee\u9898:<\/p>\n<li>\u6570\u636e\u5e93\u6570\u636e\u4e22\u5931:\u8fd0\u884c\u5728\u5bb9\u5668\u4e2d\u7684\u6570\u636e\u5e93(\u5982MySQL\u3001PostgreSQL)\u5728\u5bb9\u5668\u5220\u9664\u540e\u6570\u636e\u5168\u90e8\u4e22\u5931\u3002<\/li>\n<li>\u914d\u7f6e\u6587\u4ef6\u65e0\u6cd5\u6301\u4e45\u5316:\u5bb9\u5668\u5185\u4fee\u6539\u7684\u914d\u7f6e\u6587\u4ef6\u5728\u91cd\u5efa\u540e\u6062\u590d\u4e3a\u955c\u50cf\u9ed8\u8ba4\u503c\u3002<\/li>\n<li>\u65e5\u5fd7\u6587\u4ef6\u4e22\u5931:\u5e94\u7528\u8fd0\u884c\u65e5\u5fd7\u968f\u5bb9\u5668\u5220\u9664\u800c\u6d88\u5931,\u65e0\u6cd5\u8fdb\u884c\u4e8b\u540e\u5206\u6790\u3002<\/li>\n<li>\u4e0a\u4f20\u6587\u4ef6\u4e22\u5931:\u7528\u6237\u4e0a\u4f20\u7684\u6587\u4ef6\u5b58\u50a8\u5728\u5bb9\u5668\u5185,\u5bb9\u5668\u91cd\u5efa\u540e\u6587\u4ef6\u4e22\u5931\u3002<\/li>\n<li>\u591a\u5bb9\u5668\u95f4\u65e0\u6cd5\u5171\u4eab\u6570\u636e:\u4e0d\u540c\u5bb9\u5668\u4e4b\u95f4\u65e0\u6cd5\u76f4\u63a5\u5171\u4eab\u6587\u4ef6\u6570\u636e\u3002<\/li>\n<li>\u5bb9\u5668\u5347\u7ea7\u56f0\u96be:\u5347\u7ea7\u5bb9\u5668\u9700\u8981\u5220\u9664\u65e7\u5bb9\u5668\u3001\u521b\u5efa\u65b0\u5bb9\u5668,\u4f46\u65e7\u5bb9\u5668\u4e2d\u7684\u6570\u636e\u65e0\u6cd5\u4fdd\u7559\u3002<\/li>\n<h5>1.1.3 \u4e3a\u4ec0\u4e48\u4e0d\u80fd\u76f4\u63a5\u5728\u5bb9\u5668\u4e2d\u5b58\u50a8\u6570\u636e<\/h5>\n<p>\u9664\u4e86\u6570\u636e\u4e22\u5931\u7684\u95ee\u9898\u5916,\u76f4\u63a5\u5728\u5bb9\u5668\u53ef\u5199\u5c42\u4e2d\u5b58\u50a8\u6570\u636e\u8fd8\u6709\u4ee5\u4e0b\u7f3a\u70b9:<\/p>\n<ul>\n<li>\u6027\u80fd\u5f00\u9500:\u5b58\u50a8\u9a71\u52a8\u4f7f\u7528\u5199\u65f6\u590d\u5236(Copy-on-Write)\u673a\u5236,\u5bf9\u53ef\u5199\u5c42\u7684\u5199\u64cd\u4f5c\u6709\u989d\u5916\u7684\u6027\u80fd\u5f00\u9500\u3002<\/li>\n<li>\u5b58\u50a8\u6548\u7387\u4f4e:\u53ef\u5199\u5c42\u4e0e\u955c\u50cf\u5c42\u5206\u79bb,\u53ef\u80fd\u5bfc\u81f4\u5b58\u50a8\u7a7a\u95f4\u6d6a\u8d39\u3002<\/li>\n<li>\u4e0d\u53ef\u79fb\u690d:\u5bb9\u5668\u5185\u7684\u6570\u636e\u4e0e\u5bb9\u5668\u7ed1\u5b9a,\u65e0\u6cd5\u8f7b\u677e\u8fc1\u79fb\u5230\u5176\u4ed6\u4e3b\u673a\u6216\u5176\u4ed6\u5bb9\u5668\u3002<\/li>\n<li>\u96be\u4ee5\u5907\u4efd:\u5bb9\u5668\u53ef\u5199\u5c42\u7684\u6570\u636e\u96be\u4ee5\u5355\u72ec\u5907\u4efd,\u901a\u5e38\u9700\u8981\u501f\u52a9docker commit\u751f\u6210\u65b0\u955c\u50cf,\u4f46\u8fd9\u4e0d\u662f\u6570\u636e\u6301\u4e45\u5316\u7684\u6b63\u786e\u65b9\u5f0f\u3002<\/li>\n<\/ul>\n<h4>1.2 Docker\u5b58\u50a8\u4e09\u5927\u65b9\u5f0f: Volume\u3001Bind Mount\u3001tmpfs<\/h4>\n<p>\u4e3a\u4e86\u89e3\u51b3\u5bb9\u5668\u5b58\u50a8\u7684\u4e34\u65f6\u6027\u95ee\u9898,Docker\u63d0\u4f9b\u4e86\u4e09\u79cd\u6570\u636e\u6301\u4e45\u5316\u673a\u5236:<\/p>\n<h5>1.2.1 Volume(\u6570\u636e\u5377)<\/h5>\n<p>Volume\u662fDocker\u7ba1\u7406\u7684\u5b58\u50a8\u65b9\u5f0f,\u7531Docker\u5b88\u62a4\u8fdb\u7a0b\u521b\u5efa\u548c\u7ba1\u7406,\u5b58\u50a8\u5728\u5bbf\u4e3b\u673a\u7684\u7279\u5b9a\u76ee\u5f55\u4e0b(\u9ed8\u8ba4\u4e3a\/var\/lib\/docker\/volumes\/)\u3002\u6570\u636e\u5377\u72ec\u7acb\u4e8e\u5bb9\u5668\u7684\u751f\u547d\u5468\u671f,\u5373\u4f7f\u5bb9\u5668\u88ab\u5220\u9664,\u6570\u636e\u5377\u4e2d\u7684\u6570\u636e\u4f9d\u7136\u5b58\u5728\u3002<\/p>\n<p>\u4e3b\u8981\u7279\u70b9:<\/p>\n<ul>\n<li>\u7531Docker\u7ba1\u7406,\u5b58\u50a8\u4f4d\u7f6e\u56fa\u5b9a\u4e14\u53ef\u9884\u6d4b<\/li>\n<li>\u652f\u6301\u547d\u540d\u6570\u636e\u5377\u548c\u533f\u540d\u6570\u636e\u5377<\/li>\n<li>\u53ef\u4ee5\u5728\u591a\u4e2a\u5bb9\u5668\u4e4b\u95f4\u5171\u4eab<\/li>\n<li>\u652f\u6301\u6570\u636e\u5377\u9a71\u52a8,\u53ef\u4ee5\u6269\u5c55\u5230\u8fdc\u7a0b\u5b58\u50a8(NFS\u3001\u4e91\u5b58\u50a8\u7b49)<\/li>\n<li>\u4e0d\u53d7\u5bb9\u5668\u53ef\u5199\u5c42\u6027\u80fd\u5f71\u54cd,\u8bfb\u5199\u6027\u80fd\u63a5\u8fd1\u5bbf\u4e3b\u673a\u539f\u751f\u6587\u4ef6\u7cfb\u7edf<\/li>\n<\/ul>\n<h5>1.2.2 Bind Mount(\u7ed1\u5b9a\u6302\u8f7d)<\/h5>\n<p>Bind Mount\u5c06\u5bbf\u4e3b\u673a\u4e0a\u7684\u4e00\u4e2a\u7edd\u5bf9\u8def\u5f84\u76f4\u63a5\u6302\u8f7d\u5230\u5bb9\u5668\u4e2d\u3002\u5bb9\u5668\u53ef\u4ee5\u76f4\u63a5\u8bfb\u5199\u5bbf\u4e3b\u673a\u4e0a\u7684\u6587\u4ef6,\u9002\u5408\u5f00\u53d1\u73af\u5883\u4e2d\u7684\u4ee3\u7801\u70ed\u91cd\u8f7d\u7b49\u573a\u666f\u3002<\/p>\n<p>\u4e3b\u8981\u7279\u70b9:<\/p>\n<ul>\n<li>\u4f9d\u8d56\u5bbf\u4e3b\u673a\u7684\u76ee\u5f55\u7ed3\u6784,\u9700\u8981\u6307\u5b9a\u7edd\u5bf9\u8def\u5f84<\/li>\n<li>\u5bb9\u5668\u53ef\u4ee5\u76f4\u63a5\u4fee\u6539\u5bbf\u4e3b\u673a\u4e0a\u7684\u6587\u4ef6,\u53cd\u4e4b\u4ea6\u7136<\/li>\n<li>\u9002\u5408\u5f00\u53d1\u73af\u5883,\u5982\u4ee3\u7801\u6302\u8f7d\u3001\u914d\u7f6e\u6587\u4ef6\u6302\u8f7d<\/li>\n<li>\u65e0\u6cd5\u901a\u8fc7docker volume\u547d\u4ee4\u7ba1\u7406<\/li>\n<li>\u5728\u4e0d\u540c\u73af\u5883\u4e2d\u7684\u884c\u4e3a\u53ef\u80fd\u4e0d\u4e00\u81f4(\u8def\u5f84\u4f9d\u8d56)<\/li>\n<\/ul>\n<h5>1.2.3 tmpfs Mount(\u4e34\u65f6\u6587\u4ef6\u7cfb\u7edf\u6302\u8f7d)<\/h5>\n<p>tmpfs\u6302\u8f7d\u5c06\u6570\u636e\u5b58\u50a8\u5728\u5bbf\u4e3b\u673a\u7684\u5185\u5b58\u4e2d,\u4e0d\u4f1a\u5199\u5165\u78c1\u76d8\u3002\u9002\u5408\u5b58\u50a8\u654f\u611f\u4fe1\u606f(\u5982\u5bc6\u94a5)\u6216\u4e34\u65f6\u7f13\u5b58\u6570\u636e\u3002<\/p>\n<p>\u4e3b\u8981\u7279\u70b9:<\/p>\n<ul>\n<li>\u6570\u636e\u5b58\u50a8\u5728\u5185\u5b58\u4e2d,\u8bfb\u5199\u901f\u5ea6\u6781\u5feb<\/li>\n<li>\u5bb9\u5668\u505c\u6b62\u540e\u6570\u636e\u6d88\u5931,\u4e0d\u4f1a\u6301\u4e45\u5316\u5230\u78c1\u76d8<\/li>\n<li>\u9002\u5408\u5b58\u50a8\u654f\u611f\u4fe1\u606f,\u907f\u514d\u654f\u611f\u6570\u636e\u843d\u76d8<\/li>\n<li>\u53ea\u80fd\u5728Linux\u4e0a\u4f7f\u7528<\/li>\n<li>\u53d7\u53ef\u7528\u5185\u5b58\u5927\u5c0f\u9650\u5236<\/li>\n<\/ul>\n<h5>1.2.4 \u4e09\u79cd\u5b58\u50a8\u65b9\u5f0f\u5bf9\u6bd4<\/h5>\n<table>\n<tr>\u7279\u6027VolumeBind Mounttmpfs<\/tr>\n<tbody>\n<tr>\n<td>\u5b58\u50a8\u4f4d\u7f6e<\/td>\n<td>Docker\u7ba1\u7406\u533a\u57df(\/var\/lib\/docker\/volumes\/)<\/td>\n<td>\u5bbf\u4e3b\u673a\u4efb\u610f\u8def\u5f84<\/td>\n<td>\u5bbf\u4e3b\u673a\u5185\u5b58<\/td>\n<\/tr>\n<tr>\n<td>\u7ba1\u7406\u65b9\u5f0f<\/td>\n<td>docker volume\u547d\u4ee4<\/td>\n<td>\u76f4\u63a5\u4f7f\u7528\u5bbf\u4e3b\u673a\u8def\u5f84<\/td>\n<td>\u2013tmpfs\u6216\u2013mount<\/td>\n<\/tr>\n<tr>\n<td>\u6301\u4e45\u6027<\/td>\n<td>\u6301\u4e45(\u72ec\u7acb\u4e8e\u5bb9\u5668\u751f\u547d\u5468\u671f)<\/td>\n<td>\u6301\u4e45(\u53d6\u51b3\u4e8e\u5bbf\u4e3b\u673a\u6587\u4ef6)<\/td>\n<td>\u4e34\u65f6(\u5bb9\u5668\u505c\u6b62\u5373\u6d88\u5931)<\/td>\n<\/tr>\n<tr>\n<td>\u5171\u4eab\u6027<\/td>\n<td>\u591a\u5bb9\u5668\u5171\u4eab<\/td>\n<td>\u591a\u5bb9\u5668\u5171\u4eab<\/td>\n<td>\u4e0d\u53ef\u5171\u4eab(\u5355\u5bb9\u5668)<\/td>\n<\/tr>\n<tr>\n<td>\u6027\u80fd<\/td>\n<td>\u63a5\u8fd1\u539f\u751f<\/td>\n<td>\u63a5\u8fd1\u539f\u751f<\/td>\n<td>\u6781\u5feb(\u5185\u5b58)<\/td>\n<\/tr>\n<tr>\n<td>\u53ef\u79fb\u690d\u6027<\/td>\n<td>\u9ad8<\/td>\n<td>\u4f4e(\u8def\u5f84\u4f9d\u8d56)<\/td>\n<td>\u4e0d\u9002\u7528<\/td>\n<\/tr>\n<tr>\n<td>\u5b89\u5168\u6027<\/td>\n<td>\u8f83\u9ad8<\/td>\n<td>\u4e2d(\u76f4\u63a5\u64cd\u4f5c\u5bbf\u4e3b\u673a\u6587\u4ef6)<\/td>\n<td>\u9ad8(\u4e0d\u843d\u76d8)<\/td>\n<\/tr>\n<tr>\n<td>\u9002\u7528\u573a\u666f<\/td>\n<td>\u751f\u4ea7\u73af\u5883\u6570\u636e\u6301\u4e45\u5316<\/td>\n<td>\u5f00\u53d1\u73af\u5883\u4ee3\u7801\u6302\u8f7d<\/td>\n<td>\u654f\u611f\u4fe1\u606f\u3001\u4e34\u65f6\u7f13\u5b58<\/td>\n<\/tr>\n<tr>\n<td>\u8de8\u5e73\u53f0<\/td>\n<td>\u652f\u6301<\/td>\n<td>\u652f\u6301(\u8def\u5f84\u4e0d\u540c)<\/td>\n<td>\u4ec5Linux<\/td>\n<\/tr>\n<tr>\n<td>\u5907\u4efd\u6062\u590d<\/td>\n<td>\u65b9\u4fbf(docker volume\u547d\u4ee4)<\/td>\n<td>\u76f4\u63a5\u64cd\u4f5c\u5bbf\u4e3b\u673a\u6587\u4ef6<\/td>\n<td>\u4e0d\u9700\u8981(\u4e34\u65f6\u6570\u636e)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>1.3 \u5b58\u50a8\u9a71\u52a8(Storage Driver)\u4e0e\u6570\u636e\u5377\u7684\u533a\u522b<\/h4>\n<p>\u8bb8\u591aDocker\u521d\u5b66\u8005\u5bb9\u6613\u6df7\u6dc6&#034;\u5b58\u50a8\u9a71\u52a8&#034;\u548c&#034;\u6570\u636e\u5377&#034;\u8fd9\u4e24\u4e2a\u6982\u5ff5\u3002\u5b83\u4eec\u867d\u7136\u90fd\u4e0e\u5b58\u50a8\u76f8\u5173,\u4f46\u5728\u529f\u80fd\u548c\u4f5c\u7528\u5c42\u9762\u5b8c\u5168\u4e0d\u540c\u3002<\/p>\n<h5>1.3.1 \u5b58\u50a8\u9a71\u52a8<\/h5>\n<p>\u5b58\u50a8\u9a71\u52a8(Storage Driver)\u8d1f\u8d23\u7ba1\u7406\u955c\u50cf\u5c42(Image Layers)\u548c\u5bb9\u5668\u53ef\u5199\u5c42(Container Writable Layer)\u3002\u5b83\u5904\u7406\u7684\u662fDocker\u955c\u50cf\u7684\u5206\u5c42\u5b58\u50a8\u3001\u5199\u65f6\u590d\u5236(Copy-on-Write)\u7b49\u5e95\u5c42\u673a\u5236\u3002<\/p>\n<ul>\n<li>\u4f5c\u7528\u5bf9\u8c61:\u955c\u50cf\u5c42\u548c\u5bb9\u5668\u53ef\u5199\u5c42<\/li>\n<li>\u5173\u6ce8\u70b9:\u5982\u4f55\u9ad8\u6548\u5730\u5b58\u50a8\u548c\u53e0\u52a0\u955c\u50cf\u5c42,\u5982\u4f55\u5904\u7406\u5bb9\u5668\u7684\u8bfb\u5199\u64cd\u4f5c<\/li>\n<li>\u4e0e\u6570\u636e\u6301\u4e45\u5316\u7684\u5173\u7cfb:\u5b58\u50a8\u9a71\u52a8\u7ba1\u7406\u7684\u6570\u636e\u662f\u4e34\u65f6\u7684(\u5bb9\u5668\u5220\u9664\u5373\u4e22\u5931)<\/li>\n<li>\u914d\u7f6e\u65b9\u5f0f:\u5728\/etc\/docker\/daemon.json\u4e2d\u901a\u8fc7storage-driver\u53c2\u6570\u914d\u7f6e<\/li>\n<li>\u5e38\u89c1\u9a71\u52a8:overlay2\u3001aufs\u3001devicemapper\u3001btrfs\u3001zfs\u3001vfs<\/li>\n<\/ul>\n<h5>1.3.2 \u6570\u636e\u5377<\/h5>\n<p>\u6570\u636e\u5377(Volume)\u662fDocker\u63d0\u4f9b\u7684\u6570\u636e\u6301\u4e45\u5316\u673a\u5236,\u7528\u4e8e\u5c06\u6570\u636e\u5b58\u50a8\u5728\u5bb9\u5668\u53ef\u5199\u5c42\u4e4b\u5916\u3002<\/p>\n<ul>\n<li>\u4f5c\u7528\u5bf9\u8c61:\u9700\u8981\u6301\u4e45\u5316\u7684\u6570\u636e<\/li>\n<li>\u5173\u6ce8\u70b9:\u5982\u4f55\u5728\u5bb9\u5668\u751f\u547d\u5468\u671f\u4e4b\u5916\u4fdd\u5b58\u6570\u636e<\/li>\n<li>\u4e0e\u5b58\u50a8\u9a71\u52a8\u7684\u5173\u7cfb:\u6570\u636e\u5377\u7ed5\u8fc7\u5b58\u50a8\u9a71\u52a8,\u76f4\u63a5\u5199\u5165\u5bbf\u4e3b\u673a\u6587\u4ef6\u7cfb\u7edf<\/li>\n<li>\u914d\u7f6e\u65b9\u5f0f:\u5728docker run\u65f6\u901a\u8fc7-v\u6216&#8211;mount\u53c2\u6570\u6307\u5b9a<\/li>\n<li>\u7ba1\u7406\u547d\u4ee4:docker volume create\/ls\/rm\/inspect\/prune<\/li>\n<\/ul>\n<h5>1.3.3 \u4e00\u56fe\u7406\u89e3\u4e24\u8005\u5173\u7cfb<\/h5>\n<p>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502                    Docker \u5bb9\u5668                       \u2502<br \/>\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502<br \/>\n\u2502  \u2502              \u5bb9\u5668\u53ef\u5199\u5c42 (\u5b58\u50a8\u9a71\u52a8\u7ba1\u7406)            \u2502 \u2502<br \/>\n\u2502  \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u2502 \u2502<br \/>\n\u2502  \u2502  \u2502           \u955c\u50cf\u5c42N (\u53ea\u8bfb)                   \u2502  \u2502 \u2502<br \/>\n\u2502  \u2502  \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524  \u2502 \u2502<br \/>\n\u2502  \u2502  \u2502           \u955c\u50cf\u5c42&#8230; (\u53ea\u8bfb)                 \u2502  \u2502 \u2502<br \/>\n\u2502  \u2502  \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524  \u2502 \u2502<br \/>\n\u2502  \u2502  \u2502           \u955c\u50cf\u5c421 (\u53ea\u8bfb)                   \u2502  \u2502 \u2502<br \/>\n\u2502  \u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2502 \u2502<br \/>\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502<br \/>\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502<br \/>\n\u2502  \u2502     \u6570\u636e\u5377\u6302\u8f7d\u70b9 (\u7ed5\u8fc7\u5b58\u50a8\u9a71\u52a8,\u76f4\u63a5\u5199\u5165\u5bbf\u4e3b\u673a)    \u2502 \u2502<br \/>\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n                         \u2502<br \/>\n                         \u25bc<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502                    \u5bbf\u4e3b\u673a                            \u2502<br \/>\n\u2502  \/var\/lib\/docker\/volumes\/  \u2190 \u6570\u636e\u5377\u5b58\u50a8\u4f4d\u7f6e           \u2502<br \/>\n\u2502  \/var\/lib\/docker\/overlay2\/ \u2190 \u5b58\u50a8\u9a71\u52a8\u7ba1\u7406\u533a\u57df         \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<p>\u7b80\u5355\u6765\u8bf4:\u5b58\u50a8\u9a71\u52a8\u7ba1\u7406&#034;\u5bb9\u5668\u7684\u4e34\u65f6\u6570\u636e&#034;,\u6570\u636e\u5377\u7ba1\u7406&#034;\u9700\u8981\u6301\u4e45\u5316\u7684\u6570\u636e&#034;\u3002\u6570\u636e\u5377\u7ed5\u8fc7\u4e86\u5b58\u50a8\u9a71\u52a8,\u76f4\u63a5\u5728\u5bbf\u4e3b\u673a\u6587\u4ef6\u7cfb\u7edf\u4e0a\u8fdb\u884c\u8bfb\u5199,\u56e0\u6b64\u6027\u80fd\u66f4\u597d\u4e14\u6570\u636e\u66f4\u5b89\u5168\u3002<\/p>\n<h4>1.4 Docker\u5b58\u50a8\u67b6\u6784\u603b\u89c8<\/h4>\n<p>Docker\u7684\u5b58\u50a8\u67b6\u6784\u53ef\u4ee5\u4ece\u591a\u4e2a\u5c42\u9762\u6765\u7406\u89e3:<\/p>\n<h5>1.4.1 \u6574\u4f53\u67b6\u6784<\/h5>\n<p>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502                    Docker \u5b88\u62a4\u8fdb\u7a0b (dockerd)               \u2502<br \/>\n\u2502                                                          \u2502<br \/>\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510   \u2502<br \/>\n\u2502  \u2502  \u955c\u50cf\u7ba1\u7406\u6a21\u5757  \u2502  \u2502  \u5bb9\u5668\u7ba1\u7406\u6a21\u5757  \u2502  \u2502  \u6570\u636e\u5377\u7ba1\u7406\u6a21\u5757 \u2502   \u2502<br \/>\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518   \u2502<br \/>\n\u2502         \u2502                 \u2502                 \u2502            \u2502<br \/>\n\u2502         \u25bc                 \u25bc                 \u25bc            \u2502<br \/>\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502<br \/>\n\u2502  \u2502                 \u5b58\u50a8\u9a71\u52a8 (Storage Driver)              \u2502\u2502<br \/>\n\u2502  \u2502     overlay2 \/ aufs \/ devicemapper \/ btrfs \/ zfs     \u2502\u2502<br \/>\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2502<br \/>\n\u2502         \u2502                 \u2502                 \u2502            \u2502<br \/>\n\u2502         \u25bc                 \u25bc                 \u25bc            \u2502<br \/>\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510   \u2502<br \/>\n\u2502  \u2502 \/var\/lib\/    \u2502  \u2502 \/var\/lib\/    \u2502  \u2502 \/var\/lib\/    \u2502   \u2502<br \/>\n\u2502  \u2502 docker\/      \u2502  \u2502 docker\/      \u2502  \u2502 docker\/      \u2502   \u2502<br \/>\n\u2502  \u2502 overlay2\/    \u2502  \u2502 containers\/  \u2502  \u2502 volumes\/     \u2502   \u2502<br \/>\n\u2502  \u2502 (\u955c\u50cf\u5c42&#043;\u53ef\u5199\u5c42)\u2502  \u2502 (\u5bb9\u5668\u914d\u7f6e\u65e5\u5fd7) \u2502  \u2502 (\u6570\u636e\u5377)      \u2502   \u2502<br \/>\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518   \u2502<br \/>\n\u2502                                                          \u2502<br \/>\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502<br \/>\n\u2502  \u2502              \u6570\u636e\u5377\u9a71\u52a8 (Volume Driver)                \u2502\u2502<br \/>\n\u2502  \u2502          local \/ nfs \/ block \/ \u7b2c\u4e09\u65b9\u63d2\u4ef6              \u2502\u2502<br \/>\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n                         \u2502<br \/>\n                         \u25bc<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502                    \u5bbf\u4e3b\u673a\u6587\u4ef6\u7cfb\u7edf                         \u2502<br \/>\n\u2502          ext4 \/ xfs \/ btrfs \/ zfs \/ nfs                  \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<h5>1.4.2 \u5173\u952e\u76ee\u5f55\u8bf4\u660e<\/h5>\n<p>Docker\u5728\u5bbf\u4e3b\u673a\u4e0a\u7684\u9ed8\u8ba4\u5b58\u50a8\u76ee\u5f55\u4e3a\/var\/lib\/docker\/,\u5176\u4e2d\u5305\u542b\u4ee5\u4e0b\u91cd\u8981\u5b50\u76ee\u5f55:<\/p>\n<table>\n<tr>\u76ee\u5f55\u7528\u9014<\/tr>\n<tbody>\n<tr>\n<td>\/var\/lib\/docker\/overlay2\/<\/td>\n<td>overlay2\u5b58\u50a8\u9a71\u52a8\u7ba1\u7406\u7684\u955c\u50cf\u5c42\u548c\u5bb9\u5668\u53ef\u5199\u5c42<\/td>\n<\/tr>\n<tr>\n<td>\/var\/lib\/docker\/volumes\/<\/td>\n<td>\u6570\u636e\u5377\u7684\u5b58\u50a8\u4f4d\u7f6e<\/td>\n<\/tr>\n<tr>\n<td>\/var\/lib\/docker\/containers\/<\/td>\n<td>\u5bb9\u5668\u7684\u914d\u7f6e\u6587\u4ef6\u548c\u65e5\u5fd7\u6587\u4ef6<\/td>\n<\/tr>\n<tr>\n<td>\/var\/lib\/docker\/image\/<\/td>\n<td>\u955c\u50cf\u76f8\u5173\u7684\u5143\u6570\u636e<\/td>\n<\/tr>\n<tr>\n<td>\/var\/lib\/docker\/plugins\/<\/td>\n<td>\u5b58\u50a8\u63d2\u4ef6\u76f8\u5173\u6587\u4ef6<\/td>\n<\/tr>\n<tr>\n<td>\/var\/lib\/docker\/network\/<\/td>\n<td>\u7f51\u7edc\u76f8\u5173\u6587\u4ef6<\/td>\n<\/tr>\n<tr>\n<td>\/var\/lib\/docker\/tmp\/<\/td>\n<td>Docker\u4e34\u65f6\u6587\u4ef6<\/td>\n<\/tr>\n<tr>\n<td>\/var\/lib\/docker\/swarm\/<\/td>\n<td>Docker Swarm\u76f8\u5173\u6587\u4ef6<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u547d\u4ee4\u67e5\u770bDocker\u7684\u6839\u76ee\u5f55:<\/p>\n<p><span class=\"token comment\"># \u67e5\u770bDocker\u4fe1\u606f\u4e2d\u7684\u6839\u76ee\u5f55<\/span><br \/>\n<span class=\"token function\">docker<\/span> info <span class=\"token operator\">|<\/span> <span class=\"token function\">grep<\/span> <span class=\"token string\">&#034;Docker Root Dir&#034;<\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa: Docker Root Dir: \/var\/lib\/docker<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u5404\u76ee\u5f55\u7684\u78c1\u76d8\u4f7f\u7528\u60c5\u51b5<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">du<\/span> <span class=\"token parameter variable\">-sh<\/span> \/var\/lib\/docker\/*<\/p>\n<h5>1.4.3 \u6570\u636e\u6d41\u5411<\/h5>\n<p>\u5f53\u5bb9\u5668\u9700\u8981\u8fdb\u884c\u6587\u4ef6\u8bfb\u5199\u65f6,\u6570\u636e\u7684\u6d41\u5411\u53d6\u51b3\u4e8e\u6587\u4ef6\u6240\u5728\u7684\u5c42\u7ea7:<\/p>\n<li>\u8bfb\u53d6\u955c\u50cf\u5c42\u4e2d\u7684\u6587\u4ef6:\u5b58\u50a8\u9a71\u52a8\u8d1f\u8d23\u4ece\u5bf9\u5e94\u7684\u955c\u50cf\u5c42\u8bfb\u53d6\u6587\u4ef6\u5185\u5bb9\u3002<\/li>\n<li>\u4fee\u6539\u955c\u50cf\u5c42\u4e2d\u7684\u6587\u4ef6:\u89e6\u53d1\u5199\u65f6\u590d\u5236(Copy-on-Write),\u5b58\u50a8\u9a71\u52a8\u5c06\u6587\u4ef6\u4ece\u955c\u50cf\u5c42\u590d\u5236\u5230\u5bb9\u5668\u53ef\u5199\u5c42,\u7136\u540e\u5728\u53ef\u5199\u5c42\u8fdb\u884c\u4fee\u6539\u3002<\/li>\n<li>\u8bfb\u5199\u6570\u636e\u5377\u4e2d\u7684\u6587\u4ef6:\u76f4\u63a5\u901a\u8fc7\u6302\u8f7d\u673a\u5236\u8bfb\u5199\u5bbf\u4e3b\u673a\u6587\u4ef6\u7cfb\u7edf,\u4e0d\u7ecf\u8fc7\u5b58\u50a8\u9a71\u52a8\u3002<\/li>\n<li>\u8bfb\u5199tmpfs\u4e2d\u7684\u6587\u4ef6:\u76f4\u63a5\u5728\u5185\u5b58\u4e2d\u8fdb\u884c,\u4e0d\u7ecf\u8fc7\u5b58\u50a8\u9a71\u52a8,\u4e0d\u5199\u5165\u78c1\u76d8\u3002<\/li>\n<h4>1.5 \u5bb9\u5668\u53ef\u5199\u5c42\u4e0e\u6570\u636e\u6301\u4e45\u5316\u5c42\u7684\u5173\u7cfb<\/h4>\n<h5>1.5.1 \u5bb9\u5668\u53ef\u5199\u5c42\u7684\u5de5\u4f5c\u673a\u5236<\/h5>\n<p>\u6bcf\u4e2a\u5bb9\u5668\u542f\u52a8\u65f6,Docker\u4f1a\u4e3a\u5176\u521b\u5efa\u4e00\u4e2a\u53ef\u5199\u5c42\u3002\u8fd9\u4e2a\u53ef\u5199\u5c42\u53e0\u52a0\u5728\u955c\u50cf\u7684\u6240\u6709\u53ea\u8bfb\u5c42\u4e4b\u4e0a,\u5f62\u6210\u4e00\u4e2a\u7edf\u4e00\u7684\u6587\u4ef6\u7cfb\u7edf\u89c6\u56fe(\u901a\u8fc7\u8054\u5408\u6587\u4ef6\u7cfb\u7edfUnionFS\u5b9e\u73b0)\u3002<\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u5bb9\u5668\u7684\u53ef\u5199\u5c42\u4fe1\u606f(\u4ee5overlay2\u4e3a\u4f8b)<\/span><br \/>\n<span class=\"token function\">docker<\/span> inspect <span class=\"token operator\">&lt;<\/span>container_id<span class=\"token operator\">&gt;<\/span> <span class=\"token operator\">|<\/span> <span class=\"token function\">grep<\/span> <span class=\"token parameter variable\">-A<\/span> <span class=\"token number\">10<\/span> <span class=\"token string\">&#034;GraphDriver&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u8f93\u51fa\u793a\u4f8b:<\/span><br \/>\n<span class=\"token comment\"># &#034;GraphDriver&#034;: {<\/span><br \/>\n<span class=\"token comment\">#     &#034;Data&#034;: {<\/span><br \/>\n<span class=\"token comment\">#         &#034;LowerDir&#034;: &#034;\/var\/lib\/docker\/overlay2\/&#8230;\/diff&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;MergedDir&#034;: &#034;\/var\/lib\/docker\/overlay2\/&#8230;\/merged&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;UpperDir&#034;: &#034;\/var\/lib\/docker\/overlay2\/&#8230;\/diff&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;WorkDir&#034;: &#034;\/var\/lib\/docker\/overlay2\/&#8230;\/work&#034;<\/span><br \/>\n<span class=\"token comment\">#     },<\/span><br \/>\n<span class=\"token comment\">#     &#034;Name&#034;: &#034;overlay2&#034;<\/span><br \/>\n<span class=\"token comment\"># }<\/span><\/p>\n<p>\u5176\u4e2d:<\/p>\n<ul>\n<li>LowerDir:\u955c\u50cf\u5c42(\u53ea\u8bfb),\u53ef\u80fd\u6709\u591a\u4e2a<\/li>\n<li>UpperDir:\u5bb9\u5668\u53ef\u5199\u5c42<\/li>\n<li>MergedDir:\u5408\u5e76\u540e\u7684\u7edf\u4e00\u89c6\u56fe<\/li>\n<li>WorkDir:overlay\u5185\u90e8\u4f7f\u7528\u7684\u5de5\u4f5c\u76ee\u5f55<\/li>\n<\/ul>\n<h5>1.5.2 \u5199\u65f6\u590d\u5236(Copy-on-Write)\u673a\u5236<\/h5>\n<p>\u5199\u65f6\u590d\u5236\u662f\u5bb9\u5668\u5b58\u50a8\u7684\u6838\u5fc3\u673a\u5236\u3002\u5f53\u5bb9\u5668\u9700\u8981\u4fee\u6539\u4e00\u4e2a\u5b58\u5728\u4e8e\u955c\u50cf\u5c42\u4e2d\u7684\u6587\u4ef6\u65f6,Docker\u4e0d\u4f1a\u76f4\u63a5\u4fee\u6539\u955c\u50cf\u5c42(\u56e0\u4e3a\u955c\u50cf\u662f\u53ea\u8bfb\u7684),\u800c\u662f:<\/p>\n<li>\u5c06\u6587\u4ef6\u4ece\u955c\u50cf\u5c42(LowerDir)\u590d\u5236\u5230\u53ef\u5199\u5c42(UpperDir)<\/li>\n<li>\u5728\u53ef\u5199\u5c42\u4e2d\u5bf9\u6587\u4ef6\u8fdb\u884c\u4fee\u6539<\/li>\n<li>\u540e\u7eed\u7684\u8bfb\u53d6\u64cd\u4f5c\u4f1a\u4f18\u5148\u4ece\u53ef\u5199\u5c42\u8bfb\u53d6<\/li>\n<p>\u8fd9\u4e2a\u673a\u5236\u786e\u4fdd\u4e86:<\/p>\n<ul>\n<li>\u955c\u50cf\u5c42\u4fdd\u6301\u4e0d\u53d8,\u591a\u4e2a\u5bb9\u5668\u53ef\u4ee5\u5171\u4eab\u540c\u4e00\u4e2a\u955c\u50cf<\/li>\n<li>\u6bcf\u4e2a\u5bb9\u5668\u6709\u81ea\u5df1\u7684\u4fee\u6539\u526f\u672c,\u4e92\u4e0d\u5f71\u54cd<\/li>\n<li>\u53ea\u6709\u88ab\u4fee\u6539\u7684\u6587\u4ef6\u624d\u4f1a\u88ab\u590d\u5236,\u8282\u7701\u5b58\u50a8\u7a7a\u95f4<\/li>\n<\/ul>\n<p><span class=\"token comment\"># \u6f14\u793a\u5199\u65f6\u590d\u5236<\/span><br \/>\n<span class=\"token comment\"># \u542f\u52a8\u5bb9\u5668<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> cow-test ubuntu:22.04 <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u53ef\u5199\u5c42\u7684\u5927\u5c0f(\u521d\u59cb\u4e3a\u5f88\u5c0f)<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">du<\/span> <span class=\"token parameter variable\">-sh<\/span> <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> inspect cow-test <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{.GraphDriver.Data.UpperDir}}&#039;<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa: 12K \/var\/lib\/docker\/overlay2\/xxx\/diff<\/span><\/p>\n<p><span class=\"token comment\"># \u5728\u5bb9\u5668\u4e2d\u4fee\u6539\u4e00\u4e2a\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> cow-test <span class=\"token function\">bash<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;echo &#034;modified&#034; &gt;&gt; \/etc\/hostname&#039;<\/span><\/p>\n<p><span class=\"token comment\"># \u518d\u6b21\u67e5\u770b\u53ef\u5199\u5c42\u5927\u5c0f(\u589e\u5927\u4e86)<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">du<\/span> <span class=\"token parameter variable\">-sh<\/span> <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> inspect cow-test <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{.GraphDriver.Data.UpperDir}}&#039;<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa: 16K \/var\/lib\/docker\/overlay2\/xxx\/diff<\/span><\/p>\n<p><span class=\"token comment\"># \u6e05\u7406<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-f<\/span> cow-test<\/p>\n<h5>1.5.3 \u6570\u636e\u6301\u4e45\u5316\u5c42\u7684\u89d2\u8272<\/h5>\n<p>\u6570\u636e\u6301\u4e45\u5316\u5c42(\u6570\u636e\u5377\u3001\u7ed1\u5b9a\u6302\u8f7d)\u4e0e\u5bb9\u5668\u53ef\u5199\u5c42\u662f\u5b8c\u5168\u72ec\u7acb\u7684:<\/p>\n<li>\u6302\u8f7d\u70b9\u8986\u76d6:\u5f53\u6570\u636e\u5377\u6302\u8f7d\u5230\u5bb9\u5668\u7684\u67d0\u4e2a\u8def\u5f84\u65f6,\u8be5\u8def\u5f84\u4e0a\u7684\u53ef\u5199\u5c42\u5185\u5bb9\u4f1a\u88ab&#034;\u906e\u76d6&#034;,\u5bb9\u5668\u770b\u5230\u7684\u662f\u6570\u636e\u5377\u4e2d\u7684\u5185\u5bb9\u3002<\/li>\n<li>\u72ec\u7acb\u751f\u547d\u5468\u671f:\u6570\u636e\u5377\u7684\u521b\u5efa\u3001\u5220\u9664\u4e0e\u5bb9\u5668\u7684\u521b\u5efa\u3001\u5220\u9664\u5b8c\u5168\u72ec\u7acb\u3002\u5220\u9664\u5bb9\u5668\u4e0d\u4f1a\u5220\u9664\u6570\u636e\u5377\u3002<\/li>\n<li>\u76f4\u63a5I\/O:\u6570\u636e\u5377\u7684\u8bfb\u5199\u64cd\u4f5c\u76f4\u63a5\u4f5c\u7528\u4e8e\u5bbf\u4e3b\u673a\u6587\u4ef6\u7cfb\u7edf,\u4e0d\u7ecf\u8fc7\u5b58\u50a8\u9a71\u52a8\u7684\u5199\u65f6\u590d\u5236\u673a\u5236,\u56e0\u6b64\u6027\u80fd\u66f4\u597d\u3002<\/li>\n<li>\u521d\u59cb\u5185\u5bb9\u590d\u5236:\u5bf9\u4e8e\u547d\u540d\u6570\u636e\u5377,\u5982\u679c\u6302\u8f7d\u70b9\u5728\u955c\u50cf\u4e2d\u6709\u5185\u5bb9,\u9996\u6b21\u6302\u8f7d\u65f6Docker\u4f1a\u5c06\u955c\u50cf\u4e2d\u7684\u5185\u5bb9\u590d\u5236\u5230\u6570\u636e\u5377\u4e2d(\u5bf9\u4e8e\u7ed1\u5b9a\u6302\u8f7d\u5219\u4e0d\u4f1a)\u3002<\/li>\n<p><span class=\"token comment\"># \u6f14\u793a\u6570\u636e\u5377\u6302\u8f7d\u70b9\u8986\u76d6<\/span><br \/>\n<span class=\"token comment\"># \u4f7f\u7528nginx\u955c\u50cf,\u5176\u9ed8\u8ba4\u7f51\u7ad9\u6839\u76ee\u5f55\u4e3a\/usr\/share\/nginx\/html<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> nginx-test <span class=\"token parameter variable\">-v<\/span> nginx-html:\/usr\/share\/nginx\/html nginx:latest<\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u6570\u636e\u5377\u4e2d\u7684\u5185\u5bb9(\u4f1a\u5305\u542bnginx\u9ed8\u8ba4\u7684\u6b22\u8fce\u9875\u9762,\u56e0\u4e3a\u9996\u6b21\u6302\u8f7d\u65f6\u4ece\u955c\u50cf\u590d\u5236)<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> nginx-test <span class=\"token function\">ls<\/span> \/usr\/share\/nginx\/html<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: 50x.html  index.html<\/span><\/p>\n<p><span class=\"token comment\"># \u4fee\u6539\u6570\u636e\u5377\u4e2d\u7684\u5185\u5bb9<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> nginx-test <span class=\"token function\">bash<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;echo &#034;&lt;h1&gt;Custom Content&lt;\/h1&gt;&#034; &gt; \/usr\/share\/nginx\/html\/index.html&#039;<\/span><\/p>\n<p><span class=\"token comment\"># \u5220\u9664\u5bb9\u5668<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-f<\/span> nginx-test<\/p>\n<p><span class=\"token comment\"># \u91cd\u65b0\u521b\u5efa\u5bb9\u5668\u5e76\u6302\u8f7d\u540c\u4e00\u4e2a\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> nginx-test2 <span class=\"token parameter variable\">-v<\/span> nginx-html:\/usr\/share\/nginx\/html nginx:latest<\/p>\n<p><span class=\"token comment\"># \u9a8c\u8bc1\u6570\u636e\u4ecd\u7136\u5b58\u5728<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> nginx-test2 <span class=\"token function\">cat<\/span> \/usr\/share\/nginx\/html\/index.html<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: &lt;h1&gt;Custom Content&lt;\/h1&gt;<\/span><\/p>\n<p><span class=\"token comment\"># \u6e05\u7406<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-f<\/span> nginx-test2<br \/>\n<span class=\"token function\">docker<\/span> volume <span class=\"token function\">rm<\/span> nginx-html<\/p>\n<p>\u8fd9\u4e2a\u4f8b\u5b50\u6e05\u695a\u5730\u5c55\u793a\u4e86\u6570\u636e\u5377\u5982\u4f55\u7ed5\u8fc7\u5bb9\u5668\u53ef\u5199\u5c42,\u5b9e\u73b0\u6570\u636e\u7684\u6301\u4e45\u5316\u5b58\u50a8\u3002<\/p>\n<hr \/>\n<h3>\u7b2c\u4e8c\u7ae0 \u5b58\u50a8\u9a71\u52a8\u8be6\u89e3<\/h3>\n<h4>2.1 \u5b58\u50a8\u9a71\u52a8\u7684\u4f5c\u7528(\u7ba1\u7406\u955c\u50cf\u5c42\u548c\u5bb9\u5668\u53ef\u5199\u5c42)<\/h4>\n<p>\u5b58\u50a8\u9a71\u52a8\u662fDocker\u5b58\u50a8\u67b6\u6784\u7684\u6838\u5fc3\u7ec4\u4ef6,\u8d1f\u8d23\u7ba1\u7406\u955c\u50cf\u5c42(Image Layers)\u548c\u5bb9\u5668\u53ef\u5199\u5c42(Container Writable Layer)\u3002\u5b83\u7684\u4e3b\u8981\u804c\u8d23\u5305\u62ec:<\/p>\n<h5>2.1.1 \u955c\u50cf\u5c42\u7ba1\u7406<\/h5>\n<p>Docker\u955c\u50cf\u7531\u591a\u4e2a\u53ea\u8bfb\u5c42(Layer)\u7ec4\u6210,\u6bcf\u4e00\u5c42\u5bf9\u5e94Dockerfile\u4e2d\u7684\u4e00\u6761\u6307\u4ee4\u3002\u5b58\u50a8\u9a71\u52a8\u8d1f\u8d23:<\/p>\n<ul>\n<li>\u5c42\u53e0\u52a0:\u5c06\u591a\u4e2a\u53ea\u8bfb\u5c42\u53e0\u52a0\u6210\u4e00\u4e2a\u7edf\u4e00\u7684\u6587\u4ef6\u7cfb\u7edf\u89c6\u56fe<\/li>\n<li>\u5c42\u5171\u4eab:\u591a\u4e2a\u955c\u50cf\u53ef\u4ee5\u5171\u4eab\u76f8\u540c\u7684\u5e95\u5c42,\u8282\u7701\u5b58\u50a8\u7a7a\u95f4<\/li>\n<li>\u5c42\u7f13\u5b58:\u6784\u5efa\u955c\u50cf\u65f6\u5229\u7528\u7f13\u5b58\u5c42\u52a0\u901f\u6784\u5efa\u8fc7\u7a0b<\/li>\n<\/ul>\n<p># \u6bcf\u6761\u6307\u4ee4\u90fd\u4f1a\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u955c\u50cf\u5c42<br \/>\nFROM ubuntu:22.04           # \u57fa\u7840\u5c42(\u6765\u81eaubuntu\u955c\u50cf)<br \/>\nRUN apt-get update          # \u65b0\u5c42<br \/>\nRUN apt-get install -y nginx # \u65b0\u5c42<br \/>\nCOPY index.html \/var\/www\/html\/  # \u65b0\u5c42<br \/>\nCMD [&#034;nginx&#034;, &#034;-g&#034;, &#034;daemon off;&#034;]  # \u65b0\u5c42(\u5143\u6570\u636e\u5c42)<\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u955c\u50cf\u7684\u5206\u5c42\u7ed3\u6784<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">history<\/span> nginx:latest<\/p>\n<p><span class=\"token comment\"># \u8f93\u51fa\u793a\u4f8b:<\/span><br \/>\n<span class=\"token comment\"># IMAGE          CREATED       CREATED BY                                      SIZE<\/span><br \/>\n<span class=\"token comment\"># 605c77e624dd   2 weeks ago   \/bin\/sh -c #(nop)  CMD [&#034;nginx&#034; &#034;g&#034; &#034;daemon\u2026   0B<\/span><br \/>\n<span class=\"token comment\"># 8140c0a4wr2e   2 weeks ago   \/bin\/sh -c #(nop)  STOPSIGNAL SIGQUIT           0B<\/span><br \/>\n<span class=\"token comment\"># 41a1a8e923e3   2 weeks ago   \/bin\/sh -c #(nop)  EXPOSE 80                    0B<\/span><br \/>\n<span class=\"token comment\"># 12ad5138f5b1   2 weeks ago   \/bin\/sh -c #(nop)  ENTRYPOINT [&#034;\/docker-entr\u2026   0B<\/span><br \/>\n<span class=\"token comment\"># &#8230;<\/span><\/p>\n<h5>2.1.2 \u5bb9\u5668\u53ef\u5199\u5c42\u7ba1\u7406<\/h5>\n<p>\u5f53\u5bb9\u5668\u542f\u52a8\u65f6,\u5b58\u50a8\u9a71\u52a8\u4f1a\u5728\u955c\u50cf\u5c42\u4e4b\u4e0a\u6dfb\u52a0\u4e00\u4e2a\u53ef\u5199\u5c42:<\/p>\n<ul>\n<li>\u5199\u64cd\u4f5c\u5904\u7406:\u6240\u6709\u5199\u64cd\u4f5c\u90fd\u8bb0\u5f55\u5728\u53ef\u5199\u5c42\u4e2d<\/li>\n<li>\u5199\u65f6\u590d\u5236:\u4fee\u6539\u955c\u50cf\u5c42\u6587\u4ef6\u65f6,\u5148\u590d\u5236\u5230\u53ef\u5199\u5c42\u518d\u4fee\u6539<\/li>\n<li>\u5220\u9664\u64cd\u4f5c\u5904\u7406:\u5728\u53ef\u5199\u5c42\u4e2d\u6807\u8bb0\u6587\u4ef6\u4e3a\u5df2\u5220\u9664(whiteout\u6587\u4ef6)<\/li>\n<\/ul>\n<h5>2.1.3 \u5b58\u50a8\u9a71\u52a8\u5fc5\u987b\u5b9e\u73b0\u7684\u6838\u5fc3\u529f\u80fd<\/h5>\n<p>\u4e00\u4e2a\u5b8c\u6574\u7684\u5b58\u50a8\u9a71\u52a8\u9700\u8981\u5b9e\u73b0\u4ee5\u4e0b\u6838\u5fc3\u529f\u80fd:<\/p>\n<table>\n<tr>\u529f\u80fd\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>\u5c42\u53e0\u52a0<\/td>\n<td>\u5c06\u591a\u4e2a\u53ea\u8bfb\u5c42\u4e0e\u4e00\u4e2a\u53ef\u5199\u5c42\u53e0\u52a0\u4e3a\u7edf\u4e00\u89c6\u56fe<\/td>\n<\/tr>\n<tr>\n<td>\u5199\u65f6\u590d\u5236<\/td>\n<td>\u4fee\u6539\u6587\u4ef6\u65f6\u6309\u9700\u4ece\u53ea\u8bfb\u5c42\u590d\u5236\u5230\u53ef\u5199\u5c42<\/td>\n<\/tr>\n<tr>\n<td>\u5c42\u5171\u4eab<\/td>\n<td>\u4e0d\u540c\u955c\u50cf\/\u5bb9\u5668\u5171\u4eab\u76f8\u540c\u7684\u53ea\u8bfb\u5c42<\/td>\n<\/tr>\n<tr>\n<td>\u5c42\u53bb\u91cd<\/td>\n<td>\u76f8\u540c\u5185\u5bb9\u7684\u5c42\u53ea\u5b58\u50a8\u4e00\u4efd<\/td>\n<\/tr>\n<tr>\n<td>\u5feb\u901f\u521b\u5efa<\/td>\n<td>\u5feb\u901f\u521b\u5efa\u5bb9\u5668(\u4e0d\u9700\u8981\u590d\u5236\u6574\u4e2a\u955c\u50cf)<\/td>\n<\/tr>\n<tr>\n<td>\u5feb\u901f\u5220\u9664<\/td>\n<td>\u5feb\u901f\u5220\u9664\u5bb9\u5668\u548c\u955c\u50cf\u5c42<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>2.2 overlay2\u9a71\u52a8\u8be6\u89e3<\/h4>\n<h5>2.2.1 overlay2\u7b80\u4ecb<\/h5>\n<p>overlay2\u662fDocker\u5f53\u524d\u63a8\u8350\u7684\u5b58\u50a8\u9a71\u52a8,\u5b83\u662fOverlayFS\u7684\u7528\u6237\u7a7a\u95f4\u5b9e\u73b0\u3002OverlayFS\u662fLinux\u5185\u68383.18\u7248\u672c\u5f15\u5165\u7684\u8054\u5408\u6587\u4ef6\u7cfb\u7edf(Union Filesystem),overlay2\u662f\u5176\u7b2c\u4e8c\u4ee3\u5b9e\u73b0,\u652f\u6301\u591a\u5c42lowerdir\u53e0\u52a0(\u6700\u591a128\u5c42),\u6bd4\u7b2c\u4e00\u4ee3overlay\u9a71\u52a8\u66f4\u9ad8\u6548\u3002<\/p>\n<p>overlay2\u7684\u4f18\u52bf:<\/p>\n<ul>\n<li>\u5185\u6838\u539f\u751f\u652f\u6301,\u6027\u80fd\u4f18\u5f02<\/li>\n<li>\u652f\u6301\u591a\u5c42\u53e0\u52a0(\u6700\u591a128\u5c42),\u65e0\u9700\u4e3a\u6bcf\u5c42\u521b\u5efa\u5355\u72ec\u7684\u6302\u8f7d<\/li>\n<li>\u9875\u7f13\u5b58\u5171\u4eab,\u5185\u5b58\u5229\u7528\u7387\u9ad8<\/li>\n<li>\u7a33\u5b9a\u6027\u597d,\u9002\u5408\u751f\u4ea7\u73af\u5883<\/li>\n<li>Docker\u5b98\u65b9\u63a8\u8350<\/li>\n<\/ul>\n<p>\u7cfb\u7edf\u8981\u6c42:<\/p>\n<ul>\n<li>Linux\u5185\u68384.0\u6216\u66f4\u9ad8\u7248\u672c(\u63a8\u83504.0&#043;)<\/li>\n<li>\u6587\u4ef6\u7cfb\u7edf\u652f\u6301:ext4\u3001xfs(\u9700\u8981ftype&#061;1)\u3001btrfs\u7b49<\/li>\n<\/ul>\n<h5>2.2.2 overlay2\u5de5\u4f5c\u539f\u7406<\/h5>\n<p>overlay2\u5c06\u6587\u4ef6\u7cfb\u7edf\u5206\u4e3a\u4e09\u5c42:<\/p>\n<li>LowerDir(\u4e0b\u5c42):\u53ea\u8bfb\u7684\u955c\u50cf\u5c42,\u53ef\u4ee5\u6709\u591a\u4e2a(\u6700\u591a128\u5c42)\u3002\u8fd9\u4e9b\u5c42\u4ece\u4e0b\u5230\u4e0a\u53e0\u52a0,\u4e0a\u5c42\u8986\u76d6\u4e0b\u5c42\u3002<\/li>\n<li>UpperDir(\u4e0a\u5c42):\u5bb9\u5668\u7684\u53ef\u5199\u5c42,\u6240\u6709\u5199\u64cd\u4f5c\u90fd\u53d1\u751f\u5728\u8fd9\u91cc\u3002<\/li>\n<li>MergedDir(\u5408\u5e76\u5c42):\u5c06LowerDir\u548cUpperDir\u5408\u5e76\u540e\u7684\u7edf\u4e00\u89c6\u56fe,\u5bb9\u5668\u5185\u770b\u5230\u7684\u5c31\u662f\u8fd9\u4e2a\u89c6\u56fe\u3002<\/li>\n<p>\u6b64\u5916\u8fd8\u6709\u4e00\u4e2aWorkDir(\u5de5\u4f5c\u76ee\u5f55),\u7528\u4e8eoverlayfs\u5185\u90e8\u64cd\u4f5c(\u5982\u539f\u5b50\u6027\u64cd\u4f5c)\u3002<\/p>\n<p>                  \u5bb9\u5668\u89c6\u89d2(MergedDir)<br \/>\n                \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n                \u2502   \/usr\/share\/nginx\/   \u2502<br \/>\n                \u2502   \/etc\/nginx\/         \u2502<br \/>\n                \u2502   \/var\/log\/nginx\/     \u2502<br \/>\n                \u2502   &#8230;                 \u2502<br \/>\n                \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n                            \u2502<br \/>\n           \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n           \u2502                \u2502                \u2502<br \/>\n           \u25bc                \u25bc                \u25bc<br \/>\n    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n    \u2502  UpperDir   \u2502  \u2502  LowerDir   \u2502  \u2502  LowerDir   \u2502<br \/>\n    \u2502  (\u53ef\u5199\u5c42)    \u2502  \u2502  (\u955c\u50cf\u5c423)   \u2502  \u2502  (\u955c\u50cf\u5c422)   \u2502<br \/>\n    \u2502  \u5bb9\u5668\u4fee\u6539    \u2502  \u2502  COPY\u6307\u4ee4   \u2502  \u2502  RUN\u6307\u4ee4    \u2502<br \/>\n    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n                                              \u2502<br \/>\n                                              \u25bc<br \/>\n                                      \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n                                      \u2502  LowerDir   \u2502<br \/>\n                                      \u2502  (\u955c\u50cf\u5c421)   \u2502<br \/>\n                                      \u2502  FROM\u6307\u4ee4   \u2502<br \/>\n                                      \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<h5>2.2.3 overlay2\u7684\u6587\u4ef6\u64cd\u4f5c\u673a\u5236<\/h5>\n<p>\u8bfb\u53d6\u6587\u4ef6:<\/p>\n<li>\u5148\u5728UpperDir\u4e2d\u67e5\u627e\u6587\u4ef6<\/li>\n<li>\u5982\u679cUpperDir\u4e2d\u6ca1\u6709,\u5219\u4f9d\u6b21\u5728LowerDir\u4e2d\u4ece\u4e0a\u5230\u4e0b\u67e5\u627e<\/li>\n<li>\u8fd4\u56de\u7b2c\u4e00\u4e2a\u627e\u5230\u7684\u6587\u4ef6<\/li>\n<p>\u4fee\u6539\u6587\u4ef6(\u5199\u65f6\u590d\u5236):<\/p>\n<li>\u6587\u4ef6\u5728UpperDir\u4e2d:\u76f4\u63a5\u4fee\u6539<\/li>\n<li>\u6587\u4ef6\u5728LowerDir\u4e2d:\u5c06\u6587\u4ef6\u4eceLowerDir\u590d\u5236\u5230UpperDir,\u7136\u540e\u5728UpperDir\u4e2d\u4fee\u6539<\/li>\n<p>\u5220\u9664\u6587\u4ef6:<\/p>\n<li>\u5982\u679c\u6587\u4ef6\u5728UpperDir\u4e2d:\u76f4\u63a5\u5220\u9664<\/li>\n<li>\u5982\u679c\u6587\u4ef6\u5728LowerDir\u4e2d:\u5728UpperDir\u4e2d\u521b\u5efa\u4e00\u4e2awhiteout\u6587\u4ef6(\u5b57\u7b26\u8bbe\u5907\u6587\u4ef6,\u4e3b\u6b21\u8bbe\u5907\u53f7\u5747\u4e3a0),\u8868\u793a\u8be5\u6587\u4ef6\u5df2\u88ab\u5220\u9664<\/li>\n<p>\u521b\u5efa\u76ee\u5f55:<\/p>\n<li>\u5728UpperDir\u4e2d\u521b\u5efa\u76ee\u5f55<\/li>\n<li>\u5982\u679cLowerDir\u4e2d\u6709\u540c\u540d\u76ee\u5f55,\u9700\u8981\u5728UpperDir\u4e2d\u8bbe\u7f6eopaque\u5c5e\u6027,\u8868\u793a\u8be5\u76ee\u5f55\u4e0d\u4e0e\u4e0b\u5c42\u5408\u5e76<\/li>\n<h5>2.2.4 \u67e5\u770boverlay2\u7684\u5b9e\u9645\u7ed3\u6784<\/h5>\n<p><span class=\"token comment\"># \u542f\u52a8\u4e00\u4e2a\u5bb9\u5668<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> overlay-test nginx:latest<\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u5bb9\u5668\u7684\u5b58\u50a8\u9a71\u52a8\u4fe1\u606f<\/span><br \/>\n<span class=\"token function\">docker<\/span> inspect overlay-test <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{json .GraphDriver.Data}}&#039;<\/span> <span class=\"token operator\">|<\/span> python3 <span class=\"token parameter variable\">-m<\/span> json.tool<\/p>\n<p><span class=\"token comment\"># \u8f93\u51fa\u793a\u4f8b:<\/span><br \/>\n<span class=\"token comment\"># {<\/span><br \/>\n<span class=\"token comment\">#     &#034;LowerDir&#034;: &#034;\/var\/lib\/docker\/overlay2\/abc&#8230;\/diff:\/var\/lib\/docker\/overlay2\/def&#8230;\/diff:&#8230;&#034;,<\/span><br \/>\n<span class=\"token comment\">#     &#034;MergedDir&#034;: &#034;\/var\/lib\/docker\/overlay2\/xyz&#8230;\/merged&#034;,<\/span><br \/>\n<span class=\"token comment\">#     &#034;UpperDir&#034;: &#034;\/var\/lib\/docker\/overlay2\/xyz&#8230;\/diff&#034;,<\/span><br \/>\n<span class=\"token comment\">#     &#034;WorkDir&#034;: &#034;\/var\/lib\/docker\/overlay2\/xyz&#8230;\/work&#034;<\/span><br \/>\n<span class=\"token comment\"># }<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u5408\u5e76\u540e\u7684\u6587\u4ef6\u7cfb\u7edf\u89c6\u56fe<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">ls<\/span> <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> inspect overlay-test <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{.GraphDriver.Data.MergedDir}}&#039;<\/span><span class=\"token variable\">)<\/span><\/span>\/<\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u53ef\u5199\u5c42(\u521d\u59cb\u4e3a\u7a7a\u6216\u5f88\u5c0f)<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-la<\/span> <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> inspect overlay-test <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{.GraphDriver.Data.UpperDir}}&#039;<\/span><span class=\"token variable\">)<\/span><\/span>\/<\/p>\n<p><span class=\"token comment\"># \u5728\u5bb9\u5668\u4e2d\u4fee\u6539\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> overlay-test <span class=\"token function\">bash<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;echo &#034;test&#034; &gt; \/tmp\/overlay-test.txt&#039;<\/span><\/p>\n<p><span class=\"token comment\"># \u518d\u6b21\u67e5\u770b\u53ef\u5199\u5c42,\u53ef\u4ee5\u770b\u5230\u65b0\u521b\u5efa\u7684\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-la<\/span> <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> inspect overlay-test <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{.GraphDriver.Data.UpperDir}}&#039;<\/span><span class=\"token variable\">)<\/span><\/span>\/tmp\/<\/p>\n<p><span class=\"token comment\"># \u6e05\u7406<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-f<\/span> overlay-test<\/p>\n<h5>2.2.5 overlay2\u7684whiteout\u6587\u4ef6<\/h5>\n<p><span class=\"token comment\"># \u6f14\u793awhiteout\u673a\u5236<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> whiteout-test ubuntu:22.04 <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><\/p>\n<p><span class=\"token comment\"># \u83b7\u53d6UpperDir<\/span><br \/>\n<span class=\"token assign-left variable\">UPPER<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> inspect whiteout-test <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{.GraphDriver.Data.UpperDir}}&#039;<\/span><span class=\"token variable\">)<\/span><\/span><\/p>\n<p><span class=\"token comment\"># \u5220\u9664\u5bb9\u5668\u4e2d\u7684\u4e00\u4e2a\u6587\u4ef6(\u8be5\u6587\u4ef6\u6765\u81ea\u955c\u50cf\u5c42)<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> whiteout-test <span class=\"token function\">rm<\/span> \/etc\/hostname<\/p>\n<p><span class=\"token comment\"># \u67e5\u770bUpperDir\u4e2d\u7684whiteout\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-la<\/span> <span class=\"token variable\">$UPPER<\/span>\/etc\/<br \/>\n<span class=\"token comment\"># \u53ef\u4ee5\u770b\u5230\u4e00\u4e2a\u540d\u4e3a hostname \u7684\u5b57\u7b26\u8bbe\u5907\u6587\u4ef6(whiteout)<\/span><br \/>\n<span class=\"token comment\"># crwxr-xr-x 1 root root 0, 0 &#8230; hostname<\/span><\/p>\n<p><span class=\"token comment\"># \u6e05\u7406<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-f<\/span> whiteout-test<\/p>\n<h4>2.3 aufs\u9a71\u52a8\u8be6\u89e3<\/h4>\n<h5>2.3.1 aufs\u7b80\u4ecb<\/h5>\n<p>aufs(Advanced Multi-Layered Unification Filesystem)\u662fDocker\u65e9\u671f\u4f7f\u7528\u7684\u5b58\u50a8\u9a71\u52a8\u4e4b\u4e00,\u4e5f\u662f\u6700\u65e9\u88abDocker\u652f\u6301\u7684\u8054\u5408\u6587\u4ef6\u7cfb\u7edf\u3002aufs\u529f\u80fd\u5f3a\u5927,\u652f\u6301\u591a\u5c42\u53e0\u52a0,\u4f46\u7531\u4e8e\u672a\u80fd\u88abLinux\u5185\u6838\u4e3b\u7ebf\u63a5\u53d7,\u76ee\u524d\u4f7f\u7528\u8f83\u5c11\u3002<\/p>\n<p>aufs\u7684\u7279\u70b9:<\/p>\n<ul>\n<li>\u652f\u6301\u591a\u5c42\u53e0\u52a0(\u6700\u591a127\u5c42)<\/li>\n<li>\u529f\u80fd\u6210\u719f\u7a33\u5b9a<\/li>\n<li>\u672a\u88abLinux\u5185\u6838\u4e3b\u7ebf\u63a5\u53d7,\u9700\u8981\u989d\u5916\u5b89\u88c5<\/li>\n<li>\u5728Ubuntu\/Debian\u4e0a\u8f83\u5e38\u89c1,\u5728\u5176\u4ed6\u53d1\u884c\u7248\u4e0a\u53ef\u80fd\u4e0d\u53ef\u7528<\/li>\n<li>Docker\u5df2\u4e0d\u518d\u63a8\u8350\u4f7f\u7528aufs<\/li>\n<\/ul>\n<h5>2.3.2 aufs\u5de5\u4f5c\u539f\u7406<\/h5>\n<p>aufs\u7684\u5de5\u4f5c\u539f\u7406\u4e0eoverlay2\u7c7b\u4f3c,\u90fd\u662f\u901a\u8fc7\u8054\u5408\u6302\u8f7d\u5b9e\u73b0\u591a\u5c42\u53e0\u52a0:<\/p>\n<p>                 \u5bb9\u5668\u89c6\u89d2<br \/>\n               \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n               \u2502  \/usr\/   \u2502<br \/>\n               \u2502  \/etc\/   \u2502<br \/>\n               \u2502  \/var\/   \u2502<br \/>\n               \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n                    \u2502<br \/>\n    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n    \u2502               \u2502               \u2502<br \/>\n    \u25bc               \u25bc               \u25bc<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510      \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502 \u53ef\u5199\u5c42  \u2502    \u2502 \u53ea\u8bfb\u5c423 \u2502 &#8230;  \u2502 \u53ea\u8bfb\u5c421 \u2502<br \/>\n\u2502(container)\u2502  \u2502(image)  \u2502     \u2502(base)  \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518      \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<p>\u4e0eoverlay2\u4e0d\u540c\u7684\u662f:<\/p>\n<ul>\n<li>aufs\u4f7f\u7528aufs\u6302\u8f7d\u7c7b\u578b,\u800c\u975eoverlay<\/li>\n<li>aufs\u7684whiteout\u5b9e\u73b0\u65b9\u5f0f\u4e0d\u540c(\u4f7f\u7528.wh.\u524d\u7f00\u6587\u4ef6)<\/li>\n<li>aufs\u652f\u6301\u66f4\u591a\u7684\u5206\u652f\u7b56\u7565(round-robin\u7b49)<\/li>\n<\/ul>\n<h5>2.3.3 aufs\u7684\u76ee\u5f55\u7ed3\u6784<\/h5>\n<p><span class=\"token comment\"># aufs\u9a71\u52a8\u4e0b,\u5bb9\u5668\u7684\u5b58\u50a8\u76ee\u5f55<\/span><br \/>\n<span class=\"token comment\"># \/var\/lib\/docker\/aufs\/diff\/&lt;container_id&gt;\/  \u2192 \u53ef\u5199\u5c42<\/span><br \/>\n<span class=\"token comment\"># \/var\/lib\/docker\/aufs\/diff\/&lt;layer_id&gt;\/      \u2192 \u955c\u50cf\u5c42<\/span><br \/>\n<span class=\"token comment\"># \/var\/lib\/docker\/aufs\/mnt\/&lt;container_id&gt;\/   \u2192 \u5408\u5e76\u89c6\u56fe<\/span><br \/>\n<span class=\"token comment\"># \/var\/lib\/docker\/aufs\/layers\/&lt;container_id&gt; \u2192 \u5c42\u4f9d\u8d56\u5173\u7cfb<\/span><\/p>\n<h5>2.3.4 \u4e3a\u4ec0\u4e48aufs\u9010\u6e10\u88ab\u6dd8\u6c70<\/h5>\n<li>\u5185\u6838\u4e0d\u652f\u6301:aufs\u672a\u88abLinux\u5185\u6838\u4e3b\u7ebf\u63a5\u53d7,\u9700\u8981\u6253\u8865\u4e01<\/li>\n<li>\u7ef4\u62a4\u56f0\u96be:\u9700\u8981\u4e3a\u6bcf\u4e2a\u5185\u6838\u7248\u672c\u7ef4\u62a4\u8865\u4e01<\/li>\n<li>overlay2\u66f4\u4f18:overlay2\u88ab\u5185\u6838\u539f\u751f\u652f\u6301,\u6027\u80fd\u548c\u529f\u80fd\u90fd\u4f18\u4e8eaufs<\/li>\n<li>Docker\u5b98\u65b9\u5f03\u7528:\u4eceDocker 17.06\u5f00\u59cb,aufs\u4e0d\u518d\u88ab\u63a8\u8350<\/li>\n<h4>2.4 devicemapper\u9a71\u52a8\u8be6\u89e3<\/h4>\n<h5>2.4.1 devicemapper\u7b80\u4ecb<\/h5>\n<p>devicemapper\u662fLinux\u5185\u6838\u63d0\u4f9b\u7684\u8bbe\u5907\u6620\u5c04\u6846\u67b6,Docker\u5229\u7528\u5b83\u5b9e\u73b0\u4e86\u57fa\u4e8e\u5757\u8bbe\u5907\u7684\u5b58\u50a8\u9a71\u52a8\u3002\u4e0eoverlay2\u548caufs\u57fa\u4e8e\u6587\u4ef6\u7684\u8054\u5408\u6587\u4ef6\u7cfb\u7edf\u4e0d\u540c,devicemapper\u5de5\u4f5c\u5728\u5757\u8bbe\u5907\u5c42\u9762\u3002<\/p>\n<p>devicemapper\u7684\u7279\u70b9:<\/p>\n<ul>\n<li>\u57fa\u4e8e\u5757\u8bbe\u5907,\u4e0d\u4f9d\u8d56\u6587\u4ef6\u7cfb\u7edf<\/li>\n<li>\u4f7f\u7528\u7cbe\u7b80\u914d\u7f6e(Thin Provisioning)\u673a\u5236<\/li>\n<li>\u5728CentOS\/RHEL\u4e0a\u66fe\u662f\u9ed8\u8ba4\u9a71\u52a8<\/li>\n<li>\u6027\u80fd\u4e0d\u5982overlay2<\/li>\n<li>\u914d\u7f6e\u590d\u6742,\u5bb9\u6613\u51fa\u95ee\u9898<\/li>\n<li>Docker\u5df2\u4e0d\u518d\u63a8\u8350<\/li>\n<\/ul>\n<h5>2.4.2 devicemapper\u7684\u4e24\u79cd\u6a21\u5f0f<\/h5>\n<li>loop-lvm\u6a21\u5f0f(\u9ed8\u8ba4\u4f46\u4e0d\u63a8\u8350):\u4f7f\u7528\u56de\u73af\u8bbe\u5907(loop device)\u6a21\u62df\u5757\u8bbe\u5907,\u6027\u80fd\u5dee,\u4ec5\u7528\u4e8e\u6d4b\u8bd5\u3002<\/li>\n<li>direct-lvm\u6a21\u5f0f(\u751f\u4ea7\u63a8\u8350):\u76f4\u63a5\u4f7f\u7528\u7269\u7406\u5757\u8bbe\u5907,\u6027\u80fd\u597d,\u9002\u5408\u751f\u4ea7\u73af\u5883\u3002<\/li>\n<h5>2.4.3 devicemapper\u5de5\u4f5c\u539f\u7406<\/h5>\n<p>    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n    \u2502         ThinPool(\u7cbe\u7b80\u6c60)         \u2502<br \/>\n    \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u2502<br \/>\n    \u2502  \u2502 Data Device\u2502  \u2502Metadata Dev\u2502  \u2502<br \/>\n    \u2502  \u2502 (\u6570\u636e\u5757\u8bbe\u5907) \u2502  \u2502(\u5143\u6570\u636e\u8bbe\u5907) \u2502  \u2502<br \/>\n    \u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2502<br \/>\n    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n              \u2502<br \/>\n    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n    \u2502         \u2502         \u2502<br \/>\n    \u25bc         \u25bc         \u25bc<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502\u5bb9\u5668\u53ef\u5199\u5c42\u2502\u2502\u955c\u50cf\u5c423  \u2502\u2502\u955c\u50cf\u5c421  \u2502<br \/>\n\u2502(Thin Vol)\u2502\u2502(Snap)  \u2502\u2502(Base)  \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<p>devicemapper\u4f7f\u7528\u7cbe\u7b80\u914d\u7f6e(Thin Provisioning)\u6765\u7ba1\u7406\u5b58\u50a8\u7a7a\u95f4:<\/p>\n<ul>\n<li>\u57fa\u7840\u8bbe\u5907(Base Device):\u4e00\u4e2a\u7cbe\u7b80\u6c60(ThinPool),\u6240\u6709\u955c\u50cf\u5c42\u548c\u5bb9\u5668\u5c42\u90fd\u4ece\u4e2d\u5206\u914d\u7a7a\u95f4<\/li>\n<li>\u955c\u50cf\u5c42:\u4f5c\u4e3a\u7cbe\u7b80\u6c60\u4e2d\u7684\u57fa\u7840\u5377(Base Volume)<\/li>\n<li>\u5bb9\u5668\u53ef\u5199\u5c42:\u4f5c\u4e3a\u955c\u50cf\u5c42\u7684\u5feb\u7167(Snapshot)<\/li>\n<li>\u5199\u65f6\u590d\u5236:\u5728\u5757\u8bbe\u5907\u5c42\u9762\u5b9e\u73b0,\u4fee\u6539\u65f6\u590d\u5236\u5bf9\u5e94\u7684\u5757<\/li>\n<\/ul>\n<h5>2.4.4 \u914d\u7f6edirect-lvm\u6a21\u5f0f<\/h5>\n<p><span class=\"token comment\">\/\/ \/etc\/docker\/daemon.json<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token string-property property\">&#034;storage-driver&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;devicemapper&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token string-property property\">&#034;storage-opts&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n    <span class=\"token string\">&#034;dm.directlvm_device&#061;\/dev\/sdb&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;dm.thinp_percent&#061;95&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;dm.thinp_metapercent&#061;1&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;dm.thinp_autoextend_threshold&#061;80&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;dm.thinp_autoextend_percent&#061;20&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;dm.directlvm_device_force&#061;false&#034;<\/span><br \/>\n  <span class=\"token punctuation\">]<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\"># \u914d\u7f6e\u5b8c\u6210\u540e\u91cd\u542fDocker<\/span><br \/>\n<span class=\"token function\">sudo<\/span> systemctl restart <span class=\"token function\">docker<\/span><\/p>\n<p><span class=\"token comment\"># \u9a8c\u8bc1\u914d\u7f6e<\/span><br \/>\n<span class=\"token function\">docker<\/span> info <span class=\"token operator\">|<\/span> <span class=\"token function\">grep<\/span> <span class=\"token parameter variable\">-A<\/span> <span class=\"token number\">10<\/span> <span class=\"token string\">&#034;Storage Driver&#034;<\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa\u5e94\u663e\u793a:<\/span><br \/>\n<span class=\"token comment\">#  Storage Driver: devicemapper<\/span><br \/>\n<span class=\"token comment\">#  Pool Name: docker-thinpool<\/span><br \/>\n<span class=\"token comment\">#  Pool Blocksize: 65.54kB<\/span><br \/>\n<span class=\"token comment\">#  &#8230;<\/span><\/p>\n<h4>2.5 btrfs\u9a71\u52a8\u8be6\u89e3<\/h4>\n<h5>2.5.1 btrfs\u7b80\u4ecb<\/h5>\n<p>btrfs(B-tree file system,\u901a\u5e38\u53d1\u97f3\u4e3a&#034;Butter FS&#034;\u6216&#034;B-tree FS&#034;)\u662f\u73b0\u4ee3\u7684\u5199\u65f6\u590d\u5236\u6587\u4ef6\u7cfb\u7edf,Docker\u53ef\u4ee5\u5229\u7528btrfs\u7684\u5b50\u5377(Subvolume)\u548c\u5feb\u7167(Snapshot)\u529f\u80fd\u6765\u5b9e\u73b0\u5b58\u50a8\u9a71\u52a8\u3002<\/p>\n<p>btrfs\u7684\u7279\u70b9:<\/p>\n<ul>\n<li>\u57fa\u4e8e\u5b50\u5377\u548c\u5feb\u7167,\u539f\u751f\u652f\u6301\u5199\u65f6\u590d\u5236<\/li>\n<li>\u652f\u6301\u900f\u660e\u538b\u7f29,\u8282\u7701\u5b58\u50a8\u7a7a\u95f4<\/li>\n<li>\u652f\u6301\u5b50\u5377\u914d\u989d,\u53ef\u4ee5\u9650\u5236\u5bb9\u5668\u5b58\u50a8\u5927\u5c0f<\/li>\n<li>\u9002\u5408\u5927\u91cf\u5c0f\u6587\u4ef6\u573a\u666f<\/li>\n<li>\u7a33\u5b9a\u6027\u66fe\u53d7\u8d28\u7591,\u4f46\u5728\u4e0d\u65ad\u6539\u5584<\/li>\n<li>\u9700\u8981\u5c06\/var\/lib\/docker\u683c\u5f0f\u5316\u4e3abtrfs\u6587\u4ef6\u7cfb\u7edf<\/li>\n<\/ul>\n<h5>2.5.2 btrfs\u5de5\u4f5c\u539f\u7406<\/h5>\n<p>    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n    \u2502         btrfs \u6587\u4ef6\u7cfb\u7edf            \u2502<br \/>\n    \u2502                                 \u2502<br \/>\n    \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u2502<br \/>\n    \u2502  \u2502    \/var\/lib\/docker\/btrfs\/  \u2502  \u2502<br \/>\n    \u2502  \u2502                           \u2502  \u2502<br \/>\n    \u2502  \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u2502  \u2502<br \/>\n    \u2502  \u2502  \u2502 \u5b50\u5377:\u5bb9\u5668 \u2502 \u2502 \u5b50\u5377:\u955c\u50cf \u2502  \u2502  \u2502<br \/>\n    \u2502  \u2502  \u2502 (\u53ef\u5199)   \u2502 \u2502 (\u53ea\u8bfb)   \u2502  \u2502  \u2502<br \/>\n    \u2502  \u2502  \u2502 (\u5feb\u7167)   \u2502 \u2502          \u2502  \u2502  \u2502<br \/>\n    \u2502  \u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2502  \u2502<br \/>\n    \u2502  \u2502                           \u2502  \u2502<br \/>\n    \u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2502<br \/>\n    \u2502                                 \u2502<br \/>\n    \u2502  \u900f\u660e\u538b\u7f29 \u2502 \u5feb\u7167 \u2502 \u914d\u989d \u2502 \u53bb\u91cd    \u2502<br \/>\n    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<ul>\n<li>\u955c\u50cf\u5c42:btrfs\u5b50\u5377(\u53ea\u8bfb)<\/li>\n<li>\u5bb9\u5668\u53ef\u5199\u5c42:\u955c\u50cf\u5c42\u5b50\u5377\u7684\u5feb\u7167(\u53ef\u8bfb\u5199)<\/li>\n<li>\u5199\u65f6\u590d\u5236:btrfs\u539f\u751f\u652f\u6301,\u5728\u6587\u4ef6\u7cfb\u7edf\u5c42\u9762\u5b9e\u73b0<\/li>\n<\/ul>\n<h5>2.5.3 \u914d\u7f6ebtrfs\u9a71\u52a8<\/h5>\n<p><span class=\"token comment\"># 1. \u683c\u5f0f\u5316\u8bbe\u5907\u4e3abtrfs<\/span><br \/>\n<span class=\"token function\">sudo<\/span> mkfs.btrfs \/dev\/sdb<\/p>\n<p><span class=\"token comment\"># 2. \u6302\u8f7d\u5230\/var\/lib\/docker<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> \/var\/lib\/docker<br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">mount<\/span> \/dev\/sdb \/var\/lib\/docker<\/p>\n<p><span class=\"token comment\"># 3. \u914d\u7f6eDocker\u4f7f\u7528btrfs<\/span><br \/>\n<span class=\"token comment\"># \/etc\/docker\/daemon.json<\/span><br \/>\n<span class=\"token comment\"># {<\/span><br \/>\n<span class=\"token comment\">#   &#034;storage-driver&#034;: &#034;btrfs&#034;<\/span><br \/>\n<span class=\"token comment\"># }<\/span><\/p>\n<p><span class=\"token comment\"># 4. \u91cd\u542fDocker<\/span><br \/>\n<span class=\"token function\">sudo<\/span> systemctl restart <span class=\"token function\">docker<\/span><\/p>\n<p><span class=\"token comment\"># 5. \u9a8c\u8bc1<\/span><br \/>\n<span class=\"token function\">docker<\/span> info <span class=\"token operator\">|<\/span> <span class=\"token function\">grep<\/span> <span class=\"token string\">&#034;Storage Driver&#034;<\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa: Storage Driver: btrfs<\/span><\/p>\n<h5>2.5.4 btrfs\u7684\u914d\u989d\u7ba1\u7406<\/h5>\n<p><span class=\"token comment\"># \u542f\u7528\u914d\u989d<\/span><br \/>\n<span class=\"token function\">sudo<\/span> btrfs <span class=\"token function\">quota<\/span> <span class=\"token builtin class-name\">enable<\/span> \/var\/lib\/docker<\/p>\n<p><span class=\"token comment\"># \u8bbe\u7f6e\u5b50\u5377\u914d\u989d(\u9650\u5236\u4e3a10GB)<\/span><br \/>\n<span class=\"token function\">sudo<\/span> btrfs qgroup limit 10G \/var\/lib\/docker\/btrfs\/subvolumes\/<span class=\"token operator\">&lt;<\/span>container_id<span class=\"token operator\">&gt;<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u914d\u989d\u4f7f\u7528\u60c5\u51b5<\/span><br \/>\n<span class=\"token function\">sudo<\/span> btrfs qgroup show \/var\/lib\/docker<\/p>\n<h4>2.6 zfs\u9a71\u52a8\u8be6\u89e3<\/h4>\n<h5>2.6.1 zfs\u7b80\u4ecb<\/h5>\n<p>ZFS(Zettabyte File System)\u662f\u7531Sun Microsystems\u5f00\u53d1\u7684\u9ad8\u7ea7\u6587\u4ef6\u7cfb\u7edf,\u4ee5\u5176\u6570\u636e\u5b8c\u6574\u6027\u3001\u5feb\u7167\u529f\u80fd\u548c\u6d77\u91cf\u5b58\u50a8\u652f\u6301\u800c\u95fb\u540d\u3002Docker\u53ef\u4ee5\u5229\u7528ZFS\u7684\u6570\u636e\u96c6(Dataset)\u548c\u5feb\u7167(Snapshot)\u529f\u80fd\u5b9e\u73b0\u5b58\u50a8\u9a71\u52a8\u3002<\/p>\n<p>zfs\u7684\u7279\u70b9:<\/p>\n<ul>\n<li>\u9ad8\u7ea7\u6587\u4ef6\u7cfb\u7edf,\u652f\u6301\u6570\u636e\u5b8c\u6574\u6027\u6821\u9a8c<\/li>\n<li>\u539f\u751f\u5feb\u7167\u548c\u514b\u9686\u529f\u80fd<\/li>\n<li>\u5185\u7f6e\u538b\u7f29\u548c\u53bb\u91cd<\/li>\n<li>ARC(Adaptive Replacement Cache)\u7f13\u5b58,\u6027\u80fd\u4f18\u5f02<\/li>\n<li>\u5185\u5b58\u5360\u7528\u8f83\u9ad8<\/li>\n<li>\u8bb8\u53ef\u8bc1(CDDL)\u4e0eLinux\u5185\u6838(GPL)\u517c\u5bb9\u6027\u5b58\u5728\u4e89\u8bae<\/li>\n<\/ul>\n<h5>2.6.2 zfs\u5de5\u4f5c\u539f\u7406<\/h5>\n<p>    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n    \u2502         zfs \u5b58\u50a8\u6c60 (zpool)        \u2502<br \/>\n    \u2502                                 \u2502<br \/>\n    \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u2502<br \/>\n    \u2502  \u2502   docker\/zfs (\u6587\u4ef6\u7cfb\u7edf)     \u2502  \u2502<br \/>\n    \u2502  \u2502                           \u2502  \u2502<br \/>\n    \u2502  \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u2502  \u2502<br \/>\n    \u2502  \u2502  \u2502\u6570\u636e\u96c6:\u5bb9\u5668\u2502 \u2502\u6570\u636e\u96c6:\u955c\u50cf\u2502  \u2502  \u2502<br \/>\n    \u2502  \u2502  \u2502 (\u5feb\u7167)   \u2502 \u2502 (\u57fa\u7840)   \u2502  \u2502  \u2502<br \/>\n    \u2502  \u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2502  \u2502<br \/>\n    \u2502  \u2502                           \u2502  \u2502<br \/>\n    \u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2502<br \/>\n    \u2502                                 \u2502<br \/>\n    \u2502  \u6570\u636e\u5b8c\u6574\u6027 \u2502 \u5feb\u7167 \u2502 \u538b\u7f29 \u2502 \u7f13\u5b58   \u2502<br \/>\n    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<ul>\n<li>\u955c\u50cf\u5c42:ZFS\u6570\u636e\u96c6(\u53ea\u8bfb\u5feb\u7167)<\/li>\n<li>\u5bb9\u5668\u53ef\u5199\u5c42:\u955c\u50cf\u5c42\u7684\u514b\u9686(Clone)<\/li>\n<li>\u5199\u65f6\u590d\u5236:ZFS\u539f\u751f\u652f\u6301<\/li>\n<\/ul>\n<h5>2.6.3 \u914d\u7f6ezfs\u9a71\u52a8<\/h5>\n<p><span class=\"token comment\"># 1. \u5b89\u88c5ZFS<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">apt-get<\/span> <span class=\"token function\">install<\/span> zfsutils-linux  <span class=\"token comment\"># Ubuntu\/Debian<\/span><br \/>\n<span class=\"token comment\"># \u6216<\/span><br \/>\n<span class=\"token function\">sudo<\/span> yum <span class=\"token function\">install<\/span> zfs  <span class=\"token comment\"># CentOS\/RHEL<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u521b\u5efazpool<\/span><br \/>\n<span class=\"token function\">sudo<\/span> zpool create <span class=\"token parameter variable\">-f<\/span> zpool-docker \/dev\/sdb<\/p>\n<p><span class=\"token comment\"># 3. \u521b\u5efadocker\u6570\u636e\u96c6<\/span><br \/>\n<span class=\"token function\">sudo<\/span> zfs create zpool-docker\/docker<\/p>\n<p><span class=\"token comment\"># 4. \u8bbe\u7f6e\/var\/lib\/docker\u6302\u8f7d\u70b9<\/span><br \/>\n<span class=\"token function\">sudo<\/span> zfs <span class=\"token builtin class-name\">set<\/span> <span class=\"token assign-left variable\">mountpoint<\/span><span class=\"token operator\">&#061;<\/span>\/var\/lib\/docker zpool-docker\/docker<\/p>\n<p><span class=\"token comment\"># 5. \u914d\u7f6eDocker\u4f7f\u7528zfs<\/span><br \/>\n<span class=\"token comment\"># \/etc\/docker\/daemon.json<\/span><br \/>\n<span class=\"token comment\"># {<\/span><br \/>\n<span class=\"token comment\">#   &#034;storage-driver&#034;: &#034;zfs&#034;<\/span><br \/>\n<span class=\"token comment\"># }<\/span><\/p>\n<p><span class=\"token comment\"># 6. \u91cd\u542fDocker<\/span><br \/>\n<span class=\"token function\">sudo<\/span> systemctl restart <span class=\"token function\">docker<\/span><\/p>\n<p><span class=\"token comment\"># 7. \u9a8c\u8bc1<\/span><br \/>\n<span class=\"token function\">docker<\/span> info <span class=\"token operator\">|<\/span> <span class=\"token function\">grep<\/span> <span class=\"token string\">&#034;Storage Driver&#034;<\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa: Storage Driver: zfs<\/span><\/p>\n<h5>2.6.4 zfs\u914d\u989d\u548c\u538b\u7f29<\/h5>\n<p><span class=\"token comment\"># \u8bbe\u7f6e\u5bb9\u5668\u6570\u636e\u96c6\u914d\u989d<\/span><br \/>\n<span class=\"token function\">sudo<\/span> zfs <span class=\"token builtin class-name\">set<\/span> <span class=\"token assign-left variable\">quota<\/span><span class=\"token operator\">&#061;<\/span>10G zpool-docker\/docker\/<span class=\"token operator\">&lt;<\/span>container_id<span class=\"token operator\">&gt;<\/span><\/p>\n<p><span class=\"token comment\"># \u542f\u7528\u538b\u7f29<\/span><br \/>\n<span class=\"token function\">sudo<\/span> zfs <span class=\"token builtin class-name\">set<\/span> <span class=\"token assign-left variable\">compression<\/span><span class=\"token operator\">&#061;<\/span>lz4 zpool-docker\/docker<\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u538b\u7f29\u6548\u679c<\/span><br \/>\n<span class=\"token function\">sudo<\/span> zfs get compressratio zpool-docker\/docker<\/p>\n<h4>2.7 vfs\u9a71\u52a8\u8be6\u89e3<\/h4>\n<h5>2.7.1 vfs\u7b80\u4ecb<\/h5>\n<p>vfs(Virtual File System)\u662fDocker\u6700\u7b80\u5355\u7684\u5b58\u50a8\u9a71\u52a8,\u5b83\u4e0d\u4f7f\u7528\u4efb\u4f55\u8054\u5408\u6587\u4ef6\u7cfb\u7edf\u6280\u672f,\u800c\u662f\u901a\u8fc7\u7b80\u5355\u7684\u6587\u4ef6\u590d\u5236\u6765\u5b9e\u73b0\u5c42\u7684\u53e0\u52a0\u3002<\/p>\n<p>vfs\u7684\u7279\u70b9:<\/p>\n<ul>\n<li>\u5b9e\u73b0\u7b80\u5355,\u517c\u5bb9\u6027\u6700\u597d<\/li>\n<li>\u6ca1\u6709\u4efb\u4f55\u5199\u65f6\u590d\u5236\u4f18\u5316,\u6bcf\u4e2a\u5c42\u90fd\u662f\u5b8c\u6574\u7684\u6587\u4ef6\u590d\u5236<\/li>\n<li>\u78c1\u76d8\u7a7a\u95f4\u5360\u7528\u6781\u5927<\/li>\n<li>\u6027\u80fd\u6700\u5dee<\/li>\n<li>\u4e0d\u63a8\u8350\u5728\u751f\u4ea7\u73af\u5883\u4f7f\u7528<\/li>\n<li>\u9002\u5408\u6d4b\u8bd5\u73af\u5883\u6216\u4e0d\u652f\u6301\u5176\u4ed6\u9a71\u52a8\u7684\u7cfb\u7edf<\/li>\n<\/ul>\n<h5>2.7.2 vfs\u5de5\u4f5c\u539f\u7406<\/h5>\n<p>    \u5bb9\u5668\u89c6\u89d2<br \/>\n   \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n   \u2502  \/usr\/   \u2502<br \/>\n   \u2502  \/etc\/   \u2502<br \/>\n   \u2502  \/var\/   \u2502<br \/>\n   \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n        \u2502<br \/>\n   \u250c\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2510<br \/>\n   \u2502 \u53ef\u5199\u5c42   \u2502 \u2190 \u5b8c\u6574\u590d\u5236\u955c\u50cf\u5c42\u7684\u6240\u6709\u6587\u4ef6<br \/>\n   \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518<br \/>\n   \u250c\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2510<br \/>\n   \u2502 \u955c\u50cf\u5c423  \u2502 \u2190 \u5b8c\u6574\u590d\u5236\u524d\u4e00\u5c42\u7684\u6240\u6709\u6587\u4ef6<br \/>\n   \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518<br \/>\n   \u250c\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2510<br \/>\n   \u2502 \u955c\u50cf\u5c422  \u2502 \u2190 \u5b8c\u6574\u590d\u5236\u524d\u4e00\u5c42\u7684\u6240\u6709\u6587\u4ef6<br \/>\n   \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518<br \/>\n   \u250c\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2510<br \/>\n   \u2502 \u955c\u50cf\u5c421  \u2502 \u2190 \u57fa\u7840\u5c42<br \/>\n   \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<p>\u5728vfs\u9a71\u52a8\u4e2d,\u6bcf\u4e00\u5c42\u90fd\u662f\u5b8c\u6574\u590d\u5236\u524d\u4e00\u5c42\u7684\u6240\u6709\u6587\u4ef6,\u7136\u540e\u5728\u5176\u57fa\u7840\u4e0a\u8fdb\u884c\u4fee\u6539\u3002\u8fd9\u610f\u5473\u7740:<\/p>\n<ul>\n<li>\u521b\u5efa\u5bb9\u5668\u65f6\u4f1a\u590d\u5236\u6574\u4e2a\u955c\u50cf\u7684\u6240\u6709\u6587\u4ef6<\/li>\n<li>\u78c1\u76d8\u7a7a\u95f4\u5360\u7528\u662f\u53e0\u52a0\u7684(\u4e0d\u662f\u5171\u4eab\u7684)<\/li>\n<li>\u6ca1\u6709\u5c42\u5171\u4eab\u673a\u5236<\/li>\n<\/ul>\n<h5>2.7.3 \u4f55\u65f6\u4f7f\u7528vfs<\/h5>\n<p><span class=\"token comment\"># vfs\u9a71\u52a8\u901a\u5e38\u5728\u4e0d\u652f\u6301\u5176\u4ed6\u9a71\u52a8\u7684\u73af\u5883\u4e2d\u4f7f\u7528<\/span><br \/>\n<span class=\"token comment\"># \u4f8b\u5982\u67d0\u4e9bNAS\u73af\u5883\u6216\u53d7\u9650\u7684\u5bb9\u5668\u8fd0\u884c\u65f6<\/span><\/p>\n<p><span class=\"token comment\"># \u914d\u7f6evfs\u9a71\u52a8<\/span><br \/>\n<span class=\"token comment\"># \/etc\/docker\/daemon.json<\/span><br \/>\n<span class=\"token comment\"># {<\/span><br \/>\n<span class=\"token comment\">#   &#034;storage-driver&#034;: &#034;vfs&#034;<\/span><br \/>\n<span class=\"token comment\"># }<\/span><\/p>\n<p><span class=\"token comment\"># \u91cd\u542fDocker<\/span><br \/>\n<span class=\"token function\">sudo<\/span> systemctl restart <span class=\"token function\">docker<\/span><\/p>\n<h4>2.8 \u5b58\u50a8\u9a71\u52a8\u5bf9\u6bd4\u8868<\/h4>\n<table>\n<tr>\u7279\u6027overlay2aufsdevicemapperbtrfszfsvfs<\/tr>\n<tbody>\n<tr>\n<td>\u63a8\u8350\u5ea6<\/td>\n<td>\u63a8\u8350(\u9996\u9009)<\/td>\n<td>\u4e0d\u63a8\u8350<\/td>\n<td>\u4e0d\u63a8\u8350<\/td>\n<td>\u53ef\u9009<\/td>\n<td>\u53ef\u9009<\/td>\n<td>\u4ec5\u6d4b\u8bd5<\/td>\n<\/tr>\n<tr>\n<td>\u5e95\u5c42\u6280\u672f<\/td>\n<td>OverlayFS<\/td>\n<td>\u8054\u5408\u6587\u4ef6\u7cfb\u7edf<\/td>\n<td>\u5757\u8bbe\u5907\u6620\u5c04<\/td>\n<td>Btrfs\u6587\u4ef6\u7cfb\u7edf<\/td>\n<td>ZFS\u6587\u4ef6\u7cfb\u7edf<\/td>\n<td>\u6587\u4ef6\u590d\u5236<\/td>\n<\/tr>\n<tr>\n<td>\u5185\u6838\u8981\u6c42<\/td>\n<td>4.0&#043;<\/td>\n<td>\u9700\u8865\u4e01<\/td>\n<td>2.6.9&#043;<\/td>\n<td>3.16&#043;<\/td>\n<td>\u9700\u5b89\u88c5<\/td>\n<td>\u65e0\u7279\u6b8a\u8981\u6c42<\/td>\n<\/tr>\n<tr>\n<td>\u6700\u5927\u5c42\u6570<\/td>\n<td>128<\/td>\n<td>127<\/td>\n<td>127<\/td>\n<td>\u65e0\u9650\u5236<\/td>\n<td>\u65e0\u9650\u5236<\/td>\n<td>\u65e0\u9650\u5236<\/td>\n<\/tr>\n<tr>\n<td>\u6027\u80fd<\/td>\n<td>\u4f18\u79c0<\/td>\n<td>\u826f\u597d<\/td>\n<td>\u4e00\u822c<\/td>\n<td>\u826f\u597d<\/td>\n<td>\u826f\u597d<\/td>\n<td>\u5dee<\/td>\n<\/tr>\n<tr>\n<td>\u5199\u65f6\u590d\u5236<\/td>\n<td>\u6587\u4ef6\u7ea7<\/td>\n<td>\u6587\u4ef6\u7ea7<\/td>\n<td>\u5757\u7ea7<\/td>\n<td>\u6587\u4ef6\u7ea7<\/td>\n<td>\u5757\u7ea7<\/td>\n<td>\u65e0(\u590d\u5236)<\/td>\n<\/tr>\n<tr>\n<td>\u9875\u7f13\u5b58\u5171\u4eab<\/td>\n<td>\u662f<\/td>\n<td>\u662f<\/td>\n<td>\u5426<\/td>\n<td>\u662f<\/td>\n<td>\u662f<\/td>\n<td>\u5426<\/td>\n<\/tr>\n<tr>\n<td>\u78c1\u76d8\u7a7a\u95f4\u6548\u7387<\/td>\n<td>\u9ad8<\/td>\n<td>\u9ad8<\/td>\n<td>\u4e2d<\/td>\n<td>\u9ad8<\/td>\n<td>\u9ad8<\/td>\n<td>\u4f4e<\/td>\n<\/tr>\n<tr>\n<td>\u5185\u5b58\u5360\u7528<\/td>\n<td>\u4f4e<\/td>\n<td>\u4f4e<\/td>\n<td>\u4e2d<\/td>\n<td>\u4e2d<\/td>\n<td>\u9ad8<\/td>\n<td>\u4f4e<\/td>\n<\/tr>\n<tr>\n<td>\u914d\u989d\u652f\u6301<\/td>\n<td>\u5426<\/td>\n<td>\u5426<\/td>\n<td>\u662f<\/td>\n<td>\u662f<\/td>\n<td>\u662f<\/td>\n<td>\u5426<\/td>\n<\/tr>\n<tr>\n<td>\u538b\u7f29\u652f\u6301<\/td>\n<td>\u5426<\/td>\n<td>\u5426<\/td>\n<td>\u5426<\/td>\n<td>\u662f<\/td>\n<td>\u662f<\/td>\n<td>\u5426<\/td>\n<\/tr>\n<tr>\n<td>\u7a33\u5b9a\u6027<\/td>\n<td>\u9ad8<\/td>\n<td>\u9ad8<\/td>\n<td>\u4e2d<\/td>\n<td>\u4e2d<\/td>\n<td>\u9ad8<\/td>\n<td>\u9ad8<\/td>\n<\/tr>\n<tr>\n<td>\u9002\u7528\u573a\u666f<\/td>\n<td>\u901a\u7528\u751f\u4ea7<\/td>\n<td>\u65e7\u7cfb\u7edf<\/td>\n<td>\u65e7RHEL\u7cfb\u7edf<\/td>\n<td>\u9700\u8981\u914d\u989d<\/td>\n<td>\u9700\u8981\u6570\u636e\u5b8c\u6574\u6027<\/td>\n<td>\u6d4b\u8bd5\/\u517c\u5bb9<\/td>\n<\/tr>\n<tr>\n<td>\u8de8\u5e73\u53f0<\/td>\n<td>Linux<\/td>\n<td>Linux<\/td>\n<td>Linux<\/td>\n<td>Linux<\/td>\n<td>Linux<\/td>\n<td>Linux<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>2.9 \u5982\u4f55\u9009\u62e9\u548c\u5207\u6362\u5b58\u50a8\u9a71\u52a8<\/h4>\n<h5>2.9.1 \u9009\u62e9\u5b58\u50a8\u9a71\u52a8\u7684\u539f\u5219<\/h5>\n<li>\u4f18\u5148\u9009\u62e9overlay2:\u8fd9\u662fDocker\u5b98\u65b9\u63a8\u8350\u7684\u9996\u9009\u9a71\u52a8,\u5728\u5927\u591a\u6570Linux\u53d1\u884c\u7248\u4e0a\u90fd\u53ef\u7528,\u6027\u80fd\u548c\u7a33\u5b9a\u6027\u90fd\u5f88\u597d\u3002<\/li>\n<li>\u6839\u636e\u6587\u4ef6\u7cfb\u7edf\u9009\u62e9:\n<ul>\n<li>ext4\/xfs:\u4f7f\u7528overlay2<\/li>\n<li>btrfs:\u53ef\u4ee5\u4f7f\u7528overlay2\u6216btrfs\u9a71\u52a8<\/li>\n<li>zfs:\u53ef\u4ee5\u4f7f\u7528overlay2\u6216zfs\u9a71\u52a8(\u4f46\u4e0d\u8981\u5728\u540c\u4e00zfs\u6587\u4ef6\u7cfb\u7edf\u4e0a\u4f7f\u7528overlay2)<\/li>\n<\/ul>\n<\/li>\n<li>\u907f\u514d\u4f7f\u7528\u5df2\u5f03\u7528\u7684\u9a71\u52a8:aufs\u548cdevicemapper(loop-lvm\u6a21\u5f0f)\u5df2\u4e0d\u63a8\u8350\u4f7f\u7528\u3002<\/li>\n<li>\u751f\u4ea7\u73af\u5883\u907f\u514dvfs:vfs\u6027\u80fd\u592a\u5dee,\u4ec5\u7528\u4e8e\u6d4b\u8bd5\u3002<\/li>\n<h5>2.9.2 \u67e5\u770b\u5f53\u524d\u5b58\u50a8\u9a71\u52a8<\/h5>\n<p><span class=\"token comment\"># \u67e5\u770bDocker\u4fe1\u606f<\/span><br \/>\n<span class=\"token function\">docker<\/span> info <span class=\"token operator\">|<\/span> <span class=\"token function\">grep<\/span> <span class=\"token parameter variable\">-i<\/span> <span class=\"token string\">&#034;storage&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u8f93\u51fa\u793a\u4f8b:<\/span><br \/>\n<span class=\"token comment\">#  Storage Driver: overlay2<\/span><br \/>\n<span class=\"token comment\">#   Backing Filesystem: extfs<\/span><br \/>\n<span class=\"token comment\">#   Supports d_type: true<\/span><br \/>\n<span class=\"token comment\">#   Native Overlay Diff: true<\/span><br \/>\n<span class=\"token comment\">#   userxattr: false<\/span><\/p>\n<h5>2.9.3 \u5207\u6362\u5b58\u50a8\u9a71\u52a8<\/h5>\n<p>\u91cd\u8981\u8b66\u544a:\u5207\u6362\u5b58\u50a8\u9a71\u52a8\u4f1a\u5bfc\u81f4\u5df2\u6709\u7684\u955c\u50cf\u548c\u5bb9\u5668\u65e0\u6cd5\u4f7f\u7528!\u5207\u6362\u524d\u8bf7\u5907\u4efd\u6240\u6709\u91cd\u8981\u6570\u636e!<\/p>\n<p><span class=\"token comment\"># 1. \u505c\u6b62Docker\u670d\u52a1<\/span><br \/>\n<span class=\"token function\">sudo<\/span> systemctl stop <span class=\"token function\">docker<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u5907\u4efd\u73b0\u6709\u6570\u636e(\u53ef\u9009\u4f46\u5f3a\u70c8\u63a8\u8350)<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">cp<\/span> <span class=\"token parameter variable\">-au<\/span> \/var\/lib\/docker \/var\/lib\/docker.backup<\/p>\n<p><span class=\"token comment\"># 3. \u7f16\u8f91Docker\u914d\u7f6e<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">tee<\/span> \/etc\/docker\/daemon.json <span class=\"token operator\">&lt;&lt;<\/span><span class=\"token string\">&#039;EOF&#039;<br \/>\n{<br \/>\n  &#034;storage-driver&#034;: &#034;overlay2&#034;<br \/>\n}<br \/>\nEOF<\/span><\/p>\n<p><span class=\"token comment\"># 4. \u5220\u9664\u65e7\u6570\u636e(\u8c28\u614e\u64cd\u4f5c!)<\/span><br \/>\n<span class=\"token comment\"># \u5982\u679c\u662f\u5168\u65b0\u5207\u6362,\u53ef\u4ee5\u5220\u9664\u65e7\u6570\u636e<\/span><br \/>\n<span class=\"token comment\"># sudo rm -rf \/var\/lib\/docker<\/span><\/p>\n<p><span class=\"token comment\"># 5. \u542f\u52a8Docker\u670d\u52a1<\/span><br \/>\n<span class=\"token function\">sudo<\/span> systemctl start <span class=\"token function\">docker<\/span><\/p>\n<p><span class=\"token comment\"># 6. \u9a8c\u8bc1\u65b0\u7684\u5b58\u50a8\u9a71\u52a8<\/span><br \/>\n<span class=\"token function\">docker<\/span> info <span class=\"token operator\">|<\/span> <span class=\"token function\">grep<\/span> <span class=\"token string\">&#034;Storage Driver&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 7. \u91cd\u65b0\u62c9\u53d6\u955c\u50cf(\u56e0\u4e3a\u65e7\u955c\u50cf\u5728\u65b0\u9a71\u52a8\u4e0b\u4e0d\u53ef\u7528)<\/span><br \/>\n<span class=\"token function\">docker<\/span> pull nginx:latest<\/p>\n<h5>2.9.4 \u5404\u53d1\u884c\u7248\u9ed8\u8ba4\u5b58\u50a8\u9a71\u52a8<\/h5>\n<table>\n<tr>\u53d1\u884c\u7248\u9ed8\u8ba4\u5b58\u50a8\u9a71\u52a8\u63a8\u8350\u5b58\u50a8\u9a71\u52a8<\/tr>\n<tbody>\n<tr>\n<td>Ubuntu 20.04&#043;<\/td>\n<td>overlay2<\/td>\n<td>overlay2<\/td>\n<\/tr>\n<tr>\n<td>Debian 10&#043;<\/td>\n<td>overlay2<\/td>\n<td>overlay2<\/td>\n<\/tr>\n<tr>\n<td>CentOS 8&#043;<\/td>\n<td>overlay2<\/td>\n<td>overlay2<\/td>\n<\/tr>\n<tr>\n<td>RHEL 8&#043;<\/td>\n<td>overlay2<\/td>\n<td>overlay2<\/td>\n<\/tr>\n<tr>\n<td>Alpine<\/td>\n<td>overlay2<\/td>\n<td>overlay2<\/td>\n<\/tr>\n<tr>\n<td>SUSE<\/td>\n<td>btrfs(\u5982\u5728btrfs\u4e0a)<\/td>\n<td>overlay2<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>2.10 \u5b58\u50a8\u9a71\u52a8\u914d\u7f6e<\/h4>\n<h5>2.10.1 daemon.json\u4e2d\u7684\u5b58\u50a8\u9a71\u52a8\u914d\u7f6e<\/h5>\n<p><span class=\"token comment\">\/\/ \/etc\/docker\/daemon.json \u5b8c\u6574\u914d\u7f6e\u793a\u4f8b<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token string-property property\">&#034;storage-driver&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;overlay2&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token string-property property\">&#034;storage-opts&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n    <span class=\"token string\">&#034;overlay2.override_kernel_check&#061;true&#034;<\/span><br \/>\n  <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token string-property property\">&#034;data-root&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\/var\/lib\/docker&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token string-property property\">&#034;max-concurrent-downloads&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token string-property property\">&#034;max-concurrent-uploads&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">5<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token string-property property\">&#034;log-driver&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;json-file&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token string-property property\">&#034;log-opts&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string-property property\">&#034;max-size&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;10m&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string-property property\">&#034;max-file&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;3&#034;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h5>2.10.2 \u9a8c\u8bc1\u5b58\u50a8\u9a71\u52a8\u652f\u6301<\/h5>\n<p><span class=\"token comment\"># \u68c0\u67e5\u5185\u6838\u662f\u5426\u652f\u6301overlay<\/span><br \/>\n<span class=\"token function\">grep<\/span> overlay \/proc\/filesystems<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: nodev  overlay<\/span><\/p>\n<p><span class=\"token comment\"># \u68c0\u67e5\u6587\u4ef6\u7cfb\u7edf\u662f\u5426\u652f\u6301d_type(overlay2\u9700\u8981)<\/span><br \/>\n<span class=\"token function\">sudo<\/span> xfs_info \/ <span class=\"token operator\">|<\/span> <span class=\"token function\">grep<\/span> ftype<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: ftype&#061;1 (\u9700\u8981\u4e3a1)<\/span><\/p>\n<p><span class=\"token comment\"># \u68c0\u67e5\u5185\u6838\u7248\u672c<\/span><br \/>\n<span class=\"token function\">uname<\/span> <span class=\"token parameter variable\">-r<\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa\u5e94 &gt;&#061; 4.0<\/span><\/p>\n<h5>2.10.3 \u4fee\u6539\u6570\u636e\u6839\u76ee\u5f55<\/h5>\n<p>\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b,\u7cfb\u7edf\u76d8\u7a7a\u95f4\u4e0d\u8db3,\u9700\u8981\u5c06Docker\u6570\u636e\u76ee\u5f55\u8fc1\u79fb\u5230\u5176\u4ed6\u78c1\u76d8:<\/p>\n<p><span class=\"token comment\"># 1. \u505c\u6b62Docker<\/span><br \/>\n<span class=\"token function\">sudo<\/span> systemctl stop <span class=\"token function\">docker<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u521b\u5efa\u65b0\u76ee\u5f55<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> \/data\/docker<\/p>\n<p><span class=\"token comment\"># 3. \u4fee\u6539\u914d\u7f6e<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">tee<\/span> \/etc\/docker\/daemon.json <span class=\"token operator\">&lt;&lt;<\/span><span class=\"token string\">&#039;EOF&#039;<br \/>\n{<br \/>\n  &#034;data-root&#034;: &#034;\/data\/docker&#034;,<br \/>\n  &#034;storage-driver&#034;: &#034;overlay2&#034;<br \/>\n}<br \/>\nEOF<\/span><\/p>\n<p><span class=\"token comment\"># 4. \u8fc1\u79fb\u73b0\u6709\u6570\u636e<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">rsync<\/span> <span class=\"token parameter variable\">-aP<\/span> \/var\/lib\/docker\/ \/data\/docker\/<\/p>\n<p><span class=\"token comment\"># 5. \u542f\u52a8Docker<\/span><br \/>\n<span class=\"token function\">sudo<\/span> systemctl start <span class=\"token function\">docker<\/span><\/p>\n<p><span class=\"token comment\"># 6. \u9a8c\u8bc1<\/span><br \/>\n<span class=\"token function\">docker<\/span> info <span class=\"token operator\">|<\/span> <span class=\"token function\">grep<\/span> <span class=\"token string\">&#034;Docker Root Dir&#034;<\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa: Docker Root Dir: \/data\/docker<\/span><\/p>\n<p><span class=\"token comment\"># 7. \u786e\u8ba4\u65e0\u8bef\u540e\u5220\u9664\u65e7\u76ee\u5f55<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-rf<\/span> \/var\/lib\/docker<\/p>\n<h5>2.10.4 \u5b58\u50a8\u9a71\u52a8\u76f8\u5173\u7684\u6545\u969c\u6392\u67e5<\/h5>\n<p><span class=\"token comment\"># \u67e5\u770bDocker\u5b88\u62a4\u8fdb\u7a0b\u65e5\u5fd7<\/span><br \/>\n<span class=\"token function\">sudo<\/span> journalctl <span class=\"token parameter variable\">-u<\/span> docker.service &#8211;no-pager <span class=\"token operator\">|<\/span> <span class=\"token function\">tail<\/span> <span class=\"token parameter variable\">-50<\/span><\/p>\n<p><span class=\"token comment\"># \u5e38\u89c1\u5b58\u50a8\u9a71\u52a8\u9519\u8bef\u53ca\u89e3\u51b3\u65b9\u6cd5:<\/span><\/p>\n<p><span class=\"token comment\"># \u9519\u8bef1: &#034;overlay2 not supported&#034;<\/span><br \/>\n<span class=\"token comment\"># \u539f\u56e0: \u5185\u6838\u7248\u672c\u8fc7\u4f4e\u6216\u6587\u4ef6\u7cfb\u7edf\u4e0d\u652f\u6301<\/span><br \/>\n<span class=\"token comment\"># \u89e3\u51b3: \u5347\u7ea7\u5185\u6838(&gt;&#061;4.0)\u6216\u66f4\u6362\u6587\u4ef6\u7cfb\u7edf(\u4f7f\u7528ext4\/xfs\u5e76\u8bbe\u7f6eftype&#061;1)<\/span><\/p>\n<p><span class=\"token comment\"># \u9519\u8bef2: &#034;Failed to start Docker Container Engine&#034;<\/span><br \/>\n<span class=\"token comment\"># \u539f\u56e0: \u5b58\u50a8\u9a71\u52a8\u914d\u7f6e\u9519\u8bef\u6216\u6570\u636e\u635f\u574f<\/span><br \/>\n<span class=\"token comment\"># \u89e3\u51b3: \u68c0\u67e5daemon.json\u914d\u7f6e,\u5fc5\u8981\u65f6\u6e05\u9664\/var\/lib\/docker\u91cd\u65b0\u521d\u59cb\u5316<\/span><\/p>\n<p><span class=\"token comment\"># \u9519\u8bef3: &#034;no space left on device&#034;<\/span><br \/>\n<span class=\"token comment\"># \u539f\u56e0: \u78c1\u76d8\u7a7a\u95f4\u4e0d\u8db3<\/span><br \/>\n<span class=\"token comment\"># \u89e3\u51b3: \u6e05\u7406\u65e0\u7528\u955c\u50cf\u548c\u5bb9\u5668(docker system prune),\u6216\u8fc1\u79fb\u6570\u636e\u6839\u76ee\u5f55<\/span><\/p>\n<hr \/>\n<h3>\u7b2c\u4e09\u7ae0 Docker Volume(\u6570\u636e\u5377)<\/h3>\n<h4>3.1 \u6570\u636e\u5377\u7684\u6982\u5ff5\u4e0e\u7279\u70b9<\/h4>\n<h5>3.1.1 \u4ec0\u4e48\u662f\u6570\u636e\u5377<\/h5>\n<p>\u6570\u636e\u5377(Volume)\u662fDocker\u539f\u751f\u63d0\u4f9b\u7684\u6570\u636e\u6301\u4e45\u5316\u673a\u5236\u3002\u5b83\u662f\u4e00\u4e2a\u7531Docker\u5b88\u62a4\u8fdb\u7a0b\u7ba1\u7406\u7684\u7279\u6b8a\u76ee\u5f55,\u5b58\u5728\u4e8e\u5bbf\u4e3b\u673a\u4e0a,\u53ef\u4ee5\u88ab\u4e00\u4e2a\u6216\u591a\u4e2a\u5bb9\u5668\u6302\u8f7d\u4f7f\u7528\u3002\u6570\u636e\u5377\u5b8c\u5168\u72ec\u7acb\u4e8e\u5bb9\u5668\u7684\u751f\u547d\u5468\u671f\u2014\u2014\u5373\u4f7f\u6240\u6709\u4f7f\u7528\u5b83\u7684\u5bb9\u5668\u90fd\u88ab\u5220\u9664,\u6570\u636e\u5377\u53ca\u5176\u6570\u636e\u4f9d\u7136\u5b58\u5728\u3002<\/p>\n<h5>3.1.2 \u6570\u636e\u5377\u7684\u6838\u5fc3\u7279\u70b9<\/h5>\n<li>\u72ec\u7acb\u7684\u751f\u547d\u5468\u671f:\u6570\u636e\u5377\u7684\u521b\u5efa\u3001\u5b58\u5728\u548c\u5220\u9664\u4e0e\u5bb9\u5668\u5b8c\u5168\u89e3\u8026\u3002\u5bb9\u5668\u5220\u9664\u4e0d\u4f1a\u81ea\u52a8\u5220\u9664\u6570\u636e\u5377(\u9664\u975e\u4f7f\u7528-v\u6807\u5fd7\u5220\u9664\u5bb9\u5668)\u3002<\/li>\n<li>Docker\u7edf\u4e00\u7ba1\u7406:\u901a\u8fc7docker volume\u547d\u4ee4\u65cf\u8fdb\u884c\u7ba1\u7406,\u65e0\u9700\u5173\u5fc3\u5e95\u5c42\u5b58\u50a8\u8def\u5f84\u3002<\/li>\n<li>\u8de8\u5bb9\u5668\u5171\u4eab:\u4e00\u4e2a\u6570\u636e\u5377\u53ef\u4ee5\u88ab\u591a\u4e2a\u5bb9\u5668\u540c\u65f6\u6302\u8f7d,\u5b9e\u73b0\u6570\u636e\u5171\u4eab\u3002<\/li>\n<li>\u7ed5\u8fc7\u5b58\u50a8\u9a71\u52a8:\u6570\u636e\u5377\u7684\u8bfb\u5199\u76f4\u63a5\u4f5c\u7528\u4e8e\u5bbf\u4e3b\u673a\u6587\u4ef6\u7cfb\u7edf,\u4e0d\u7ecf\u8fc7\u5b58\u50a8\u9a71\u52a8\u7684\u5199\u65f6\u590d\u5236\u673a\u5236,\u6027\u80fd\u63a5\u8fd1\u539f\u751f\u3002<\/li>\n<li>\u652f\u6301\u9a71\u52a8\u6269\u5c55:\u901a\u8fc7\u6570\u636e\u5377\u9a71\u52a8(Volume Driver),\u53ef\u4ee5\u5c06\u6570\u636e\u5b58\u50a8\u5728\u8fdc\u7a0b\u5b58\u50a8(NFS\u3001\u4e91\u5b58\u50a8\u3001\u5757\u5b58\u50a8\u7b49)\u4e0a\u3002<\/li>\n<li>\u521d\u59cb\u5185\u5bb9\u590d\u5236:\u5bf9\u4e8e\u547d\u540d\u6570\u636e\u5377,\u9996\u6b21\u6302\u8f7d\u5230\u4e00\u4e2a\u6709\u5185\u5bb9\u7684\u76ee\u5f55\u65f6,Docker\u4f1a\u5c06\u955c\u50cf\u4e2d\u7684\u5185\u5bb9\u590d\u5236\u5230\u6570\u636e\u5377\u4e2d\u3002<\/li>\n<li>\u5e73\u53f0\u65e0\u5173:\u6570\u636e\u5377\u7684\u4f7f\u7528\u65b9\u5f0f\u5728\u4e0d\u540c\u64cd\u4f5c\u7cfb\u7edf\u4e0a\u57fa\u672c\u4e00\u81f4(\u867d\u7136\u5e95\u5c42\u5b58\u50a8\u8def\u5f84\u4e0d\u540c)\u3002<\/li>\n<h5>3.1.3 \u6570\u636e\u5377\u7684\u5b58\u50a8\u4f4d\u7f6e<\/h5>\n<p>\u6570\u636e\u5377\u9ed8\u8ba4\u5b58\u50a8\u5728\u5bbf\u4e3b\u673a\u7684\/var\/lib\/docker\/volumes\/\u76ee\u5f55\u4e0b:<\/p>\n<p>\/var\/lib\/docker\/volumes\/<br \/>\n\u251c\u2500\u2500 my-volume\/                    # \u547d\u540d\u6570\u636e\u5377<br \/>\n\u2502   \u251c\u2500\u2500 _data\/                    # \u5b9e\u9645\u6570\u636e\u5b58\u50a8\u76ee\u5f55<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 file1.txt<br \/>\n\u2502   \u2502   \u2514\u2500\u2500 subdir\/<br \/>\n\u2502   \u2502       \u2514\u2500\u2500 file2.txt<br \/>\n\u2502   \u2514\u2500\u2500 metadata.json             # \u6570\u636e\u5377\u5143\u6570\u636e? (\u5b9e\u9645\u4e0d\u5b58\u5728\u6b64\u6587\u4ef6)<br \/>\n\u251c\u2500\u2500 f3b4&#8230;45e\/                   # \u533f\u540d\u6570\u636e\u5377(\u4f7f\u7528\u54c8\u5e0c\u503c\u547d\u540d)<br \/>\n\u2502   \u2514\u2500\u2500 _data\/<br \/>\n\u2502       \u2514\u2500\u2500 &#8230;<br \/>\n\u2514\u2500\u2500 backingFsBlockDev             # \u7cfb\u7edf\u6587\u4ef6<\/p>\n<p>\u5728\u4e0d\u540c\u5e73\u53f0\u4e0a,\u6570\u636e\u5377\u7684\u5b58\u50a8\u4f4d\u7f6e\u6709\u6240\u4e0d\u540c:<\/p>\n<table>\n<tr>\u5e73\u53f0\u5b58\u50a8\u4f4d\u7f6e<\/tr>\n<tbody>\n<tr>\n<td>Linux<\/td>\n<td>\/var\/lib\/docker\/volumes\/<\/td>\n<\/tr>\n<tr>\n<td>Docker Desktop (macOS)<\/td>\n<td>\u5728Linux VM\u5185\u90e8<\/td>\n<\/tr>\n<tr>\n<td>Docker Desktop (Windows)<\/td>\n<td>\u5728WSL2 VM\u5185\u90e8<\/td>\n<\/tr>\n<tr>\n<td>Windows Containers<\/td>\n<td>C:\\\\ProgramData\\\\docker\\\\volumes\\\\<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>3.2 docker volume create\u521b\u5efa\u6570\u636e\u5377<\/h4>\n<h5>3.2.1 \u57fa\u672c\u521b\u5efa\u547d\u4ee4<\/h5>\n<p><span class=\"token comment\"># \u521b\u5efa\u4e00\u4e2a\u547d\u540d\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create my-data-volume<\/p>\n<p><span class=\"token comment\"># \u8f93\u51fa: my-data-volume<\/span><\/p>\n<p>\u521b\u5efa\u540e,Docker\u4f1a\u5728\/var\/lib\/docker\/volumes\/my-data-volume\/_data\/\u76ee\u5f55\u4e0b\u521b\u5efa\u5b9e\u9645\u7684\u6570\u636e\u5b58\u50a8\u76ee\u5f55\u3002<\/p>\n<h5>3.2.2 \u521b\u5efa\u65f6\u6307\u5b9a\u9009\u9879<\/h5>\n<p><span class=\"token comment\"># \u521b\u5efa\u6570\u636e\u5377\u65f6\u6307\u5b9a\u6807\u7b7e(label)<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token parameter variable\">&#8211;label<\/span> <span class=\"token assign-left variable\">environment<\/span><span class=\"token operator\">&#061;<\/span>production <span class=\"token parameter variable\">&#8211;label<\/span> <span class=\"token assign-left variable\">app<\/span><span class=\"token operator\">&#061;<\/span>web my-labeled-volume<\/p>\n<p><span class=\"token comment\"># \u521b\u5efa\u6570\u636e\u5377\u65f6\u6307\u5b9a\u9a71\u52a8(\u9ed8\u8ba4\u4e3alocal)<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token builtin class-name\">local<\/span> my-local-volume<\/p>\n<p><span class=\"token comment\"># \u521b\u5efa\u6570\u636e\u5377\u65f6\u6307\u5b9a\u9a71\u52a8\u9009\u9879<\/span><br \/>\n<span class=\"token comment\"># \u4f8b\u5982:\u521b\u5efa\u4e00\u4e2aNFS\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token builtin class-name\">local<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>nfs <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">o<\/span><span class=\"token operator\">&#061;<\/span>addr<span class=\"token operator\">&#061;<\/span><span class=\"token number\">192.168<\/span>.1.100,rw <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">device<\/span><span class=\"token operator\">&#061;<\/span>:\/path\/to\/nfs\/share <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-nfs-volume<\/p>\n<p><span class=\"token comment\"># \u521b\u5efa\u4e00\u4e2atmpfs\u7c7b\u578b\u7684\u6570\u636e\u5377(\u5b58\u50a8\u5728\u5185\u5b58\u4e2d)<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token builtin class-name\">local<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>tmpfs <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">device<\/span><span class=\"token operator\">&#061;<\/span>tmpfs <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">o<\/span><span class=\"token operator\">&#061;<\/span>size<span class=\"token operator\">&#061;<\/span>100m,mode<span class=\"token operator\">&#061;<\/span>0755 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-tmpfs-volume<\/p>\n<p><span class=\"token comment\"># \u521b\u5efa\u4e00\u4e2abtrfs\u5b50\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token builtin class-name\">local<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>btrfs <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">device<\/span><span class=\"token operator\">&#061;<\/span>\/dev\/sdb <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">o<\/span><span class=\"token operator\">&#061;<\/span>subvol<span class=\"token operator\">&#061;<\/span>\/docker-volumes\/my-subvol <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-btrfs-volume<\/p>\n<h5>3.2.3 \u67e5\u770b\u521b\u5efa\u7ed3\u679c<\/h5>\n<p><span class=\"token comment\"># \u67e5\u770b\u6570\u636e\u5377\u8be6\u7ec6\u4fe1\u606f<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume inspect my-data-volume<\/p>\n<p><span class=\"token comment\"># \u8f93\u51fa:<\/span><br \/>\n<span class=\"token comment\"># [<\/span><br \/>\n<span class=\"token comment\">#     {<\/span><br \/>\n<span class=\"token comment\">#         &#034;CreatedAt&#034;: &#034;2024-01-15T10:30:00Z&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Driver&#034;: &#034;local&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Labels&#034;: {},<\/span><br \/>\n<span class=\"token comment\">#         &#034;Mountpoint&#034;: &#034;\/var\/lib\/docker\/volumes\/my-data-volume\/_data&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Name&#034;: &#034;my-data-volume&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Options&#034;: {},<\/span><br \/>\n<span class=\"token comment\">#         &#034;Scope&#034;: &#034;local&#034;<\/span><br \/>\n<span class=\"token comment\">#     }<\/span><br \/>\n<span class=\"token comment\"># ]<\/span><\/p>\n<p><span class=\"token comment\"># \u5728\u5bbf\u4e3b\u673a\u4e0a\u67e5\u770b\u6570\u636e\u5377\u76ee\u5f55<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-la<\/span> \/var\/lib\/docker\/volumes\/my-data-volume\/<br \/>\n<span class=\"token comment\"># \u8f93\u51fa:<\/span><br \/>\n<span class=\"token comment\"># total 4<\/span><br \/>\n<span class=\"token comment\"># drwxr-xr-x 3 root root 4096 Jan 15 10:30 .<\/span><br \/>\n<span class=\"token comment\"># drwxr-xr-x 3 root root 4096 Jan 15 10:30 ..<\/span><br \/>\n<span class=\"token comment\"># drwxr-xr-x 2 root root   40 Jan 15 10:30 _data<\/span><\/p>\n<h4>3.3 docker volume ls\/rm\/inspect\/prune\u7ba1\u7406\u6570\u636e\u5377<\/h4>\n<h5>3.3.1 docker volume ls &#8211; \u5217\u51fa\u6570\u636e\u5377<\/h5>\n<p><span class=\"token comment\"># \u5217\u51fa\u6240\u6709\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span><\/p>\n<p><span class=\"token comment\"># \u8f93\u51fa\u793a\u4f8b:<\/span><br \/>\n<span class=\"token comment\"># DRIVER    VOLUME NAME<\/span><br \/>\n<span class=\"token comment\"># local     my-data-volume<\/span><br \/>\n<span class=\"token comment\"># local     my-labeled-volume<\/span><br \/>\n<span class=\"token comment\"># local     nginx-html<\/span><br \/>\n<span class=\"token comment\"># local     f3b4a2c5e8d1&#8230;   # \u533f\u540d\u6570\u636e\u5377(\u54c8\u5e0c\u547d\u540d)<\/span><\/p>\n<p><span class=\"token comment\"># \u6309\u540d\u79f0\u8fc7\u6ee4<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">&#8211;filter<\/span> <span class=\"token assign-left variable\">name<\/span><span class=\"token operator\">&#061;<\/span>my<\/p>\n<p><span class=\"token comment\"># \u8f93\u51fa:<\/span><br \/>\n<span class=\"token comment\"># DRIVER    VOLUME NAME<\/span><br \/>\n<span class=\"token comment\"># local     my-data-volume<\/span><br \/>\n<span class=\"token comment\"># local     my-labeled-volume<\/span><\/p>\n<p><span class=\"token comment\"># \u6309\u6807\u7b7e\u8fc7\u6ee4<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">&#8211;filter<\/span> <span class=\"token assign-left variable\">label<\/span><span class=\"token operator\">&#061;<\/span>environment<span class=\"token operator\">&#061;<\/span>production<\/p>\n<p><span class=\"token comment\"># \u8f93\u51fa:<\/span><br \/>\n<span class=\"token comment\"># DRIVER    VOLUME NAME<\/span><br \/>\n<span class=\"token comment\"># local     my-labeled-volume<\/span><\/p>\n<p><span class=\"token comment\"># \u53ea\u663e\u793a\u6570\u636e\u5377\u540d\u79f0(\u4e0d\u663e\u793aDRIVER\u5217)<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-q<\/span><\/p>\n<p><span class=\"token comment\"># \u8f93\u51fa:<\/span><br \/>\n<span class=\"token comment\"># my-data-volume<\/span><br \/>\n<span class=\"token comment\"># my-labeled-volume<\/span><\/p>\n<h5>3.3.2 docker volume inspect &#8211; \u67e5\u770b\u8be6\u60c5<\/h5>\n<p><span class=\"token comment\"># \u67e5\u770b\u5355\u4e2a\u6570\u636e\u5377\u8be6\u60c5<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume inspect my-data-volume<\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u591a\u4e2a\u6570\u636e\u5377\u8be6\u60c5<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume inspect my-data-volume my-labeled-volume<\/p>\n<p><span class=\"token comment\"># \u53ea\u67e5\u770b\u6302\u8f7d\u70b9\u8def\u5f84<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume inspect my-data-volume <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{.Mountpoint}}&#039;<\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa: \/var\/lib\/docker\/volumes\/my-data-volume\/_data<\/span><\/p>\n<p><span class=\"token comment\"># \u53ea\u67e5\u770b\u9a71\u52a8\u540d\u79f0<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume inspect my-data-volume <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{.Driver}}&#039;<\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa: local<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u6807\u7b7e<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume inspect my-labeled-volume <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{.Labels}}&#039;<\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa: map[app:web environment:production]<\/span><\/p>\n<h5>3.3.3 docker volume rm &#8211; \u5220\u9664\u6570\u636e\u5377<\/h5>\n<p><span class=\"token comment\"># \u5220\u9664\u5355\u4e2a\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume <span class=\"token function\">rm<\/span> my-data-volume<\/p>\n<p><span class=\"token comment\"># \u5220\u9664\u591a\u4e2a\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume <span class=\"token function\">rm<\/span> volume1 volume2 volume3<\/p>\n<p><span class=\"token comment\"># \u6ce8\u610f:\u6b63\u5728\u88ab\u5bb9\u5668\u4f7f\u7528\u7684\u6570\u636e\u5377\u65e0\u6cd5\u5220\u9664<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume <span class=\"token function\">rm<\/span> my-data-volume<br \/>\n<span class=\"token comment\"># \u62a5\u9519: Error response from daemon: unable to remove volume: <\/span><br \/>\n<span class=\"token comment\"># remove my-data-volume: volume is in use<\/span><\/p>\n<p><span class=\"token comment\"># \u5f3a\u5236\u5220\u9664\u4f7f\u7528\u4e2d\u7684\u6570\u636e\u5377(\u9700\u8981\u5148\u5220\u9664\u4f7f\u7528\u5b83\u7684\u5bb9\u5668)<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-f<\/span> container_using_volume<br \/>\n<span class=\"token function\">docker<\/span> volume <span class=\"token function\">rm<\/span> my-data-volume<\/p>\n<h5>3.3.4 docker volume prune &#8211; \u6e05\u7406\u65e0\u7528\u6570\u636e\u5377<\/h5>\n<p><span class=\"token comment\"># \u5220\u9664\u6240\u6709\u672a\u88ab\u5bb9\u5668\u4f7f\u7528\u7684\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume prune<\/p>\n<p><span class=\"token comment\"># \u8f93\u51fa:<\/span><br \/>\n<span class=\"token comment\"># WARNING! This will remove all local volumes not used by at least one container.<\/span><br \/>\n<span class=\"token comment\"># Are you sure you want to continue? [y\/N] y<\/span><br \/>\n<span class=\"token comment\"># Deleted Volumes:<\/span><br \/>\n<span class=\"token comment\"># unused-volume-1<\/span><br \/>\n<span class=\"token comment\"># unused-volume-2<\/span><br \/>\n<span class=\"token comment\"># Total reclaimed space: 1.2GB<\/span><\/p>\n<p><span class=\"token comment\"># \u8df3\u8fc7\u786e\u8ba4\u63d0\u793a<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume prune <span class=\"token parameter variable\">-f<\/span><\/p>\n<p><span class=\"token comment\"># \u6309\u6807\u7b7e\u8fc7\u6ee4\u5220\u9664<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume prune <span class=\"token parameter variable\">&#8211;filter<\/span> label<span class=\"token operator\">!&#061;<\/span>keep<span class=\"token operator\">&#061;<\/span>true<\/p>\n<p><span class=\"token comment\"># \u5220\u9664\u8d85\u8fc724\u5c0f\u65f6\u672a\u4f7f\u7528\u7684\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume prune <span class=\"token parameter variable\">&#8211;filter<\/span> <span class=\"token string\">&#034;until&#061;24h&#034;<\/span><\/p>\n<h5>3.3.5 \u6570\u636e\u5377\u7ba1\u7406\u6700\u4f73\u5b9e\u8df5<\/h5>\n<p><span class=\"token comment\"># 1. \u4e3a\u6570\u636e\u5377\u6dfb\u52a0\u63cf\u8ff0\u6027\u6807\u7b7e<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token parameter variable\">&#8211;label<\/span> <span class=\"token assign-left variable\">app<\/span><span class=\"token operator\">&#061;<\/span>mysql <span class=\"token parameter variable\">&#8211;label<\/span> <span class=\"token assign-left variable\">env<\/span><span class=\"token operator\">&#061;<\/span>prod <span class=\"token parameter variable\">&#8211;label<\/span> <span class=\"token assign-left variable\">backup<\/span><span class=\"token operator\">&#061;<\/span>daily mysql-data<\/p>\n<p><span class=\"token comment\"># 2. \u4f7f\u7528\u6709\u610f\u4e49\u7684\u540d\u79f0<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create mysql_prod_data    <span class=\"token comment\"># \u597d\u7684\u547d\u540d<\/span><br \/>\n<span class=\"token comment\"># docker volume create vol1              # \u4e0d\u597d\u7684\u547d\u540d<\/span><\/p>\n<p><span class=\"token comment\"># 3. \u5b9a\u671f\u68c0\u67e5\u65e0\u7528\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-f<\/span> <span class=\"token assign-left variable\">dangling<\/span><span class=\"token operator\">&#061;<\/span>true<\/p>\n<p><span class=\"token comment\"># 4. \u5b9a\u671f\u6e05\u7406<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume prune <span class=\"token parameter variable\">-f<\/span>  <span class=\"token comment\"># \u8c28\u614e\u4f7f\u7528,\u786e\u4fdd\u6ca1\u6709\u6b63\u5728\u4f7f\u7528\u7684\u533f\u540d\u5377<\/span><\/p>\n<p><span class=\"token comment\"># 5. \u5907\u4efd\u91cd\u8981\u7684\u6570\u636e\u5377(\u540e\u7eed\u7ae0\u8282\u8be6\u7ec6\u8bb2\u89e3)<\/span><\/p>\n<h4>3.4 \u5728docker run\u4e2d\u4f7f\u7528\u6570\u636e\u5377<\/h4>\n<h5>3.4.1 \u57fa\u672c\u7528\u6cd5(-v\u53c2\u6570)<\/h5>\n<p><span class=\"token comment\"># \u4f7f\u7528\u547d\u540d\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> web-server <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> web-data:\/usr\/share\/nginx\/html <span class=\"token punctuation\">\\\\<\/span><br \/>\n  nginx:latest<\/p>\n<p><span class=\"token comment\"># \u53c2\u6570\u8bf4\u660e:<\/span><br \/>\n<span class=\"token comment\"># -v web-data:\/usr\/share\/nginx\/html<\/span><br \/>\n<span class=\"token comment\">#   web-data: \u6570\u636e\u5377\u540d\u79f0(Docker\u4f1a\u81ea\u52a8\u521b\u5efa\u5982\u679c\u4e0d\u5b58\u5728)<\/span><br \/>\n<span class=\"token comment\">#   \/usr\/share\/nginx\/html: \u5bb9\u5668\u5185\u7684\u6302\u8f7d\u8def\u5f84<\/span><\/p>\n<h5>3.4.2 \u4f7f\u7528\u2013mount\u53c2\u6570(\u63a8\u8350)<\/h5>\n<p><span class=\"token comment\"># \u4f7f\u7528&#8211;mount\u53c2\u6570(\u8bed\u6cd5\u66f4\u660e\u786e,\u63a8\u8350\u4f7f\u7528)<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> web-server <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>volume,src<span class=\"token operator\">&#061;<\/span>web-data,dst<span class=\"token operator\">&#061;<\/span>\/usr\/share\/nginx\/html <span class=\"token punctuation\">\\\\<\/span><br \/>\n  nginx:latest<\/p>\n<p><span class=\"token comment\"># \u53c2\u6570\u8bf4\u660e:<\/span><br \/>\n<span class=\"token comment\"># &#8211;mount type&#061;volume: \u6307\u5b9a\u6302\u8f7d\u7c7b\u578b\u4e3a\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token comment\">#   src&#061;web-data: \u6e90\u6570\u636e\u5377\u540d\u79f0(\u4e5f\u53ef\u4ee5\u7528source&#061;)<\/span><br \/>\n<span class=\"token comment\">#   dst&#061;\/usr\/share\/nginx\/html: \u76ee\u6807\u8def\u5f84(\u4e5f\u53ef\u4ee5\u7528destination&#061;\u6216target&#061;)<\/span><\/p>\n<p><span class=\"token comment\"># \u7b49\u4ef7\u4e8e:<\/span><br \/>\n<span class=\"token comment\"># docker run -d &#8211;name web-server -v web-data:\/usr\/share\/nginx\/html nginx:latest<\/span><\/p>\n<h5>3.4.3 -v\u4e0e\u2013mount\u7684\u5bf9\u6bd4<\/h5>\n<p><span class=\"token comment\"># -v \u53c2\u6570: \u7b80\u6d01\u4f46\u4e0d\u591f\u660e\u786e<\/span><br \/>\n<span class=\"token comment\"># \u683c\u5f0f: -v &lt;volume_name&gt;:&lt;container_path&gt;[:&lt;options&gt;]<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">-v<\/span> web-data:\/data:ro nginx:latest<\/p>\n<p><span class=\"token comment\"># &#8211;mount \u53c2\u6570: \u8bed\u6cd5\u660e\u786e,\u529f\u80fd\u66f4\u4e30\u5bcc<\/span><br \/>\n<span class=\"token comment\"># \u683c\u5f0f: &#8211;mount type&#061;volume,src&#061;&lt;name&gt;,dst&#061;&lt;path&gt;[,&lt;options&gt;]<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>volume,src<span class=\"token operator\">&#061;<\/span>web-data,dst<span class=\"token operator\">&#061;<\/span>\/data,readonly <span class=\"token punctuation\">\\\\<\/span><br \/>\n  nginx:latest<\/p>\n<p><span class=\"token comment\"># &#8211;mount \u7684\u4f18\u52bf:<\/span><br \/>\n<span class=\"token comment\"># 1. \u8bed\u6cd5\u66f4\u660e\u786e,\u6bcf\u4e2a\u53c2\u6570\u90fd\u6709\u952e\u540d<\/span><br \/>\n<span class=\"token comment\"># 2. \u66f4\u5bb9\u6613\u9605\u8bfb\u548c\u7406\u89e3<\/span><br \/>\n<span class=\"token comment\"># 3. \u652f\u6301\u66f4\u591a\u9009\u9879(\u5982volume-nocopy)<\/span><br \/>\n<span class=\"token comment\"># 4. \u9002\u7528\u4e8eSwarm\u670d\u52a1<\/span><\/p>\n<h5>3.4.4 \u6302\u8f7d\u591a\u4e2a\u6570\u636e\u5377<\/h5>\n<p><span class=\"token comment\"># \u4e00\u4e2a\u5bb9\u5668\u53ef\u4ee5\u6302\u8f7d\u591a\u4e2a\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> app-server <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> app-data:\/app\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> app-logs:\/app\/logs <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> app-config:\/app\/config <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-app:latest<\/p>\n<p><span class=\"token comment\"># \u4f7f\u7528&#8211;mount\u8bed\u6cd5<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> app-server <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>volume,src<span class=\"token operator\">&#061;<\/span>app-data,dst<span class=\"token operator\">&#061;<\/span>\/app\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>volume,src<span class=\"token operator\">&#061;<\/span>app-logs,dst<span class=\"token operator\">&#061;<\/span>\/app\/logs <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>volume,src<span class=\"token operator\">&#061;<\/span>app-config,dst<span class=\"token operator\">&#061;<\/span>\/app\/config <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-app:latest<\/p>\n<h5>3.4.5 volume-nocopy\u9009\u9879<\/h5>\n<p>\u9ed8\u8ba4\u60c5\u51b5\u4e0b,\u5f53\u547d\u540d\u6570\u636e\u5377\u9996\u6b21\u6302\u8f7d\u5230\u4e00\u4e2a\u975e\u7a7a\u76ee\u5f55\u65f6,Docker\u4f1a\u5c06\u5bb9\u5668\u955c\u50cf\u4e2d\u8be5\u76ee\u5f55\u7684\u5185\u5bb9\u590d\u5236\u5230\u6570\u636e\u5377\u4e2d\u3002\u53ef\u4ee5\u4f7f\u7528volume-nocopy\u9009\u9879\u7981\u7528\u6b64\u884c\u4e3a:<\/p>\n<p><span class=\"token comment\"># \u9ed8\u8ba4\u884c\u4e3a:\u590d\u5236\u955c\u50cf\u5185\u5bb9\u5230\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> web1 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>volume,src<span class=\"token operator\">&#061;<\/span>web-data,dst<span class=\"token operator\">&#061;<\/span>\/usr\/share\/nginx\/html <span class=\"token punctuation\">\\\\<\/span><br \/>\n  nginx:latest<br \/>\n<span class=\"token comment\"># web-data\u4f1a\u5305\u542bnginx\u9ed8\u8ba4\u7684index.html\u548c50x.html<\/span><\/p>\n<p><span class=\"token comment\"># \u7981\u6b62\u590d\u5236:\u4e0d\u590d\u5236\u955c\u50cf\u5185\u5bb9<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> web2 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>volume,src<span class=\"token operator\">&#061;<\/span>web-data2,dst<span class=\"token operator\">&#061;<\/span>\/usr\/share\/nginx\/html,volume-nocopy <span class=\"token punctuation\">\\\\<\/span><br \/>\n  nginx:latest<br \/>\n<span class=\"token comment\"># web-data2\u4e3a\u7a7a,\u4e0d\u4f1a\u5305\u542bnginx\u9ed8\u8ba4\u6587\u4ef6<\/span><\/p>\n<h4>3.5 \u6570\u636e\u5377\u7684\u81ea\u52a8\u521b\u5efa\u884c\u4e3a<\/h4>\n<h5>3.5.1 \u81ea\u52a8\u521b\u5efa\u547d\u540d\u6570\u636e\u5377<\/h5>\n<p><span class=\"token comment\"># \u5982\u679c\u6307\u5b9a\u7684\u547d\u540d\u6570\u636e\u5377\u4e0d\u5b58\u5728,Docker\u4f1a\u81ea\u52a8\u521b\u5efa<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> auto-create-test <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> non-existent-volume:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u662f\u5426\u81ea\u52a8\u521b\u5efa\u4e86\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span> <span class=\"token operator\">|<\/span> <span class=\"token function\">grep<\/span> non-existent-volume<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: local     non-existent-volume<\/span><\/p>\n<p><span class=\"token comment\"># \u81ea\u52a8\u521b\u5efa\u7684\u6570\u636e\u5377\u6ca1\u6709\u4efb\u4f55\u7279\u6b8a\u6807\u7b7e<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume inspect non-existent-volume<\/p>\n<h5>3.5.2 \u81ea\u52a8\u521b\u5efa\u533f\u540d\u6570\u636e\u5377<\/h5>\n<p><span class=\"token comment\"># \u5982\u679c\u53ea\u6307\u5b9a\u5bb9\u5668\u8def\u5f84\u800c\u4e0d\u6307\u5b9a\u6570\u636e\u5377\u540d\u79f0,Docker\u4f1a\u521b\u5efa\u533f\u540d\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> anonymous-volume-test <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u521b\u5efa\u7684\u533f\u540d\u6570\u636e\u5377(\u540d\u79f0\u4e3a\u957f\u54c8\u5e0c\u503c)<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa\u5305\u542b:<\/span><br \/>\n<span class=\"token comment\"># DRIVER    VOLUME NAME<\/span><br \/>\n<span class=\"token comment\"># local     f3b4a2c5e8d1234567890abcdef1234567890abcdef1234567890abcdef1234<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u533f\u540d\u6570\u636e\u5377\u7684\u8be6\u7ec6\u4fe1\u606f<\/span><br \/>\n<span class=\"token function\">docker<\/span> inspect anonymous-volume-test <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{json .Mounts}}&#039;<\/span> <span class=\"token operator\">|<\/span> python3 <span class=\"token parameter variable\">-m<\/span> json.tool<br \/>\n<span class=\"token comment\"># \u8f93\u51fa:<\/span><br \/>\n<span class=\"token comment\"># [<\/span><br \/>\n<span class=\"token comment\">#     {<\/span><br \/>\n<span class=\"token comment\">#         &#034;Type&#034;: &#034;volume&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Name&#034;: &#034;f3b4a2c5&#8230;&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Source&#034;: &#034;\/var\/lib\/docker\/volumes\/f3b4a2c5&#8230;\/_data&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Destination&#034;: &#034;\/data&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Driver&#034;: &#034;local&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Mode&#034;: &#034;&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;RW&#034;: true,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Propagation&#034;: &#034;&#034;<\/span><br \/>\n<span class=\"token comment\">#     }<\/span><br \/>\n<span class=\"token comment\"># ]<\/span><\/p>\n<h5>3.5.3 \u81ea\u52a8\u521b\u5efa\u7684\u98ce\u9669\u4e0e\u6ce8\u610f\u4e8b\u9879<\/h5>\n<p>\u533f\u540d\u6570\u636e\u5377\u7684\u81ea\u52a8\u521b\u5efa\u53ef\u80fd\u5bfc\u81f4&#034;\u6570\u636e\u5377\u6cc4\u6f0f&#034;\u95ee\u9898\u2014\u2014\u5bb9\u5668\u5220\u9664\u540e,\u533f\u540d\u6570\u636e\u5377\u4e0d\u4f1a\u88ab\u81ea\u52a8\u5220\u9664,\u957f\u671f\u79ef\u7d2f\u4f1a\u5360\u7528\u5927\u91cf\u78c1\u76d8\u7a7a\u95f4\u3002<\/p>\n<p><span class=\"token comment\"># \u6f14\u793a\u6570\u636e\u5377\u6cc4\u6f0f<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token for-or-select variable\">i<\/span> <span class=\"token keyword\">in<\/span> <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">seq<\/span> <span class=\"token number\">1<\/span> <span class=\"token number\">10<\/span><span class=\"token variable\">)<\/span><\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">do<\/span><br \/>\n  <span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token parameter variable\">-v<\/span> \/tmp\/data alpine <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;creating anonymous volume <span class=\"token variable\">$i<\/span>&#034;<\/span><br \/>\n<span class=\"token keyword\">done<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770b<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span><br \/>\n<span class=\"token comment\"># \u4f1a\u53d1\u73b0\u670910\u4e2a\u533f\u540d\u6570\u636e\u5377\u6b8b\u7559<\/span><\/p>\n<p><span class=\"token comment\"># \u6e05\u7406<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume prune <span class=\"token parameter variable\">-f<\/span><\/p>\n<p>\u6700\u4f73\u5b9e\u8df5:\u59cb\u7ec8\u4f7f\u7528\u547d\u540d\u6570\u636e\u5377,\u907f\u514d\u533f\u540d\u6570\u636e\u5377\u3002<\/p>\n<p><span class=\"token comment\"># \u4e0d\u63a8\u8350:\u533f\u540d\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-v<\/span> \/data alpine <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><\/p>\n<p><span class=\"token comment\"># \u63a8\u8350:\u547d\u540d\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-v<\/span> my-data:\/data alpine <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><\/p>\n<h4>3.6 \u6570\u636e\u5377\u5728\u5bbf\u4e3b\u673a\u4e0a\u7684\u5b58\u50a8\u4f4d\u7f6e<\/h4>\n<h5>3.6.1 \u9ed8\u8ba4\u5b58\u50a8\u4f4d\u7f6e<\/h5>\n<p><span class=\"token comment\"># \u6570\u636e\u5377\u9ed8\u8ba4\u5b58\u50a8\u5728<\/span><br \/>\n<span class=\"token comment\"># \/var\/lib\/docker\/volumes\/&lt;volume_name&gt;\/_data\/<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u6570\u636e\u5377\u7684\u5b58\u50a8\u8def\u5f84<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume inspect my-data-volume <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{.Mountpoint}}&#039;<\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa: \/var\/lib\/docker\/volumes\/my-data-volume\/_data<\/span><\/p>\n<p><span class=\"token comment\"># \u76f4\u63a5\u5728\u5bbf\u4e3b\u673a\u4e0a\u64cd\u4f5c\u6570\u636e\u5377\u5185\u5bb9<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-la<\/span> \/var\/lib\/docker\/volumes\/my-data-volume\/_data\/<\/p>\n<p><span class=\"token comment\"># \u5728\u5bbf\u4e3b\u673a\u4e0a\u521b\u5efa\u6587\u4ef6(\u4f1a\u53cd\u6620\u5230\u5bb9\u5668\u4e2d)<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Hello from host&#034;<\/span> <span class=\"token operator\">&gt;<\/span> \/var\/lib\/docker\/volumes\/my-data-volume\/_data\/host-created.txt<\/p>\n<p><span class=\"token comment\"># \u5728\u5bb9\u5668\u4e2d\u9a8c\u8bc1<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token parameter variable\">-v<\/span> my-data-volume:\/data alpine <span class=\"token function\">cat<\/span> \/data\/host-created.txt<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: Hello from host<\/span><\/p>\n<h5>3.6.2 \u4fee\u6539\u6570\u636e\u5377\u5b58\u50a8\u4f4d\u7f6e<\/h5>\n<p><span class=\"token comment\">\/\/ \/etc\/docker\/daemon.json<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token string-property property\">&#034;data-root&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\/data\/docker&#034;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u4fee\u6539\u540e\u6570\u636e\u5377\u5c06\u5b58\u50a8\u5728\/data\/docker\/volumes\/\u76ee\u5f55\u4e0b\u3002<\/p>\n<h5>3.6.3 \u6570\u636e\u5377\u7684\u6587\u4ef6\u7cfb\u7edf\u6743\u9650<\/h5>\n<p><span class=\"token comment\"># \u6570\u636e\u5377\u5728\u5bbf\u4e3b\u673a\u4e0a\u9ed8\u8ba4\u7531root\u62e5\u6709<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-la<\/span> \/var\/lib\/docker\/volumes\/<br \/>\n<span class=\"token comment\"># drwxr-xr-x  root root  &#8230;<\/span><br \/>\n<span class=\"token comment\"># drwxr-xr-x  root root  &#8230;<\/span><\/p>\n<p><span class=\"token comment\"># \u5982\u679c\u5bb9\u5668\u5185\u4ee5\u975eroot\u7528\u6237\u8fd0\u884c,\u53ef\u80fd\u9047\u5230\u6743\u9650\u95ee\u9898<\/span><br \/>\n<span class=\"token comment\"># \u89e3\u51b3\u65b9\u6cd51:\u5728Dockerfile\u4e2d\u8c03\u6574\u6743\u9650<\/span><br \/>\n<span class=\"token comment\"># Dockerfile:<\/span><br \/>\n<span class=\"token comment\"># RUN mkdir -p \/data &amp;&amp; chown 1000:1000 \/data<\/span><br \/>\n<span class=\"token comment\"># USER 1000<\/span><\/p>\n<p><span class=\"token comment\"># \u89e3\u51b3\u65b9\u6cd52:\u5728\u5bbf\u4e3b\u673a\u4e0a\u4fee\u6539\u6570\u636e\u5377\u6743\u9650<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">chown<\/span> <span class=\"token parameter variable\">-R<\/span> <span class=\"token number\">1000<\/span>:1000 \/var\/lib\/docker\/volumes\/my-data-volume\/_data\/<\/p>\n<p><span class=\"token comment\"># \u89e3\u51b3\u65b9\u6cd53:\u4f7f\u7528\u521d\u59cb\u5316\u5bb9\u5668\u8bbe\u7f6e\u6743\u9650<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token parameter variable\">-v<\/span> my-data-volume:\/data alpine <span class=\"token function\">chown<\/span> <span class=\"token parameter variable\">-R<\/span> <span class=\"token number\">1000<\/span>:1000 \/data<\/p>\n<h4>3.7 \u53ea\u8bfb\u6570\u636e\u5377<\/h4>\n<h5>3.7.1 \u521b\u5efa\u53ea\u8bfb\u6570\u636e\u5377<\/h5>\n<p><span class=\"token comment\"># \u4f7f\u7528-v\u53c2\u6570\u521b\u5efa\u53ea\u8bfb\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> readonly-test <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> readonly-data:\/data:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><\/p>\n<p><span class=\"token comment\"># \u4f7f\u7528&#8211;mount\u53c2\u6570\u521b\u5efa\u53ea\u8bfb\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> readonly-test2 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>volume,src<span class=\"token operator\">&#061;<\/span>readonly-data,dst<span class=\"token operator\">&#061;<\/span>\/data,readonly <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><\/p>\n<p><span class=\"token comment\"># :ro \u6216 readonly \u8868\u793a\u53ea\u8bfb<\/span><\/p>\n<h5>3.7.2 \u9a8c\u8bc1\u53ea\u8bfb\u5c5e\u6027<\/h5>\n<p><span class=\"token comment\"># \u8bfb\u53d6\u6570\u636e\u5377\u4e2d\u7684\u6587\u4ef6(\u6b63\u5e38)<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> readonly-test <span class=\"token function\">cat<\/span> \/data\/somefile.txt<\/p>\n<p><span class=\"token comment\"># \u5199\u5165\u6570\u636e\u5377(\u4f1a\u5931\u8d25)<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> readonly-test <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;echo &#034;test&#034; &gt; \/data\/newfile.txt&#039;<\/span><br \/>\n<span class=\"token comment\"># \u62a5\u9519: sh: can&#039;t create \/data\/newfile.txt: Read-only file system<\/span><\/p>\n<p><span class=\"token comment\"># \u521b\u5efa\u5b50\u76ee\u5f55(\u4e5f\u4f1a\u5931\u8d25)<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> readonly-test <span class=\"token function\">mkdir<\/span> \/data\/newdir<br \/>\n<span class=\"token comment\"># \u62a5\u9519: mkdir: can&#039;t create directory &#039;\/data\/newdir&#039;: Read-only file system<\/span><\/p>\n<h5>3.7.3 \u53ea\u8bfb\u6570\u636e\u5377\u7684\u5e94\u7528\u573a\u666f<\/h5>\n<p><span class=\"token comment\"># \u573a\u666f1:\u914d\u7f6e\u6587\u4ef6\u53ea\u8bfb\u6302\u8f7d(\u9632\u6b62\u5e94\u7528\u610f\u5916\u4fee\u6539\u914d\u7f6e)<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> config-server <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> app-config:\/etc\/app\/config:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-app:latest<\/p>\n<p><span class=\"token comment\"># \u573a\u666f2:\u9759\u6001\u8d44\u6e90\u53ea\u8bfb\u6302\u8f7d<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> static-server <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> static-assets:\/var\/www\/static:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  nginx:latest<\/p>\n<p><span class=\"token comment\"># \u573a\u666f3:\u53ea\u8bfb\u6570\u636e &#043; \u53ef\u5199\u65e5\u5fd7(\u4e00\u4e2a\u53ea\u8bfb,\u4e00\u4e2a\u53ef\u5199)<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> mixed-server <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> app-data:\/app\/data:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> app-logs:\/app\/logs <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-app:latest<\/p>\n<h4>3.8 \u6570\u636e\u5377\u7684\u6743\u9650\u4e0e\u6240\u6709\u6743<\/h4>\n<h5>3.8.1 \u6743\u9650\u95ee\u9898\u5206\u6790<\/h5>\n<p>\u5f53\u5bb9\u5668\u5185\u4ee5\u975eroot\u7528\u6237\u8fd0\u884c\u65f6,\u53ef\u80fd\u4f1a\u9047\u5230\u6570\u636e\u5377\u6743\u9650\u95ee\u9898\u3002\u8fd9\u662f\u56e0\u4e3a\u6570\u636e\u5377\u5728\u5bbf\u4e3b\u673a\u4e0a\u7531root\u521b\u5efa,\u5bb9\u5668\u5185\u7684\u975eroot\u7528\u6237\u53ef\u80fd\u6ca1\u6709\u8bfb\u5199\u6743\u9650\u3002<\/p>\n<p><span class=\"token comment\"># \u793a\u4f8b:\u4ee5\u975eroot\u7528\u6237\u8fd0\u884c\u7684\u5bb9\u5668\u9047\u5230\u6743\u9650\u95ee\u9898<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> permission-test <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;user<\/span> <span class=\"token number\">1000<\/span>:1000 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> perm-data:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><\/p>\n<p><span class=\"token comment\"># \u5c1d\u8bd5\u5199\u5165\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> permission-test <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;echo &#034;test&#034; &gt; \/data\/test.txt&#039;<\/span><br \/>\n<span class=\"token comment\"># \u53ef\u80fd\u62a5\u9519: sh: can&#039;t create \/data\/test.txt: Permission denied<\/span><\/p>\n<h5>3.8.2 \u89e3\u51b3\u6743\u9650\u95ee\u9898\u7684\u65b9\u6cd5<\/h5>\n<p>\u65b9\u6cd51:\u5728Dockerfile\u4e2d\u9884\u8bbe\u6743\u9650<\/p>\n<p># Dockerfile<br \/>\nFROM alpine:latest<\/p>\n<p># \u521b\u5efa\u76ee\u5f55\u5e76\u8bbe\u7f6e\u6743\u9650<br \/>\nRUN mkdir -p \/data &amp;&amp; chown 1000:1000 \/data<\/p>\n<p># \u5207\u6362\u5230\u975eroot\u7528\u6237<br \/>\nUSER 1000:1000<\/p>\n<p>CMD [&#034;sleep&#034;, &#034;3600&#034;]<\/p>\n<p>\u65b9\u6cd52:\u4f7f\u7528\u521d\u59cb\u5316\u5bb9\u5668<\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa41:\u4f7f\u7528root\u7528\u6237\u521d\u59cb\u5316\u6570\u636e\u5377\u6743\u9650<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> perm-data:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token function\">chown<\/span> <span class=\"token parameter variable\">-R<\/span> <span class=\"token number\">1000<\/span>:1000 \/data<\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa42:\u4ee5\u975eroot\u7528\u6237\u8fd0\u884c\u5e94\u7528<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;user<\/span> <span class=\"token number\">1000<\/span>:1000 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> perm-data:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-app:latest<\/p>\n<p>\u65b9\u6cd53:\u5728\u5bbf\u4e3b\u673a\u4e0a\u76f4\u63a5\u4fee\u6539\u6743\u9650<\/p>\n<p><span class=\"token comment\"># \u83b7\u53d6\u6570\u636e\u5377\u8def\u5f84<\/span><br \/>\n<span class=\"token assign-left variable\">VOLUME_PATH<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> volume inspect perm-data <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{.Mountpoint}}&#039;<\/span><span class=\"token variable\">)<\/span><\/span><\/p>\n<p><span class=\"token comment\"># \u4fee\u6539\u6240\u6709\u6743<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">chown<\/span> <span class=\"token parameter variable\">-R<\/span> <span class=\"token number\">1000<\/span>:1000 <span class=\"token variable\">$VOLUME_PATH<\/span><\/p>\n<p><span class=\"token comment\"># \u4fee\u6539\u6743\u9650<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">chmod<\/span> <span class=\"token parameter variable\">-R<\/span> <span class=\"token number\">755<\/span> <span class=\"token variable\">$VOLUME_PATH<\/span><\/p>\n<p>\u65b9\u6cd54:\u4f7f\u7528Docker Compose\u7684init\u5bb9\u5668<\/p>\n<p><span class=\"token comment\"># docker-compose.yml<\/span><br \/>\n<span class=\"token key atrule\">version<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;3.8&#039;<\/span><\/p>\n<p><span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">init-permissions<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> alpine<span class=\"token punctuation\">:<\/span>latest<br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> app<span class=\"token punctuation\">&#8211;<\/span>data<span class=\"token punctuation\">:<\/span>\/data<br \/>\n    <span class=\"token key atrule\">command<\/span><span class=\"token punctuation\">:<\/span> chown <span class=\"token punctuation\">&#8211;<\/span>R 1000<span class=\"token punctuation\">:<\/span>1000 \/data<br \/>\n    <span class=\"token key atrule\">user<\/span><span class=\"token punctuation\">:<\/span> root<\/p>\n<p>  <span class=\"token key atrule\">app<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> my<span class=\"token punctuation\">&#8211;<\/span>app<span class=\"token punctuation\">:<\/span>latest<br \/>\n    <span class=\"token key atrule\">depends_on<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> init<span class=\"token punctuation\">&#8211;<\/span>permissions<br \/>\n    <span class=\"token key atrule\">user<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;1000:1000&#034;<\/span><br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> app<span class=\"token punctuation\">&#8211;<\/span>data<span class=\"token punctuation\">:<\/span>\/data<\/p>\n<p><span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">app-data<\/span><span class=\"token punctuation\">:<\/span><\/p>\n<h4>3.9 \u547d\u540d\u6570\u636e\u5377 vs \u533f\u540d\u6570\u636e\u5377<\/h4>\n<h5>3.9.1 \u547d\u540d\u6570\u636e\u5377(Named Volume)<\/h5>\n<p><span class=\"token comment\"># \u547d\u540d\u6570\u636e\u5377:\u6709\u660e\u786e\u7684\u540d\u79f0<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> my-app-data:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-app:latest<\/p>\n<p><span class=\"token comment\"># \u7279\u70b9:<\/span><br \/>\n<span class=\"token comment\"># 1. \u6709\u660e\u786e\u7684\u3001\u53ef\u8bfb\u7684\u540d\u79f0<\/span><br \/>\n<span class=\"token comment\"># 2. \u53ef\u4ee5\u901a\u8fc7\u540d\u79f0\u5f15\u7528\u548c\u7ba1\u7406<\/span><br \/>\n<span class=\"token comment\"># 3. \u9002\u5408\u751f\u4ea7\u73af\u5883<\/span><br \/>\n<span class=\"token comment\"># 4. \u4fbf\u4e8e\u5907\u4efd\u3001\u8fc1\u79fb\u548c\u5171\u4eab<\/span><\/p>\n<h5>3.9.2 \u533f\u540d\u6570\u636e\u5377(Anonymous Volume)<\/h5>\n<p><span class=\"token comment\"># \u533f\u540d\u6570\u636e\u5377:\u53ea\u6307\u5b9a\u5bb9\u5668\u8def\u5f84,\u4e0d\u6307\u5b9a\u6570\u636e\u5377\u540d\u79f0<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-app:latest<\/p>\n<p><span class=\"token comment\"># \u7279\u70b9:<\/span><br \/>\n<span class=\"token comment\"># 1. \u540d\u79f0\u662f\u968f\u673a\u751f\u6210\u7684\u54c8\u5e0c\u503c<\/span><br \/>\n<span class=\"token comment\"># 2. \u96be\u4ee5\u7ba1\u7406\u548c\u8bc6\u522b<\/span><br \/>\n<span class=\"token comment\"># 3. \u5bb9\u5668\u5220\u9664\u540e\u5bb9\u6613\u6210\u4e3a&#034;\u5b64\u513f&#034;\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token comment\"># 4. \u4e0d\u63a8\u8350\u5728\u751f\u4ea7\u73af\u5883\u4f7f\u7528<\/span><\/p>\n<h5>3.9.3 \u5bf9\u6bd4<\/h5>\n<table>\n<tr>\u7279\u6027\u547d\u540d\u6570\u636e\u5377\u533f\u540d\u6570\u636e\u5377<\/tr>\n<tbody>\n<tr>\n<td>\u540d\u79f0<\/td>\n<td>\u6709\u660e\u786e\u540d\u79f0<\/td>\n<td>\u968f\u673a\u54c8\u5e0c\u503c<\/td>\n<\/tr>\n<tr>\n<td>\u53ef\u8bfb\u6027<\/td>\n<td>\u597d<\/td>\n<td>\u5dee<\/td>\n<\/tr>\n<tr>\n<td>\u7ba1\u7406\u96be\u5ea6<\/td>\n<td>\u4f4e<\/td>\n<td>\u9ad8<\/td>\n<\/tr>\n<tr>\n<td>\u53ef\u590d\u7528\u6027<\/td>\n<td>\u9ad8<\/td>\n<td>\u4f4e<\/td>\n<\/tr>\n<tr>\n<td>\u9002\u7528\u573a\u666f<\/td>\n<td>\u751f\u4ea7\u73af\u5883<\/td>\n<td>\u4e34\u65f6\u6d4b\u8bd5<\/td>\n<\/tr>\n<tr>\n<td>\u6e05\u7406\u96be\u5ea6<\/td>\n<td>\u4f4e(\u6309\u540d\u79f0\u5220\u9664)<\/td>\n<td>\u9ad8(\u9700\u627e\u51fa\u5bf9\u5e94\u54c8\u5e0c)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5>3.9.4 Dockerfile\u4e2d\u7684VOLUME\u6307\u4ee4\u4ea7\u751f\u7684\u533f\u540d\u5377<\/h5>\n<p># Dockerfile\u4e2d\u4f7f\u7528VOLUME\u6307\u4ee4\u4f1a\u521b\u5efa\u533f\u540d\u6570\u636e\u5377<br \/>\nFROM nginx:latest<br \/>\nVOLUME \/data<\/p>\n<p><span class=\"token comment\"># \u6784\u5efa\u5e76\u8fd0\u884c<\/span><br \/>\n<span class=\"token function\">docker<\/span> build <span class=\"token parameter variable\">-t<\/span> my-volume-image <span class=\"token builtin class-name\">.<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> vol-test my-volume-image<\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u6302\u8f7d\u4fe1\u606f,\u4f1a\u53d1\u73b0\u4e00\u4e2a\u533f\u540d\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> inspect vol-test <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{json .Mounts}}&#039;<\/span> <span class=\"token operator\">|<\/span> python3 <span class=\"token parameter variable\">-m<\/span> json.tool<\/p>\n<h4>3.10 \u6570\u636e\u5377\u5b9e\u6218: MySQL\u6570\u636e\u6301\u4e45\u5316<\/h4>\n<h5>3.10.1 \u9700\u6c42\u5206\u6790<\/h5>\n<p>\u6211\u4eec\u9700\u8981\u8fd0\u884c\u4e00\u4e2aMySQL\u5bb9\u5668,\u8981\u6c42:<\/p>\n<li>\u6570\u636e\u5e93\u6570\u636e\u6301\u4e45\u5316,\u5bb9\u5668\u5220\u9664\u540e\u6570\u636e\u4e0d\u4e22\u5931<\/li>\n<li>\u914d\u7f6e\u6587\u4ef6\u5916\u90e8\u7ba1\u7406,\u65b9\u4fbf\u4fee\u6539<\/li>\n<li>\u65e5\u5fd7\u6587\u4ef6\u6301\u4e45\u5316<\/li>\n<li>\u521d\u59cb\u5316SQL\u811a\u672c\u81ea\u52a8\u6267\u884c<\/li>\n<h5>3.10.2 \u5b8c\u6574\u5b9e\u73b0<\/h5>\n<p><span class=\"token comment\"># \u6b65\u9aa41:\u521b\u5efa\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create mysql_data<br \/>\n<span class=\"token function\">docker<\/span> volume create mysql_logs<br \/>\n<span class=\"token function\">docker<\/span> volume create mysql_config<\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa42:\u521b\u5efa\u914d\u7f6e\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> \/opt\/mysql\/conf<br \/>\n<span class=\"token function\">cat<\/span> <span class=\"token operator\">&gt;<\/span> \/opt\/mysql\/conf\/my.cnf <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#039;EOF&#039;<br \/>\n[mysqld]<br \/>\ncharacter-set-server&#061;utf8mb4<br \/>\ncollation-server&#061;utf8mb4_unicode_ci<br \/>\nmax_connections&#061;500<br \/>\ninnodb_buffer_pool_size&#061;256M<br \/>\nslow_query_log&#061;1<br \/>\nlong_query_time&#061;2<br \/>\nEOF<\/span><\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa43:\u521b\u5efa\u521d\u59cb\u5316SQL\u811a\u672c<\/span><br \/>\n<span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> \/opt\/mysql\/init<br \/>\n<span class=\"token function\">cat<\/span> <span class=\"token operator\">&gt;<\/span> \/opt\/mysql\/init\/init.sql <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#039;EOF&#039;<br \/>\nCREATE DATABASE IF NOT EXISTS appdb DEFAULT CHARACTER SET utf8mb4;<br \/>\nCREATE USER IF NOT EXISTS &#039;appuser&#039;&#064;&#039;%&#039; IDENTIFIED BY &#039;apppass123&#039;;<br \/>\nGRANT ALL PRIVILEGES ON appdb.* TO &#039;appuser&#039;&#064;&#039;%&#039;;<br \/>\nFLUSH PRIVILEGES;<br \/>\nEOF<\/span><\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa44:\u542f\u52a8MySQL\u5bb9\u5668<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> mysql-prod <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;restart<\/span> unless-stopped <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-p<\/span> <span class=\"token number\">3306<\/span>:3306 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-e<\/span> <span class=\"token assign-left variable\">MYSQL_ROOT_PASSWORD<\/span><span class=\"token operator\">&#061;<\/span>RootPass123<span class=\"token operator\">!<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-e<\/span> <span class=\"token assign-left variable\">MYSQL_DATABASE<\/span><span class=\"token operator\">&#061;<\/span>appdb <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-e<\/span> <span class=\"token assign-left variable\">MYSQL_USER<\/span><span class=\"token operator\">&#061;<\/span>appuser <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-e<\/span> <span class=\"token assign-left variable\">MYSQL_PASSWORD<\/span><span class=\"token operator\">&#061;<\/span>apppass123 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> mysql_data:\/var\/lib\/mysql <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> mysql_logs:\/var\/log\/mysql <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/opt\/mysql\/conf\/my.cnf:\/etc\/mysql\/conf.d\/my.cnf:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/opt\/mysql\/init:\/docker-entrypoint-initdb.d:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  mysql:8.0<\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa45:\u9a8c\u8bc1MySQL\u8fd0\u884c\u72b6\u6001<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> mysql-prod mysql <span class=\"token parameter variable\">-uroot<\/span> -pRootPass123<span class=\"token operator\">!<\/span> <span class=\"token parameter variable\">-e<\/span> <span class=\"token string\">&#034;SHOW DATABASES;&#034;<\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa:<\/span><br \/>\n<span class=\"token comment\"># &#043;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;&#043;<\/span><br \/>\n<span class=\"token comment\"># | Database           |<\/span><br \/>\n<span class=\"token comment\"># &#043;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;&#043;<\/span><br \/>\n<span class=\"token comment\"># | appdb              |<\/span><br \/>\n<span class=\"token comment\"># | information_schema |<\/span><br \/>\n<span class=\"token comment\"># | mysql              |<\/span><br \/>\n<span class=\"token comment\"># | performance_schema |<\/span><br \/>\n<span class=\"token comment\"># | sys                |<\/span><br \/>\n<span class=\"token comment\"># &#043;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;&#043;<\/span><\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa46:\u5199\u5165\u6d4b\u8bd5\u6570\u636e<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> mysql-prod mysql <span class=\"token parameter variable\">-uroot<\/span> -pRootPass123<span class=\"token operator\">!<\/span> appdb <span class=\"token parameter variable\">-e<\/span> <span class=\"token string\">&#034;<br \/>\n  CREATE TABLE users (<br \/>\n    id INT AUTO_INCREMENT PRIMARY KEY,<br \/>\n    name VARCHAR(100) NOT NULL,<br \/>\n    email VARCHAR(100) UNIQUE NOT NULL,<br \/>\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP<br \/>\n  );<br \/>\n  INSERT INTO users (name, email) VALUES (&#039;\u5f20\u4e09&#039;, &#039;zhangsan&#064;example.com&#039;);<br \/>\n  INSERT INTO users (name, email) VALUES (&#039;\u674e\u56db&#039;, &#039;lisi&#064;example.com&#039;);<br \/>\n  SELECT * FROM users;<br \/>\n&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa47:\u6a21\u62df\u5bb9\u5668\u6545\u969c &#8211; \u5220\u9664\u5e76\u91cd\u5efa\u5bb9\u5668<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-f<\/span> mysql-prod<\/p>\n<p><span class=\"token comment\"># \u91cd\u65b0\u542f\u52a8\u5bb9\u5668(\u4f7f\u7528\u76f8\u540c\u7684\u6570\u636e\u5377)<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> mysql-prod <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;restart<\/span> unless-stopped <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-p<\/span> <span class=\"token number\">3306<\/span>:3306 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-e<\/span> <span class=\"token assign-left variable\">MYSQL_ROOT_PASSWORD<\/span><span class=\"token operator\">&#061;<\/span>RootPass123<span class=\"token operator\">!<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> mysql_data:\/var\/lib\/mysql <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> mysql_logs:\/var\/log\/mysql <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/opt\/mysql\/conf\/my.cnf:\/etc\/mysql\/conf.d\/my.cnf:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  mysql:8.0<\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa48:\u9a8c\u8bc1\u6570\u636e\u4f9d\u7136\u5b58\u5728<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> mysql-prod mysql <span class=\"token parameter variable\">-uroot<\/span> -pRootPass123<span class=\"token operator\">!<\/span> appdb <span class=\"token parameter variable\">-e<\/span> <span class=\"token string\">&#034;SELECT * FROM users;&#034;<\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa:<\/span><br \/>\n<span class=\"token comment\"># &#043;&#8212;-&#043;&#8212;&#8212;&#8211;&#043;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-&#043;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#043;<\/span><br \/>\n<span class=\"token comment\"># | id | name   | email                | created_at          |<\/span><br \/>\n<span class=\"token comment\"># &#043;&#8212;-&#043;&#8212;&#8212;&#8211;&#043;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-&#043;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#043;<\/span><br \/>\n<span class=\"token comment\"># |  1 | \u5f20\u4e09   | zhangsan&#064;example.com | 2024-01-15 10:30:00 |<\/span><br \/>\n<span class=\"token comment\"># |  2 | \u674e\u56db   | lisi&#064;example.com     | 2024-01-15 10:30:00 |<\/span><br \/>\n<span class=\"token comment\"># &#043;&#8212;-&#043;&#8212;&#8212;&#8211;&#043;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-&#043;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#043;<\/span><\/p>\n<p><span class=\"token comment\"># \u6570\u636e\u5b8c\u597d\u65e0\u635f!\u8fd9\u5c31\u662f\u6570\u636e\u5377\u6301\u4e45\u5316\u7684\u5a01\u529b\u3002<\/span><\/p>\n<h5>3.10.3 \u4f7f\u7528Docker Compose\u7ba1\u7406<\/h5>\n<p><span class=\"token comment\"># docker-compose.yml<\/span><br \/>\n<span class=\"token key atrule\">version<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;3.8&#039;<\/span><\/p>\n<p><span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">mysql<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> mysql<span class=\"token punctuation\">:<\/span><span class=\"token number\">8.0<\/span><br \/>\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> mysql<span class=\"token punctuation\">&#8211;<\/span>prod<br \/>\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">&#8211;<\/span>stopped<br \/>\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token string\">&#034;3306:3306&#034;<\/span><br \/>\n    <span class=\"token key atrule\">environment<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">MYSQL_ROOT_PASSWORD<\/span><span class=\"token punctuation\">:<\/span> RootPass123<span class=\"token tag\">!<\/span><br \/>\n      <span class=\"token key atrule\">MYSQL_DATABASE<\/span><span class=\"token punctuation\">:<\/span> appdb<br \/>\n      <span class=\"token key atrule\">MYSQL_USER<\/span><span class=\"token punctuation\">:<\/span> appuser<br \/>\n      <span class=\"token key atrule\">MYSQL_PASSWORD<\/span><span class=\"token punctuation\">:<\/span> apppass123<br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> mysql_data<span class=\"token punctuation\">:<\/span>\/var\/lib\/mysql<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> mysql_logs<span class=\"token punctuation\">:<\/span>\/var\/log\/mysql<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> .\/conf\/my.cnf<span class=\"token punctuation\">:<\/span>\/etc\/mysql\/conf.d\/my.cnf<span class=\"token punctuation\">:<\/span>ro<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> .\/init<span class=\"token punctuation\">:<\/span>\/docker<span class=\"token punctuation\">&#8211;<\/span>entrypoint<span class=\"token punctuation\">&#8211;<\/span>initdb.d<span class=\"token punctuation\">:<\/span>ro<br \/>\n    <span class=\"token key atrule\">healthcheck<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">test<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;CMD&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;mysqladmin&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;ping&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-h&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;localhost&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-uroot&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-pRootPass123!&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n      <span class=\"token key atrule\">interval<\/span><span class=\"token punctuation\">:<\/span> 10s<br \/>\n      <span class=\"token key atrule\">timeout<\/span><span class=\"token punctuation\">:<\/span> 5s<br \/>\n      <span class=\"token key atrule\">retries<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">5<\/span><\/p>\n<p><span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">mysql_data<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> mysql_data<br \/>\n  <span class=\"token key atrule\">mysql_logs<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> mysql_logs<\/p>\n<p><span class=\"token comment\"># \u542f\u52a8<\/span><br \/>\n<span class=\"token function\">docker-compose<\/span> up <span class=\"token parameter variable\">-d<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u72b6\u6001<\/span><br \/>\n<span class=\"token function\">docker-compose<\/span> <span class=\"token function\">ps<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u65e5\u5fd7<\/span><br \/>\n<span class=\"token function\">docker-compose<\/span> logs <span class=\"token parameter variable\">-f<\/span> mysql<\/p>\n<p><span class=\"token comment\"># \u505c\u6b62<\/span><br \/>\n<span class=\"token function\">docker-compose<\/span> down<br \/>\n<span class=\"token comment\"># \u6ce8\u610f:down\u4e0d\u4f1a\u5220\u9664\u6570\u636e\u5377,\u4f46down -v\u4f1a\u5220\u9664\u6570\u636e\u5377!<\/span><br \/>\n<span class=\"token comment\"># docker-compose down -v  # \u5371\u9669!\u4f1a\u5220\u9664\u6240\u6709\u6570\u636e!<\/span><\/p>\n<hr \/>\n<h3>\u7b2c\u56db\u7ae0 Bind Mount(\u7ed1\u5b9a\u6302\u8f7d)<\/h3>\n<h4>4.1 \u7ed1\u5b9a\u6302\u8f7d\u7684\u6982\u5ff5\u4e0e\u7279\u70b9<\/h4>\n<h5>4.1.1 \u4ec0\u4e48\u662f\u7ed1\u5b9a\u6302\u8f7d<\/h5>\n<p>\u7ed1\u5b9a\u6302\u8f7d(Bind Mount)\u662fDocker\u63d0\u4f9b\u7684\u53e6\u4e00\u79cd\u6570\u636e\u6301\u4e45\u5316\u673a\u5236\u3002\u4e0e\u6570\u636e\u5377\u4e0d\u540c,\u7ed1\u5b9a\u6302\u8f7d\u5c06\u5bbf\u4e3b\u673a\u4e0a\u7684\u4e00\u4e2a\u7edd\u5bf9\u8def\u5f84\u76f4\u63a5\u6302\u8f7d\u5230\u5bb9\u5668\u4e2d\u3002\u5bb9\u5668\u5bf9\u8be5\u8def\u5f84\u4e0b\u6587\u4ef6\u7684\u8bfb\u5199\u64cd\u4f5c\u76f4\u63a5\u4f5c\u7528\u4e8e\u5bbf\u4e3b\u673a\u7684\u6587\u4ef6\u7cfb\u7edf,\u4e24\u8005\u4e4b\u95f4\u662f&#034;\u53cc\u5411\u540c\u6b65&#034;\u7684\u3002<\/p>\n<p>\u7ed1\u5b9a\u6302\u8f7d\u5728Docker\u7684\u65e9\u671f\u7248\u672c\u4e2d\u5c31\u5df2\u7ecf\u5b58\u5728,\u53ef\u4ee5\u8bf4\u662f\u6700\u53e4\u8001\u7684\u6570\u636e\u6301\u4e45\u5316\u65b9\u5f0f\u4e4b\u4e00\u3002\u5b83\u7684\u6982\u5ff5\u6765\u6e90\u4e8eLinux\u7684mount &#8211;bind\u547d\u4ee4,\u5373\u5c06\u4e00\u4e2a\u76ee\u5f55\u6811\u6302\u8f7d\u5230\u53e6\u4e00\u4e2a\u76ee\u5f55\u6811\u4e0a\u3002<\/p>\n<h5>4.1.2 \u7ed1\u5b9a\u6302\u8f7d\u7684\u6838\u5fc3\u7279\u70b9<\/h5>\n<li>\u4f9d\u8d56\u5bbf\u4e3b\u673a\u8def\u5f84:\u5fc5\u987b\u6307\u5b9a\u5bbf\u4e3b\u673a\u4e0a\u7684\u7edd\u5bf9\u8def\u5f84,\u8def\u5f84\u4e0d\u5b58\u5728\u65f6Docker\u4f1a\u81ea\u52a8\u521b\u5efa\u3002<\/li>\n<li>\u53cc\u5411\u540c\u6b65:\u5bb9\u5668\u5185\u4fee\u6539\u6587\u4ef6\u4f1a\u53cd\u6620\u5230\u5bbf\u4e3b\u673a,\u5bbf\u4e3b\u673a\u4fee\u6539\u6587\u4ef6\u4e5f\u4f1a\u53cd\u6620\u5230\u5bb9\u5668\u5185\u3002<\/li>\n<li>\u7ed5\u8fc7\u5b58\u50a8\u9a71\u52a8:\u4e0e\u6570\u636e\u5377\u4e00\u6837,\u7ed1\u5b9a\u6302\u8f7d\u76f4\u63a5\u64cd\u4f5c\u5bbf\u4e3b\u673a\u6587\u4ef6\u7cfb\u7edf,\u4e0d\u7ecf\u8fc7\u5b58\u50a8\u9a71\u52a8\u3002<\/li>\n<li>\u4e0d\u81ea\u52a8\u590d\u5236\u5185\u5bb9:\u4e0e\u547d\u540d\u6570\u636e\u5377\u4e0d\u540c,\u7ed1\u5b9a\u6302\u8f7d\u4e0d\u4f1a\u5c06\u955c\u50cf\u4e2d\u7684\u5185\u5bb9\u590d\u5236\u5230\u5bbf\u4e3b\u673a\u8def\u5f84\u3002\u5982\u679c\u5bbf\u4e3b\u673a\u8def\u5f84\u4e3a\u7a7a,\u5bb9\u5668\u5185\u6302\u8f7d\u70b9\u4e5f\u662f\u7a7a\u7684(\u4f1a&#034;\u906e\u76d6&#034;\u955c\u50cf\u4e2d\u7684\u539f\u6709\u5185\u5bb9)\u3002<\/li>\n<li>\u65e0\u6cd5\u901a\u8fc7docker volume\u7ba1\u7406:\u7ed1\u5b9a\u6302\u8f7d\u4e0d\u662f\u6570\u636e\u5377,\u4e0d\u80fd\u7528docker volume\u547d\u4ee4\u7ba1\u7406\u3002<\/li>\n<li>\u8def\u5f84\u4f9d\u8d56\u6027\u5f3a:\u5728\u4e0d\u540c\u4e3b\u673a\u4e0a\u8fd0\u884c\u65f6,\u5bbf\u4e3b\u673a\u8def\u5f84\u5fc5\u987b\u4e00\u81f4,\u53ef\u79fb\u690d\u6027\u8f83\u5dee\u3002<\/li>\n<h5>4.1.3 \u7ed1\u5b9a\u6302\u8f7d\u7684\u5de5\u4f5c\u539f\u7406<\/h5>\n<p>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502              \u5bbf\u4e3b\u673a                  \u2502<br \/>\n\u2502                                     \u2502<br \/>\n\u2502  \/home\/user\/project\/                \u2502<br \/>\n\u2502  \u251c\u2500\u2500 src\/                           \u2502<br \/>\n\u2502  \u2502   \u251c\u2500\u2500 app.py                     \u2502<br \/>\n\u2502  \u2502   \u2514\u2500\u2500 utils.py                   \u2502<br \/>\n\u2502  \u251c\u2500\u2500 config\/                        \u2502<br \/>\n\u2502  \u2502   \u2514\u2500\u2500 settings.json              \u2502<br \/>\n\u2502  \u2514\u2500\u2500 requirements.txt               \u2502<br \/>\n\u2502                                     \u2502<br \/>\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502<br \/>\n\u2502  \u2502           Docker \u5bb9\u5668            \u2502\u2502<br \/>\n\u2502  \u2502                                 \u2502\u2502<br \/>\n\u2502  \u2502  \/app\/  \u2190 \u7ed1\u5b9a\u6302\u8f7d\u70b9             \u2502\u2502<br \/>\n\u2502  \u2502  \u251c\u2500\u2500 src\/        \u2190 \u540c\u6b65          \u2502\u2502<br \/>\n\u2502  \u2502  \u2502   \u251c\u2500\u2500 app.py   \u2190 \u540c\u6b65         \u2502\u2502<br \/>\n\u2502  \u2502  \u2502   \u2514\u2500\u2500 utils.py \u2190 \u540c\u6b65         \u2502\u2502<br \/>\n\u2502  \u2502  \u251c\u2500\u2500 config\/     \u2190 \u540c\u6b65          \u2502\u2502<br \/>\n\u2502  \u2502  \u2502   \u2514\u2500\u2500 settings.json \u2190 \u540c\u6b65   \u2502\u2502<br \/>\n\u2502  \u2502  \u2514\u2500\u2500 requirements.txt \u2190 \u540c\u6b65     \u2502\u2502<br \/>\n\u2502  \u2502                                 \u2502\u2502<br \/>\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<p>\u5f53\u7ed1\u5b9a\u6302\u8f7d\u751f\u6548\u65f6,\u5bb9\u5668\u5185\u6302\u8f7d\u70b9\u8def\u5f84\u4e0a\u7684\u5185\u5bb9\u4f1a\u88ab\u5bbf\u4e3b\u673a\u8def\u5f84\u7684\u5185\u5bb9&#034;\u8986\u76d6&#034;\u3002\u5373\u4f7f\u955c\u50cf\u4e2d\u8be5\u8def\u5f84\u4e0b\u6709\u6587\u4ef6,\u8fd9\u4e9b\u6587\u4ef6\u4e5f\u4f1a\u88ab\u9690\u85cf\u3002<\/p>\n<h4>4.2 \u5728docker run\u4e2d\u4f7f\u7528\u7ed1\u5b9a\u6302\u8f7d<\/h4>\n<h5>4.2.1 \u57fa\u672c\u7528\u6cd5(-v\u53c2\u6570)<\/h5>\n<p><span class=\"token comment\"># \u4f7f\u7528-v\u53c2\u6570\u521b\u5efa\u7ed1\u5b9a\u6302\u8f7d<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> dev-server <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/home\/user\/project:\/app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  node:18-alpine<\/p>\n<p><span class=\"token comment\"># \u53c2\u6570\u8bf4\u660e:<\/span><br \/>\n<span class=\"token comment\"># -v \/home\/user\/project:\/app<\/span><br \/>\n<span class=\"token comment\">#   \/home\/user\/project: \u5bbf\u4e3b\u673a\u7edd\u5bf9\u8def\u5f84<\/span><br \/>\n<span class=\"token comment\">#   \/app: \u5bb9\u5668\u5185\u6302\u8f7d\u8def\u5f84<\/span><br \/>\n<span class=\"token comment\">#   \u6ce8\u610f:\u5bbf\u4e3b\u673a\u8def\u5f84\u4ee5 \/ \u5f00\u5934\u8868\u793a\u7ed1\u5b9a\u6302\u8f7d(\u4e0d\u662f\u4ee5\/\u5f00\u5934\u8868\u793a\u6570\u636e\u5377\u540d\u79f0)<\/span><\/p>\n<h5>4.2.2 \u533a\u5206\u7ed1\u5b9a\u6302\u8f7d\u548c\u6570\u636e\u5377<\/h5>\n<p><span class=\"token comment\"># \u7ed1\u5b9a\u6302\u8f7d:\u5bbf\u4e3b\u673a\u8def\u5f84\u4ee5\/\u5f00\u5934(\u6216.\/\u3001~\/\u7b49\u7edd\u5bf9\/\u76f8\u5bf9\u8def\u5f84)<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-v<\/span> \/home\/user\/data:\/data alpine <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span>    <span class=\"token comment\"># \u7ed1\u5b9a\u6302\u8f7d<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-v<\/span> .\/data:\/data alpine <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span>              <span class=\"token comment\"># \u7ed1\u5b9a\u6302\u8f7d(\u76f8\u5bf9\u8def\u5f84)<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-v<\/span> ~\/data:\/data alpine <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span>              <span class=\"token comment\"># \u7ed1\u5b9a\u6302\u8f7d(\u5bb6\u76ee\u5f55)<\/span><\/p>\n<p><span class=\"token comment\"># \u6570\u636e\u5377:\u4e0d\u4ee5\/\u5f00\u5934\u7684\u662f\u6570\u636e\u5377\u540d\u79f0<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-v<\/span> my-volume:\/data alpine <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span>           <span class=\"token comment\"># \u547d\u540d\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-v<\/span> \/data alpine <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span>                     <span class=\"token comment\"># \u533f\u540d\u6570\u636e\u5377(\u53ea\u6709\u5bb9\u5668\u8def\u5f84)<\/span><\/p>\n<h5>4.2.3 \u6302\u8f7d\u5355\u4e2a\u6587\u4ef6<\/h5>\n<p><span class=\"token comment\"># \u7ed1\u5b9a\u6302\u8f7d\u4e5f\u53ef\u4ee5\u6302\u8f7d\u5355\u4e2a\u6587\u4ef6(\u800c\u4e0d\u4ec5\u4ec5\u662f\u76ee\u5f55)<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> nginx-custom <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/opt\/nginx\/nginx.conf:\/etc\/nginx\/nginx.conf:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  nginx:latest<\/p>\n<p><span class=\"token comment\"># \u6ce8\u610f:\u6302\u8f7d\u5355\u4e2a\u6587\u4ef6\u65f6,\u5bbf\u4e3b\u673a\u4e0a\u8be5\u6587\u4ef6\u5fc5\u987b\u5b58\u5728<\/span><br \/>\n<span class=\"token comment\"># \u5982\u679c\u6587\u4ef6\u4e0d\u5b58\u5728,Docker\u4f1a\u5c06\u5176\u521b\u5efa\u4e3a\u4e00\u4e2a\u76ee\u5f55!<\/span><\/p>\n<p><span class=\"token comment\"># \u6f14\u793a\u6587\u4ef6\u6302\u8f7d\u7684\u9519\u8bef\u60c5\u51b5<\/span><br \/>\n<span class=\"token comment\"># \u5982\u679c\u6587\u4ef6\u4e0d\u5b58\u5728,Docker\u4f1a\u521b\u5efa\u76ee\u5f55<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token parameter variable\">-v<\/span> \/tmp\/nonexist.conf:\/etc\/config.conf alpine <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-la<\/span> \/etc\/config.conf<br \/>\n<span class=\"token comment\"># \/etc\/config.conf \u5b9e\u9645\u4e0a\u662f\u4e00\u4e2a\u76ee\u5f55!<\/span><\/p>\n<p><span class=\"token comment\"># \u6b63\u786e\u505a\u6cd5:\u5148\u521b\u5efa\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">touch<\/span> \/tmp\/config.conf<br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token parameter variable\">-v<\/span> \/tmp\/config.conf:\/etc\/config.conf alpine <span class=\"token function\">cat<\/span> \/etc\/config.conf<br \/>\n<span class=\"token comment\"># \u6b63\u5e38\u5de5\u4f5c<\/span><\/p>\n<h5>4.2.4 \u6302\u8f7d\u591a\u4e2a\u7ed1\u5b9a\u6302\u8f7d<\/h5>\n<p><span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> full-dev-env <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/home\/user\/project\/src:\/app\/src <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/home\/user\/project\/config:\/app\/config:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/home\/user\/project\/logs:\/app\/logs <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/home\/user\/.ssh:\/root\/.ssh:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  node:18-alpine<\/p>\n<h4>4.3 \u4f7f\u7528\u2013mount\u53c2\u6570(\u66f4\u660e\u786e\u7684\u8bed\u6cd5)<\/h4>\n<h5>4.3.1 &#8211;mount\u8bed\u6cd5<\/h5>\n<p><span class=\"token comment\"># \u4f7f\u7528&#8211;mount\u53c2\u6570\u521b\u5efa\u7ed1\u5b9a\u6302\u8f7d<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> dev-server <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>bind,src<span class=\"token operator\">&#061;<\/span>\/home\/user\/project,dst<span class=\"token operator\">&#061;<\/span>\/app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  node:18-alpine<\/p>\n<p><span class=\"token comment\"># \u53c2\u6570\u8bf4\u660e:<\/span><br \/>\n<span class=\"token comment\"># type&#061;bind: \u6307\u5b9a\u6302\u8f7d\u7c7b\u578b\u4e3a\u7ed1\u5b9a\u6302\u8f7d<\/span><br \/>\n<span class=\"token comment\"># src&#061;\/home\/user\/project: \u5bbf\u4e3b\u673a\u6e90\u8def\u5f84(\u4e5f\u53ef\u4ee5\u7528source&#061;)<\/span><br \/>\n<span class=\"token comment\"># dst&#061;\/app: \u5bb9\u5668\u5185\u76ee\u6807\u8def\u5f84(\u4e5f\u53ef\u4ee5\u7528destination&#061;\u6216target&#061;)<\/span><\/p>\n<h5>4.3.2 &#8211;mount\u7684\u5b8c\u6574\u9009\u9879<\/h5>\n<p><span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> dev-server <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>bind,<span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token assign-left variable\">src<\/span><span class=\"token operator\">&#061;<\/span>\/home\/user\/project,<span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token assign-left variable\">dst<\/span><span class=\"token operator\">&#061;<\/span>\/app,<span class=\"token punctuation\">\\\\<\/span><br \/>\n    readonly,<span class=\"token punctuation\">\\\\<\/span><br \/>\n    bind-propagation<span class=\"token operator\">&#061;<\/span>rprivate <span class=\"token punctuation\">\\\\<\/span><br \/>\n  node:18-alpine<\/p>\n<p><span class=\"token comment\"># \u9009\u9879\u8bf4\u660e:<\/span><br \/>\n<span class=\"token comment\"># type&#061;bind: \u7ed1\u5b9a\u6302\u8f7d\u7c7b\u578b<\/span><br \/>\n<span class=\"token comment\"># src: \u5bbf\u4e3b\u673a\u6e90\u8def\u5f84<\/span><br \/>\n<span class=\"token comment\"># dst: \u5bb9\u5668\u76ee\u6807\u8def\u5f84<\/span><br \/>\n<span class=\"token comment\"># readonly: \u53ea\u8bfb\u6302\u8f7d<\/span><br \/>\n<span class=\"token comment\"># bind-propagation: \u7ed1\u5b9a\u4f20\u64ad\u6a21\u5f0f(rprivate\/private\/rslave\/slave\/rshared\/shared)<\/span><\/p>\n<h5>4.3.3 \u7ed1\u5b9a\u4f20\u64ad(Bind Propagation)<\/h5>\n<p>\u7ed1\u5b9a\u4f20\u64ad\u63a7\u5236\u5f53\u6302\u8f7d\u70b9\u4e0b\u53c8\u6709\u5176\u4ed6\u6302\u8f7d\u65f6,\u8fd9\u4e9b\u6302\u8f7d\u5982\u4f55\u4f20\u64ad:<\/p>\n<p><span class=\"token comment\"># \u6f14\u793a\u7ed1\u5b9a\u4f20\u64ad<\/span><br \/>\n<span class=\"token comment\"># \u51c6\u5907\u76ee\u5f55\u7ed3\u6784<\/span><br \/>\n<span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> \/tmp\/propagation\/source<br \/>\n<span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> \/tmp\/propagation\/dest<br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;source content&#034;<\/span> <span class=\"token operator\">&gt;<\/span> \/tmp\/propagation\/source\/file.txt<\/p>\n<p><span class=\"token comment\"># rprivate(\u9ed8\u8ba4): \u4e0d\u4f1a\u4f20\u64ad\u4efb\u4f55\u6302\u8f7d<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>bind,src<span class=\"token operator\">&#061;<\/span>\/tmp\/propagation\/source,dst<span class=\"token operator\">&#061;<\/span>\/tmp\/propagation\/dest,bind-propagation<span class=\"token operator\">&#061;<\/span>rprivate <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine <span class=\"token function\">ls<\/span> \/tmp\/propagation\/dest<\/p>\n<p><span class=\"token comment\"># shared: \u6302\u8f7d\u70b9\u4e2d\u7684\u6302\u8f7d\u4f1a\u4f20\u64ad\u5230\u539f\u6302\u8f7d,\u53cd\u4e4b\u4ea6\u7136<\/span><br \/>\n<span class=\"token comment\"># slave: \u53ea\u63a5\u6536\u539f\u6302\u8f7d\u7684\u4f20\u64ad,\u4e0d\u53cd\u5411\u4f20\u64ad<\/span><br \/>\n<span class=\"token comment\"># rshared: \u9012\u5f52shared<\/span><br \/>\n<span class=\"token comment\"># rslave: \u9012\u5f52slave<\/span><br \/>\n<span class=\"token comment\"># private: \u4e0d\u4f20\u64ad<\/span><br \/>\n<span class=\"token comment\"># rprivate: \u9012\u5f52private(\u9ed8\u8ba4)<\/span><\/p>\n<table>\n<tr>\u4f20\u64ad\u6a21\u5f0f\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>rprivate<\/td>\n<td>\u9012\u5f52\u79c1\u6709(\u9ed8\u8ba4),\u4e0d\u4f20\u64ad\u4efb\u4f55\u6302\u8f7d<\/td>\n<\/tr>\n<tr>\n<td>private<\/td>\n<td>\u79c1\u6709,\u4e0d\u4f20\u64ad\u6302\u8f7d<\/td>\n<\/tr>\n<tr>\n<td>rshared<\/td>\n<td>\u9012\u5f52\u5171\u4eab,\u53cc\u5411\u4f20\u64ad\u6240\u6709\u6302\u8f7d<\/td>\n<\/tr>\n<tr>\n<td>shared<\/td>\n<td>\u5171\u4eab,\u53cc\u5411\u4f20\u64ad\u76f4\u63a5\u6302\u8f7d<\/td>\n<\/tr>\n<tr>\n<td>rslave<\/td>\n<td>\u9012\u5f52\u4ece\u5c5e,\u53ea\u63a5\u6536\u539f\u6302\u8f7d\u7684\u4f20\u64ad<\/td>\n<\/tr>\n<tr>\n<td>slave<\/td>\n<td>\u4ece\u5c5e,\u53ea\u63a5\u6536\u539f\u6302\u8f7d\u7684\u76f4\u63a5\u4f20\u64ad<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>4.4 \u7ed1\u5b9a\u6302\u8f7d\u7684\u7edd\u5bf9\u8def\u5f84\u8981\u6c42<\/h4>\n<h5>4.4.1 \u7edd\u5bf9\u8def\u5f84\u89c4\u5219<\/h5>\n<p><span class=\"token comment\"># \u7ed1\u5b9a\u6302\u8f7d\u7684\u5bbf\u4e3b\u673a\u8def\u5f84\u5fc5\u987b\u662f\u7edd\u5bf9\u8def\u5f84<\/span><br \/>\n<span class=\"token comment\"># \u6b63\u786e:\u7edd\u5bf9\u8def\u5f84<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-v<\/span> \/home\/user\/data:\/data alpine <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><\/p>\n<p><span class=\"token comment\"># \u6b63\u786e:\u4f7f\u7528$(pwd)\u5c55\u5f00\u4e3a\u7edd\u5bf9\u8def\u5f84<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-v<\/span> <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token builtin class-name\">pwd<\/span><span class=\"token variable\">)<\/span><\/span>\/data:\/data alpine <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><\/p>\n<p><span class=\"token comment\"># \u9519\u8bef:\u76f8\u5bf9\u8def\u5f84(\u4e0d\u4ee5\/\u5f00\u5934\u4f1a\u88ab\u5f53\u4f5c\u6570\u636e\u5377\u540d\u79f0)<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-v<\/span> data:\/data alpine <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><br \/>\n<span class=\"token comment\"># Docker\u4f1a\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a&#034;data&#034;\u7684\u6570\u636e\u5377,\u800c\u4e0d\u662f\u7ed1\u5b9a\u6302\u8f7d!<\/span><\/p>\n<p><span class=\"token comment\"># \u6b63\u786e:\u4f7f\u7528\u76f8\u5bf9\u8def\u5f84\u5c55\u5f00<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token builtin class-name\">pwd<\/span><span class=\"token variable\">)<\/span><\/span>\/data&#034;<\/span>:\/data alpine <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><\/p>\n<h5>4.4.2 \u4f7f\u7528\u76f8\u5bf9\u8def\u5f84\u7684\u6b63\u786e\u65b9\u5f0f<\/h5>\n<p><span class=\"token comment\"># \u5728\u9879\u76ee\u76ee\u5f55\u4e2d\u4f7f\u7528\u7ed1\u5b9a\u6302\u8f7d<\/span><br \/>\n<span class=\"token builtin class-name\">cd<\/span> \/home\/user\/myproject<\/p>\n<p><span class=\"token comment\"># \u4f7f\u7528$(pwd)\u83b7\u53d6\u5f53\u524d\u76ee\u5f55\u7684\u7edd\u5bf9\u8def\u5f84<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> dev <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token builtin class-name\">pwd<\/span><span class=\"token variable\">)<\/span><\/span>&#034;<\/span>:\/app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  node:18-alpine<\/p>\n<p><span class=\"token comment\"># \u6216\u8005\u4f7f\u7528&#8211;mount\u8bed\u6cd5(\u540c\u6837\u9700\u8981\u7edd\u5bf9\u8def\u5f84)<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> dev <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>bind,src<span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token builtin class-name\">pwd<\/span><span class=\"token variable\">)<\/span><\/span>,dst<span class=\"token operator\">&#061;<\/span>\/app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  node:18-alpine<\/p>\n<p><span class=\"token comment\"># \u5728Windows\u4e0a\u4f7f\u7528PowerShell<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token variable\"><span class=\"token variable\">&#096;<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> dev <span class=\"token variable\">&#096;<\/span><\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">${<span class=\"token environment constant\">PWD<\/span>}<\/span>:\/app&#034;<\/span> &#096;<br \/>\n  node:18-alpine<\/p>\n<p><span class=\"token comment\"># \u5728Windows\u4e0a\u4f7f\u7528CMD<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> ^<br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> dev ^<br \/>\n  <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;%cd%:\/app&#034;<\/span> ^<br \/>\n  node:18-alpine<\/p>\n<h5>4.4.3 \u8def\u5f84\u4e0d\u5b58\u5728\u65f6\u7684\u884c\u4e3a<\/h5>\n<p><span class=\"token comment\"># \u5982\u679c\u5bbf\u4e3b\u673a\u8def\u5f84\u4e0d\u5b58\u5728,Docker\u4f1a\u81ea\u52a8\u521b\u5efa\u4e00\u4e2a\u76ee\u5f55<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token parameter variable\">-v<\/span> \/tmp\/nonexistent-dir:\/data alpine <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-la<\/span> \/data<br \/>\n<span class=\"token comment\"># \/data\u76ee\u5f55\u4f1a\u88ab\u521b\u5efa(\u4e3a\u7a7a)<\/span><\/p>\n<p><span class=\"token comment\"># \u4f46\u5982\u679c\u6302\u8f7d\u7684\u662f\u6587\u4ef6\u4e14\u6587\u4ef6\u4e0d\u5b58\u5728,Docker\u4f1a\u521b\u5efa\u4e00\u4e2a\u76ee\u5f55(\u800c\u975e\u6587\u4ef6)<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token parameter variable\">-v<\/span> \/tmp\/nonexistent-file.txt:\/config.txt alpine <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-la<\/span> \/config.txt<br \/>\n<span class=\"token comment\"># \/config.txt\u5b9e\u9645\u4e0a\u662f\u4e00\u4e2a\u76ee\u5f55,\u800c\u975e\u6587\u4ef6!<\/span><br \/>\n<span class=\"token comment\"># \u8fd9\u53ef\u80fd\u5bfc\u81f4\u5e94\u7528\u62a5\u9519<\/span><\/p>\n<p><span class=\"token comment\"># \u89e3\u51b3\u65b9\u6cd5:\u5148\u5728\u5bbf\u4e3b\u673a\u4e0a\u521b\u5efa\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">touch<\/span> \/tmp\/config.txt<br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token parameter variable\">-v<\/span> \/tmp\/config.txt:\/config.txt alpine <span class=\"token function\">cat<\/span> \/config.txt<\/p>\n<h4>4.5 \u53ea\u8bfb\u7ed1\u5b9a\u6302\u8f7d<\/h4>\n<h5>4.5.1 \u521b\u5efa\u53ea\u8bfb\u7ed1\u5b9a\u6302\u8f7d<\/h5>\n<p><span class=\"token comment\"># \u4f7f\u7528-v\u53c2\u6570<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> config-server <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/opt\/app\/config:\/app\/config:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-app:latest<\/p>\n<p><span class=\"token comment\"># \u4f7f\u7528&#8211;mount\u53c2\u6570<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> config-server <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>bind,src<span class=\"token operator\">&#061;<\/span>\/opt\/app\/config,dst<span class=\"token operator\">&#061;<\/span>\/app\/config,readonly <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-app:latest<\/p>\n<h5>4.5.2 \u53ea\u8bfb\u7ed1\u5b9a\u6302\u8f7d\u7684\u5e94\u7528\u573a\u666f<\/h5>\n<p><span class=\"token comment\"># \u573a\u666f1:\u53ea\u8bfb\u914d\u7f6e\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> nginx-server <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/opt\/nginx\/nginx.conf:\/etc\/nginx\/nginx.conf:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/opt\/nginx\/conf.d:\/etc\/nginx\/conf.d:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  nginx:latest<\/p>\n<p><span class=\"token comment\"># \u573a\u666f2:\u53ea\u8bfb\u9759\u6001\u8d44\u6e90<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> static-server <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/opt\/static:\/usr\/share\/nginx\/html:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  nginx:latest<\/p>\n<p><span class=\"token comment\"># \u573a\u666f3:\u53ea\u8bfbSSL\u8bc1\u4e66<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> https-server <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/opt\/ssl\/certs:\/etc\/ssl\/certs:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/opt\/ssl\/private:\/etc\/ssl\/private:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  nginx:latest<\/p>\n<p><span class=\"token comment\"># \u573a\u666f4:\u53ef\u8bfb\u5199\u7684\u4ee3\u7801\u76ee\u5f55 &#043; \u53ea\u8bfb\u7684\u914d\u7f6e\u76ee\u5f55<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> dev-server <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/home\/user\/project\/src:\/app\/src <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/opt\/app\/config:\/app\/config:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  node:18-alpine<\/p>\n<h4>4.6 \u7ed1\u5b9a\u6302\u8f7d\u4e0e\u6587\u4ef6\u540c\u6b65<\/h4>\n<h5>4.6.1 \u5b9e\u65f6\u53cc\u5411\u540c\u6b65<\/h5>\n<p>\u7ed1\u5b9a\u6302\u8f7d\u7684\u6700\u5927\u4f18\u52bf\u4e4b\u4e00\u662f\u5bbf\u4e3b\u673a\u4e0e\u5bb9\u5668\u4e4b\u95f4\u7684\u6587\u4ef6\u5b9e\u65f6\u53cc\u5411\u540c\u6b65:<\/p>\n<p><span class=\"token comment\"># \u542f\u52a8\u4e00\u4e2a\u7ed1\u5b9a\u6302\u8f7d\u7684\u5bb9\u5668<\/span><br \/>\n<span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> \/tmp\/sync-test<br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> sync-test <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/tmp\/sync-test:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><\/p>\n<p><span class=\"token comment\"># \u5728\u5bbf\u4e3b\u673a\u521b\u5efa\u6587\u4ef6<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Hello from host&#034;<\/span> <span class=\"token operator\">&gt;<\/span> \/tmp\/sync-test\/host-file.txt<\/p>\n<p><span class=\"token comment\"># \u5728\u5bb9\u5668\u4e2d\u67e5\u770b(\u7acb\u5373\u53ef\u89c1)<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> sync-test <span class=\"token function\">cat<\/span> \/data\/host-file.txt<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: Hello from host<\/span><\/p>\n<p><span class=\"token comment\"># \u5728\u5bb9\u5668\u4e2d\u521b\u5efa\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> sync-test <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;echo &#034;Hello from container&#034; &gt; \/data\/container-file.txt&#039;<\/span><\/p>\n<p><span class=\"token comment\"># \u5728\u5bbf\u4e3b\u673a\u67e5\u770b(\u7acb\u5373\u53ef\u89c1)<\/span><br \/>\n<span class=\"token function\">cat<\/span> \/tmp\/sync-test\/container-file.txt<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: Hello from container<\/span><\/p>\n<p><span class=\"token comment\"># \u6e05\u7406<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-f<\/span> sync-test<br \/>\n<span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-rf<\/span> \/tmp\/sync-test<\/p>\n<h5>4.6.2 inotify\u4e8b\u4ef6\u4f20\u64ad<\/h5>\n<p>\u7ed1\u5b9a\u6302\u8f7d\u652f\u6301\u6587\u4ef6\u7cfb\u7edf\u4e8b\u4ef6(inotify)\u7684\u4f20\u64ad,\u8fd9\u4f7f\u5f97\u6587\u4ef6\u76d1\u542c\u5de5\u5177(\u5982nodemon\u3001webpack-dev-server\u7b49)\u53ef\u4ee5\u5728\u5bb9\u5668\u5185\u6b63\u5e38\u8fd0\u884c:<\/p>\n<p><span class=\"token comment\"># \u5728\u5f00\u53d1\u73af\u5883\u4e2d\u4f7f\u7528nodemon\u76d1\u542c\u6587\u4ef6\u53d8\u5316<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> node-dev <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token builtin class-name\">pwd<\/span><span class=\"token variable\">)<\/span><\/span>:\/app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-w<\/span> \/app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  node:18-alpine <span class=\"token punctuation\">\\\\<\/span><br \/>\n  npx nodemon app.js<\/p>\n<p><span class=\"token comment\"># \u5f53\u4f60\u5728\u5bbf\u4e3b\u673a\u4e0a\u4fee\u6539app.js\u65f6,nodemon\u4f1a\u68c0\u6d4b\u5230\u53d8\u5316\u5e76\u81ea\u52a8\u91cd\u542f<\/span><\/p>\n<h4>4.7 \u7ed1\u5b9a\u6302\u8f7d\u5728\u5f00\u53d1\u73af\u5883\u4e2d\u7684\u5e94\u7528<\/h4>\n<h5>4.7.1 \u4ee3\u7801\u70ed\u91cd\u8f7d(Node.js)<\/h5>\n<p><span class=\"token comment\"># \u9879\u76ee\u7ed3\u6784<\/span><br \/>\n<span class=\"token comment\"># \/home\/user\/myapp\/<\/span><br \/>\n<span class=\"token comment\"># \u251c\u2500\u2500 package.json<\/span><br \/>\n<span class=\"token comment\"># \u251c\u2500\u2500 src\/<\/span><br \/>\n<span class=\"token comment\"># \u2502   \u251c\u2500\u2500 index.js<\/span><br \/>\n<span class=\"token comment\"># \u2502   \u2514\u2500\u2500 routes.js<\/span><br \/>\n<span class=\"token comment\"># \u251c\u2500\u2500 node_modules\/<\/span><br \/>\n<span class=\"token comment\"># \u2514\u2500\u2500 Dockerfile<\/span><\/p>\n<p><span class=\"token comment\"># Dockerfile<\/span><br \/>\n<span class=\"token comment\"># FROM node:18-alpine<\/span><br \/>\n<span class=\"token comment\"># WORKDIR \/app<\/span><br \/>\n<span class=\"token comment\"># COPY package.json .<\/span><br \/>\n<span class=\"token comment\"># RUN npm install<\/span><br \/>\n<span class=\"token comment\"># EXPOSE 3000<\/span><br \/>\n<span class=\"token comment\"># CMD [&#034;npm&#034;, &#034;start&#034;]<\/span><\/p>\n<p><span class=\"token comment\"># \u4f7f\u7528\u7ed1\u5b9a\u6302\u8f7d\u5b9e\u73b0\u70ed\u91cd\u8f7d<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> node-dev <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-p<\/span> <span class=\"token number\">3000<\/span>:3000 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/home\/user\/myapp:\/app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-w<\/span> \/app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  node:18-alpine <span class=\"token punctuation\">\\\\<\/span><br \/>\n  npx nodemon <span class=\"token parameter variable\">&#8211;watch<\/span> src src\/index.js<\/p>\n<p><span class=\"token comment\"># \u4fee\u6539\u5bbf\u4e3b\u673a\u4e0a\u7684src\/index.js,\u5bb9\u5668\u5185\u7684\u5e94\u7528\u4f1a\u81ea\u52a8\u91cd\u542f<\/span><\/p>\n<h5>4.7.2 Python Flask\u70ed\u91cd\u8f7d<\/h5>\n<p><span class=\"token comment\"># \u4f7f\u7528Flask\u7684debug\u6a21\u5f0f\u5b9e\u73b0\u70ed\u91cd\u8f7d<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> flask-dev <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-p<\/span> <span class=\"token number\">5000<\/span>:5000 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token builtin class-name\">pwd<\/span><span class=\"token variable\">)<\/span><\/span>:\/app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-w<\/span> \/app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  python:3.11-slim <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">bash<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#034;pip install flask &amp;&amp; flask &#8211;app app run &#8211;host&#061;0.0.0.0 &#8211;debug &#8211;reload&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u4fee\u6539app.py,Flask\u4f1a\u81ea\u52a8\u91cd\u8f7d<\/span><\/p>\n<h5>4.7.3 \u907f\u514dnode_modules\u8986\u76d6\u95ee\u9898<\/h5>\n<p><span class=\"token comment\"># \u95ee\u9898:\u7ed1\u5b9a\u6302\u8f7d\u4f1a\u8986\u76d6\u5bb9\u5668\u5185\u7684node_modules<\/span><br \/>\n<span class=\"token comment\"># \u89e3\u51b3\u65b9\u6cd5:\u4f7f\u7528\u533f\u540d\u6570\u636e\u5377\u4fdd\u62a4node_modules<\/span><\/p>\n<p><span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> node-dev <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-p<\/span> <span class=\"token number\">3000<\/span>:3000 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token builtin class-name\">pwd<\/span><span class=\"token variable\">)<\/span><\/span>:\/app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/app\/node_modules <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-w<\/span> \/app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  node:18-alpine <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">npm<\/span> start<\/p>\n<p><span class=\"token comment\"># \u8bf4\u660e:<\/span><br \/>\n<span class=\"token comment\"># -v $(pwd):\/app: \u7ed1\u5b9a\u6302\u8f7d\u9879\u76ee\u76ee\u5f55<\/span><br \/>\n<span class=\"token comment\"># -v \/app\/node_modules: \u533f\u540d\u6570\u636e\u5377,\u4fdd\u62a4\u5bb9\u5668\u5185\u7684node_modules\u4e0d\u88ab\u5bbf\u4e3b\u673a\u8986\u76d6<\/span><br \/>\n<span class=\"token comment\"># Docker\u4f1a\u5148\u5904\u7406\u7ed1\u5b9a\u6302\u8f7d,\u518d\u5904\u7406\u533f\u540d\u5377,\u6240\u4ee5node_modules\u4f1a\u88ab\u5355\u72ec\u6302\u8f7d<\/span><\/p>\n<h4>4.8 \u7ed1\u5b9a\u6302\u8f7d\u7684\u6743\u9650\u95ee\u9898<\/h4>\n<h5>4.8.1 Linux\u4e0a\u7684\u6743\u9650\u95ee\u9898<\/h5>\n<p><span class=\"token comment\"># \u5728Linux\u4e0a,\u7ed1\u5b9a\u6302\u8f7d\u76f4\u63a5\u4f7f\u7528\u5bbf\u4e3b\u673a\u7684UID\/GID<\/span><br \/>\n<span class=\"token comment\"># \u5982\u679c\u5bb9\u5668\u5185\u4ee5\u975eroot\u7528\u6237\u8fd0\u884c,\u9700\u8981\u786e\u4fddUID\u5339\u914d<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u5bbf\u4e3b\u673a\u5f53\u524d\u7528\u6237\u7684UID<\/span><br \/>\n<span class=\"token function\">id<\/span> <span class=\"token parameter variable\">-u<\/span>  <span class=\"token comment\"># \u4f8b\u5982:1000<\/span><\/p>\n<p><span class=\"token comment\"># \u65b9\u6cd51:Dockerfile\u4e2d\u521b\u5efa\u76f8\u540cUID\u7684\u7528\u6237<\/span><br \/>\n<span class=\"token comment\"># Dockerfile:<\/span><br \/>\n<span class=\"token comment\"># FROM node:18-alpine<\/span><br \/>\n<span class=\"token comment\"># RUN addgroup -g 1000 appgroup &amp;&amp; adduser -u 1000 -G appgroup -s \/bin\/sh -D appuser<\/span><br \/>\n<span class=\"token comment\"># USER appuser<\/span><\/p>\n<p><span class=\"token comment\"># \u65b9\u6cd52:\u8fd0\u884c\u65f6\u6307\u5b9a\u7528\u6237<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> dev <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;user<\/span> <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">id<\/span> <span class=\"token parameter variable\">-u<\/span><span class=\"token variable\">)<\/span><\/span><span class=\"token builtin class-name\">:<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">id<\/span> <span class=\"token parameter variable\">-g<\/span><span class=\"token variable\">)<\/span><\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token builtin class-name\">pwd<\/span><span class=\"token variable\">)<\/span><\/span>:\/app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  node:18-alpine<\/p>\n<h5>4.8.2 macOS\u4e0a\u7684\u7279\u6b8a\u5904\u7406<\/h5>\n<p>\u5728macOS\u4e0a\u4f7f\u7528Docker Desktop\u65f6,\u7ed1\u5b9a\u6302\u8f7d\u901a\u8fc7\u4e00\u4e2aLinux\u865a\u62df\u673a\u4e2d\u8f6c,\u5b58\u5728\u4ee5\u4e0b\u7279\u70b9:<\/p>\n<p><span class=\"token comment\"># macOS\u4e0aDocker Desktop\u4f7f\u7528VirtioFS\u6216osxfs\u8fdb\u884c\u6587\u4ef6\u5171\u4eab<\/span><br \/>\n<span class=\"token comment\"># 1. \u6587\u4ef6\u6743\u9650\u81ea\u52a8\u8f6c\u6362<\/span><br \/>\n<span class=\"token comment\"># 2. \u6027\u80fd\u6bd4Linux\u539f\u751f\u7ed1\u5b9a\u6302\u8f7d\u7a0d\u5dee<\/span><br \/>\n<span class=\"token comment\"># 3. \u53ef\u4ee5\u901a\u8fc7Docker Desktop\u8bbe\u7f6e\u914d\u7f6e\u6587\u4ef6\u5171\u4eab\u8def\u5f84<\/span><\/p>\n<p><span class=\"token comment\"># \u5728Docker Desktop\u4e2d\u8bbe\u7f6e:<\/span><br \/>\n<span class=\"token comment\"># Settings \u2192 Resources \u2192 File Sharing<\/span><br \/>\n<span class=\"token comment\"># \u786e\u4fdd\u7ed1\u5b9a\u7684\u8def\u5f84\u5728\u5171\u4eab\u5217\u8868\u4e2d<\/span><\/p>\n<p><span class=\"token comment\"># \u6027\u80fd\u4f18\u5316:\u4f7f\u7528\u7f13\u5b58\u9009\u9879(\u4ec5macOS)<\/span><br \/>\n<span class=\"token comment\"># \u5728docker-compose.yml\u4e2d:<\/span><br \/>\n<span class=\"token comment\"># volumes:<\/span><br \/>\n<span class=\"token comment\">#   &#8211; type: bind<\/span><br \/>\n<span class=\"token comment\">#     source: .\/src<\/span><br \/>\n<span class=\"token comment\">#     target: \/app\/src<\/span><br \/>\n<span class=\"token comment\">#     consistency: cached  # macOS\u4e13\u7528,\u63d0\u9ad8\u8bfb\u53d6\u6027\u80fd<\/span><br \/>\n<span class=\"token comment\">#     # consistency: delegated  # \u5bb9\u5668\u5185\u7684\u4fee\u6539\u5ef6\u8fdf\u540c\u6b65\u5230\u5bbf\u4e3b\u673a<\/span><br \/>\n<span class=\"token comment\">#     # consistency: consistent  # \u9ed8\u8ba4,\u5b8c\u5168\u4e00\u81f4<\/span><\/p>\n<h5>4.8.3 Windows\u4e0a\u7684\u7279\u6b8a\u5904\u7406<\/h5>\n<p><span class=\"token comment\"># \u5728Windows\u4e0a,\u8def\u5f84\u683c\u5f0f\u4e0d\u540c<\/span><br \/>\n<span class=\"token comment\"># \u4f7f\u7528PowerShell:<\/span><br \/>\ndocker run <span class=\"token operator\">&#8211;<\/span>d &#096;<br \/>\n  <span class=\"token operator\">&#8212;<\/span>name dev &#096;<br \/>\n  <span class=\"token operator\">&#8211;<\/span>v <span class=\"token string\">&#034;${PWD}\\\\src:\/app\/src&#034;<\/span> &#096;<br \/>\n  node:18-alpine<\/p>\n<p><span class=\"token comment\"># \u6216\u8005\u4f7f\u7528\u6b63\u659c\u6760(\u63a8\u8350):<\/span><br \/>\ndocker run <span class=\"token operator\">&#8211;<\/span>d &#096;<br \/>\n  <span class=\"token operator\">&#8212;<\/span>name dev &#096;<br \/>\n  <span class=\"token operator\">&#8211;<\/span>v <span class=\"token string\">&#034;${PWD}\/src:\/app\/src&#034;<\/span> &#096;<br \/>\n  node:18-alpine<\/p>\n<p><span class=\"token comment\"># Windows\u8def\u5f84\u7684\u7279\u6b8a\u5904\u7406:<\/span><br \/>\n<span class=\"token comment\"># 1. \u76d8\u7b26\u8def\u5f84(C:\\\\&#8230;)\u4f1a\u88ab\u8f6c\u6362\u4e3aLinux\u8def\u5f84<\/span><br \/>\n<span class=\"token comment\"># 2. \u4f7f\u7528Docker Desktop\u7684WSL2\u540e\u7aef\u6027\u80fd\u66f4\u597d<\/span><br \/>\n<span class=\"token comment\"># 3. \u9700\u8981\u5728Docker Desktop\u8bbe\u7f6e\u4e2d\u5f00\u542f\u6587\u4ef6\u5171\u4eab<\/span><\/p>\n<p><span class=\"token comment\"># \u6ce8\u610fWindows\u4e0a\u7684\u6362\u884c\u7b26\u95ee\u9898(CRLF vs LF)<\/span><br \/>\n<span class=\"token comment\"># \u5efa\u8bae:.gitattributes\u4e2d\u8bbe\u7f6e * text&#061;auto eol&#061;lf<\/span><\/p>\n<h4>4.9 Bind Mount vs Volume\u5bf9\u6bd4<\/h4>\n<table>\n<tr>\u5bf9\u6bd4\u9879Bind Mount(\u7ed1\u5b9a\u6302\u8f7d)Volume(\u6570\u636e\u5377)<\/tr>\n<tbody>\n<tr>\n<td>\u521b\u5efa\u65b9\u5f0f<\/td>\n<td>\u76f4\u63a5\u4f7f\u7528\u5bbf\u4e3b\u673a\u8def\u5f84<\/td>\n<td>docker volume create\u6216\u81ea\u52a8\u521b\u5efa<\/td>\n<\/tr>\n<tr>\n<td>\u5b58\u50a8\u4f4d\u7f6e<\/td>\n<td>\u5bbf\u4e3b\u673a\u4efb\u610f\u8def\u5f84<\/td>\n<td>\/var\/lib\/docker\/volumes\/<\/td>\n<\/tr>\n<tr>\n<td>\u7ba1\u7406\u65b9\u5f0f<\/td>\n<td>\u76f4\u63a5\u64cd\u4f5c\u5bbf\u4e3b\u673a\u6587\u4ef6<\/td>\n<td>docker volume\u547d\u4ee4\u65cf<\/td>\n<\/tr>\n<tr>\n<td>\u751f\u547d\u5468\u671f<\/td>\n<td>\u4f9d\u8d56\u5bbf\u4e3b\u673a\u6587\u4ef6<\/td>\n<td>\u72ec\u7acb\u4e8e\u5bb9\u5668<\/td>\n<\/tr>\n<tr>\n<td>\u521d\u59cb\u5185\u5bb9<\/td>\n<td>\u4e0d\u590d\u5236\u955c\u50cf\u5185\u5bb9(\u8986\u76d6)<\/td>\n<td>\u547d\u540d\u5377\u4f1a\u590d\u5236\u955c\u50cf\u5185\u5bb9<\/td>\n<\/tr>\n<tr>\n<td>\u53ef\u79fb\u690d\u6027<\/td>\n<td>\u5dee(\u8def\u5f84\u4f9d\u8d56)<\/td>\n<td>\u597d<\/td>\n<\/tr>\n<tr>\n<td>\u5907\u4efd\u6062\u590d<\/td>\n<td>\u76f4\u63a5\u64cd\u4f5c\u6587\u4ef6<\/td>\n<td>\u9700\u8981\u901a\u8fc7\u5bb9\u5668\u64cd\u4f5c<\/td>\n<\/tr>\n<tr>\n<td>\u6743\u9650\u63a7\u5236<\/td>\n<td>\u4f9d\u8d56\u5bbf\u4e3b\u673a\u6743\u9650<\/td>\n<td>Docker\u7ba1\u7406\u6743\u9650<\/td>\n<\/tr>\n<tr>\n<td>\u8de8\u5e73\u53f0<\/td>\n<td>\u8def\u5f84\u683c\u5f0f\u4e0d\u540c<\/td>\n<td>\u7edf\u4e00\u7ba1\u7406<\/td>\n<\/tr>\n<tr>\n<td>\u9a71\u52a8\u652f\u6301<\/td>\n<td>\u4e0d\u652f\u6301<\/td>\n<td>\u652f\u6301\u591a\u79cd\u9a71\u52a8<\/td>\n<\/tr>\n<tr>\n<td>\u591a\u5bb9\u5668\u5171\u4eab<\/td>\n<td>\u652f\u6301<\/td>\n<td>\u652f\u6301<\/td>\n<\/tr>\n<tr>\n<td>\u9002\u5408\u573a\u666f<\/td>\n<td>\u5f00\u53d1\u73af\u5883\u3001\u914d\u7f6e\u6587\u4ef6\u6302\u8f7d<\/td>\n<td>\u751f\u4ea7\u73af\u5883\u6570\u636e\u6301\u4e45\u5316<\/td>\n<\/tr>\n<tr>\n<td>\u5b89\u5168\u6027<\/td>\n<td>\u4e2d(\u76f4\u63a5\u64cd\u4f5c\u5bbf\u4e3b\u673a)<\/td>\n<td>\u9ad8(\u9694\u79bb\u7ba1\u7406)<\/td>\n<\/tr>\n<tr>\n<td>\u6027\u80fd<\/td>\n<td>\u63a5\u8fd1\u539f\u751f<\/td>\n<td>\u63a5\u8fd1\u539f\u751f<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u9009\u62e9\u5efa\u8bae:<\/p>\n<ul>\n<li>\u751f\u4ea7\u73af\u5883:\u4f18\u5148\u4f7f\u7528\u6570\u636e\u5377(Volume),\u4fbf\u4e8e\u7ba1\u7406\u3001\u5907\u4efd\u548c\u8fc1\u79fb\u3002<\/li>\n<li>\u5f00\u53d1\u73af\u5883:\u4f7f\u7528\u7ed1\u5b9a\u6302\u8f7d(Bind Mount),\u65b9\u4fbf\u4ee3\u7801\u70ed\u91cd\u8f7d\u3002<\/li>\n<li>\u914d\u7f6e\u6587\u4ef6:\u4e24\u79cd\u90fd\u53ef\u4ee5,\u7ed1\u5b9a\u6302\u8f7d\u66f4\u76f4\u89c2\u3002<\/li>\n<li>\u6570\u636e\u5e93\u6570\u636e:\u5fc5\u987b\u4f7f\u7528\u6570\u636e\u5377,\u4e0d\u8981\u4f7f\u7528\u7ed1\u5b9a\u6302\u8f7d\u3002<\/li>\n<\/ul>\n<h4>4.10 \u7ed1\u5b9a\u6302\u8f7d\u5b9e\u6218: \u5f00\u53d1\u73af\u5883\u4ee3\u7801\u70ed\u66f4\u65b0<\/h4>\n<h5>4.10.1 \u9879\u76ee\u7ed3\u6784<\/h5>\n<p>my-webapp\/<br \/>\n\u251c\u2500\u2500 docker-compose.yml<br \/>\n\u251c\u2500\u2500 Dockerfile<br \/>\n\u251c\u2500\u2500 package.json<br \/>\n\u251c\u2500\u2500 src\/<br \/>\n\u2502   \u251c\u2500\u2500 index.js<br \/>\n\u2502   \u251c\u2500\u2500 routes\/<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 users.js<br \/>\n\u2502   \u2502   \u2514\u2500\u2500 products.js<br \/>\n\u2502   \u2514\u2500\u2500 public\/<br \/>\n\u2502       \u251c\u2500\u2500 index.html<br \/>\n\u2502       \u2514\u2500\u2500 styles.css<br \/>\n\u2514\u2500\u2500 config\/<br \/>\n    \u2514\u2500\u2500 config.json<\/p>\n<h5>4.10.2 Dockerfile<\/h5>\n<p># Dockerfile<br \/>\nFROM node:18-alpine<\/p>\n<p># \u8bbe\u7f6e\u5de5\u4f5c\u76ee\u5f55<br \/>\nWORKDIR \/app<\/p>\n<p># \u590d\u5236package.json\u5e76\u5b89\u88c5\u4f9d\u8d56<br \/>\nCOPY package.json package-lock.json .\/<br \/>\nRUN npm ci &#8211;only&#061;production<\/p>\n<p># \u5b89\u88c5\u5f00\u53d1\u4f9d\u8d56<br \/>\nRUN npm install &#8211;only&#061;dev<\/p>\n<p># \u66b4\u9732\u7aef\u53e3<br \/>\nEXPOSE 3000<\/p>\n<p># \u4f7f\u7528nodemon\u542f\u52a8(\u652f\u6301\u70ed\u91cd\u8f7d)<br \/>\nCMD [&#034;npx&#034;, &#034;nodemon&#034;, &#034;&#8211;watch&#034;, &#034;src&#034;, &#034;src\/index.js&#034;]<\/p>\n<h5>4.10.3 docker-compose.yml<\/h5>\n<p><span class=\"token comment\"># docker-compose.yml<\/span><br \/>\n<span class=\"token key atrule\">version<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;3.8&#039;<\/span><\/p>\n<p><span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">webapp<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">build<\/span><span class=\"token punctuation\">:<\/span> .<br \/>\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> webapp<span class=\"token punctuation\">&#8211;<\/span>dev<br \/>\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token string\">&#034;3000:3000&#034;<\/span><br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token comment\"># \u7ed1\u5b9a\u6302\u8f7d:\u6e90\u4ee3\u7801\u76ee\u5f55(\u652f\u6301\u70ed\u91cd\u8f7d)<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> .\/src<span class=\"token punctuation\">:<\/span>\/app\/src<br \/>\n      <span class=\"token comment\"># \u7ed1\u5b9a\u6302\u8f7d:\u914d\u7f6e\u6587\u4ef6(\u53ea\u8bfb)<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> .\/config<span class=\"token punctuation\">:<\/span>\/app\/config<span class=\"token punctuation\">:<\/span>ro<br \/>\n      <span class=\"token comment\"># \u533f\u540d\u6570\u636e\u5377:\u4fdd\u62a4node_modules\u4e0d\u88ab\u8986\u76d6<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> \/app\/node_modules<br \/>\n    <span class=\"token key atrule\">environment<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> NODE_ENV&#061;development<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> CHOKIDAR_USEPOLLING&#061;true  <span class=\"token comment\"># \u786e\u4fdd\u6587\u4ef6\u53d8\u5316\u68c0\u6d4b\u5728\u6240\u6709\u5e73\u53f0\u4e0a\u6b63\u5e38\u5de5\u4f5c<\/span><br \/>\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">&#8211;<\/span>stopped<\/p>\n<h5>4.10.4 \u8fd0\u884c\u4e0e\u9a8c\u8bc1<\/h5>\n<p><span class=\"token comment\"># \u542f\u52a8\u5f00\u53d1\u73af\u5883<\/span><br \/>\n<span class=\"token function\">docker-compose<\/span> up <span class=\"token parameter variable\">-d<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u65e5\u5fd7<\/span><br \/>\n<span class=\"token function\">docker-compose<\/span> logs <span class=\"token parameter variable\">-f<\/span> webapp<\/p>\n<p><span class=\"token comment\"># \u4fee\u6539src\/index.js(\u5728\u5bbf\u4e3b\u673a\u4e0a)<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#039;app.get(&#034;\/health&#034;, (req, res) &#061;&gt; res.json({status: &#034;ok&#034;}));&#039;<\/span> <span class=\"token operator\">&gt;&gt;<\/span> src\/index.js<\/p>\n<p><span class=\"token comment\"># nodemon\u4f1a\u81ea\u52a8\u68c0\u6d4b\u5230\u53d8\u5316\u5e76\u91cd\u542f\u5e94\u7528<\/span><br \/>\n<span class=\"token comment\"># \u65e5\u5fd7\u4e2d\u4f1a\u51fa\u73b0: [nodemon] restarting due to changes&#8230;<\/span><\/p>\n<p><span class=\"token comment\"># \u6d4b\u8bd5\u65b0\u6dfb\u52a0\u7684\u8def\u7531<\/span><br \/>\n<span class=\"token function\">curl<\/span> http:\/\/localhost:3000\/health<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: {&#034;status&#034;:&#034;ok&#034;}<\/span><\/p>\n<p><span class=\"token comment\"># \u4fee\u6539\u914d\u7f6e\u6587\u4ef6<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#039;{&#034;debug&#034;: true}&#039;<\/span> <span class=\"token operator\">&gt;<\/span> config\/config.json<\/p>\n<p><span class=\"token comment\"># \u5e94\u7528\u53ef\u4ee5\u8bfb\u53d6\u6700\u65b0\u7684\u914d\u7f6e\u6587\u4ef6\u5185\u5bb9(\u56e0\u4e3a\u7ed1\u5b9a\u6302\u8f7d\u662f\u5b9e\u65f6\u7684)<\/span><\/p>\n<h5>4.10.5 \u5f00\u53d1\u73af\u5883\u7684\u6700\u4f73\u5b9e\u8df5<\/h5>\n<p><span class=\"token comment\"># 1. \u4f7f\u7528.dockerignore\u907f\u514d\u4e0d\u5fc5\u8981\u7684\u6587\u4ef6\u88abCOPY<\/span><br \/>\n<span class=\"token comment\"># .dockerignore:<\/span><br \/>\n<span class=\"token comment\"># node_modules<\/span><br \/>\n<span class=\"token comment\"># .git<\/span><br \/>\n<span class=\"token comment\"># *.md<\/span><br \/>\n<span class=\"token comment\"># .env<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u4f7f\u7528docker-compose.override.yml\u8986\u76d6\u5f00\u53d1\u914d\u7f6e<\/span><br \/>\n<span class=\"token comment\"># docker-compose.yml(\u57fa\u7840\u914d\u7f6e)<\/span><br \/>\n<span class=\"token comment\"># docker-compose.override.yml(\u5f00\u53d1\u8986\u76d6\u914d\u7f6e,\u81ea\u52a8\u52a0\u8f7d)<\/span><\/p>\n<p><span class=\"token comment\"># 3. \u4f7f\u7528\u73af\u5883\u53d8\u91cf\u7ba1\u7406\u914d\u7f6e<\/span><br \/>\n<span class=\"token comment\"># .env\u6587\u4ef6:<\/span><br \/>\n<span class=\"token comment\"># NODE_ENV&#061;development<\/span><br \/>\n<span class=\"token comment\"># PORT&#061;3000<\/span><\/p>\n<p><span class=\"token comment\"># 4. \u5f00\u53d1\u5de5\u5177\u96c6\u6210<\/span><br \/>\n<span class=\"token comment\"># VS Code\u7684Dev Containers\u6269\u5c55\u53ef\u4ee5\u76f4\u63a5\u5728\u5bb9\u5668\u5185\u5f00\u53d1<\/span><br \/>\n<span class=\"token comment\"># \u4f7f\u7528.devcontainer\/devcontainer.json\u914d\u7f6e<\/span><\/p>\n<p><span class=\"token comment\">\/\/ .devcontainer\/devcontainer.json<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token string-property property\">&#034;name&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;Node.js Dev&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token string-property property\">&#034;build&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string-property property\">&#034;dockerfile&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;..\/Dockerfile&#034;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token string-property property\">&#034;forwardPorts&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token number\">3000<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token string-property property\">&#034;mounts&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n    <span class=\"token string\">&#034;source&#061;${localWorkspaceFolder}\/src,target&#061;\/app\/src,type&#061;bind,consistency&#061;cached&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;source&#061;${localWorkspaceFolder}\/config,target&#061;\/app\/config,type&#061;bind&#034;<\/span><br \/>\n  <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token string-property property\">&#034;remoteEnv&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string-property property\">&#034;NODE_ENV&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;development&#034;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token string-property property\">&#034;postCreateCommand&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;npm install&#034;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<hr \/>\n<h3>\u7b2c\u4e94\u7ae0 tmpfs Mount(\u4e34\u65f6\u6587\u4ef6\u7cfb\u7edf)<\/h3>\n<h4>5.1 tmpfs\u6302\u8f7d\u7684\u6982\u5ff5\u4e0e\u7279\u70b9<\/h4>\n<h5>5.1.1 \u4ec0\u4e48\u662ftmpfs\u6302\u8f7d<\/h5>\n<p>tmpfs\u6302\u8f7d\u662fDocker\u63d0\u4f9b\u7684\u7b2c\u4e09\u79cd\u5b58\u50a8\u65b9\u5f0f\u3002\u4e0e\u6570\u636e\u5377\u548c\u7ed1\u5b9a\u6302\u8f7d\u4e0d\u540c,tmpfs\u5c06\u6570\u636e\u5b58\u50a8\u5728\u5bbf\u4e3b\u673a\u7684**\u5185\u5b58(RAM)**\u4e2d,\u800c\u4e0d\u662f\u78c1\u76d8\u4e0a\u3002\u8fd9\u610f\u5473\u7740tmpfs\u4e2d\u7684\u6570\u636e\u8bfb\u5199\u901f\u5ea6\u6781\u5feb,\u4f46\u5bb9\u5668\u505c\u6b62\u540e\u6570\u636e\u5c31\u4f1a\u6d88\u5931,\u4e0d\u4f1a\u6301\u4e45\u5316\u5230\u78c1\u76d8\u3002<\/p>\n<p>tmpfs\u662fLinux\u5185\u6838\u63d0\u4f9b\u7684\u4e34\u65f6\u6587\u4ef6\u7cfb\u7edf,\u5b83\u5c06\u4e00\u90e8\u5206\u5185\u5b58\u4f5c\u4e3a\u6587\u4ef6\u7cfb\u7edf\u4f7f\u7528\u3002Docker\u5229\u7528\u8fd9\u4e00\u673a\u5236,\u5141\u8bb8\u5bb9\u5668\u5c06\u7279\u5b9a\u8def\u5f84\u6302\u8f7d\u4e3atmpfs,\u5b9e\u73b0\u9ad8\u901f\u4e34\u65f6\u5b58\u50a8\u3002<\/p>\n<h5>5.1.2 tmpfs\u6302\u8f7d\u7684\u6838\u5fc3\u7279\u70b9<\/h5>\n<li>\u5b58\u50a8\u5728\u5185\u5b58\u4e2d:\u6570\u636e\u5b58\u50a8\u5728\u5bbf\u4e3b\u673aRAM\u4e2d,\u4e0d\u5199\u5165\u78c1\u76d8\u3002<\/li>\n<li>\u6781\u5feb\u7684\u8bfb\u5199\u901f\u5ea6:\u5185\u5b58\u8bfb\u5199\u901f\u5ea6\u8fdc\u8d85\u78c1\u76d8,\u9002\u5408\u9ad8\u9891\u8bfb\u5199\u573a\u666f\u3002<\/li>\n<li>\u4e34\u65f6\u6027:\u5bb9\u5668\u505c\u6b62\u540e\u6570\u636e\u6d88\u5931,\u4e0d\u4f1a\u5728\u78c1\u76d8\u4e0a\u7559\u4e0b\u75d5\u8ff9\u3002<\/li>\n<li>\u5b89\u5168\u6027\u9ad8:\u6570\u636e\u4e0d\u843d\u76d8,\u9002\u5408\u5b58\u50a8\u654f\u611f\u4fe1\u606f(\u5982\u5bc6\u94a5\u3001\u4ee4\u724c)\u3002<\/li>\n<li>\u53d7\u5185\u5b58\u9650\u5236:\u53ef\u7528\u7a7a\u95f4\u53d7\u5bbf\u4e3b\u673a\u53ef\u7528\u5185\u5b58\u9650\u5236\u3002<\/li>\n<li>\u4ec5\u652f\u6301Linux:tmpfs\u662fLinux\u7279\u6027,\u5728Windows\u5bb9\u5668\u4e0a\u4e0d\u652f\u6301\u3002<\/li>\n<li>\u5355\u5bb9\u5668\u4f7f\u7528:tmpfs\u6302\u8f7d\u4e0d\u80fd\u5728\u591a\u4e2a\u5bb9\u5668\u4e4b\u95f4\u5171\u4eab\u3002<\/li>\n<li>\u65e0\u6cd5\u901a\u8fc7docker volume\u7ba1\u7406:tmpfs\u4e0d\u662f\u6570\u636e\u5377,\u4e0d\u80fd\u7528docker volume\u547d\u4ee4\u7ba1\u7406\u3002<\/li>\n<h5>5.1.3 tmpfs vs Volume vs Bind Mount<\/h5>\n<p>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502                   \u5b58\u50a8\u4f4d\u7f6e\u5bf9\u6bd4                       \u2502<br \/>\n\u2502                                                    \u2502<br \/>\n\u2502  Volume:     \u78c1\u76d8(\/var\/lib\/docker\/volumes\/)        \u2502<br \/>\n\u2502  Bind Mount: \u78c1\u76d8(\u5bbf\u4e3b\u673a\u4efb\u610f\u8def\u5f84)                    \u2502<br \/>\n\u2502  tmpfs:      \u5185\u5b58(RAM)                              \u2502<br \/>\n\u2502                                                    \u2502<br \/>\n\u2502  \u6301\u4e45\u6027:    Volume &gt; Bind Mount &gt; tmpfs             \u2502<br \/>\n\u2502  \u6027\u80fd:      tmpfs &gt; Volume \u2248 Bind Mount             \u2502<br \/>\n\u2502  \u5b89\u5168\u6027:    tmpfs &gt; Volume &gt; Bind Mount             \u2502<br \/>\n\u2502  \u53ef\u5171\u4eab:    Volume &#061; Bind Mount &gt; tmpfs(\u4e0d\u53ef\u5171\u4eab)    \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<h4>5.2 \u4f7f\u7528tmpfs\u6302\u8f7d<\/h4>\n<h5>5.2.1 \u4f7f\u7528\u2013tmpfs\u53c2\u6570<\/h5>\n<p><span class=\"token comment\"># \u4f7f\u7528&#8211;tmpfs\u53c2\u6570\u521b\u5efatmpfs\u6302\u8f7d<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> tmpfs-test <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;tmpfs<\/span> \/app\/temp <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><\/p>\n<p><span class=\"token comment\"># \u53c2\u6570\u8bf4\u660e:<\/span><br \/>\n<span class=\"token comment\"># &#8211;tmpfs \/app\/temp: \u5728\u5bb9\u5668\u5185\u7684\/app\/temp\u8def\u5f84\u6302\u8f7dtmpfs<\/span><\/p>\n<p><span class=\"token comment\"># \u9a8c\u8bc1tmpfs<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> tmpfs-test <span class=\"token function\">df<\/span> <span class=\"token parameter variable\">-h<\/span> \/app\/temp<br \/>\n<span class=\"token comment\"># \u8f93\u51fa:<\/span><br \/>\n<span class=\"token comment\"># Filesystem                Size      Used Available Use% Mounted on<\/span><br \/>\n<span class=\"token comment\"># tmpfs                    64.0M         0     64.0M   0% \/app\/temp<\/span><\/p>\n<p><span class=\"token comment\"># \u5199\u5165\u6570\u636e<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> tmpfs-test <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;echo &#034;temp data&#034; &gt; \/app\/temp\/test.txt&#039;<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> tmpfs-test <span class=\"token function\">cat<\/span> \/app\/temp\/test.txt<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: temp data<\/span><\/p>\n<h5>5.2.2 \u4f7f\u7528\u2013mount\u53c2\u6570<\/h5>\n<p><span class=\"token comment\"># \u4f7f\u7528&#8211;mount\u53c2\u6570\u521b\u5efatmpfs\u6302\u8f7d(\u8bed\u6cd5\u66f4\u660e\u786e)<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> tmpfs-test2 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>tmpfs,dst<span class=\"token operator\">&#061;<\/span>\/app\/temp <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><\/p>\n<p><span class=\"token comment\"># \u5e26\u9009\u9879\u7684tmpfs\u6302\u8f7d<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> tmpfs-test3 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>tmpfs,dst<span class=\"token operator\">&#061;<\/span>\/app\/temp,tmpfs-size<span class=\"token operator\">&#061;<\/span>100m,tmpfs-mode<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1777<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><\/p>\n<p><span class=\"token comment\"># \u53c2\u6570\u8bf4\u660e:<\/span><br \/>\n<span class=\"token comment\"># type&#061;tmpfs: \u6307\u5b9a\u6302\u8f7d\u7c7b\u578b\u4e3atmpfs<\/span><br \/>\n<span class=\"token comment\"># dst&#061;\/app\/temp: \u5bb9\u5668\u5185\u76ee\u6807\u8def\u5f84<\/span><br \/>\n<span class=\"token comment\"># tmpfs-size&#061;100m: tmpfs\u5927\u5c0f\u9650\u5236\u4e3a100MB<\/span><br \/>\n<span class=\"token comment\"># tmpfs-mode&#061;1777: tmpfs\u7684\u6743\u9650\u6a21\u5f0f<\/span><\/p>\n<h5>5.2.3 &#8211;tmpfs\u4e0e\u2013mount\u7684\u533a\u522b<\/h5>\n<table>\n<tr>\u7279\u6027\u2013tmpfs\u2013mount type&#061;tmpfs<\/tr>\n<tbody>\n<tr>\n<td>\u8bed\u6cd5<\/td>\n<td>\u7b80\u6d01<\/td>\n<td>\u660e\u786e<\/td>\n<\/tr>\n<tr>\n<td>\u5927\u5c0f\u9650\u5236<\/td>\n<td>\u4e0d\u652f\u6301\u5355\u72ec\u8bbe\u7f6e<\/td>\n<td>\u652f\u6301(tmpfs-size)<\/td>\n<\/tr>\n<tr>\n<td>\u6743\u9650\u6a21\u5f0f<\/td>\n<td>\u4e0d\u652f\u6301\u5355\u72ec\u8bbe\u7f6e<\/td>\n<td>\u652f\u6301(tmpfs-mode)<\/td>\n<\/tr>\n<tr>\n<td>Swarm\u652f\u6301<\/td>\n<td>\u4e0d\u652f\u6301<\/td>\n<td>\u652f\u6301<\/td>\n<\/tr>\n<tr>\n<td>\u63a8\u8350\u5ea6<\/td>\n<td>\u7b80\u5355\u573a\u666f<\/td>\n<td>\u590d\u6742\u573a\u666f\/\u751f\u4ea7\u73af\u5883<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>5.3 tmpfs\u6302\u8f7d\u7684\u9009\u9879<\/h4>\n<h5>5.3.1 tmpfs-size(\u5927\u5c0f\u9650\u5236)<\/h5>\n<p><span class=\"token comment\"># \u8bbe\u7f6etmpfs\u5927\u5c0f\u4e3a64MB<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> tmpfs-sized <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>tmpfs,dst<span class=\"token operator\">&#061;<\/span>\/app\/temp,tmpfs-size<span class=\"token operator\">&#061;<\/span>64m <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><\/p>\n<p><span class=\"token comment\"># \u9a8c\u8bc1\u5927\u5c0f\u9650\u5236<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> tmpfs-sized <span class=\"token function\">df<\/span> <span class=\"token parameter variable\">-h<\/span> \/app\/temp<br \/>\n<span class=\"token comment\"># \u8f93\u51fa:<\/span><br \/>\n<span class=\"token comment\"># Filesystem                Size      Used Available Use% Mounted on<\/span><br \/>\n<span class=\"token comment\"># tmpfs                    64.0M         0     64.0M   0% \/app\/temp<\/span><\/p>\n<p><span class=\"token comment\"># \u6d4b\u8bd5\u5199\u5165\u8d85\u8fc7\u9650\u5236\u7684\u6570\u636e(\u4f1a\u5931\u8d25)<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> tmpfs-sized <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;dd if&#061;\/dev\/zero of&#061;\/app\/temp\/bigfile bs&#061;1M count&#061;100&#039;<\/span><br \/>\n<span class=\"token comment\"># \u62a5\u9519: dd: writing &#039;\/app\/temp\/bigfile&#039;: No space left on device<\/span><\/p>\n<p><span class=\"token comment\"># \u6ce8\u610f:\u5982\u679c\u4e0d\u8bbe\u7f6etmpfs-size,\u9ed8\u8ba4\u5927\u5c0f\u4e3a\u5bbf\u4e3b\u673a\u5185\u5b58\u7684\u4e00\u534a<\/span><\/p>\n<h5>5.3.2 tmpfs-mode(\u6743\u9650\u6a21\u5f0f)<\/h5>\n<p><span class=\"token comment\"># \u8bbe\u7f6etmpfs\u6743\u9650\u4e3a1777(\u6240\u6709\u7528\u6237\u53ef\u8bfb\u5199\u6267\u884c)<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> tmpfs-mode-test <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>tmpfs,dst<span class=\"token operator\">&#061;<\/span>\/app\/temp,tmpfs-mode<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1777<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><\/p>\n<p><span class=\"token comment\"># \u9a8c\u8bc1\u6743\u9650<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> tmpfs-mode-test <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-ld<\/span> \/app\/temp<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: drwxrwxrwt    2 root     root          40 Jan 15 10:30 \/app\/temp<\/span><\/p>\n<p><span class=\"token comment\"># \u8bbe\u7f6e\u6743\u9650\u4e3a700(\u4ec5root\u53ef\u8bbf\u95ee)<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> tmpfs-private <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>tmpfs,dst<span class=\"token operator\">&#061;<\/span>\/app\/temp,tmpfs-mode<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1700<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><\/p>\n<p><span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> tmpfs-private <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-ld<\/span> \/app\/temp<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: drwx&#8212;&#8212;    2 root     root          40 Jan 15 10:30 \/app\/temp<\/span><\/p>\n<h5>5.3.3 \u5b8c\u6574\u9009\u9879\u5217\u8868<\/h5>\n<table>\n<tr>\u9009\u9879\u8bf4\u660e\u793a\u4f8b<\/tr>\n<tbody>\n<tr>\n<td>tmpfs-size<\/td>\n<td>tmpfs\u6700\u5927\u5927\u5c0f(\u5b57\u8282)<\/td>\n<td>tmpfs-size&#061;100m<\/td>\n<\/tr>\n<tr>\n<td>tmpfs-mode<\/td>\n<td>\u6587\u4ef6\u6743\u9650\u6a21\u5f0f(\u516b\u8fdb\u5236)<\/td>\n<td>tmpfs-mode&#061;1777<\/td>\n<\/tr>\n<tr>\n<td>tmpfs-mode<\/td>\n<td>\u53ef\u4ee5\u4e0e\u5176\u4ed6tmpfs\u9009\u9879\u7ec4\u5408<\/td>\n<td>\u2013tmpfs \/app\/temp:rw,size&#061;100m,mode&#061;1777<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>5.4 tmpfs\u7684\u5185\u5b58\u4f7f\u7528<\/h4>\n<h5>5.4.1 \u5185\u5b58\u6d88\u8017\u673a\u5236<\/h5>\n<p>tmpfs\u4f7f\u7528\u5bbf\u4e3b\u673a\u7684\u5185\u5b58\u6765\u5b58\u50a8\u6570\u636e\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f:<\/p>\n<li>\u52a8\u6001\u5206\u914d:tmpfs\u4e0d\u4f1a\u9884\u5206\u914d\u5168\u90e8\u5185\u5b58,\u800c\u662f\u6309\u9700\u5206\u914d\u3002<\/li>\n<li>\u53ef\u88ab\u4ea4\u6362:\u5982\u679c\u7cfb\u7edf\u5185\u5b58\u4e0d\u8db3,tmpfs\u4e2d\u7684\u6570\u636e\u53ef\u80fd\u88ab\u4ea4\u6362\u5230swap\u5206\u533a\u3002<\/li>\n<li>\u5f71\u54cd\u5bb9\u5668\u5185\u5b58\u9650\u5236:tmpfs\u5360\u7528\u7684\u5185\u5b58\u8ba1\u5165\u5bb9\u5668\u7684\u5185\u5b58\u4f7f\u7528\u3002<\/li>\n<p><span class=\"token comment\"># \u67e5\u770b\u5bbf\u4e3b\u673a\u5185\u5b58\u4f7f\u7528\u60c5\u51b5<\/span><br \/>\n<span class=\"token function\">free<\/span> <span class=\"token parameter variable\">-h<\/span><\/p>\n<p><span class=\"token comment\"># \u542f\u52a8\u4f7f\u7528tmpfs\u7684\u5bb9\u5668<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> mem-test <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>tmpfs,dst<span class=\"token operator\">&#061;<\/span>\/app\/temp,tmpfs-size<span class=\"token operator\">&#061;<\/span>512m <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><\/p>\n<p><span class=\"token comment\"># \u5728\u5bb9\u5668\u4e2d\u5199\u5165\u6570\u636e<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> mem-test <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;dd if&#061;\/dev\/zero of&#061;\/app\/temp\/bigfile bs&#061;1M count&#061;200&#039;<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u5bbf\u4e3b\u673a\u5185\u5b58\u53d8\u5316<\/span><br \/>\n<span class=\"token function\">free<\/span> <span class=\"token parameter variable\">-h<\/span><br \/>\n<span class=\"token comment\"># \u53ef\u4ee5\u770b\u5230\u53ef\u7528\u5185\u5b58\u51cf\u5c11\u4e86\u7ea6200MB<\/span><\/p>\n<p><span class=\"token comment\"># \u6e05\u7406<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-f<\/span> mem-test<\/p>\n<h5>5.4.2 \u4e0e\u5bb9\u5668\u5185\u5b58\u9650\u5236\u7684\u5173\u7cfb<\/h5>\n<p><span class=\"token comment\"># \u5982\u679c\u5bb9\u5668\u8bbe\u7f6e\u4e86\u5185\u5b58\u9650\u5236,tmpfs\u7684\u5185\u5b58\u4f7f\u7528\u4e5f\u8ba1\u5165\u9650\u5236<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> mem-limited <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;memory<\/span><span class=\"token operator\">&#061;<\/span>256m <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>tmpfs,dst<span class=\"token operator\">&#061;<\/span>\/app\/temp,tmpfs-size<span class=\"token operator\">&#061;<\/span>512m <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><\/p>\n<p><span class=\"token comment\"># \u5c1d\u8bd5\u5199\u5165\u8d85\u8fc7\u5185\u5b58\u9650\u5236\u7684\u6570\u636e<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> mem-limited <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;dd if&#061;\/dev\/zero of&#061;\/app\/temp\/bigfile bs&#061;1M count&#061;200&#039;<\/span><br \/>\n<span class=\"token comment\"># \u53ef\u80fd\u4f1a\u89e6\u53d1OOM Killer,\u5bfc\u81f4\u8fdb\u7a0b\u88ab\u6740<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u5bb9\u5668\u662f\u5426\u56e0OOM\u88ab\u6740<\/span><br \/>\n<span class=\"token function\">docker<\/span> inspect mem-limited <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{.State.OOMKilled}}&#039;<\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa: true (\u5982\u679c\u88abOOM\u6740\u6389)<\/span><\/p>\n<h4>5.5 tmpfs\u9002\u7528\u573a\u666f<\/h4>\n<h5>5.5.1 \u5b58\u50a8\u654f\u611f\u4fe1\u606f<\/h5>\n<p><span class=\"token comment\"># \u573a\u666f:\u4e34\u65f6\u5b58\u50a8API\u5bc6\u94a5\u6216\u4ee4\u724c<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> secure-app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>tmpfs,dst<span class=\"token operator\">&#061;<\/span>\/app\/secrets,tmpfs-mode<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1700<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-app:latest<\/p>\n<p><span class=\"token comment\"># \u5e94\u7528\u5c06\u654f\u611f\u4fe1\u606f\u5199\u5165\/app\/secrets,\u5bb9\u5668\u505c\u6b62\u540e\u4fe1\u606f\u6d88\u5931<\/span><br \/>\n<span class=\"token comment\"># \u4e0d\u4f1a\u5728\u78c1\u76d8\u4e0a\u7559\u4e0b\u4efb\u4f55\u75d5\u8ff9<\/span><\/p>\n<h5>5.5.2 \u9ad8\u901f\u4e34\u65f6\u7f13\u5b58<\/h5>\n<p><span class=\"token comment\"># \u573a\u666f:\u5e94\u7528\u7f13\u5b58\u76ee\u5f55<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> cache-app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>tmpfs,dst<span class=\"token operator\">&#061;<\/span>\/app\/cache,tmpfs-size<span class=\"token operator\">&#061;<\/span>256m <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-app:latest<\/p>\n<p><span class=\"token comment\"># \u7f13\u5b58\u6570\u636e\u5b58\u50a8\u5728\u5185\u5b58\u4e2d,\u8bfb\u5199\u901f\u5ea6\u6781\u5feb<\/span><br \/>\n<span class=\"token comment\"># \u5bb9\u5668\u91cd\u542f\u540e\u7f13\u5b58\u81ea\u52a8\u6e05\u7a7a(\u4ece\u540e\u7aef\u91cd\u65b0\u52a0\u8f7d)<\/span><\/p>\n<h5>5.5.3 \u51cf\u5c11\u78c1\u76d8I\/O<\/h5>\n<p><span class=\"token comment\"># \u573a\u666f:\u4e34\u65f6\u6587\u4ef6\u5904\u7406<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> file-processor <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>tmpfs,dst<span class=\"token operator\">&#061;<\/span>\/tmp\/processing,tmpfs-size<span class=\"token operator\">&#061;<\/span>512m <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-app:latest<\/p>\n<p><span class=\"token comment\"># \u4e34\u65f6\u6587\u4ef6\u5728\u5185\u5b58\u4e2d\u5904\u7406,\u51cf\u5c11\u78c1\u76d8I\/O<\/span><br \/>\n<span class=\"token comment\"># \u5904\u7406\u5b8c\u6210\u540e,\u7ed3\u679c\u5199\u5165\u6301\u4e45\u5316\u5b58\u50a8(\u6570\u636e\u5377)<\/span><\/p>\n<h5>5.5.4 \u4e0d\u9002\u5408tmpfs\u7684\u573a\u666f<\/h5>\n<p><span class=\"token comment\"># \u4e0d\u9002\u5408:\u9700\u8981\u6301\u4e45\u5316\u7684\u6570\u636e<\/span><br \/>\n<span class=\"token comment\"># \u6570\u636e\u5e93\u6570\u636e \u2192 \u4f7f\u7528Volume<\/span><br \/>\n<span class=\"token comment\"># \u5e94\u7528\u65e5\u5fd7 \u2192 \u4f7f\u7528Volume\u6216\u65e5\u5fd7\u9a71\u52a8<\/span><br \/>\n<span class=\"token comment\"># \u7528\u6237\u4e0a\u4f20\u6587\u4ef6 \u2192 \u4f7f\u7528Volume<\/span><\/p>\n<p><span class=\"token comment\"># \u4e0d\u9002\u5408:\u5927\u91cf\u6570\u636e<\/span><br \/>\n<span class=\"token comment\"># tmpfs\u53d7\u5185\u5b58\u9650\u5236,\u4e0d\u9002\u5408\u5b58\u50a8\u5927\u91cf\u6570\u636e<\/span><\/p>\n<p><span class=\"token comment\"># \u4e0d\u9002\u5408:\u9700\u8981\u591a\u5bb9\u5668\u5171\u4eab\u7684\u6570\u636e<\/span><br \/>\n<span class=\"token comment\"># tmpfs\u662f\u5bb9\u5668\u79c1\u6709\u7684,\u65e0\u6cd5\u5171\u4eab<\/span><\/p>\n<h4>5.6 tmpfs\u5b9e\u6218: \u5b89\u5168\u5b58\u50a8\u4e34\u65f6\u5bc6\u94a5<\/h4>\n<h5>5.6.1 \u9700\u6c42\u573a\u666f<\/h5>\n<p>\u5728\u4e00\u4e2a\u5fae\u670d\u52a1\u5e94\u7528\u4e2d,\u9700\u8981\u4e34\u65f6\u5b58\u50a8\u6570\u636e\u5e93\u5bc6\u7801\u3001API\u5bc6\u94a5\u7b49\u654f\u611f\u4fe1\u606f\u3002\u8fd9\u4e9b\u4fe1\u606f\u4e0d\u5e94\u8be5\u6301\u4e45\u5316\u5230\u78c1\u76d8,\u4ec5\u5728\u5e94\u7528\u8fd0\u884c\u671f\u95f4\u5b58\u5728\u4e8e\u5185\u5b58\u4e2d\u3002<\/p>\n<h5>5.6.2 \u5b8c\u6574\u5b9e\u73b0<\/h5>\n<p><span class=\"token comment\"># \u6b65\u9aa41:\u521b\u5efa\u5e94\u7528\u955c\u50cf<\/span><br \/>\n<span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> \/tmp\/secure-app<br \/>\n<span class=\"token function\">cat<\/span> <span class=\"token operator\">&gt;<\/span> \/tmp\/secure-app\/Dockerfile <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#039;EOF&#039;<br \/>\nFROM python:3.11-slim<\/p>\n<p>WORKDIR \/app<\/p>\n<p>RUN pip install flask<\/p>\n<p>COPY app.py .<\/p>\n<p>EXPOSE 5000<\/p>\n<p>CMD [&#034;python&#034;, &#034;app.py&#034;]<br \/>\nEOF<\/span><\/p>\n<p><span class=\"token function\">cat<\/span> <span class=\"token operator\">&gt;<\/span> \/tmp\/secure-app\/app.py <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#039;PYEOF&#039;<br \/>\nimport os<br \/>\nimport json<br \/>\nfrom flask import Flask, request, jsonify<\/p>\n<p>app &#061; Flask(__name__)<\/p>\n<p>SECRETS_DIR &#061; &#039;\/app\/secrets&#039;<\/p>\n<p>&#064;app.route(&#039;\/secret&#039;, methods&#061;[&#039;POST&#039;])<br \/>\ndef store_secret():<br \/>\n    &#034;&#034;&#034;\u4e34\u65f6\u5b58\u50a8\u5bc6\u94a5(\u4ec5\u5b58\u5728\u4e8e\u5185\u5b58\u4e2d)&#034;&#034;&#034;<br \/>\n    data &#061; request.json<br \/>\n    key &#061; data.get(&#039;key&#039;)<br \/>\n    value &#061; data.get(&#039;value&#039;)<\/p>\n<p>    if not key or not value:<br \/>\n        return jsonify({&#039;error&#039;: &#039;key and value required&#039;}), 400<\/p>\n<p>    # \u5199\u5165tmpfs(\u5185\u5b58\u4e2d)<br \/>\n    with open(f&#039;{SECRETS_DIR}\/{key}.txt&#039;, &#039;w&#039;) as f:<br \/>\n        f.write(value)<\/p>\n<p>    return jsonify({&#039;message&#039;: f&#039;Secret &#034;{key}&#034; stored in memory&#039;}), 200<\/p>\n<p>&#064;app.route(&#039;\/secret\/&lt;key&gt;&#039;, methods&#061;[&#039;GET&#039;])<br \/>\ndef get_secret(key):<br \/>\n    &#034;&#034;&#034;\u8bfb\u53d6\u4e34\u65f6\u5bc6\u94a5&#034;&#034;&#034;<br \/>\n    try:<br \/>\n        with open(f&#039;{SECRETS_DIR}\/{key}.txt&#039;, &#039;r&#039;) as f:<br \/>\n            value &#061; f.read()<br \/>\n        return jsonify({&#039;key&#039;: key, &#039;value&#039;: value}), 200<br \/>\n    except FileNotFoundError:<br \/>\n        return jsonify({&#039;error&#039;: &#039;Secret not found&#039;}), 404<\/p>\n<p>&#064;app.route(&#039;\/secrets&#039;, methods&#061;[&#039;GET&#039;])<br \/>\ndef list_secrets():<br \/>\n    &#034;&#034;&#034;\u5217\u51fa\u6240\u6709\u4e34\u65f6\u5bc6\u94a5&#034;&#034;&#034;<br \/>\n    files &#061; os.listdir(SECRETS_DIR)<br \/>\n    return jsonify({&#039;secrets&#039;: files}), 200<\/p>\n<p>&#064;app.route(&#039;\/health&#039;, methods&#061;[&#039;GET&#039;])<br \/>\ndef health():<br \/>\n    return jsonify({&#039;status&#039;: &#039;healthy&#039;}), 200<\/p>\n<p>if __name__ &#061;&#061; &#039;__main__&#039;:<br \/>\n    # \u786e\u4fdd\u5bc6\u94a5\u76ee\u5f55\u5b58\u5728<br \/>\n    os.makedirs(SECRETS_DIR, exist_ok&#061;True)<br \/>\n    app.run(host&#061;&#039;0.0.0.0&#039;, port&#061;5000)<br \/>\nPYEOF<\/span><\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa42:\u6784\u5efa\u955c\u50cf<\/span><br \/>\n<span class=\"token function\">docker<\/span> build <span class=\"token parameter variable\">-t<\/span> secure-app \/tmp\/secure-app\/<\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa43:\u4f7f\u7528tmpfs\u542f\u52a8\u5bb9\u5668<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> secure-service <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-p<\/span> <span class=\"token number\">5000<\/span>:5000 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>tmpfs,dst<span class=\"token operator\">&#061;<\/span>\/app\/secrets,tmpfs-size<span class=\"token operator\">&#061;<\/span>64m,tmpfs-mode<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1700<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;memory<\/span><span class=\"token operator\">&#061;<\/span>256m <span class=\"token punctuation\">\\\\<\/span><br \/>\n  secure-app<\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa44:\u5b58\u50a8\u5bc6\u94a5<\/span><br \/>\n<span class=\"token function\">curl<\/span> <span class=\"token parameter variable\">-X<\/span> POST http:\/\/localhost:5000\/secret <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-H<\/span> <span class=\"token string\">&#034;Content-Type: application\/json&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-d<\/span> <span class=\"token string\">&#039;{&#034;key&#034;: &#034;db_password&#034;, &#034;value&#034;: &#034;SuperSecret123!&#034;}&#039;<\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa: {&#034;message&#034;:&#034;Secret \\\\&#034;db_password\\\\&#034; stored in memory&#034;}<\/span><\/p>\n<p><span class=\"token function\">curl<\/span> <span class=\"token parameter variable\">-X<\/span> POST http:\/\/localhost:5000\/secret <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-H<\/span> <span class=\"token string\">&#034;Content-Type: application\/json&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-d<\/span> <span class=\"token string\">&#039;{&#034;key&#034;: &#034;api_key&#034;, &#034;value&#034;: &#034;ak_1234567890abcdef&#034;}&#039;<\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa: {&#034;message&#034;:&#034;Secret \\\\&#034;api_key\\\\&#034; stored in memory&#034;}<\/span><\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa45:\u8bfb\u53d6\u5bc6\u94a5<\/span><br \/>\n<span class=\"token function\">curl<\/span> http:\/\/localhost:5000\/secret\/db_password<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: {&#034;key&#034;:&#034;db_password&#034;,&#034;value&#034;:&#034;SuperSecret123!&#034;}<\/span><\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa46:\u5217\u51fa\u6240\u6709\u5bc6\u94a5<\/span><br \/>\n<span class=\"token function\">curl<\/span> http:\/\/localhost:5000\/secrets<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: {&#034;secrets&#034;:[&#034;db_password.txt&#034;,&#034;api_key.txt&#034;]}<\/span><\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa47:\u9a8c\u8bc1\u5bc6\u94a5\u4e0d\u5728\u78c1\u76d8\u4e0a<\/span><br \/>\n<span class=\"token comment\"># \u67e5\u770b\u5bb9\u5668\u6302\u8f7d\u4fe1\u606f<\/span><br \/>\n<span class=\"token function\">docker<\/span> inspect secure-service <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{json .Mounts}}&#039;<\/span> <span class=\"token operator\">|<\/span> python3 <span class=\"token parameter variable\">-m<\/span> json.tool<br \/>\n<span class=\"token comment\"># \u8f93\u51fa\u663e\u793atmpfs\u6302\u8f7d,\u6ca1\u6709\u78c1\u76d8\u8def\u5f84<\/span><\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa48:\u91cd\u542f\u5bb9\u5668,\u9a8c\u8bc1\u5bc6\u94a5\u6d88\u5931<\/span><br \/>\n<span class=\"token function\">docker<\/span> restart secure-service<br \/>\n<span class=\"token function\">sleep<\/span> <span class=\"token number\">3<\/span><\/p>\n<p><span class=\"token function\">curl<\/span> http:\/\/localhost:5000\/secrets<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: {&#034;secrets&#034;:[]}<\/span><br \/>\n<span class=\"token comment\"># \u5bc6\u94a5\u5df2\u6d88\u5931!\u56e0\u4e3atmpfs\u6570\u636e\u5728\u5bb9\u5668\u91cd\u542f\u540e\u6e05\u9664<\/span><\/p>\n<p><span class=\"token comment\"># \u6e05\u7406<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-f<\/span> secure-service<br \/>\n<span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-rf<\/span> \/tmp\/secure-app<\/p>\n<h5>5.6.3 \u4f7f\u7528Docker Compose<\/h5>\n<p><span class=\"token comment\"># docker-compose.yml<\/span><br \/>\n<span class=\"token key atrule\">version<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;3.8&#039;<\/span><\/p>\n<p><span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">secure-service<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">build<\/span><span class=\"token punctuation\">:<\/span> .<br \/>\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> secure<span class=\"token punctuation\">&#8211;<\/span>service<br \/>\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token string\">&#034;5000:5000&#034;<\/span><br \/>\n    <span class=\"token key atrule\">tmpfs<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> \/app\/secrets<span class=\"token punctuation\">:<\/span>size&#061;64m<span class=\"token punctuation\">,<\/span>mode&#061;1700<br \/>\n    <span class=\"token key atrule\">mem_limit<\/span><span class=\"token punctuation\">:<\/span> 256m<br \/>\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">&#8211;<\/span>stopped<br \/>\n    <span class=\"token key atrule\">healthcheck<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">test<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;CMD&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;curl&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-f&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;http:\/\/localhost:5000\/health&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n      <span class=\"token key atrule\">interval<\/span><span class=\"token punctuation\">:<\/span> 30s<br \/>\n      <span class=\"token key atrule\">timeout<\/span><span class=\"token punctuation\">:<\/span> 5s<br \/>\n      <span class=\"token key atrule\">retries<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">3<\/span><\/p>\n<p><span class=\"token comment\"># \u542f\u52a8<\/span><br \/>\n<span class=\"token function\">docker-compose<\/span> up <span class=\"token parameter variable\">-d<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770btmpfs\u6302\u8f7d<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> secure-service <span class=\"token function\">df<\/span> <span class=\"token parameter variable\">-h<\/span> \/app\/secrets<br \/>\n<span class=\"token comment\"># \u8f93\u51fa:<\/span><br \/>\n<span class=\"token comment\"># Filesystem                Size      Used Available Use% Mounted on<\/span><br \/>\n<span class=\"token comment\"># tmpfs                    64.0M         0     64.0M   0% \/app\/secrets<\/span><\/p>\n<h5>5.6.4 tmpfs\u5b89\u5168\u6ce8\u610f\u4e8b\u9879<\/h5>\n<p><span class=\"token comment\"># 1. tmpfs\u6570\u636e\u53ef\u80fd\u88ab\u4ea4\u6362\u5230swap\u5206\u533a<\/span><br \/>\n<span class=\"token comment\">#    \u5982\u679c\u9700\u8981\u786e\u4fdd\u6570\u636e\u7edd\u4e0d\u843d\u76d8,\u9700\u8981\u7981\u7528swap<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> ultra-secure <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>tmpfs,dst<span class=\"token operator\">&#061;<\/span>\/app\/secrets <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;memory<\/span><span class=\"token operator\">&#061;<\/span>256m <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;memory-swap<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  secure-app<br \/>\n<span class=\"token comment\"># &#8211;memory-swap&#061;0: \u7981\u6b62\u5185\u5b58\u4ea4\u6362,\u786e\u4fddtmpfs\u6570\u636e\u4e0d\u88ab\u5199\u5165swap<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u4f7f\u7528tmpfs\u65f6\u6ce8\u610f\u5185\u5b58\u76d1\u63a7<\/span><br \/>\n<span class=\"token comment\">#    tmpfs\u5360\u7528\u7684\u5185\u5b58\u4f1a\u5f71\u54cd\u5bb9\u5668\u548c\u5bbf\u4e3b\u673a\u7684\u53ef\u7528\u5185\u5b58<\/span><\/p>\n<p><span class=\"token comment\"># 3. tmpfs\u4e0d\u9002\u5408\u957f\u671f\u5b58\u50a8\u5927\u91cf\u6570\u636e<\/span><br \/>\n<span class=\"token comment\">#    \u4ec5\u9002\u5408\u4e34\u65f6\u3001\u5c11\u91cf\u7684\u654f\u611f\u6570\u636e<\/span><\/p>\n<hr \/>\n<h3>\u7b2c\u516d\u7ae0 \u6570\u636e\u5377\u8fdb\u9636\u64cd\u4f5c<\/h3>\n<h4>6.1 \u6570\u636e\u5377\u9a71\u52a8\u4e0e\u8fdc\u7a0b\u6570\u636e\u5377<\/h4>\n<h5>6.1.1 \u6570\u636e\u5377\u9a71\u52a8\u6982\u8ff0<\/h5>\n<p>\u6570\u636e\u5377\u9a71\u52a8(Volume Driver)\u662fDocker\u6570\u636e\u5377\u7cfb\u7edf\u7684\u6269\u5c55\u673a\u5236\u3002\u9ed8\u8ba4\u7684\u6570\u636e\u5377\u9a71\u52a8\u662flocal,\u5b83\u5c06\u6570\u636e\u5b58\u50a8\u5728\u5bbf\u4e3b\u673a\u7684\u672c\u5730\u6587\u4ef6\u7cfb\u7edf\u4e0a\u3002\u901a\u8fc7\u5b89\u88c5\u7b2c\u4e09\u65b9\u6570\u636e\u5377\u9a71\u52a8\u63d2\u4ef6,\u53ef\u4ee5\u5c06\u6570\u636e\u5377\u5b58\u50a8\u5728\u5404\u79cd\u8fdc\u7a0b\u5b58\u50a8\u7cfb\u7edf\u4e0a,\u5982NFS\u3001Amazon EBS\u3001Google Persistent Disk\u3001Azure File Storage\u7b49\u3002<\/p>\n<p>\u6570\u636e\u5377\u9a71\u52a8\u7684\u4f5c\u7528:<\/p>\n<ul>\n<li>\u62bd\u8c61\u5e95\u5c42\u5b58\u50a8:\u4e3aDocker\u63d0\u4f9b\u7edf\u4e00\u7684\u5b58\u50a8\u63a5\u53e3,\u5c4f\u853d\u5e95\u5c42\u5b58\u50a8\u5dee\u5f02<\/li>\n<li>\u652f\u6301\u8fdc\u7a0b\u5b58\u50a8:\u5c06\u6570\u636e\u5b58\u50a8\u5728\u7f51\u7edc\u5b58\u50a8\u4e0a,\u5b9e\u73b0\u8de8\u4e3b\u673a\u6570\u636e\u5171\u4eab<\/li>\n<li>\u652f\u6301\u4e91\u5b58\u50a8:\u4e0e\u4e91\u5382\u5546\u7684\u5757\u5b58\u50a8\u3001\u6587\u4ef6\u5b58\u50a8\u670d\u52a1\u96c6\u6210<\/li>\n<li>\u652f\u6301\u9ad8\u7ea7\u7279\u6027:\u5982\u52a0\u5bc6\u3001\u538b\u7f29\u3001\u5feb\u7167\u7b49<\/li>\n<\/ul>\n<h5>6.1.2 \u5185\u7f6e\u6570\u636e\u5377\u9a71\u52a8<\/h5>\n<p>Docker\u5185\u7f6e\u4e86local\u9a71\u52a8,\u5b83\u652f\u6301\u51e0\u79cd\u5b58\u50a8\u7c7b\u578b:<\/p>\n<p><span class=\"token comment\"># 1. \u9ed8\u8ba4\u672c\u5730\u76ee\u5f55(\u6700\u5e38\u89c1)<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create my-local-volume<br \/>\n<span class=\"token comment\"># \u5b58\u50a8: \/var\/lib\/docker\/volumes\/my-local-volume\/_data\/<\/span><\/p>\n<p><span class=\"token comment\"># 2. NFS\u7c7b\u578b<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token builtin class-name\">local<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>nfs <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">o<\/span><span class=\"token operator\">&#061;<\/span>addr<span class=\"token operator\">&#061;<\/span><span class=\"token number\">192.168<\/span>.1.100,nfsvers<span class=\"token operator\">&#061;<\/span><span class=\"token number\">4<\/span>,rw <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">device<\/span><span class=\"token operator\">&#061;<\/span>:\/path\/to\/nfs\/share <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-nfs-volume<\/p>\n<p><span class=\"token comment\"># 3. CIFS\/SMB\u7c7b\u578b(Windows\u5171\u4eab)<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token builtin class-name\">local<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>cifs <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">o<\/span><span class=\"token operator\">&#061;<\/span>addr<span class=\"token operator\">&#061;<\/span><span class=\"token number\">192.168<\/span>.1.200,username<span class=\"token operator\">&#061;<\/span>user,password<span class=\"token operator\">&#061;<\/span>pass,rw <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">device<\/span><span class=\"token operator\">&#061;<\/span>\/sharename <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-smb-volume<\/p>\n<p><span class=\"token comment\"># 4. tmpfs\u7c7b\u578b<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token builtin class-name\">local<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>tmpfs <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">device<\/span><span class=\"token operator\">&#061;<\/span>tmpfs <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">o<\/span><span class=\"token operator\">&#061;<\/span>size<span class=\"token operator\">&#061;<\/span>100m,mode<span class=\"token operator\">&#061;<\/span>0755 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-tmpfs-volume<\/p>\n<p><span class=\"token comment\"># 5. btrfs\u5b50\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token builtin class-name\">local<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>btrfs <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">device<\/span><span class=\"token operator\">&#061;<\/span>\/dev\/sdb <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">o<\/span><span class=\"token operator\">&#061;<\/span>subvol<span class=\"token operator\">&#061;<\/span>\/docker-volumes\/my-subvol <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-btrfs-volume<\/p>\n<p><span class=\"token comment\"># 6. \u6307\u5b9a\u5df2\u6709\u7684\u5757\u8bbe\u5907<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token builtin class-name\">local<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>ext4 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">device<\/span><span class=\"token operator\">&#061;<\/span>\/dev\/sdc1 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-block-volume<\/p>\n<h5>6.1.3 \u7b2c\u4e09\u65b9\u6570\u636e\u5377\u9a71\u52a8\u63d2\u4ef6<\/h5>\n<p><span class=\"token comment\"># \u67e5\u770b\u5df2\u5b89\u88c5\u7684\u63d2\u4ef6<\/span><br \/>\n<span class=\"token function\">docker<\/span> plugin <span class=\"token function\">ls<\/span><\/p>\n<p><span class=\"token comment\"># \u5b89\u88c5\u63d2\u4ef6\u793a\u4f8b(\u4ee5Docker NFS\u63d2\u4ef6\u4e3a\u4f8b)<\/span><br \/>\n<span class=\"token function\">docker<\/span> plugin <span class=\"token function\">install<\/span> leapbit\/docker-nfs:latest<\/p>\n<p><span class=\"token comment\"># \u4f7f\u7528\u63d2\u4ef6\u521b\u5efa\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;driver<\/span> leapbit\/docker-nfs:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">nfsserver<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token number\">192.168<\/span>.1.100 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">nfspath<\/span><span class=\"token operator\">&#061;<\/span>\/shared\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">nfsoptions<\/span><span class=\"token operator\">&#061;<\/span>nfsvers<span class=\"token operator\">&#061;<\/span><span class=\"token number\">4<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-remote-volume<\/p>\n<h4>6.2 \u4f7f\u7528\u6570\u636e\u5377\u63d2\u4ef6(local\u3001nfs\u3001block)<\/h4>\n<h5>6.2.1 local\u9a71\u52a8\u8be6\u89e3<\/h5>\n<p>local\u9a71\u52a8\u662fDocker\u9ed8\u8ba4\u7684\u6570\u636e\u5377\u9a71\u52a8,\u5b83\u652f\u6301\u591a\u79cd\u5b58\u50a8\u540e\u7aef:<\/p>\n<p><span class=\"token comment\"># \u67e5\u770blocal\u9a71\u52a8\u652f\u6301\u7684\u9009\u9879<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token builtin class-name\">local<\/span> <span class=\"token parameter variable\">&#8211;help<\/span><\/p>\n<p><span class=\"token comment\"># local\u9a71\u52a8\u652f\u6301\u7684&#8211;opt\u9009\u9879:<\/span><br \/>\n<span class=\"token comment\"># type: \u6587\u4ef6\u7cfb\u7edf\u7c7b\u578b(nfs, cifs, tmpfs, ext4, btrfs\u7b49)<\/span><br \/>\n<span class=\"token comment\"># device: \u8bbe\u5907\u8def\u5f84\u6216\u8fdc\u7a0b\u5171\u4eab\u8def\u5f84<\/span><br \/>\n<span class=\"token comment\"># o: \u6302\u8f7d\u9009\u9879(\u5bf9\u5e94mount\u547d\u4ee4\u7684-o\u53c2\u6570)<\/span><\/p>\n<p><span class=\"token comment\"># \u793a\u4f8b:\u521b\u5efa\u4e00\u4e2a\u57fa\u4e8eext4\u6587\u4ef6\u7cfb\u7edf\u7684\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token comment\"># \u524d\u63d0:\/dev\/sdb1\u5df2\u7ecf\u683c\u5f0f\u5316\u4e3aext4<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token builtin class-name\">local<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>ext4 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">device<\/span><span class=\"token operator\">&#061;<\/span>\/dev\/sdb1 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-ext4-volume<\/p>\n<p><span class=\"token comment\"># \u4f7f\u7528\u8be5\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> db <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> my-ext4-volume:\/var\/lib\/mysql <span class=\"token punctuation\">\\\\<\/span><br \/>\n  mysql:8.0<\/p>\n<h5>6.2.2 NFS\u6570\u636e\u5377\u63d2\u4ef6<\/h5>\n<p>NFS(Network File System)\u662f\u5e38\u7528\u7684\u7f51\u7edc\u6587\u4ef6\u7cfb\u7edf\u534f\u8bae,\u9002\u5408\u591a\u4e3b\u673a\u5171\u4eab\u6570\u636e:<\/p>\n<p><span class=\"token comment\"># \u65b9\u6cd51:\u4f7f\u7528local\u9a71\u52a8\u521b\u5efaNFS\u6570\u636e\u5377(\u63a8\u8350)<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token builtin class-name\">local<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>nfs <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">o<\/span><span class=\"token operator\">&#061;<\/span>addr<span class=\"token operator\">&#061;<\/span><span class=\"token number\">192.168<\/span>.1.100,nfsvers<span class=\"token operator\">&#061;<\/span><span class=\"token number\">4<\/span>,soft,timeo<span class=\"token operator\">&#061;<\/span><span class=\"token number\">60<\/span>,retrans<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">device<\/span><span class=\"token operator\">&#061;<\/span>:\/data\/shared <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> nfs-shared-data<\/p>\n<p><span class=\"token comment\"># \u53c2\u6570\u8bf4\u660e:<\/span><br \/>\n<span class=\"token comment\"># type&#061;nfs: \u4f7f\u7528NFS\u6587\u4ef6\u7cfb\u7edf<\/span><br \/>\n<span class=\"token comment\"># o&#061;addr&#061;192.168.1.100: NFS\u670d\u52a1\u5668\u5730\u5740<\/span><br \/>\n<span class=\"token comment\">#    nfsvers&#061;4: NFS\u7248\u672c4<\/span><br \/>\n<span class=\"token comment\">#    soft: \u8f6f\u6302\u8f7d(NFS\u4e0d\u53ef\u7528\u65f6\u8fd4\u56de\u9519\u8bef\u800c\u975e\u6302\u8d77)<\/span><br \/>\n<span class=\"token comment\">#    timeo&#061;60: \u8d85\u65f6\u65f6\u95f4(60\u79d2)<\/span><br \/>\n<span class=\"token comment\">#    retrans&#061;2: \u91cd\u8bd5\u6b21\u6570<\/span><br \/>\n<span class=\"token comment\"># device&#061;:\/data\/shared: NFS\u670d\u52a1\u5668\u4e0a\u7684\u5171\u4eab\u8def\u5f84<\/span><\/p>\n<p><span class=\"token comment\"># \u4f7f\u7528NFS\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> shared-app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> nfs-shared-data:\/app\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-app:latest<\/p>\n<p><span class=\"token comment\"># \u5728\u591a\u53f0\u4e3b\u673a\u4e0a\u521b\u5efa\u540c\u540dNFS\u6570\u636e\u5377,\u5b9e\u73b0\u8de8\u4e3b\u673a\u6570\u636e\u5171\u4eab<\/span><br \/>\n<span class=\"token comment\"># \u4e3b\u673aA:<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token builtin class-name\">local<\/span> <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>nfs <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">o<\/span><span class=\"token operator\">&#061;<\/span>addr<span class=\"token operator\">&#061;<\/span>nfs-server-ip,nfsvers<span class=\"token operator\">&#061;<\/span><span class=\"token number\">4<\/span> <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">device<\/span><span class=\"token operator\">&#061;<\/span>:\/data\/shared nfs-shared-data<br \/>\n<span class=\"token comment\"># \u4e3b\u673aB:<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token builtin class-name\">local<\/span> <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>nfs <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">o<\/span><span class=\"token operator\">&#061;<\/span>addr<span class=\"token operator\">&#061;<\/span>nfs-server-ip,nfsvers<span class=\"token operator\">&#061;<\/span><span class=\"token number\">4<\/span> <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">device<\/span><span class=\"token operator\">&#061;<\/span>:\/data\/shared nfs-shared-data<br \/>\n<span class=\"token comment\"># \u4e24\u53f0\u4e3b\u673a\u4e0a\u7684\u5bb9\u5668\u6302\u8f7d\u540c\u4e00\u4e2aNFS\u6570\u636e\u5377,\u6570\u636e\u5b9e\u65f6\u5171\u4eab<\/span><\/p>\n<h5>6.2.3 block\u8bbe\u5907\u6570\u636e\u5377<\/h5>\n<p><span class=\"token comment\"># \u4f7f\u7528\u5757\u8bbe\u5907\u521b\u5efa\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token comment\"># \u524d\u63d0:\u5757\u8bbe\u5907\u5df2\u683c\u5f0f\u5316<\/span><br \/>\n<span class=\"token function\">sudo<\/span> mkfs.ext4 \/dev\/sdb1<\/p>\n<p><span class=\"token comment\"># \u521b\u5efa\u57fa\u4e8e\u5757\u8bbe\u5907\u7684\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token builtin class-name\">local<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>ext4 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">device<\/span><span class=\"token operator\">&#061;<\/span>\/dev\/sdb1 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  block-data-volume<\/p>\n<p><span class=\"token comment\"># \u4f7f\u7528\u5757\u8bbe\u5907\u6570\u636e\u5377(\u9002\u5408\u9ad8\u6027\u80fd\u6570\u636e\u5e93\u573a\u666f)<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> high-perf-db <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> block-data-volume:\/var\/lib\/postgresql\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  postgres:15<\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u6570\u636e\u5377\u4fe1\u606f<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume inspect block-data-volume<br \/>\n<span class=\"token comment\"># \u8f93\u51fa:<\/span><br \/>\n<span class=\"token comment\"># [<\/span><br \/>\n<span class=\"token comment\">#     {<\/span><br \/>\n<span class=\"token comment\">#         &#034;CreatedAt&#034;: &#034;2024-01-15T10:30:00Z&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Driver&#034;: &#034;local&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Labels&#034;: null,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Mountpoint&#034;: &#034;\/var\/lib\/docker\/volumes\/block-data-volume\/_data&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Name&#034;: &#034;block-data-volume&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Options&#034;: {<\/span><br \/>\n<span class=\"token comment\">#             &#034;device&#034;: &#034;\/dev\/sdb1&#034;,<\/span><br \/>\n<span class=\"token comment\">#             &#034;type&#034;: &#034;ext4&#034;<\/span><br \/>\n<span class=\"token comment\">#         },<\/span><br \/>\n<span class=\"token comment\">#         &#034;Scope&#034;: &#034;local&#034;<\/span><br \/>\n<span class=\"token comment\">#     }<\/span><br \/>\n<span class=\"token comment\"># ]<\/span><\/p>\n<h4>6.3 \u521b\u5efaNFS\u6570\u636e\u5377<\/h4>\n<h5>6.3.1 \u5b8c\u6574NFS\u6570\u636e\u5377\u914d\u7f6e<\/h5>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\"># \u6b65\u9aa41:\u5728NFS\u670d\u52a1\u5668\u4e0a\u914d\u7f6e\u5171\u4eab(\u5047\u8bbeIP:192.168.1.100)<\/span><br \/>\n<span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token comment\"># \u5b89\u88c5NFS\u670d\u52a1<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">apt-get<\/span> <span class=\"token function\">install<\/span> nfs-kernel-server  <span class=\"token comment\"># Ubuntu\/Debian<\/span><br \/>\n<span class=\"token comment\"># \u6216<\/span><br \/>\n<span class=\"token function\">sudo<\/span> yum <span class=\"token function\">install<\/span> nfs-utils  <span class=\"token comment\"># CentOS\/RHEL<\/span><\/p>\n<p><span class=\"token comment\"># \u521b\u5efa\u5171\u4eab\u76ee\u5f55<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> \/data\/docker-shared<br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">chown<\/span> <span class=\"token parameter variable\">-R<\/span> nobody:nogroup \/data\/docker-shared<br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">chmod<\/span> <span class=\"token number\">777<\/span> \/data\/docker-shared<\/p>\n<p><span class=\"token comment\"># \u914d\u7f6eNFS\u5171\u4eab<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">tee<\/span> <span class=\"token parameter variable\">-a<\/span> \/etc\/exports <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#039;EOF&#039;<br \/>\n\/data\/docker-shared  192.168.1.0\/24(rw,sync,no_subtree_check,no_root_squash)<br \/>\nEOF<\/span><\/p>\n<p><span class=\"token comment\"># \u542f\u52a8NFS\u670d\u52a1<\/span><br \/>\n<span class=\"token function\">sudo<\/span> exportfs <span class=\"token parameter variable\">-ra<\/span><br \/>\n<span class=\"token function\">sudo<\/span> systemctl restart nfs-kernel-server<br \/>\n<span class=\"token function\">sudo<\/span> systemctl <span class=\"token builtin class-name\">enable<\/span> nfs-kernel-server<\/p>\n<p><span class=\"token comment\"># \u9a8c\u8bc1\u5171\u4eab<\/span><br \/>\nshowmount <span class=\"token parameter variable\">-e<\/span> localhost<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: \/data\/docker-shared 192.168.1.0\/24<\/span><\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\"># \u6b65\u9aa42:\u5728Docker\u4e3b\u673a\u4e0a\u521b\u5efaNFS\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token comment\"># \u5b89\u88c5NFS\u5ba2\u6237\u7aef<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">apt-get<\/span> <span class=\"token function\">install<\/span> nfs-common  <span class=\"token comment\"># Ubuntu\/Debian<\/span><br \/>\n<span class=\"token comment\"># \u6216<\/span><br \/>\n<span class=\"token function\">sudo<\/span> yum <span class=\"token function\">install<\/span> nfs-utils  <span class=\"token comment\"># CentOS\/RHEL<\/span><\/p>\n<p><span class=\"token comment\"># \u521b\u5efaNFS\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token builtin class-name\">local<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>nfs <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">o<\/span><span class=\"token operator\">&#061;<\/span>addr<span class=\"token operator\">&#061;<\/span><span class=\"token number\">192.168<\/span>.1.100,nfsvers<span class=\"token operator\">&#061;<\/span><span class=\"token number\">4<\/span>,soft,timeo<span class=\"token operator\">&#061;<\/span><span class=\"token number\">60<\/span>,retrans<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">device<\/span><span class=\"token operator\">&#061;<\/span>:\/data\/docker-shared <span class=\"token punctuation\">\\\\<\/span><br \/>\n  nfs-docker-data<\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\"># \u6b65\u9aa43:\u4f7f\u7528NFS\u6570\u636e\u5377\u8fd0\u884c\u5bb9\u5668<\/span><br \/>\n<span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token comment\"># \u8fd0\u884c\u4e00\u4e2aweb\u5e94\u7528,\u6570\u636e\u5b58\u50a8\u5728NFS\u4e0a<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> web-app-1 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-p<\/span> <span class=\"token number\">8080<\/span>:80 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> nfs-docker-data:\/usr\/share\/nginx\/html <span class=\"token punctuation\">\\\\<\/span><br \/>\n  nginx:latest<\/p>\n<p><span class=\"token comment\"># \u5728\u5bb9\u5668\u4e2d\u521b\u5efa\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> web-app-1 <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;echo &#034;&lt;h1&gt;Hello from NFS&lt;\/h1&gt;&#034; &gt; \/usr\/share\/nginx\/html\/index.html&#039;<\/span><\/p>\n<p><span class=\"token comment\"># \u5728\u53e6\u4e00\u53f0Docker\u4e3b\u673a\u4e0a\u8fd0\u884c\u5bb9\u5668,\u6302\u8f7d\u540c\u4e00\u4e2aNFS\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token comment\"># (\u9700\u8981\u5728\u53e6\u4e00\u53f0\u4e3b\u673a\u4e0a\u4e5f\u521b\u5efa\u540c\u540d\u7684NFS\u6570\u636e\u5377)<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> web-app-2 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-p<\/span> <span class=\"token number\">8080<\/span>:80 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> nfs-docker-data:\/usr\/share\/nginx\/html <span class=\"token punctuation\">\\\\<\/span><br \/>\n  nginx:latest<\/p>\n<p><span class=\"token comment\"># \u9a8c\u8bc1:web-app-2\u4e5f\u80fd\u770b\u5230web-app-1\u521b\u5efa\u7684\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> web-app-2 <span class=\"token function\">cat<\/span> \/usr\/share\/nginx\/html\/index.html<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: &lt;h1&gt;Hello from NFS&lt;\/h1&gt;<\/span><\/p>\n<h5>6.3.2 NFS\u6570\u636e\u5377\u5728Docker Compose\u4e2d\u7684\u4f7f\u7528<\/h5>\n<p><span class=\"token comment\"># docker-compose.yml<\/span><br \/>\n<span class=\"token key atrule\">version<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;3.8&#039;<\/span><\/p>\n<p><span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">web<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> nginx<span class=\"token punctuation\">:<\/span>latest<br \/>\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token string\">&#034;8080:80&#034;<\/span><br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> nfs<span class=\"token punctuation\">&#8211;<\/span>data<span class=\"token punctuation\">:<\/span>\/usr\/share\/nginx\/html<br \/>\n    <span class=\"token key atrule\">deploy<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">replicas<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">3<\/span>  <span class=\"token comment\"># \u5728Swarm\u96c6\u7fa4\u4e2d\u8fd0\u884c3\u4e2a\u526f\u672c,\u5171\u4eab\u540c\u4e00NFS\u6570\u636e<\/span><\/p>\n<p><span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">nfs-data<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">driver<\/span><span class=\"token punctuation\">:<\/span> local<br \/>\n    <span class=\"token key atrule\">driver_opts<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">type<\/span><span class=\"token punctuation\">:<\/span> nfs<br \/>\n      <span class=\"token key atrule\">o<\/span><span class=\"token punctuation\">:<\/span> addr&#061;192.168.1.100<span class=\"token punctuation\">,<\/span>nfsvers&#061;4<span class=\"token punctuation\">,<\/span>soft<span class=\"token punctuation\">,<\/span>timeo&#061;60<span class=\"token punctuation\">,<\/span>retrans&#061;2<br \/>\n      <span class=\"token key atrule\">device<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">:<\/span>\/data\/docker<span class=\"token punctuation\">&#8211;<\/span>shared<\/p>\n<h4>6.4 \u6570\u636e\u5377\u5171\u4eab\u4e0e\u591a\u5bb9\u5668\u540c\u65f6\u6302\u8f7d<\/h4>\n<h5>6.4.1 \u591a\u5bb9\u5668\u5171\u4eab\u540c\u4e00\u4e2a\u6570\u636e\u5377<\/h5>\n<p><span class=\"token comment\"># \u521b\u5efa\u5171\u4eab\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create shared-data<\/p>\n<p><span class=\"token comment\"># \u5bb9\u56681:\u5199\u5165\u6570\u636e<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> writer <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> shared-data:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;while true; do echo &#034;$(date): writer&#034; &gt;&gt; \/data\/log.txt; sleep 5; done&#039;<\/span><\/p>\n<p><span class=\"token comment\"># \u5bb9\u56682:\u8bfb\u53d6\u6570\u636e<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> reader <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> shared-data:\/data:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;while true; do tail -1 \/data\/log.txt; sleep 5; done&#039;<\/span><\/p>\n<p><span class=\"token comment\"># \u5bb9\u56683:\u540c\u65f6\u8bfb\u5199<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> processor <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> shared-data:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;while true; do echo &#034;$(date): processor&#034; &gt;&gt; \/data\/log.txt; sleep 10; done&#039;<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u65e5\u5fd7<\/span><br \/>\n<span class=\"token function\">docker<\/span> logs <span class=\"token parameter variable\">-f<\/span> reader<br \/>\n<span class=\"token comment\"># \u8f93\u51fa:<\/span><br \/>\n<span class=\"token comment\"># Wed Jan 15 10:30:05 UTC 2024: writer<\/span><br \/>\n<span class=\"token comment\"># Wed Jan 15 10:30:10 UTC 2024: writer<\/span><br \/>\n<span class=\"token comment\"># Wed Jan 15 10:30:10 UTC 2024: processor<\/span><br \/>\n<span class=\"token comment\"># &#8230;<\/span><\/p>\n<h5>6.4.2 \u5e76\u53d1\u5199\u5165\u7684\u6ce8\u610f\u4e8b\u9879<\/h5>\n<p><span class=\"token comment\"># \u591a\u4e2a\u5bb9\u5668\u540c\u65f6\u5199\u5165\u540c\u4e00\u4e2a\u6570\u636e\u5377\u65f6,\u9700\u8981\u6ce8\u610f\u5e76\u53d1\u95ee\u9898<\/span><br \/>\n<span class=\"token comment\"># Docker\u4e0d\u63d0\u4f9b\u6587\u4ef6\u9501\u673a\u5236,\u9700\u8981\u5e94\u7528\u5c42\u9762\u5904\u7406\u5e76\u53d1<\/span><\/p>\n<p><span class=\"token comment\"># \u573a\u666f:\u591a\u4e2a\u5bb9\u5668\u5199\u5165\u540c\u4e00\u4e2a\u6587\u4ef6<\/span><br \/>\n<span class=\"token comment\"># \u95ee\u9898:\u53ef\u80fd\u5bfc\u81f4\u6570\u636e\u4ea4\u9519\u6216\u4e22\u5931<\/span><\/p>\n<p><span class=\"token comment\"># \u89e3\u51b3\u65b9\u6cd51:\u6bcf\u4e2a\u5bb9\u5668\u5199\u5165\u4e0d\u540c\u7684\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> app1 <span class=\"token parameter variable\">-v<\/span> shared-data:\/data alpine <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;while true; do echo &#034;$(date)&#034; &gt;&gt; \/data\/app1.log; sleep 5; done&#039;<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> app2 <span class=\"token parameter variable\">-v<\/span> shared-data:\/data alpine <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;while true; do echo &#034;$(date)&#034; &gt;&gt; \/data\/app2.log; sleep 5; done&#039;<\/span><\/p>\n<p><span class=\"token comment\"># \u89e3\u51b3\u65b9\u6cd52:\u4f7f\u7528\u6587\u4ef6\u9501(flock)<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> app1 <span class=\"token parameter variable\">-v<\/span> shared-data:\/data alpine <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;<br \/>\n  while true; do<br \/>\n    (<br \/>\n      flock -x 200<br \/>\n      echo &#034;$(date): app1&#034; &gt;&gt; \/data\/shared.log<br \/>\n    ) 200&gt;\/data\/.lock<br \/>\n    sleep 5<br \/>\n  done<br \/>\n&#039;<\/span><\/p>\n<p><span class=\"token comment\"># \u89e3\u51b3\u65b9\u6cd53:\u4f7f\u7528\u6d88\u606f\u961f\u5217\u6216\u6570\u636e\u5e93\u5904\u7406\u5e76\u53d1<\/span><\/p>\n<h4>6.5 \u6570\u636e\u5377\u5bb9\u5668\u6a21\u5f0f(\u2013volumes-from)<\/h4>\n<h5>6.5.1 \u6570\u636e\u5377\u5bb9\u5668\u6982\u5ff5<\/h5>\n<p>\u6570\u636e\u5377\u5bb9\u5668(Data Volume Container)\u662f\u4e00\u79cd\u7279\u6b8a\u7684\u5bb9\u5668,\u5b83\u672c\u8eab\u4e0d\u8fd0\u884c\u5e94\u7528\u670d\u52a1,\u4ec5\u7528\u4e8e\u63d0\u4f9b\u6570\u636e\u5377\u7ed9\u5176\u4ed6\u5bb9\u5668\u6302\u8f7d\u3002\u5176\u4ed6\u5bb9\u5668\u901a\u8fc7&#8211;volumes-from\u53c2\u6570\u6765\u6302\u8f7d\u6570\u636e\u5377\u5bb9\u5668\u4e2d\u7684\u6240\u6709\u6570\u636e\u5377\u3002<\/p>\n<p>\u867d\u7136\u5728\u65b0\u7248\u672c\u7684Docker\u4e2d,\u76f4\u63a5\u4f7f\u7528\u547d\u540d\u6570\u636e\u5377\u662f\u66f4\u63a8\u8350\u7684\u505a\u6cd5,\u4f46\u6570\u636e\u5377\u5bb9\u5668\u6a21\u5f0f\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4ecd\u7136\u6709\u7528\u3002<\/p>\n<h5>6.5.2 \u521b\u5efa\u548c\u4f7f\u7528\u6570\u636e\u5377\u5bb9\u5668<\/h5>\n<p><span class=\"token comment\"># \u6b65\u9aa41:\u521b\u5efa\u6570\u636e\u5377\u5bb9\u5668(\u4e0d\u8fd0\u884c\u5b9e\u9645\u5e94\u7528)<\/span><br \/>\n<span class=\"token function\">docker<\/span> create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> data-container <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/app\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/app\/config <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/app\/logs <span class=\"token punctuation\">\\\\<\/span><br \/>\n  busybox:latest<\/p>\n<p><span class=\"token comment\"># \u6ce8\u610f:\u4f7f\u7528docker create\u800c\u975edocker run,\u5bb9\u5668\u521b\u5efa\u4f46\u4e0d\u542f\u52a8<\/span><\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa42:\u5176\u4ed6\u5bb9\u5668\u901a\u8fc7&#8211;volumes-from\u6302\u8f7d\u6570\u636e\u5377\u5bb9\u5668\u7684\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> app1 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;volumes-from data-container <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-app:latest<\/p>\n<p><span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> app2 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;volumes-from data-container <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-app:latest<\/p>\n<p><span class=\"token comment\"># app1\u548capp2\u90fd\u6302\u8f7d\u4e86\/app\/data\u3001\/app\/config\u3001\/app\/logs<\/span><br \/>\n<span class=\"token comment\"># \u5b83\u4eec\u5171\u4eab\u8fd9\u4e9b\u8def\u5f84\u7684\u6570\u636e<\/span><\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa43:\u9a8c\u8bc1\u5171\u4eab<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> app1 <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;echo &#034;data from app1&#034; &gt; \/app\/data\/test.txt&#039;<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> app2 <span class=\"token function\">cat<\/span> \/app\/data\/test.txt<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: data from app1<\/span><\/p>\n<h5>6.5.3 &#8211;volumes-from\u7684\u6743\u9650\u7ee7\u627f<\/h5>\n<p><span class=\"token comment\"># &#8211;volumes-from\u4f1a\u7ee7\u627f\u6570\u636e\u5377\u7684\u8bfb\u5199\u6743\u9650<\/span><br \/>\n<span class=\"token comment\"># \u5982\u679c\u6570\u636e\u5377\u5bb9\u5668\u4e2d\u662f\u53ea\u8bfb\u6302\u8f7d,\u7ee7\u627f\u7684\u4e5f\u662f\u53ea\u8bfb<\/span><\/p>\n<p><span class=\"token comment\"># \u521b\u5efa\u53ea\u8bfb\u6570\u636e\u5377\u5bb9\u5668<\/span><br \/>\n<span class=\"token function\">docker<\/span> create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> readonly-data-container <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/app\/config:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  busybox:latest<\/p>\n<p><span class=\"token comment\"># \u7ee7\u627f\u7684\u5bb9\u5668\u4e5f\u662f\u53ea\u8bfb<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> app-readonly <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;volumes-from readonly-data-container <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-app:latest<\/p>\n<p><span class=\"token comment\"># app-readonly\u65e0\u6cd5\u5199\u5165\/app\/config<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> app-readonly <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;echo &#034;test&#034; &gt; \/app\/config\/test.txt&#039;<\/span><br \/>\n<span class=\"token comment\"># \u62a5\u9519: Read-only file system<\/span><\/p>\n<h5>6.5.4 \u94fe\u5f0f\u7ee7\u627f<\/h5>\n<p><span class=\"token comment\"># &#8211;volumes-from\u652f\u6301\u94fe\u5f0f\u7ee7\u627f<\/span><br \/>\n<span class=\"token function\">docker<\/span> create <span class=\"token parameter variable\">&#8211;name<\/span> base-data <span class=\"token parameter variable\">-v<\/span> \/data busybox:latest<br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> mid-data &#8211;volumes-from base-data <span class=\"token parameter variable\">-v<\/span> \/logs busybox:latest <span class=\"token function\">sleep<\/span> <span class=\"token number\">3600<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> app &#8211;volumes-from mid-data my-app:latest<\/p>\n<p><span class=\"token comment\"># app\u540c\u65f6\u6302\u8f7d\u4e86\/data(\u6765\u81eabase-data)\u548c\/logs(\u6765\u81eamid-data)<\/span><\/p>\n<h5>6.5.5 \u6570\u636e\u5377\u5bb9\u5668\u6a21\u5f0f\u7684\u4f18\u7f3a\u70b9<\/h5>\n<p><span class=\"token comment\"># \u4f18\u70b9:<\/span><br \/>\n<span class=\"token comment\"># 1. \u96c6\u4e2d\u7ba1\u7406\u6570\u636e\u5377\u5b9a\u4e49<\/span><br \/>\n<span class=\"token comment\"># 2. \u591a\u4e2a\u5bb9\u5668\u5171\u4eab\u540c\u4e00\u7ec4\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token comment\"># 3. \u53ef\u4ee5\u65b9\u4fbf\u5730\u6dfb\u52a0\u65b0\u7684\u5171\u4eab\u5bb9\u5668<\/span><\/p>\n<p><span class=\"token comment\"># \u7f3a\u70b9:<\/span><br \/>\n<span class=\"token comment\"># 1. \u6570\u636e\u5377\u5bb9\u5668\u672c\u8eab\u4e0d\u8fd0\u884c,\u5bb9\u6613\u88ab\u9057\u5fd8\u548c\u8bef\u5220<\/span><br \/>\n<span class=\"token comment\"># 2. \u533f\u540d\u6570\u636e\u5377\u96be\u4ee5\u7ba1\u7406<\/span><br \/>\n<span class=\"token comment\"># 3. Docker\u5b98\u65b9\u66f4\u63a8\u8350\u4f7f\u7528\u547d\u540d\u6570\u636e\u5377<\/span><\/p>\n<p><span class=\"token comment\"># \u63a8\u8350\u7684\u73b0\u4ee3\u505a\u6cd5:\u76f4\u63a5\u4f7f\u7528\u547d\u540d\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create app-data<br \/>\n<span class=\"token function\">docker<\/span> volume create app-logs<\/p>\n<p><span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> app1 <span class=\"token parameter variable\">-v<\/span> app-data:\/app\/data <span class=\"token parameter variable\">-v<\/span> app-logs:\/app\/logs my-app:latest<br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> app2 <span class=\"token parameter variable\">-v<\/span> app-data:\/app\/data <span class=\"token parameter variable\">-v<\/span> app-logs:\/app\/logs my-app:latest<\/p>\n<h4>6.6 \u6570\u636e\u5377\u7684\u5907\u4efd(docker run &#043; tar)<\/h4>\n<h5>6.6.1 \u5907\u4efd\u539f\u7406<\/h5>\n<p>\u6570\u636e\u5377\u867d\u7136\u5b58\u50a8\u5728\u5bbf\u4e3b\u673a\u4e0a,\u4f46Docker\u63a8\u8350\u901a\u8fc7\u5bb9\u5668\u6765\u64cd\u4f5c\u6570\u636e\u5377\u5185\u5bb9\u3002\u5907\u4efd\u6570\u636e\u5377\u7684\u6807\u51c6\u65b9\u6cd5\u662f:\u542f\u52a8\u4e00\u4e2a\u65b0\u5bb9\u5668,\u540c\u65f6\u6302\u8f7d\u8981\u5907\u4efd\u7684\u6570\u636e\u5377\u548c\u5bbf\u4e3b\u673a\u4e0a\u7684\u5907\u4efd\u76ee\u5f55,\u7136\u540e\u4f7f\u7528tar\u547d\u4ee4\u5c06\u6570\u636e\u5377\u5185\u5bb9\u6253\u5305\u5230\u5907\u4efd\u76ee\u5f55\u4e2d\u3002<\/p>\n<h5>6.6.2 \u57fa\u672c\u5907\u4efd\u64cd\u4f5c<\/h5>\n<p><span class=\"token comment\"># \u5047\u8bbe\u6709\u4e00\u4e2a\u540d\u4e3amysql-data\u7684\u6570\u636e\u5377\u9700\u8981\u5907\u4efd<\/span><\/p>\n<p><span class=\"token comment\"># \u65b9\u6cd51:\u5907\u4efd\u5230\u5bbf\u4e3b\u673a\u76ee\u5f55<\/span><br \/>\n<span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> \/backup<\/p>\n<p><span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> mysql-data:\/data:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/backup:\/backup <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">tar<\/span> czf \/backup\/mysql-data-<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%Y%m%d-%H%M%S<span class=\"token variable\">)<\/span><\/span>.tar.gz <span class=\"token parameter variable\">-C<\/span> \/data <span class=\"token builtin class-name\">.<\/span><\/p>\n<p><span class=\"token comment\"># \u53c2\u6570\u8bf4\u660e:<\/span><br \/>\n<span class=\"token comment\"># &#8211;rm: \u5bb9\u5668\u9000\u51fa\u540e\u81ea\u52a8\u5220\u9664<\/span><br \/>\n<span class=\"token comment\"># -v mysql-data:\/data:ro: \u4ee5\u53ea\u8bfb\u65b9\u5f0f\u6302\u8f7d\u8981\u5907\u4efd\u7684\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token comment\"># -v \/backup:\/backup: \u6302\u8f7d\u5bbf\u4e3b\u673a\u7684\u5907\u4efd\u76ee\u5f55<\/span><br \/>\n<span class=\"token comment\"># tar czf: \u521b\u5efagzip\u538b\u7f29\u7684tar\u5305<\/span><br \/>\n<span class=\"token comment\"># -C \/data .: \u5207\u6362\u5230\/data\u76ee\u5f55\u5e76\u6253\u5305\u5f53\u524d\u76ee\u5f55\u4e0b\u7684\u6240\u6709\u5185\u5bb9<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u5907\u4efd\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-lh<\/span> \/backup\/<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: -rw-r&#8211;r&#8211; 1 root root 50M Jan 15 10:30 mysql-data-20240115-103000.tar.gz<\/span><\/p>\n<h5>6.6.3 \u5907\u4efd\u811a\u672c<\/h5>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># backup-volume.sh &#8211; \u6570\u636e\u5377\u5907\u4efd\u811a\u672c<\/span><\/p>\n<p><span class=\"token comment\"># \u53c2\u6570<\/span><br \/>\n<span class=\"token assign-left variable\">VOLUME_NAME<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\">$1<\/span><br \/>\n<span class=\"token assign-left variable\">BACKUP_DIR<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\">${2<span class=\"token operator\">:-<\/span><span class=\"token operator\">\/<\/span>backup}<\/span><br \/>\n<span class=\"token assign-left variable\">RETENTION_DAYS<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\">${3<span class=\"token operator\">:-<\/span>7}<\/span><\/p>\n<p><span class=\"token comment\"># \u68c0\u67e5\u53c2\u6570<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token parameter variable\">-z<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$VOLUME_NAME<\/span>&#034;<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Usage: <span class=\"token variable\">$0<\/span> &lt;volume_name&gt; [backup_dir] [retention_days]&#034;<\/span><br \/>\n    <span class=\"token builtin class-name\">exit<\/span> <span class=\"token number\">1<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token comment\"># \u521b\u5efa\u5907\u4efd\u76ee\u5f55<\/span><br \/>\n<span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u751f\u6210\u5907\u4efd\u6587\u4ef6\u540d<\/span><br \/>\n<span class=\"token assign-left variable\">TIMESTAMP<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%Y%m%d-%H%M%S<span class=\"token variable\">)<\/span><\/span><br \/>\n<span class=\"token assign-left variable\">BACKUP_FILE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>\/<span class=\"token variable\">${VOLUME_NAME}<\/span>&#8211;<span class=\"token variable\">${TIMESTAMP}<\/span>.tar.gz&#034;<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Backing up volume: <span class=\"token variable\">$VOLUME_NAME<\/span>&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  Backup file: <span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u6267\u884c\u5907\u4efd<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$VOLUME_NAME<\/span>&#034;<\/span>:\/data:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span>:\/backup <span class=\"token punctuation\">\\\\<\/span><br \/>\n    alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token function\">tar<\/span> czf <span class=\"token string\">&#034;\/backup\/<span class=\"token variable\">${VOLUME_NAME}<\/span>&#8211;<span class=\"token variable\">${TIMESTAMP}<\/span>.tar.gz&#034;<\/span> <span class=\"token parameter variable\">-C<\/span> \/data <span class=\"token builtin class-name\">.<\/span><\/p>\n<p><span class=\"token comment\"># \u68c0\u67e5\u5907\u4efd\u7ed3\u679c<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token variable\">$?<\/span> <span class=\"token parameter variable\">-eq<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    <span class=\"token assign-left variable\">BACKUP_SIZE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">du<\/span> <span class=\"token parameter variable\">-h<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span> <span class=\"token operator\">|<\/span> <span class=\"token function\">cut<\/span> <span class=\"token parameter variable\">-f1<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Backup completed successfully&#034;<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  Size: <span class=\"token variable\">$BACKUP_SIZE<\/span>&#034;<\/span><br \/>\n<span class=\"token keyword\">else<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Backup FAILED!&#034;<\/span><br \/>\n    <span class=\"token builtin class-name\">exit<\/span> <span class=\"token number\">1<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token comment\"># \u6e05\u7406\u8fc7\u671f\u5907\u4efd<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Cleaning up backups older than <span class=\"token variable\">$RETENTION_DAYS<\/span> days&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">find<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span> <span class=\"token parameter variable\">-name<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">${VOLUME_NAME}<\/span>-*.tar.gz&#034;<\/span> <span class=\"token parameter variable\">-mtime<\/span> &#043;<span class=\"token variable\">$RETENTION_DAYS<\/span> <span class=\"token parameter variable\">-delete<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Done.&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u4f7f\u7528\u5907\u4efd\u811a\u672c<\/span><br \/>\n<span class=\"token function\">chmod<\/span> &#043;x backup-volume.sh<br \/>\n.\/backup-volume.sh mysql-data \/backup <span class=\"token number\">7<\/span><\/p>\n<h4>6.7 \u6570\u636e\u5377\u7684\u6062\u590d<\/h4>\n<h5>6.7.1 \u4ece\u5907\u4efd\u6062\u590d\u6570\u636e\u5377<\/h5>\n<p><span class=\"token comment\"># \u65b9\u6cd51:\u6062\u590d\u5230\u65b0\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token comment\"># \u6b65\u9aa41:\u521b\u5efa\u65b0\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create mysql-data-restored<\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa42:\u4ece\u5907\u4efd\u6062\u590d<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> mysql-data-restored:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/backup:\/backup:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;tar xzf \/backup\/mysql-data-20240115-103000.tar.gz -C \/data&#039;<\/span><\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa43:\u9a8c\u8bc1\u6062\u590d<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token parameter variable\">-v<\/span> mysql-data-restored:\/data alpine <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-la<\/span> \/data<\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa44:\u4f7f\u7528\u6062\u590d\u7684\u6570\u636e\u5377\u542f\u52a8\u5bb9\u5668<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> mysql-restored <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> mysql-data-restored:\/var\/lib\/mysql <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-e<\/span> <span class=\"token assign-left variable\">MYSQL_ROOT_PASSWORD<\/span><span class=\"token operator\">&#061;<\/span>RootPass123<span class=\"token operator\">!<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  mysql:8.0<\/p>\n<h5>6.7.2 \u6062\u590d\u811a\u672c<\/h5>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># restore-volume.sh &#8211; \u6570\u636e\u5377\u6062\u590d\u811a\u672c<\/span><\/p>\n<p><span class=\"token assign-left variable\">VOLUME_NAME<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\">$1<\/span><br \/>\n<span class=\"token assign-left variable\">BACKUP_FILE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\">$2<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token parameter variable\">-z<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$VOLUME_NAME<\/span>&#034;<\/span> <span class=\"token punctuation\">]<\/span> <span class=\"token operator\">||<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token parameter variable\">-z<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Usage: <span class=\"token variable\">$0<\/span> &lt;volume_name&gt; &lt;backup_file&gt;&#034;<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Example: <span class=\"token variable\">$0<\/span> mysql-data \/backup\/mysql-data-20240115-103000.tar.gz&#034;<\/span><br \/>\n    <span class=\"token builtin class-name\">exit<\/span> <span class=\"token number\">1<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token operator\">!<\/span> <span class=\"token parameter variable\">-f<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Error: Backup file not found: <span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span><br \/>\n    <span class=\"token builtin class-name\">exit<\/span> <span class=\"token number\">1<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token assign-left variable\">BACKUP_DIR<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">dirname<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n<span class=\"token assign-left variable\">BACKUP_FILENAME<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">basename<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span><span class=\"token variable\">)<\/span><\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Restoring volume: <span class=\"token variable\">$VOLUME_NAME<\/span>&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  From: <span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u68c0\u67e5\u6570\u636e\u5377\u662f\u5426\u5b58\u5728,\u4e0d\u5b58\u5728\u5219\u521b\u5efa<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token operator\">!<\/span> <span class=\"token function\">docker<\/span> volume inspect <span class=\"token string\">&#034;<span class=\"token variable\">$VOLUME_NAME<\/span>&#034;<\/span> <span class=\"token operator\">&gt;<\/span> \/dev\/null <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span><span class=\"token file-descriptor important\">&amp;1<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Creating new volume: <span class=\"token variable\">$VOLUME_NAME<\/span>&#034;<\/span><br \/>\n    <span class=\"token function\">docker<\/span> volume create <span class=\"token string\">&#034;<span class=\"token variable\">$VOLUME_NAME<\/span>&#034;<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token comment\"># \u6267\u884c\u6062\u590d<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$VOLUME_NAME<\/span>&#034;<\/span>:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span>:\/backup:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n    alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#034;tar xzf \/backup\/<span class=\"token variable\">$BACKUP_FILENAME<\/span> -C \/data&#034;<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token variable\">$?<\/span> <span class=\"token parameter variable\">-eq<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Restore completed successfully&#034;<\/span><br \/>\n<span class=\"token keyword\">else<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Restore FAILED!&#034;<\/span><br \/>\n    <span class=\"token builtin class-name\">exit<\/span> <span class=\"token number\">1<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token comment\"># \u4f7f\u7528\u6062\u590d\u811a\u672c<\/span><br \/>\n<span class=\"token function\">chmod<\/span> &#043;x restore-volume.sh<br \/>\n.\/restore-volume.sh mysql-data-restored \/backup\/mysql-data-20240115-103000.tar.gz<\/p>\n<h4>6.8 \u6570\u636e\u5377\u8fc1\u79fb<\/h4>\n<h5>6.8.1 \u540c\u4e3b\u673a\u8fc1\u79fb<\/h5>\n<p><span class=\"token comment\"># \u573a\u666f:\u5c06\u6570\u636e\u4ece\u65e7\u6570\u636e\u5377\u8fc1\u79fb\u5230\u65b0\u6570\u636e\u5377(\u53ef\u80fd\u4f7f\u7528\u4e0d\u540c\u7684\u9a71\u52a8)<\/span><\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa41:\u521b\u5efa\u65b0\u6570\u636e\u5377(\u4f8b\u5982\u4f7f\u7528NFS\u9a71\u52a8)<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token builtin class-name\">local<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>nfs <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">o<\/span><span class=\"token operator\">&#061;<\/span>addr<span class=\"token operator\">&#061;<\/span><span class=\"token number\">192.168<\/span>.1.100,nfsvers<span class=\"token operator\">&#061;<\/span><span class=\"token number\">4<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">device<\/span><span class=\"token operator\">&#061;<\/span>:\/data\/new-storage <span class=\"token punctuation\">\\\\<\/span><br \/>\n  new-data-volume<\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa42:\u8fc1\u79fb\u6570\u636e<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> old-data-volume:\/source:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> new-data-volume:\/target <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;cp -a \/source\/. \/target\/&#039;<\/span><\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa43:\u9a8c\u8bc1\u6570\u636e<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token parameter variable\">-v<\/span> new-data-volume:\/data alpine <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-la<\/span> \/data<\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa44:\u66f4\u65b0\u5bb9\u5668\u4f7f\u7528\u65b0\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-f<\/span> my-app<br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> my-app <span class=\"token parameter variable\">-v<\/span> new-data-volume:\/app\/data my-app:latest<\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa45:\u786e\u8ba4\u65e0\u8bef\u540e\u5220\u9664\u65e7\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume <span class=\"token function\">rm<\/span> old-data-volume<\/p>\n<h5>6.8.2 \u8de8\u4e3b\u673a\u8fc1\u79fb<\/h5>\n<p><span class=\"token comment\"># \u573a\u666f:\u5c06\u6570\u636e\u5377\u4ece\u4e3b\u673aA\u8fc1\u79fb\u5230\u4e3b\u673aB<\/span><\/p>\n<p><span class=\"token comment\"># \u4e3b\u673aA:\u5bfc\u51fa\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> source-volume:\/data:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/tmp:\/backup <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">tar<\/span> czf \/backup\/source-volume-backup.tar.gz <span class=\"token parameter variable\">-C<\/span> \/data <span class=\"token builtin class-name\">.<\/span><\/p>\n<p><span class=\"token comment\"># \u5c06\u5907\u4efd\u6587\u4ef6\u4f20\u8f93\u5230\u4e3b\u673aB<\/span><br \/>\n<span class=\"token function\">scp<\/span> \/tmp\/source-volume-backup.tar.gz user&#064;hostB:\/tmp\/<\/p>\n<p><span class=\"token comment\"># \u4e3b\u673aB:\u521b\u5efa\u65b0\u6570\u636e\u5377\u5e76\u6062\u590d<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create source-volume<br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> source-volume:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/tmp:\/backup:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;tar xzf \/backup\/source-volume-backup.tar.gz -C \/data&#039;<\/span><\/p>\n<p><span class=\"token comment\"># \u9a8c\u8bc1<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token parameter variable\">-v<\/span> source-volume:\/data alpine <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-la<\/span> \/data<\/p>\n<h5>6.8.3 \u4f7f\u7528rsync\u589e\u91cf\u8fc1\u79fb<\/h5>\n<p><span class=\"token comment\"># \u5bf9\u4e8e\u5927\u6570\u636e\u5377,\u4f7f\u7528rsync\u8fdb\u884c\u589e\u91cf\u8fc1\u79fb\u66f4\u9ad8\u6548<\/span><br \/>\n<span class=\"token comment\"># \u9700\u8981\u5728\u4e24\u7aef\u90fd\u652f\u6301rsync<\/span><\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa41:\u5728\u76ee\u6807\u4e3b\u673a\u521b\u5efa\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create migrated-data<\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa42:\u4f7f\u7528rsync\u8fc1\u79fb\u6570\u636e<\/span><br \/>\n<span class=\"token comment\"># \u65b9\u6cd5:\u5728\u6e90\u4e3b\u673a\u4e0a\u4e34\u65f6\u542f\u52a8rsync\u670d\u52a1\u7aef<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> rsync-server <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> source-volume:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-p<\/span> <span class=\"token number\">873<\/span>:873 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;apk add rsync &amp;&amp; rsync &#8211;daemon &#8211;no-detach&#039;<\/span><\/p>\n<p><span class=\"token comment\"># \u5728\u76ee\u6807\u4e3b\u673a\u4e0a\u62c9\u53d6\u6570\u636e<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> migrated-data:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;apk add rsync &amp;&amp; rsync -avz rsync:\/\/source-host:\/data\/ \/data\/&#039;<\/span><\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa43:\u6e05\u7406rsync\u670d\u52a1\u7aef<\/span><br \/>\n<span class=\"token comment\"># \u5728\u6e90\u4e3b\u673a\u4e0a<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-f<\/span> rsync-server<\/p>\n<h4>6.9 \u6570\u636e\u5377\u5927\u5c0f\u9650\u5236<\/h4>\n<h5>6.9.1 \u4f7f\u7528\u914d\u989d\u9650\u5236\u6570\u636e\u5377\u5927\u5c0f<\/h5>\n<p>Docker\u672c\u8eab\u4e0d\u76f4\u63a5\u652f\u6301\u4e3a\u6570\u636e\u5377\u8bbe\u7f6e\u5927\u5c0f\u9650\u5236,\u4f46\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u65b9\u6cd5\u5b9e\u73b0:<\/p>\n<p><span class=\"token comment\"># \u65b9\u6cd51:\u4f7f\u7528btrfs\u914d\u989d(\u9700\u8981Docker\u4f7f\u7528btrfs\u5b58\u50a8\u9a71\u52a8)<\/span><br \/>\n<span class=\"token comment\"># \u524d\u63d0:\/var\/lib\/docker\u5728btrfs\u6587\u4ef6\u7cfb\u7edf\u4e0a<\/span><br \/>\n<span class=\"token function\">sudo<\/span> btrfs <span class=\"token function\">quota<\/span> <span class=\"token builtin class-name\">enable<\/span> \/var\/lib\/docker<br \/>\n<span class=\"token function\">sudo<\/span> btrfs qgroup limit 10G \/var\/lib\/docker\/volumes\/my-volume\/_data<\/p>\n<p><span class=\"token comment\"># \u65b9\u6cd52:\u4f7f\u7528LVM\u521b\u5efa\u6307\u5b9a\u5927\u5c0f\u7684\u903b\u8f91\u5377<\/span><br \/>\n<span class=\"token comment\"># \u521b\u5efa\u4e00\u4e2a10GB\u7684\u903b\u8f91\u5377<\/span><br \/>\n<span class=\"token function\">sudo<\/span> lvcreate <span class=\"token parameter variable\">-L<\/span> 10G <span class=\"token parameter variable\">-n<\/span> docker-volume-data vg0<br \/>\n<span class=\"token function\">sudo<\/span> mkfs.ext4 \/dev\/vg0\/docker-volume-data<\/p>\n<p><span class=\"token comment\"># \u521b\u5efa\u57fa\u4e8e\u8be5\u903b\u8f91\u5377\u7684\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token builtin class-name\">local<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>ext4 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">device<\/span><span class=\"token operator\">&#061;<\/span>\/dev\/vg0\/docker-volume-data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  size-limited-volume<\/p>\n<p><span class=\"token comment\"># \u65b9\u6cd53:\u4f7f\u7528loop\u8bbe\u5907\u521b\u5efa\u56fa\u5b9a\u5927\u5c0f\u7684\u6587\u4ef6\u7cfb\u7edf<\/span><br \/>\n<span class=\"token comment\"># \u521b\u5efa\u4e00\u4e2a10GB\u7684\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">dd<\/span> <span class=\"token assign-left variable\">if<\/span><span class=\"token operator\">&#061;<\/span>\/dev\/zero <span class=\"token assign-left variable\">of<\/span><span class=\"token operator\">&#061;<\/span>\/tmp\/volume-image.img <span class=\"token assign-left variable\">bs<\/span><span class=\"token operator\">&#061;<\/span>1M <span class=\"token assign-left variable\">count<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token number\">10240<\/span><br \/>\n<span class=\"token function\">sudo<\/span> mkfs.ext4 \/tmp\/volume-image.img<br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">mount<\/span> <span class=\"token parameter variable\">-o<\/span> loop \/tmp\/volume-image.img \/mnt\/volume-mount<\/p>\n<p><span class=\"token comment\"># \u521b\u5efa\u6570\u636e\u5377\u65f6\u6307\u5411\u6302\u8f7d\u70b9<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token builtin class-name\">local<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>none <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">device<\/span><span class=\"token operator\">&#061;<\/span>\/mnt\/volume-mount <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">o<\/span><span class=\"token operator\">&#061;<\/span>bind <span class=\"token punctuation\">\\\\<\/span><br \/>\n  loop-volume<\/p>\n<p><span class=\"token comment\"># \u65b9\u6cd54:\u4f7f\u7528XFS\u914d\u989d<\/span><br \/>\n<span class=\"token comment\"># \u6302\u8f7dXFS\u65f6\u542f\u7528\u914d\u989d<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">mount<\/span> <span class=\"token parameter variable\">-o<\/span> prjquota \/dev\/sdb1 \/var\/lib\/docker<br \/>\n<span class=\"token comment\"># \u8bbe\u7f6e\u9879\u76ee\u914d\u989d<\/span><br \/>\n<span class=\"token function\">sudo<\/span> xfs_quota <span class=\"token parameter variable\">-x<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;project -s -p \/var\/lib\/docker\/volumes\/my-volume\/_data 1&#039;<\/span><br \/>\n<span class=\"token function\">sudo<\/span> xfs_quota <span class=\"token parameter variable\">-x<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;limit -p bhard&#061;10g 1&#039;<\/span><\/p>\n<h5>6.9.2 \u76d1\u63a7\u6570\u636e\u5377\u4f7f\u7528\u91cf<\/h5>\n<p><span class=\"token comment\"># \u65b9\u6cd51:\u4f7f\u7528docker system df<\/span><br \/>\n<span class=\"token function\">docker<\/span> system <span class=\"token function\">df<\/span> <span class=\"token parameter variable\">-v<\/span><br \/>\n<span class=\"token comment\"># \u4f1a\u663e\u793a\u6bcf\u4e2a\u6570\u636e\u5377\u7684\u5927\u5c0f<\/span><\/p>\n<p><span class=\"token comment\"># \u65b9\u6cd52:\u76f4\u63a5\u68c0\u67e5\u5bbf\u4e3b\u673a\u4e0a\u7684\u6570\u636e\u5377\u76ee\u5f55<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">du<\/span> <span class=\"token parameter variable\">-sh<\/span> \/var\/lib\/docker\/volumes\/*\/<\/p>\n<p><span class=\"token comment\"># \u65b9\u6cd53:\u901a\u8fc7\u5bb9\u5668\u68c0\u67e5<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token parameter variable\">-v<\/span> my-volume:\/data alpine <span class=\"token function\">du<\/span> <span class=\"token parameter variable\">-sh<\/span> \/data<\/p>\n<p><span class=\"token comment\"># \u65b9\u6cd54:\u76d1\u63a7\u811a\u672c<\/span><br \/>\n<span class=\"token comment\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># monitor-volumes.sh<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token for-or-select variable\">vol<\/span> <span class=\"token keyword\">in<\/span> <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-q<\/span><span class=\"token variable\">)<\/span><\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">do<\/span><br \/>\n    <span class=\"token assign-left variable\">SIZE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$vol<\/span>&#034;<\/span>:\/data alpine <span class=\"token function\">du<\/span> <span class=\"token parameter variable\">-sh<\/span> \/data <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null <span class=\"token operator\">|<\/span> <span class=\"token function\">cut<\/span> <span class=\"token parameter variable\">-f1<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$vol<\/span>: <span class=\"token variable\">$SIZE<\/span>&#034;<\/span><br \/>\n<span class=\"token keyword\">done<\/span><\/p>\n<h4>6.10 \u6570\u636e\u5377\u751f\u547d\u5468\u671f\u7ba1\u7406\u7b56\u7565<\/h4>\n<h5>6.10.1 \u751f\u547d\u5468\u671f\u9636\u6bb5<\/h5>\n<p>\u521b\u5efa \u2192 \u4f7f\u7528(\u6302\u8f7d\u5230\u5bb9\u5668) \u2192 \u5907\u4efd \u2192 \u8fc1\u79fb(\u53ef\u9009) \u2192 \u5f52\u6863 \u2192 \u6e05\u7406\/\u5220\u9664<\/p>\n<h5>6.10.2 \u751f\u547d\u5468\u671f\u7ba1\u7406\u6700\u4f73\u5b9e\u8df5<\/h5>\n<p><span class=\"token comment\"># 1. \u4f7f\u7528\u6807\u7b7e\u7ba1\u7406\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;label<\/span> <span class=\"token assign-left variable\">app<\/span><span class=\"token operator\">&#061;<\/span>mysql <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;label<\/span> <span class=\"token assign-left variable\">env<\/span><span class=\"token operator\">&#061;<\/span>production <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;label<\/span> <span class=\"token assign-left variable\">backup<\/span><span class=\"token operator\">&#061;<\/span>daily <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;label<\/span> <span class=\"token assign-left variable\">retention<\/span><span class=\"token operator\">&#061;<\/span>30d <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;label<\/span> <span class=\"token assign-left variable\">owner<\/span><span class=\"token operator\">&#061;<\/span>dba-team <span class=\"token punctuation\">\\\\<\/span><br \/>\n  mysql-prod-data<\/p>\n<p><span class=\"token comment\"># 2. \u5b9a\u671f\u5907\u4efd\u811a\u672c(crontab)<\/span><br \/>\n<span class=\"token comment\"># \/etc\/crontab<\/span><br \/>\n<span class=\"token comment\"># 0 2 * * * root \/opt\/scripts\/backup-all-volumes.sh &gt;&gt; \/var\/log\/volume-backup.log 2&gt;&amp;1<\/span><\/p>\n<p><span class=\"token comment\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># backup-all-volumes.sh &#8211; \u5907\u4efd\u6240\u6709\u6807\u8bb0\u4e86backup&#061;daily\u7684\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token assign-left variable\">BACKUP_DIR<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\/backup\/volumes\/<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%Y%m%d<span class=\"token variable\">)<\/span><\/span>&#034;<\/span><br \/>\n<span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span><\/p>\n<p><span class=\"token keyword\">for<\/span> <span class=\"token for-or-select variable\">vol<\/span> <span class=\"token keyword\">in<\/span> <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">&#8211;filter<\/span> <span class=\"token assign-left variable\">label<\/span><span class=\"token operator\">&#061;<\/span>backup<span class=\"token operator\">&#061;<\/span>daily <span class=\"token parameter variable\">-q<\/span><span class=\"token variable\">)<\/span><\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">do<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Backing up <span class=\"token variable\">$vol<\/span>&#8230;&#034;<\/span><br \/>\n    <span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n        <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$vol<\/span>&#034;<\/span>:\/data:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n        <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span>:\/backup <span class=\"token punctuation\">\\\\<\/span><br \/>\n        alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n        <span class=\"token function\">tar<\/span> czf <span class=\"token string\">&#034;\/backup\/<span class=\"token variable\">${vol}<\/span>.tar.gz&#034;<\/span> <span class=\"token parameter variable\">-C<\/span> \/data <span class=\"token builtin class-name\">.<\/span><br \/>\n<span class=\"token keyword\">done<\/span><\/p>\n<p><span class=\"token comment\"># \u6e05\u740630\u5929\u524d\u7684\u5907\u4efd<\/span><br \/>\n<span class=\"token function\">find<\/span> \/backup\/volumes\/ <span class=\"token parameter variable\">-maxdepth<\/span> <span class=\"token number\">1<\/span> <span class=\"token parameter variable\">-type<\/span> d <span class=\"token parameter variable\">-mtime<\/span> &#043;30 <span class=\"token parameter variable\">-exec<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-rf<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span> <span class=\"token punctuation\">\\\\<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\"># 3. \u6e05\u7406\u65e0\u7528\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token comment\"># \u8c28\u614e\u4f7f\u7528!\u5148\u68c0\u67e5\u518d\u6e05\u7406<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-f<\/span> <span class=\"token assign-left variable\">dangling<\/span><span class=\"token operator\">&#061;<\/span>true<br \/>\n<span class=\"token comment\"># \u786e\u8ba4\u540e\u6e05\u7406<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume prune <span class=\"token parameter variable\">-f<\/span><\/p>\n<p><span class=\"token comment\"># 4. \u6570\u636e\u5377\u5f52\u6863<\/span><br \/>\n<span class=\"token comment\"># \u5c06\u4e0d\u518d\u4f7f\u7528\u4f46\u9700\u8981\u4fdd\u7559\u7684\u6570\u636e\u5377\u5f52\u6863<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> old-data-volume:\/data:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/archive:\/archive <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">tar<\/span> czf \/archive\/old-data-volume-<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%Y%m%d<span class=\"token variable\">)<\/span><\/span>.tar.gz <span class=\"token parameter variable\">-C<\/span> \/data <span class=\"token builtin class-name\">.<\/span><\/p>\n<p><span class=\"token comment\"># \u5f52\u6863\u540e\u5220\u9664\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume <span class=\"token function\">rm<\/span> old-data-volume<\/p>\n<p><span class=\"token comment\"># 5. \u5b9a\u671f\u5b8c\u6574\u6027\u68c0\u67e5<\/span><br \/>\n<span class=\"token comment\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># check-volumes.sh &#8211; \u68c0\u67e5\u6570\u636e\u5377\u5b8c\u6574\u6027<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token for-or-select variable\">vol<\/span> <span class=\"token keyword\">in<\/span> <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-q<\/span><span class=\"token variable\">)<\/span><\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">do<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Checking <span class=\"token variable\">$vol<\/span>&#8230;&#034;<\/span><br \/>\n    <span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$vol<\/span>&#034;<\/span>:\/data alpine <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;<br \/>\n        if [ -d \/data ]; then<br \/>\n            FILE_COUNT&#061;$(find \/data -type f | wc -l)<br \/>\n            SIZE&#061;$(du -sh \/data | cut -f1)<br \/>\n            echo &#034;  Files: $FILE_COUNT, Size: $SIZE&#034;<br \/>\n        else<br \/>\n            echo &#034;  ERROR: \/data directory not found!&#034;<br \/>\n        fi<br \/>\n    &#039;<\/span><br \/>\n<span class=\"token keyword\">done<\/span><\/p>\n<hr \/>\n<h3>\u7b2c\u4e03\u7ae0 Dockerfile\u4e2d\u7684\u5b58\u50a8\u914d\u7f6e<\/h3>\n<h4>7.1 VOLUME\u6307\u4ee4\u8be6\u89e3<\/h4>\n<h5>7.1.1 VOLUME\u6307\u4ee4\u8bed\u6cd5<\/h5>\n<p>VOLUME\u6307\u4ee4\u5728Dockerfile\u4e2d\u7528\u4e8e\u58f0\u660e\u6570\u636e\u5377\u6302\u8f7d\u70b9\u3002\u5f53\u5bb9\u5668\u542f\u52a8\u65f6,\u5982\u679c\u7528\u6237\u6ca1\u6709\u901a\u8fc7-v\u53c2\u6570\u6307\u5b9a\u6570\u636e\u5377,Docker\u4f1a\u81ea\u52a8\u4e3a\u8fd9\u4e9b\u8def\u5f84\u521b\u5efa\u533f\u540d\u6570\u636e\u5377\u3002<\/p>\n<p># Dockerfile\u4e2d\u4f7f\u7528VOLUME\u6307\u4ee4<\/p>\n<p># \u8bed\u6cd51:JSON\u6570\u7ec4\u5f62\u5f0f(\u63a8\u8350)<br \/>\nVOLUME [&#034;\/data&#034;, &#034;\/var\/log\/app&#034;]<\/p>\n<p># \u8bed\u6cd52:\u7a7a\u683c\u5206\u9694\u7684\u5b57\u7b26\u4e32\u5f62\u5f0f<br \/>\nVOLUME \/data \/var\/log\/app<\/p>\n<h5>7.1.2 VOLUME\u6307\u4ee4\u7684\u4f5c\u7528<\/h5>\n<p># \u793a\u4f8bDockerfile<br \/>\nFROM ubuntu:22.04<\/p>\n<p># \u521b\u5efa\u76ee\u5f55<br \/>\nRUN mkdir -p \/app\/data \/app\/logs<\/p>\n<p># \u58f0\u660e\u6570\u636e\u5377<br \/>\nVOLUME [&#034;\/app\/data&#034;, &#034;\/app\/logs&#034;]<\/p>\n<p># \u8bbe\u7f6e\u9ed8\u8ba4\u547d\u4ee4<br \/>\nCMD [&#034;sleep&#034;, &#034;3600&#034;]<\/p>\n<p><span class=\"token comment\"># \u6784\u5efa\u955c\u50cf<\/span><br \/>\n<span class=\"token function\">docker<\/span> build <span class=\"token parameter variable\">-t<\/span> volume-test <span class=\"token builtin class-name\">.<\/span><\/p>\n<p><span class=\"token comment\"># \u8fd0\u884c\u5bb9\u5668(\u4e0d\u6307\u5b9a-v\u53c2\u6570)<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> auto-volume volume-test<\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u81ea\u52a8\u521b\u5efa\u7684\u533f\u540d\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> inspect auto-volume <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{json .Mounts}}&#039;<\/span> <span class=\"token operator\">|<\/span> python3 <span class=\"token parameter variable\">-m<\/span> json.tool<br \/>\n<span class=\"token comment\"># \u8f93\u51fa:<\/span><br \/>\n<span class=\"token comment\"># [<\/span><br \/>\n<span class=\"token comment\">#     {<\/span><br \/>\n<span class=\"token comment\">#         &#034;Type&#034;: &#034;volume&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Name&#034;: &#034;abc123def456&#8230;&#034;,  # \u533f\u540d\u6570\u636e\u5377(\u54c8\u5e0c\u547d\u540d)<\/span><br \/>\n<span class=\"token comment\">#         &#034;Source&#034;: &#034;\/var\/lib\/docker\/volumes\/abc123def456&#8230;\/_data&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Destination&#034;: &#034;\/app\/data&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Driver&#034;: &#034;local&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Mode&#034;: &#034;&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;RW&#034;: true,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Propagation&#034;: &#034;&#034;<\/span><br \/>\n<span class=\"token comment\">#     },<\/span><br \/>\n<span class=\"token comment\">#     {<\/span><br \/>\n<span class=\"token comment\">#         &#034;Type&#034;: &#034;volume&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Name&#034;: &#034;xyz789ghi012&#8230;&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Source&#034;: &#034;\/var\/lib\/docker\/volumes\/xyz789ghi012&#8230;\/_data&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Destination&#034;: &#034;\/app\/logs&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Driver&#034;: &#034;local&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Mode&#034;: &#034;&#034;,<\/span><br \/>\n<span class=\"token comment\">#         &#034;RW&#034;: true,<\/span><br \/>\n<span class=\"token comment\">#         &#034;Propagation&#034;: &#034;&#034;<\/span><br \/>\n<span class=\"token comment\">#     }<\/span><br \/>\n<span class=\"token comment\"># ]<\/span><\/p>\n<h4>7.2 VOLUME\u6307\u4ee4\u7684\u6ce8\u610f\u4e8b\u9879<\/h4>\n<h5>7.2.1 \u533f\u540d\u6570\u636e\u5377\u95ee\u9898<\/h5>\n<p># Dockerfile<br \/>\nFROM nginx:latest<br \/>\nVOLUME \/usr\/share\/nginx\/html<\/p>\n<p><span class=\"token comment\"># \u6bcf\u6b21\u8fd0\u884c\u5bb9\u5668\u90fd\u4f1a\u521b\u5efa\u4e00\u4e2a\u533f\u540d\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> web1 volume-nginx  <span class=\"token comment\"># \u521b\u5efa\u533f\u540d\u53771<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> web2 volume-nginx  <span class=\"token comment\"># \u521b\u5efa\u533f\u540d\u53772<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> web3 volume-nginx  <span class=\"token comment\"># \u521b\u5efa\u533f\u540d\u53773<\/span><\/p>\n<p><span class=\"token comment\"># \u5220\u9664\u5bb9\u5668\u540e,\u533f\u540d\u6570\u636e\u5377\u4e0d\u4f1a\u88ab\u81ea\u52a8\u5220\u9664<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-f<\/span> web1 web2 web3<\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u9057\u7559\u7684\u533f\u540d\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span><br \/>\n<span class=\"token comment\"># \u4f1a\u770b\u52303\u4e2a\u54c8\u5e0c\u547d\u540d\u7684\u533f\u540d\u6570\u636e\u5377<\/span><\/p>\n<p><span class=\"token comment\"># \u6e05\u7406<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume prune <span class=\"token parameter variable\">-f<\/span><\/p>\n<h5>7.2.2 VOLUME\u6307\u4ee4\u540e\u7684RUN\u6307\u4ee4<\/h5>\n<p># \u91cd\u8981:VOLUME\u6307\u4ee4\u540e\u7684RUN\u6307\u4ee4\u5bf9VOLUME\u58f0\u660e\u7684\u8def\u5f84\u65e0\u6548!<br \/>\n# \u56e0\u4e3aVOLUME\u58f0\u660e\u540e,Docker\u77e5\u9053\u8be5\u8def\u5f84\u5c06\u4f7f\u7528\u5916\u90e8\u5b58\u50a8,<br \/>\n# \u6240\u4ee5\u4e0d\u4f1a\u5c06RUN\u6307\u4ee4\u5bf9\u8be5\u8def\u5f84\u7684\u4fee\u6539\u4fdd\u5b58\u5230\u955c\u50cf\u4e2d<\/p>\n<p># \u9519\u8bef\u793a\u4f8b:<br \/>\nFROM ubuntu:22.04<br \/>\nVOLUME \/app\/data<br \/>\nRUN echo &#034;initial data&#034; &gt; \/app\/data\/initial.txt  # \u8fd9\u884c\u4e0d\u4f1a\u88ab\u4fdd\u5b58\u5230\u955c\u50cf!<br \/>\n# \u539f\u56e0:VOLUME\u58f0\u660e\u540e,\/app\/data\u88ab\u8ba4\u4e3a\u662f\u5916\u90e8\u6302\u8f7d\u70b9,<br \/>\n# RUN\u6307\u4ee4\u4e2d\u7684\u4fee\u6539\u53ea\u4f1a\u5f71\u54cd\u4e34\u65f6\u5bb9\u5668\u7684\u53ef\u5199\u5c42,\u4e0d\u4f1a\u5199\u5165\u955c\u50cf\u5c42<\/p>\n<p># \u6b63\u786e\u793a\u4f8b:\u5148\u5199\u5165\u6570\u636e,\u518d\u58f0\u660eVOLUME<br \/>\nFROM ubuntu:22.04<br \/>\nRUN mkdir -p \/app\/data &amp;&amp; echo &#034;initial data&#034; &gt; \/app\/data\/initial.txt<br \/>\nVOLUME \/app\/data<br \/>\n# \u8fd9\u6837initial.txt\u4f1a\u88ab\u5305\u542b\u5728\u955c\u50cf\u4e2d,\u9996\u6b21\u6302\u8f7d\u65f6\u4f1a\u88ab\u590d\u5236\u5230\u6570\u636e\u5377<\/p>\n<h5>7.2.3 VOLUME\u6307\u4ee4\u4e0e\u955c\u50cf\u5c42\u7684\u5173\u7cfb<\/h5>\n<p># VOLUME\u6307\u4ee4\u672c\u8eab\u4e0d\u521b\u5efa\u65b0\u5c42,\u5b83\u53ea\u662f\u5728\u955c\u50cf\u5143\u6570\u636e\u4e2d\u6dfb\u52a0\u58f0\u660e<br \/>\n# \u4f46VOLUME\u6307\u4ee4\u4f1a\u5f71\u54cd\u540e\u7eed\u6307\u4ee4\u7684\u884c\u4e3a<\/p>\n<p>FROM ubuntu:22.04<\/p>\n<p># \u8fd9\u4e00\u5c42\u4f1a\u5305\u542b\u6587\u4ef6<br \/>\nRUN mkdir -p \/app\/data &amp;&amp; echo &#034;content&#034; &gt; \/app\/data\/file.txt<\/p>\n<p># VOLUME\u58f0\u660e(\u4e0d\u5f71\u54cd\u5df2\u6709\u7684\u955c\u50cf\u5c42)<br \/>\nVOLUME \/app\/data<\/p>\n<p># \u8fd9\u4e00\u5c42\u4e0d\u4f1a\u5f71\u54cd\/app\/data(\u56e0\u4e3aVOLUME\u5df2\u58f0\u660e)<br \/>\nRUN echo &#034;new content&#034; &gt; \/app\/data\/newfile.txt<br \/>\n# newfile.txt\u4e0d\u4f1a\u88ab\u4fdd\u5b58\u5230\u955c\u50cf\u4e2d!<\/p>\n<p># \u6784\u5efa\u5e76\u9a8c\u8bc1<br \/>\n# docker build -t test .<br \/>\n# docker run &#8211;rm test ls \/app\/data\/<br \/>\n# \u8f93\u51fa: file.txt  (\u6ca1\u6709newfile.txt!)<\/p>\n<h4>7.3 VOLUME\u4e0edocker run -v\u7684\u4ea4\u4e92<\/h4>\n<h5>7.3.1 -v\u8986\u76d6VOLUME\u58f0\u660e\u7684\u8def\u5f84<\/h5>\n<p># Dockerfile<br \/>\nFROM nginx:latest<br \/>\nVOLUME [&#034;\/usr\/share\/nginx\/html&#034;]<\/p>\n<p><span class=\"token comment\"># \u60c5\u51b51:\u4e0d\u6307\u5b9a-v,Docker\u521b\u5efa\u533f\u540d\u6570\u636e\u5377(\u5305\u542b\u955c\u50cf\u5185\u5bb9)<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> web1 volume-nginx<br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> web1 <span class=\"token function\">ls<\/span> \/usr\/share\/nginx\/html<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: 50x.html  index.html (\u4ece\u955c\u50cf\u590d\u5236)<\/span><\/p>\n<p><span class=\"token comment\"># \u60c5\u51b52:\u6307\u5b9a\u547d\u540d\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> web2 <span class=\"token parameter variable\">-v<\/span> my-html:\/usr\/share\/nginx\/html volume-nginx<br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> web2 <span class=\"token function\">ls<\/span> \/usr\/share\/nginx\/html<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: 50x.html  index.html (\u9996\u6b21\u6302\u8f7d\u65f6\u4ece\u955c\u50cf\u590d\u5236)<\/span><\/p>\n<p><span class=\"token comment\"># \u60c5\u51b53:\u6307\u5b9a\u7ed1\u5b9a\u6302\u8f7d(\u4e0d\u4f1a\u590d\u5236\u955c\u50cf\u5185\u5bb9)<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> web3 <span class=\"token parameter variable\">-v<\/span> \/tmp\/empty:\/usr\/share\/nginx\/html volume-nginx<br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> web3 <span class=\"token function\">ls<\/span> \/usr\/share\/nginx\/html<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: (\u7a7a,\u7ed1\u5b9a\u6302\u8f7d\u4e0d\u590d\u5236\u955c\u50cf\u5185\u5bb9)<\/span><\/p>\n<p><span class=\"token comment\"># \u60c5\u51b54:\u6302\u8f7d\u5df2\u6709\u5185\u5bb9\u7684\u6570\u636e\u5377(\u4e0d\u590d\u5236\u955c\u50cf\u5185\u5bb9)<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create pre-filled-volume<br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token parameter variable\">-v<\/span> pre-filled-volume:\/data alpine <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;echo &#034;existing&#034; &gt; \/data\/existing.txt&#039;<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> web4 <span class=\"token parameter variable\">-v<\/span> pre-filled-volume:\/usr\/share\/nginx\/html volume-nginx<br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> web4 <span class=\"token function\">ls<\/span> \/usr\/share\/nginx\/html<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: existing.txt (\u5df2\u6709\u5185\u5bb9,\u4e0d\u590d\u5236\u955c\u50cf\u5185\u5bb9)<\/span><\/p>\n<h5>7.3.2 \u884c\u4e3a\u603b\u7ed3<\/h5>\n<table>\n<tr>\u573a\u666f\u955c\u50cf\u5185\u5bb9\u662f\u5426\u590d\u5236\u5230\u6570\u636e\u5377<\/tr>\n<tbody>\n<tr>\n<td>VOLUME\u58f0\u660e &#043; \u4e0d\u6307\u5b9a-v(\u521b\u5efa\u533f\u540d\u5377)<\/td>\n<td>\u662f<\/td>\n<\/tr>\n<tr>\n<td>VOLUME\u58f0\u660e &#043; \u547d\u540d\u6570\u636e\u5377(\u9996\u6b21\u521b\u5efa)<\/td>\n<td>\u662f<\/td>\n<\/tr>\n<tr>\n<td>VOLUME\u58f0\u660e &#043; \u547d\u540d\u6570\u636e\u5377(\u5df2\u6709\u5185\u5bb9)<\/td>\n<td>\u5426<\/td>\n<\/tr>\n<tr>\n<td>VOLUME\u58f0\u660e &#043; \u7ed1\u5b9a\u6302\u8f7d<\/td>\n<td>\u5426<\/td>\n<\/tr>\n<tr>\n<td>\u65e0VOLUME\u58f0\u660e &#043; \u547d\u540d\u6570\u636e\u5377(\u9996\u6b21\u521b\u5efa)<\/td>\n<td>\u662f<\/td>\n<\/tr>\n<tr>\n<td>\u65e0VOLUME\u58f0\u660e &#043; \u7ed1\u5b9a\u6302\u8f7d<\/td>\n<td>\u5426<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>7.4 \u5728Dockerfile\u4e2d\u5b9a\u4e49\u6570\u636e\u5377\u7684\u6700\u4f73\u5b9e\u8df5<\/h4>\n<h5>7.4.1 \u6700\u4f73\u5b9e\u8df5\u5efa\u8bae<\/h5>\n<p># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n# \u6700\u4f73\u5b9e\u8df51:\u8c28\u614e\u4f7f\u7528VOLUME\u6307\u4ee4<br \/>\n# &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/p>\n<p># \u4e0d\u63a8\u8350:\u5728\u57fa\u7840\u955c\u50cf\u4e2d\u4f7f\u7528VOLUME<br \/>\n# \u8fd9\u4f1a\u5bfc\u81f4\u6240\u6709\u7ee7\u627f\u7684\u955c\u50cf\u90fd\u88ab\u5f3a\u5236\u521b\u5efa\u533f\u540d\u6570\u636e\u5377<br \/>\n# FROM ubuntu:22.04<br \/>\n# VOLUME \/data  # \u4e0d\u63a8\u8350<\/p>\n<p># \u63a8\u8350:\u8ba9\u7528\u6237\u5728docker run\u65f6\u901a\u8fc7-v\u6307\u5b9a<br \/>\n# \u5728\u6587\u6863\u4e2d\u8bf4\u660e\u9700\u8981\u6301\u4e45\u5316\u7684\u8def\u5f84\u5373\u53ef<\/p>\n<p># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n# \u6700\u4f73\u5b9e\u8df52:\u5bf9\u4e8e\u6570\u636e\u5e93\u955c\u50cf,\u58f0\u660eVOLUME\u662f\u5408\u7406\u7684<br \/>\n# &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/p>\n<p># MySQL\u5b98\u65b9Dockerfile\u4e2d\u58f0\u660e\u4e86VOLUME<br \/>\n# FROM mysql:8.0<br \/>\n# VOLUME \/var\/lib\/mysql<br \/>\n# \u8fd9\u6837\u5373\u4f7f\u7528\u6237\u5fd8\u8bb0\u6307\u5b9a-v,\u6570\u636e\u4e5f\u4f1a\u4fdd\u5b58\u5728\u533f\u540d\u6570\u636e\u5377\u4e2d<br \/>\n# \u867d\u7136\u533f\u540d\u5377\u96be\u4ee5\u7ba1\u7406,\u4f46\u81f3\u5c11\u4e0d\u4f1a\u56e0\u5bb9\u5668\u5220\u9664\u800c\u4e22\u5931<\/p>\n<p># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n# \u6700\u4f73\u5b9e\u8df53:\u5728VOLUME\u4e4b\u524d\u51c6\u5907\u521d\u59cb\u6570\u636e<br \/>\n# &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/p>\n<p>FROM ubuntu:22.04<\/p>\n<p># \u5148\u521b\u5efa\u76ee\u5f55\u548c\u521d\u59cb\u6570\u636e<br \/>\nRUN mkdir -p \/app\/data &amp;&amp; \\\\<br \/>\n    echo &#039;{&#034;initialized&#034;: true}&#039; &gt; \/app\/data\/config.json &amp;&amp; \\\\<br \/>\n    echo &#039;#!\/bin\/sh&#039; &gt; \/app\/data\/init.sh &amp;&amp; \\\\<br \/>\n    chmod &#043;x \/app\/data\/init.sh<\/p>\n<p># \u7136\u540e\u58f0\u660eVOLUME<br \/>\nVOLUME [&#034;\/app\/data&#034;]<\/p>\n<p># \u8fd9\u6837config.json\u548cinit.sh\u4f1a\u88ab\u5305\u542b\u5728\u955c\u50cf\u4e2d<br \/>\n# \u9996\u6b21\u6302\u8f7d\u65f6\u4f1a\u590d\u5236\u5230\u6570\u636e\u5377<\/p>\n<p>CMD [&#034;sleep&#034;, &#034;3600&#034;]<\/p>\n<h5>7.4.2 \u907f\u514d\u5728VOLUME\u8def\u5f84\u4e0b\u6267\u884c\u5199\u64cd\u4f5c<\/h5>\n<p># \u4e0d\u63a8\u8350<br \/>\nFROM node:18-alpine<br \/>\nWORKDIR \/app<br \/>\nVOLUME [&#034;\/app&#034;]  # \u6574\u4e2a\/app\u76ee\u5f55\u58f0\u660e\u4e3aVOLUME<br \/>\nCOPY . .          # COPY\u64cd\u4f5c\u53d1\u751f\u5728VOLUME\u58f0\u660e\u4e4b\u540e,\u53ef\u80fd\u6709\u95ee\u9898<br \/>\nRUN npm install   # npm install\u7684\u7ed3\u679c\u53ef\u80fd\u4e0d\u88ab\u4fdd\u5b58<\/p>\n<p># \u63a8\u8350<br \/>\nFROM node:18-alpine<br \/>\nWORKDIR \/app<br \/>\nCOPY . .          # \u5148COPY<br \/>\nRUN npm install   # \u5148\u5b89\u88c5\u4f9d\u8d56<br \/>\n# \u4e0d\u58f0\u660eVOLUME,\u8ba9\u7528\u6237\u51b3\u5b9a\u5982\u4f55\u6301\u4e45\u5316<br \/>\n# \u6216\u8005\u53ea\u58f0\u660e\u9700\u8981\u6301\u4e45\u5316\u7684\u5b50\u76ee\u5f55<br \/>\nVOLUME [&#034;\/app\/data&#034;]  # \u53ea\u6301\u4e45\u5316\u6570\u636e\u76ee\u5f55<\/p>\n<h4>7.5 \u591a\u9636\u6bb5\u6784\u5efa\u4e2d\u7684\u6570\u636e\u5377\u5904\u7406<\/h4>\n<h5>7.5.1 \u591a\u9636\u6bb5\u6784\u5efa\u4e0eVOLUME<\/h5>\n<p># \u591a\u9636\u6bb5\u6784\u5efa\u4e2d,VOLUME\u6307\u4ee4\u53ea\u5728\u6700\u7ec8\u9636\u6bb5\u751f\u6548<\/p>\n<p># \u9636\u6bb51:\u6784\u5efa\u9636\u6bb5<br \/>\nFROM node:18-alpine AS builder<br \/>\nWORKDIR \/app<br \/>\nCOPY package*.json .\/<br \/>\nRUN npm ci<br \/>\nCOPY . .<br \/>\nRUN npm run build<\/p>\n<p># \u9636\u6bb52:\u8fd0\u884c\u9636\u6bb5<br \/>\nFROM nginx:alpine<br \/>\n# \u4ece\u6784\u5efa\u9636\u6bb5\u590d\u5236\u4ea7\u7269<br \/>\nCOPY &#8211;from&#061;builder \/app\/dist \/usr\/share\/nginx\/html<br \/>\n# \u58f0\u660e\u6570\u636e\u5377(\u4ec5\u5728\u6b64\u9636\u6bb5\u751f\u6548)<br \/>\nVOLUME [&#034;\/var\/log\/nginx&#034;]<br \/>\nEXPOSE 80<br \/>\nCMD [&#034;nginx&#034;, &#034;-g&#034;, &#034;daemon off;&#034;]<\/p>\n<h5>7.5.2 \u591a\u9636\u6bb5\u6784\u5efa\u4e2d\u7684\u6570\u636e\u4f20\u9012<\/h5>\n<p># \u5728\u591a\u9636\u6bb5\u6784\u5efa\u4e2d,\u6570\u636e\u5377\u58f0\u660e\u4e0d\u4f1a\u8de8\u9636\u6bb5\u4f20\u9012<br \/>\n# \u6bcf\u4e2a\u9636\u6bb5\u662f\u72ec\u7acb\u7684<\/p>\n<p># \u9636\u6bb51:\u6570\u636e\u51c6\u5907\u9636\u6bb5<br \/>\nFROM alpine AS data-prep<br \/>\nRUN mkdir -p \/data &amp;&amp; \\\\<br \/>\n    echo &#034;prepared data&#034; &gt; \/data\/ready.txt<\/p>\n<p># \u9636\u6bb52:\u8fd0\u884c\u9636\u6bb5<br \/>\nFROM alpine<br \/>\n# \u4ece\u9636\u6bb51\u590d\u5236\u6570\u636e(\u8fd9\u4e0d\u662f\u6570\u636e\u5377,\u662f\u955c\u50cf\u5c42\u590d\u5236)<br \/>\nCOPY &#8211;from&#061;data-prep \/data \/app\/data<br \/>\n# \u58f0\u660e\u6570\u636e\u5377<br \/>\nVOLUME [&#034;\/app\/data&#034;]<br \/>\nCMD [&#034;cat&#034;, &#034;\/app\/data\/ready.txt&#034;]<\/p>\n<h4>7.6 \u955c\u50cf\u4e2d\u9884\u586b\u5145\u6570\u636e\u5377\u5185\u5bb9<\/h4>\n<h5>7.6.1 \u9884\u586b\u5145\u673a\u5236<\/h5>\n<p>\u5f53\u547d\u540d\u6570\u636e\u5377\u9996\u6b21\u6302\u8f7d\u5230\u4e00\u4e2a\u975e\u7a7a\u76ee\u5f55\u65f6(\u76ee\u5f55\u4e2d\u6709\u955c\u50cf\u5c42\u7684\u5185\u5bb9),Docker\u4f1a\u5c06\u8fd9\u4e9b\u5185\u5bb9\u590d\u5236\u5230\u6570\u636e\u5377\u4e2d\u3002\u8fd9\u88ab\u79f0\u4e3a&#034;\u9884\u586b\u5145&#034;\u3002<\/p>\n<p># Dockerfile &#8211; \u9884\u586b\u5145\u6570\u636e\u5377\u5185\u5bb9<br \/>\nFROM ubuntu:22.04<\/p>\n<p># \u521b\u5efa\u76ee\u5f55\u5e76\u586b\u5145\u521d\u59cb\u6570\u636e<br \/>\nRUN mkdir -p \/app\/data \/app\/config \/app\/templates<\/p>\n<p># \u586b\u5145\u521d\u59cb\u6570\u636e\u6587\u4ef6<br \/>\nRUN echo &#039;{&#034;version&#034;: &#034;1.0&#034;, &#034;initialized&#034;: false}&#039; &gt; \/app\/data\/default.json<\/p>\n<p># \u586b\u5145\u914d\u7f6e\u6587\u4ef6<br \/>\nRUN echo &#039;server.port&#061;8080&#039; &gt; \/app\/config\/application.properties<\/p>\n<p># \u586b\u5145\u6a21\u677f\u6587\u4ef6<br \/>\nRUN echo &#039;&lt;html&gt;&lt;body&gt;Hello {{name}}&lt;\/body&gt;&lt;\/html&gt;&#039; &gt; \/app\/templates\/index.html<\/p>\n<p># \u58f0\u660e\u6570\u636e\u5377<br \/>\nVOLUME [&#034;\/app\/data&#034;, &#034;\/app\/config&#034;, &#034;\/app\/templates&#034;]<\/p>\n<p>CMD [&#034;sleep&#034;, &#034;3600&#034;]<\/p>\n<p><span class=\"token comment\"># \u6784\u5efa\u955c\u50cf<\/span><br \/>\n<span class=\"token function\">docker<\/span> build <span class=\"token parameter variable\">-t<\/span> pre-filled-app <span class=\"token builtin class-name\">.<\/span><\/p>\n<p><span class=\"token comment\"># \u521b\u5efa\u547d\u540d\u6570\u636e\u5377(\u9996\u6b21\u6302\u8f7d\u4f1a\u590d\u5236\u955c\u50cf\u5185\u5bb9)<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create app-data<br \/>\n<span class=\"token function\">docker<\/span> volume create app-config<\/p>\n<p><span class=\"token comment\"># \u8fd0\u884c\u5bb9\u5668<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> app-data:\/app\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> app-config:\/app\/config <span class=\"token punctuation\">\\\\<\/span><br \/>\n  pre-filled-app<\/p>\n<p><span class=\"token comment\"># \u9a8c\u8bc1\u6570\u636e\u5377\u4e2d\u5305\u542b\u4e86\u955c\u50cf\u7684\u521d\u59cb\u5185\u5bb9<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> app <span class=\"token function\">cat<\/span> \/app\/data\/default.json<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: {&#034;version&#034;: &#034;1.0&#034;, &#034;initialized&#034;: false}<\/span><\/p>\n<p><span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> app <span class=\"token function\">cat<\/span> \/app\/config\/application.properties<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: server.port&#061;8080<\/span><\/p>\n<p><span class=\"token comment\"># \u7528\u6237\u53ef\u4ee5\u4fee\u6539\u6570\u636e\u5377\u4e2d\u7684\u5185\u5bb9<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> app <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;echo &#034;{\\\\&#034;version\\\\&#034;: \\\\&#034;1.0\\\\&#034;, \\\\&#034;initialized\\\\&#034;: true}&#034; &gt; \/app\/data\/default.json&#039;<\/span><\/p>\n<p><span class=\"token comment\"># \u4e0b\u6b21\u521b\u5efa\u5bb9\u5668\u65f6,\u6570\u636e\u5377\u4e2d\u662f\u4fee\u6539\u540e\u7684\u5185\u5bb9(\u4e0d\u518d\u590d\u5236\u955c\u50cf\u5185\u5bb9)<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-f<\/span> app<br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> app2 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> app-data:\/app\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> app-config:\/app\/config <span class=\"token punctuation\">\\\\<\/span><br \/>\n  pre-filled-app<\/p>\n<p><span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> app2 <span class=\"token function\">cat<\/span> \/app\/data\/default.json<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: {&#034;version&#034;: &#034;1.0&#034;, &#034;initialized&#034;: true}<\/span><\/p>\n<h5>7.6.2 \u521d\u59cb\u5316\u811a\u672c\u6a21\u5f0f<\/h5>\n<p># Dockerfile &#8211; \u4f7f\u7528\u521d\u59cb\u5316\u811a\u672c\u586b\u5145\u6570\u636e\u5377<br \/>\nFROM ubuntu:22.04<\/p>\n<p># \u590d\u5236\u521d\u59cb\u5316\u811a\u672c<br \/>\nCOPY init-data.sh \/docker-entrypoint-initdb.d\/<br \/>\nRUN chmod &#043;x \/docker-entrypoint-initdb.d\/init-data.sh<\/p>\n<p># \u58f0\u660e\u6570\u636e\u5377<br \/>\nVOLUME [&#034;\/app\/data&#034;]<\/p>\n<p># \u81ea\u5b9a\u4e49entrypoint<br \/>\nCOPY entrypoint.sh \/entrypoint.sh<br \/>\nRUN chmod &#043;x \/entrypoint.sh<br \/>\nENTRYPOINT [&#034;\/entrypoint.sh&#034;]<br \/>\nCMD [&#034;sleep&#034;, &#034;3600&#034;]<\/p>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># entrypoint.sh &#8211; \u81ea\u5b9a\u4e49\u5165\u53e3\u811a\u672c<\/span><br \/>\n<span class=\"token builtin class-name\">set<\/span> <span class=\"token parameter variable\">-e<\/span><\/p>\n<p><span class=\"token comment\"># \u5982\u679c\u6570\u636e\u5377\u4e3a\u7a7a,\u6267\u884c\u521d\u59cb\u5316<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token parameter variable\">-z<\/span> <span class=\"token string\">&#034;<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-A<\/span> \/app\/data <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null<span class=\"token variable\">)<\/span><\/span>&#034;<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Initializing data volume&#8230;&#034;<\/span><br \/>\n    \/docker-entrypoint-initdb.d\/init-data.sh<br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token comment\"># \u6267\u884c\u4e3b\u547d\u4ee4<\/span><br \/>\n<span class=\"token builtin class-name\">exec<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$&#064;<\/span>&#034;<\/span><\/p>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># init-data.sh &#8211; \u521d\u59cb\u5316\u811a\u672c<\/span><br \/>\n<span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> \/app\/data<br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#039;{&#034;initialized&#034;: true, &#034;timestamp&#034;: &#034;&#039;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> <span class=\"token parameter variable\">-Iseconds<\/span><span class=\"token variable\">)<\/span><\/span><span class=\"token string\">&#039;&#034;}&#039;<\/span> <span class=\"token operator\">&gt;<\/span> \/app\/data\/init.json<br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Data volume initialized at <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u6784\u5efa\u5e76\u8fd0\u884c<\/span><br \/>\n<span class=\"token function\">docker<\/span> build <span class=\"token parameter variable\">-t<\/span> init-app <span class=\"token builtin class-name\">.<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create app-fresh-data<br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token parameter variable\">&#8211;name<\/span> app <span class=\"token parameter variable\">-v<\/span> app-fresh-data:\/app\/data init-app<\/p>\n<p><span class=\"token comment\"># \u9a8c\u8bc1\u521d\u59cb\u5316<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> app <span class=\"token function\">cat<\/span> \/app\/data\/init.json<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: {&#034;initialized&#034;: true, &#034;timestamp&#034;: &#034;2024-01-15T10:30:00&#043;00:00&#034;}<\/span><\/p>\n<p><span class=\"token comment\"># \u91cd\u542f\u5bb9\u5668,\u4e0d\u4f1a\u91cd\u590d\u521d\u59cb\u5316(\u56e0\u4e3a\u6570\u636e\u5377\u4e0d\u4e3a\u7a7a)<\/span><br \/>\n<span class=\"token function\">docker<\/span> restart app<br \/>\n<span class=\"token function\">docker<\/span> logs app <span class=\"token operator\">|<\/span> <span class=\"token function\">grep<\/span> <span class=\"token string\">&#034;Initializing&#034;<\/span><br \/>\n<span class=\"token comment\"># \u53ea\u5728\u9996\u6b21\u542f\u52a8\u65f6\u51fa\u73b0<\/span><\/p>\n<hr \/>\n<h3>\u7b2c\u516b\u7ae0 \u5e38\u89c1\u6570\u636e\u5e93\u7684\u5b58\u50a8\u65b9\u6848<\/h3>\n<p>\u6570\u636e\u5e93\u662f\u5bb9\u5668\u5316\u90e8\u7f72\u4e2d\u6700\u9700\u8981\u6570\u636e\u6301\u4e45\u5316\u7684\u5e94\u7528\u7c7b\u578b\u3002\u672c\u7ae0\u5c06\u8be6\u7ec6\u8bb2\u89e3MySQL\u3001PostgreSQL\u3001MongoDB\u3001Redis\u548cElasticsearch\u4e94\u79cd\u5e38\u89c1\u6570\u636e\u5e93\u5728Docker\u4e2d\u7684\u5b8c\u6574\u6301\u4e45\u5316\u65b9\u6848,\u5305\u62ec\u6570\u636e\u5377\u914d\u7f6e\u3001\u914d\u7f6e\u6587\u4ef6\u6302\u8f7d\u3001\u65e5\u5fd7\u7ba1\u7406\u3001\u5907\u4efd\u6062\u590d\u548c\u6027\u80fd\u4f18\u5316\u3002<\/p>\n<h4>8.1 MySQL\u6570\u636e\u6301\u4e45\u5316\u65b9\u6848(\u5b8c\u6574\u914d\u7f6e)<\/h4>\n<h5>8.1.1 \u9700\u6c42\u5206\u6790<\/h5>\n<p>MySQL\u662f\u4f7f\u7528\u6700\u5e7f\u6cdb\u7684\u5173\u7cfb\u578b\u6570\u636e\u5e93\u4e4b\u4e00\u3002\u5728Docker\u4e2d\u90e8\u7f72MySQL,\u9700\u8981\u8003\u8651\u4ee5\u4e0b\u6301\u4e45\u5316\u9700\u6c42:<\/p>\n<ul>\n<li>\u6570\u636e\u6587\u4ef6(\/var\/lib\/mysql):\u5b58\u50a8\u6240\u6709\u6570\u636e\u5e93\u548c\u8868\u6570\u636e<\/li>\n<li>\u914d\u7f6e\u6587\u4ef6(\/etc\/mysql):\u5b58\u50a8MySQL\u670d\u52a1\u5668\u914d\u7f6e<\/li>\n<li>\u65e5\u5fd7\u6587\u4ef6:\u5305\u62ec\u9519\u8bef\u65e5\u5fd7\u3001\u6162\u67e5\u8be2\u65e5\u5fd7\u3001\u4e8c\u8fdb\u5236\u65e5\u5fd7<\/li>\n<li>\u521d\u59cb\u5316\u811a\u672c:\u9996\u6b21\u542f\u52a8\u65f6\u81ea\u52a8\u6267\u884cSQL\u811a\u672c<\/li>\n<\/ul>\n<h5>8.1.2 \u5b8c\u6574Docker Compose\u914d\u7f6e<\/h5>\n<p><span class=\"token comment\"># docker-compose.yml &#8211; MySQL\u5b8c\u6574\u6301\u4e45\u5316\u65b9\u6848<\/span><br \/>\n<span class=\"token key atrule\">version<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;3.8&#039;<\/span><\/p>\n<p><span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">mysql<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> mysql<span class=\"token punctuation\">:<\/span><span class=\"token number\">8.0<\/span><br \/>\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> mysql<span class=\"token punctuation\">&#8211;<\/span>prod<br \/>\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">&#8211;<\/span>stopped<br \/>\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token string\">&#034;3306:3306&#034;<\/span><br \/>\n    <span class=\"token key atrule\">environment<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">MYSQL_ROOT_PASSWORD<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span>MYSQL_ROOT_PASSWORD<span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">&#8211;<\/span>RootPass123<span class=\"token tag\">!<\/span><span class=\"token punctuation\">}<\/span><br \/>\n      <span class=\"token key atrule\">MYSQL_DATABASE<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span>MYSQL_DATABASE<span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">&#8211;<\/span>appdb<span class=\"token punctuation\">}<\/span><br \/>\n      <span class=\"token key atrule\">MYSQL_USER<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span>MYSQL_USER<span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">&#8211;<\/span>appuser<span class=\"token punctuation\">}<\/span><br \/>\n      <span class=\"token key atrule\">MYSQL_PASSWORD<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span>MYSQL_PASSWORD<span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">&#8211;<\/span>apppass123<span class=\"token punctuation\">}<\/span><br \/>\n      <span class=\"token key atrule\">TZ<\/span><span class=\"token punctuation\">:<\/span> Asia\/Shanghai<br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token comment\"># \u6570\u636e\u6301\u4e45\u5316 &#8211; \u6838\u5fc3\u6570\u636e\u5377<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> mysql_data<span class=\"token punctuation\">:<\/span>\/var\/lib\/mysql<br \/>\n      <span class=\"token comment\"># \u914d\u7f6e\u6587\u4ef6\u6302\u8f7d<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> .\/mysql\/conf\/my.cnf<span class=\"token punctuation\">:<\/span>\/etc\/mysql\/conf.d\/my.cnf<span class=\"token punctuation\">:<\/span>ro<br \/>\n      <span class=\"token comment\"># \u521d\u59cb\u5316SQL\u811a\u672c(\u4ec5\u9996\u6b21\u542f\u52a8\u65f6\u6267\u884c)<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> .\/mysql\/init<span class=\"token punctuation\">:<\/span>\/docker<span class=\"token punctuation\">&#8211;<\/span>entrypoint<span class=\"token punctuation\">&#8211;<\/span>initdb.d<span class=\"token punctuation\">:<\/span>ro<br \/>\n      <span class=\"token comment\"># \u65e5\u5fd7\u6301\u4e45\u5316<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> mysql_logs<span class=\"token punctuation\">:<\/span>\/var\/log\/mysql<br \/>\n      <span class=\"token comment\"># \u4e8c\u8fdb\u5236\u65e5\u5fd7(\u7528\u4e8e\u4e3b\u4ece\u590d\u5236)<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> mysql_binlog<span class=\"token punctuation\">:<\/span>\/var\/lib\/mysql<span class=\"token punctuation\">&#8211;<\/span>bin<br \/>\n    <span class=\"token key atrule\">command<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">&gt;<\/span><span class=\"token scalar string\"><br \/>\n      &#8211;default-authentication-plugin&#061;mysql_native_password<br \/>\n      &#8211;character-set-server&#061;utf8mb4<br \/>\n      &#8211;collation-server&#061;utf8mb4_unicode_ci<br \/>\n      &#8211;max_connections&#061;500<br \/>\n      &#8211;innodb_buffer_pool_size&#061;512M<br \/>\n      &#8211;slow_query_log&#061;1<br \/>\n      &#8211;long_query_time&#061;2<br \/>\n      &#8211;slow_query_log_file&#061;\/var\/log\/mysql\/slow.log<br \/>\n      &#8211;log_error&#061;\/var\/log\/mysql\/error.log<br \/>\n      &#8211;binlog_expire_logs_seconds&#061;604800<\/span><br \/>\n    <span class=\"token key atrule\">healthcheck<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">test<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;CMD-SHELL&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;mysqladmin ping -h localhost -uroot -p$${MYSQL_ROOT_PASSWORD} &#8211;silent&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n      <span class=\"token key atrule\">interval<\/span><span class=\"token punctuation\">:<\/span> 10s<br \/>\n      <span class=\"token key atrule\">timeout<\/span><span class=\"token punctuation\">:<\/span> 5s<br \/>\n      <span class=\"token key atrule\">retries<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">5<\/span><br \/>\n      <span class=\"token key atrule\">start_period<\/span><span class=\"token punctuation\">:<\/span> 30s<br \/>\n    <span class=\"token key atrule\">deploy<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">resources<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token key atrule\">limits<\/span><span class=\"token punctuation\">:<\/span><br \/>\n          <span class=\"token key atrule\">memory<\/span><span class=\"token punctuation\">:<\/span> 2G<br \/>\n          <span class=\"token key atrule\">cpus<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;2.0&#039;<\/span><br \/>\n        <span class=\"token key atrule\">reservations<\/span><span class=\"token punctuation\">:<\/span><br \/>\n          <span class=\"token key atrule\">memory<\/span><span class=\"token punctuation\">:<\/span> 1G<br \/>\n          <span class=\"token key atrule\">cpus<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;0.5&#039;<\/span><br \/>\n    <span class=\"token key atrule\">logging<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">driver<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;json-file&#034;<\/span><br \/>\n      <span class=\"token key atrule\">options<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token key atrule\">max-size<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;10m&#034;<\/span><br \/>\n        <span class=\"token key atrule\">max-file<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;3&#034;<\/span><\/p>\n<p>  <span class=\"token comment\"># \u5907\u4efd\u670d\u52a1(\u5b9a\u65f6\u5907\u4efd)<\/span><br \/>\n  <span class=\"token key atrule\">mysql-backup<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> alpine<span class=\"token punctuation\">:<\/span>latest<br \/>\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> mysql<span class=\"token punctuation\">&#8211;<\/span>backup<br \/>\n    <span class=\"token key atrule\">depends_on<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">mysql<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token key atrule\">condition<\/span><span class=\"token punctuation\">:<\/span> service_healthy<br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> mysql_data<span class=\"token punctuation\">:<\/span>\/var\/lib\/mysql<span class=\"token punctuation\">:<\/span>ro<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> .\/backup<span class=\"token punctuation\">:<\/span>\/backup<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> .\/scripts\/backup<span class=\"token punctuation\">&#8211;<\/span>mysql.sh<span class=\"token punctuation\">:<\/span>\/backup.sh<span class=\"token punctuation\">:<\/span>ro<br \/>\n    <span class=\"token key atrule\">environment<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">MYSQL_HOST<\/span><span class=\"token punctuation\">:<\/span> mysql<br \/>\n      <span class=\"token key atrule\">MYSQL_ROOT_PASSWORD<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span>MYSQL_ROOT_PASSWORD<span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">&#8211;<\/span>RootPass123<span class=\"token tag\">!<\/span><span class=\"token punctuation\">}<\/span><br \/>\n      <span class=\"token key atrule\">BACKUP_RETENTION_DAYS<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">7<\/span><br \/>\n    <span class=\"token key atrule\">entrypoint<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;\/bin\/sh&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-c&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token key atrule\">command<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;crond -f -l 2&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token comment\"># \u5728\u5b9e\u9645\u4f7f\u7528\u4e2d,\u9700\u8981\u5148\u5b89\u88c5crond\u6216\u4f7f\u7528\u5176\u4ed6\u8c03\u5ea6\u65b9\u5f0f<\/span><br \/>\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">&#8211;<\/span>stopped<\/p>\n<p><span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">mysql_data<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> mysql_data<br \/>\n    <span class=\"token key atrule\">labels<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">app<\/span><span class=\"token punctuation\">:<\/span> mysql<br \/>\n      <span class=\"token key atrule\">env<\/span><span class=\"token punctuation\">:<\/span> production<br \/>\n  <span class=\"token key atrule\">mysql_logs<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> mysql_logs<br \/>\n  <span class=\"token key atrule\">mysql_binlog<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> mysql_binlog<\/p>\n<h5>8.1.3 MySQL\u914d\u7f6e\u6587\u4ef6<\/h5>\n<p># mysql\/conf\/my.cnf &#8211; MySQL\u914d\u7f6e\u6587\u4ef6<\/p>\n<p>[mysqld]<br \/>\n# \u57fa\u672c\u8bbe\u7f6e<br \/>\ncharacter-set-server &#061; utf8mb4<br \/>\ncollation-server &#061; utf8mb4_unicode_ci<br \/>\ndefault-storage-engine &#061; InnoDB<br \/>\nskip-name-resolve<\/p>\n<p># \u8fde\u63a5\u8bbe\u7f6e<br \/>\nmax_connections &#061; 500<br \/>\nmax_connect_errors &#061; 1000<br \/>\nwait_timeout &#061; 28800<br \/>\ninteractive_timeout &#061; 28800<\/p>\n<p># InnoDB\u8bbe\u7f6e<br \/>\ninnodb_buffer_pool_size &#061; 512M<br \/>\ninnodb_buffer_pool_instances &#061; 4<br \/>\ninnodb_log_file_size &#061; 128M<br \/>\ninnodb_log_buffer_size &#061; 16M<br \/>\ninnodb_flush_log_at_trx_commit &#061; 1<br \/>\ninnodb_file_per_table &#061; 1<br \/>\ninnodb_flush_method &#061; O_DIRECT<\/p>\n<p># \u65e5\u5fd7\u8bbe\u7f6e<br \/>\nslow_query_log &#061; 1<br \/>\nlong_query_time &#061; 2<br \/>\nslow_query_log_file &#061; \/var\/log\/mysql\/slow.log<br \/>\nlog_error &#061; \/var\/log\/mysql\/error.log<\/p>\n<p># \u4e8c\u8fdb\u5236\u65e5\u5fd7\u8bbe\u7f6e(\u7528\u4e8e\u4e3b\u4ece\u590d\u5236\u548c\u6570\u636e\u6062\u590d)<br \/>\nlog_bin &#061; \/var\/lib\/mysql-bin\/mysql-bin<br \/>\nbinlog_format &#061; ROW<br \/>\nbinlog_expire_logs_seconds &#061; 604800<br \/>\nserver_id &#061; 1<\/p>\n<p># \u5b89\u5168\u8bbe\u7f6e<br \/>\nlocal_infile &#061; 0<br \/>\nsql_mode &#061; STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION<\/p>\n<p>[client]<br \/>\ndefault-character-set &#061; utf8mb4<\/p>\n<p>[mysql]<br \/>\ndefault-character-set &#061; utf8mb4<\/p>\n<h5>8.1.4 \u521d\u59cb\u5316\u811a\u672c<\/h5>\n<p><span class=\"token comment\">&#8212; mysql\/init\/01-create-databases.sql<\/span><br \/>\n<span class=\"token comment\">&#8212; \u521b\u5efa\u5e94\u7528\u6570\u636e\u5e93<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">DATABASE<\/span> <span class=\"token keyword\">IF<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token keyword\">EXISTS<\/span> appdb <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token keyword\">CHARACTER<\/span> <span class=\"token keyword\">SET<\/span> utf8mb4 <span class=\"token keyword\">COLLATE<\/span> utf8mb4_unicode_ci<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">DATABASE<\/span> <span class=\"token keyword\">IF<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token keyword\">EXISTS<\/span> logdb <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token keyword\">CHARACTER<\/span> <span class=\"token keyword\">SET<\/span> utf8mb4 <span class=\"token keyword\">COLLATE<\/span> utf8mb4_unicode_ci<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u521b\u5efa\u5e94\u7528\u7528\u6237<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">USER<\/span> <span class=\"token keyword\">IF<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token keyword\">EXISTS<\/span> <span class=\"token string\">&#039;appuser&#039;<\/span><span class=\"token variable\">&#064;&#039;%&#039;<\/span> IDENTIFIED <span class=\"token keyword\">WITH<\/span> mysql_native_password <span class=\"token keyword\">BY<\/span> <span class=\"token string\">&#039;apppass123&#039;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">GRANT<\/span> <span class=\"token keyword\">ALL<\/span> <span class=\"token keyword\">PRIVILEGES<\/span> <span class=\"token keyword\">ON<\/span> appdb<span class=\"token punctuation\">.<\/span><span class=\"token operator\">*<\/span> <span class=\"token keyword\">TO<\/span> <span class=\"token string\">&#039;appuser&#039;<\/span><span class=\"token variable\">&#064;&#039;%&#039;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">GRANT<\/span> <span class=\"token keyword\">INSERT<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">SELECT<\/span> <span class=\"token keyword\">ON<\/span> logdb<span class=\"token punctuation\">.<\/span><span class=\"token operator\">*<\/span> <span class=\"token keyword\">TO<\/span> <span class=\"token string\">&#039;appuser&#039;<\/span><span class=\"token variable\">&#064;&#039;%&#039;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u521b\u5efa\u53ea\u8bfb\u7528\u6237<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">USER<\/span> <span class=\"token keyword\">IF<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token keyword\">EXISTS<\/span> <span class=\"token string\">&#039;readonly&#039;<\/span><span class=\"token variable\">&#064;&#039;%&#039;<\/span> IDENTIFIED <span class=\"token keyword\">WITH<\/span> mysql_native_password <span class=\"token keyword\">BY<\/span> <span class=\"token string\">&#039;readonly123&#039;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">GRANT<\/span> <span class=\"token keyword\">SELECT<\/span> <span class=\"token keyword\">ON<\/span> appdb<span class=\"token punctuation\">.<\/span><span class=\"token operator\">*<\/span> <span class=\"token keyword\">TO<\/span> <span class=\"token string\">&#039;readonly&#039;<\/span><span class=\"token variable\">&#064;&#039;%&#039;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u5237\u65b0\u6743\u9650<\/span><br \/>\nFLUSH <span class=\"token keyword\">PRIVILEGES<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; mysql\/init\/02-create-tables.sql<\/span><br \/>\n<span class=\"token keyword\">USE<\/span> appdb<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u7528\u6237\u8868<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> <span class=\"token keyword\">IF<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token keyword\">EXISTS<\/span> users <span class=\"token punctuation\">(<\/span><br \/>\n    id <span class=\"token keyword\">BIGINT<\/span> <span class=\"token keyword\">AUTO_INCREMENT<\/span> <span class=\"token keyword\">PRIMARY<\/span> <span class=\"token keyword\">KEY<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    username <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">50<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span> <span class=\"token keyword\">UNIQUE<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    email <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span> <span class=\"token keyword\">UNIQUE<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    password_hash <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">255<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    created_at <span class=\"token keyword\">TIMESTAMP<\/span> <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token keyword\">CURRENT_TIMESTAMP<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    updated_at <span class=\"token keyword\">TIMESTAMP<\/span> <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token keyword\">CURRENT_TIMESTAMP<\/span> <span class=\"token keyword\">ON<\/span> <span class=\"token keyword\">UPDATE<\/span> <span class=\"token keyword\">CURRENT_TIMESTAMP<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token keyword\">INDEX<\/span> idx_email <span class=\"token punctuation\">(<\/span>email<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">ENGINE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token keyword\">InnoDB<\/span> <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token keyword\">CHARSET<\/span><span class=\"token operator\">&#061;<\/span>utf8mb4<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u5546\u54c1\u8868<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> <span class=\"token keyword\">IF<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token keyword\">EXISTS<\/span> products <span class=\"token punctuation\">(<\/span><br \/>\n    id <span class=\"token keyword\">BIGINT<\/span> <span class=\"token keyword\">AUTO_INCREMENT<\/span> <span class=\"token keyword\">PRIMARY<\/span> <span class=\"token keyword\">KEY<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    name <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">200<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    price <span class=\"token keyword\">DECIMAL<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    stock <span class=\"token keyword\">INT<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span> <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    created_at <span class=\"token keyword\">TIMESTAMP<\/span> <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token keyword\">CURRENT_TIMESTAMP<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token keyword\">INDEX<\/span> idx_name <span class=\"token punctuation\">(<\/span>name<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">ENGINE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token keyword\">InnoDB<\/span> <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token keyword\">CHARSET<\/span><span class=\"token operator\">&#061;<\/span>utf8mb4<span class=\"token punctuation\">;<\/span><\/p>\n<h5>8.1.5 \u5907\u4efd\u4e0e\u6062\u590d<\/h5>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># scripts\/backup-mysql.sh &#8211; MySQL\u5907\u4efd\u811a\u672c<\/span><\/p>\n<p><span class=\"token assign-left variable\">BACKUP_DIR<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\/backup\/mysql\/<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%Y%m%d<span class=\"token variable\">)<\/span><\/span>&#034;<\/span><br \/>\n<span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 1. \u903b\u8f91\u5907\u4efd(mysqldump)<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Starting mysqldump backup&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> mysql-prod <span class=\"token punctuation\">\\\\<\/span><br \/>\n  mysqldump <span class=\"token parameter variable\">-uroot<\/span> -p<span class=\"token string\">&#034;<span class=\"token variable\">$MYSQL_ROOT_PASSWORD<\/span>&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;all-databases <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;single-transaction <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;routines<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;triggers<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;events<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;set-gtid-purged<span class=\"token operator\">&#061;<\/span>OFF <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token operator\">&gt;<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>\/alldatabases-<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%H%M%S<span class=\"token variable\">)<\/span><\/span>.sql&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u5355\u72ec\u5907\u4efd\u6bcf\u4e2a\u6570\u636e\u5e93<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token for-or-select variable\">db<\/span> <span class=\"token keyword\">in<\/span> appdb logdb<span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">do<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Backing up database: <span class=\"token variable\">$db<\/span>&#034;<\/span><br \/>\n    <span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> mysql-prod <span class=\"token punctuation\">\\\\<\/span><br \/>\n      mysqldump <span class=\"token parameter variable\">-uroot<\/span> -p<span class=\"token string\">&#034;<span class=\"token variable\">$MYSQL_ROOT_PASSWORD<\/span>&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n      &#8211;single-transaction <span class=\"token punctuation\">\\\\<\/span><br \/>\n      <span class=\"token parameter variable\">&#8211;routines<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n      <span class=\"token parameter variable\">&#8211;triggers<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n      <span class=\"token string\">&#034;<span class=\"token variable\">$db<\/span>&#034;<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>\/<span class=\"token variable\">${db}<\/span>&#8211;<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%H%M%S<span class=\"token variable\">)<\/span><\/span>.sql&#034;<\/span><br \/>\n<span class=\"token keyword\">done<\/span><\/p>\n<p><span class=\"token comment\"># 3. \u7269\u7406\u5907\u4efd(\u5907\u4efd\u6570\u636e\u5377)<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Backing up data volume&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> mysql_data:\/var\/lib\/mysql:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span>:\/backup <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">tar<\/span> czf \/backup\/mysql-data-<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%H%M%S<span class=\"token variable\">)<\/span><\/span>.tar.gz <span class=\"token parameter variable\">-C<\/span> \/var\/lib\/mysql <span class=\"token builtin class-name\">.<\/span><\/p>\n<p><span class=\"token comment\"># 4. \u538b\u7f29\u5907\u4efd\u6587\u4ef6<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Compressing backups&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">gzip<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span>\/*.sql<\/p>\n<p><span class=\"token comment\"># 5. \u6e05\u7406\u8fc7\u671f\u5907\u4efd<\/span><br \/>\n<span class=\"token function\">find<\/span> \/backup\/mysql\/ <span class=\"token parameter variable\">-maxdepth<\/span> <span class=\"token number\">1<\/span> <span class=\"token parameter variable\">-type<\/span> d <span class=\"token parameter variable\">-mtime<\/span> &#043;<span class=\"token variable\">${BACKUP_RETENTION_DAYS<span class=\"token operator\">:-<\/span>7}<\/span> <span class=\"token parameter variable\">-exec<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-rf<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span> <span class=\"token punctuation\">\\\\<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Backup completed.&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  Location: <span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span><br \/>\n<span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-lh<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span>\/<\/p>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># scripts\/restore-mysql.sh &#8211; MySQL\u6062\u590d\u811a\u672c<\/span><\/p>\n<p><span class=\"token assign-left variable\">BACKUP_FILE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\">$1<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token parameter variable\">-z<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Usage: <span class=\"token variable\">$0<\/span> &lt;backup_sql_file&gt;&#034;<\/span><br \/>\n    <span class=\"token builtin class-name\">exit<\/span> <span class=\"token number\">1<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Restoring MySQL from: <span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u5982\u679c\u662fgzip\u538b\u7f29\u6587\u4ef6,\u5148\u89e3\u538b<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">[<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span> <span class=\"token operator\">&#061;&#061;<\/span> *.gz <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    gunzip <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span> <span class=\"token operator\">|<\/span> <span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> <span class=\"token parameter variable\">-i<\/span> mysql-prod <span class=\"token punctuation\">\\\\<\/span><br \/>\n      mysql <span class=\"token parameter variable\">-uroot<\/span> -p<span class=\"token string\">&#034;<span class=\"token variable\">$MYSQL_ROOT_PASSWORD<\/span>&#034;<\/span><br \/>\n<span class=\"token keyword\">else<\/span><br \/>\n    <span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> <span class=\"token parameter variable\">-i<\/span> mysql-prod <span class=\"token punctuation\">\\\\<\/span><br \/>\n      mysql <span class=\"token parameter variable\">-uroot<\/span> -p<span class=\"token string\">&#034;<span class=\"token variable\">$MYSQL_ROOT_PASSWORD<\/span>&#034;<\/span> <span class=\"token operator\">&lt;<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Restore completed.&#034;<\/span><\/p>\n<h4>8.2 PostgreSQL\u6570\u636e\u6301\u4e45\u5316\u65b9\u6848(\u5b8c\u6574\u914d\u7f6e)<\/h4>\n<h5>8.2.1 \u5b8c\u6574Docker Compose\u914d\u7f6e<\/h5>\n<p><span class=\"token comment\"># docker-compose.yml &#8211; PostgreSQL\u5b8c\u6574\u6301\u4e45\u5316\u65b9\u6848<\/span><br \/>\n<span class=\"token key atrule\">version<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;3.8&#039;<\/span><\/p>\n<p><span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">postgres<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> postgres<span class=\"token punctuation\">:<\/span>15<span class=\"token punctuation\">&#8211;<\/span>alpine<br \/>\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> postgres<span class=\"token punctuation\">&#8211;<\/span>prod<br \/>\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">&#8211;<\/span>stopped<br \/>\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token string\">&#034;5432:5432&#034;<\/span><br \/>\n    <span class=\"token key atrule\">environment<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">POSTGRES_DB<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span>POSTGRES_DB<span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">&#8211;<\/span>appdb<span class=\"token punctuation\">}<\/span><br \/>\n      <span class=\"token key atrule\">POSTGRES_USER<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span>POSTGRES_USER<span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">&#8211;<\/span>appuser<span class=\"token punctuation\">}<\/span><br \/>\n      <span class=\"token key atrule\">POSTGRES_PASSWORD<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span>POSTGRES_PASSWORD<span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">&#8211;<\/span>apppass123<span class=\"token punctuation\">}<\/span><br \/>\n      <span class=\"token key atrule\">POSTGRES_INITDB_ARGS<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;&#8211;encoding&#061;UTF8 &#8211;locale&#061;C&#034;<\/span><br \/>\n      <span class=\"token key atrule\">PGDATA<\/span><span class=\"token punctuation\">:<\/span> \/var\/lib\/postgresql\/data\/pgdata<br \/>\n      <span class=\"token key atrule\">TZ<\/span><span class=\"token punctuation\">:<\/span> Asia\/Shanghai<br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token comment\"># \u6570\u636e\u6301\u4e45\u5316<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> postgres_data<span class=\"token punctuation\">:<\/span>\/var\/lib\/postgresql\/data<br \/>\n      <span class=\"token comment\"># \u914d\u7f6e\u6587\u4ef6<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> .\/postgres\/conf\/postgresql.conf<span class=\"token punctuation\">:<\/span>\/etc\/postgresql\/postgresql.conf<span class=\"token punctuation\">:<\/span>ro<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> .\/postgres\/conf\/pg_hba.conf<span class=\"token punctuation\">:<\/span>\/etc\/postgresql\/pg_hba.conf<span class=\"token punctuation\">:<\/span>ro<br \/>\n      <span class=\"token comment\"># \u521d\u59cb\u5316\u811a\u672c<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> .\/postgres\/init<span class=\"token punctuation\">:<\/span>\/docker<span class=\"token punctuation\">&#8211;<\/span>entrypoint<span class=\"token punctuation\">&#8211;<\/span>initdb.d<span class=\"token punctuation\">:<\/span>ro<br \/>\n      <span class=\"token comment\"># WAL\u5f52\u6863\u65e5\u5fd7<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> postgres_wal<span class=\"token punctuation\">:<\/span>\/var\/lib\/postgresql\/wal_archive<br \/>\n      <span class=\"token comment\"># \u65e5\u5fd7<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> postgres_logs<span class=\"token punctuation\">:<\/span>\/var\/log\/postgresql<br \/>\n    <span class=\"token key atrule\">command<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">&gt;<\/span><span class=\"token scalar string\"><br \/>\n      postgres<br \/>\n      -c config_file&#061;\/etc\/postgresql\/postgresql.conf<br \/>\n      -c hba_file&#061;\/etc\/postgresql\/pg_hba.conf<br \/>\n      -c max_connections&#061;200<br \/>\n      -c shared_buffers&#061;256MB<br \/>\n      -c effective_cache_size&#061;768MB<br \/>\n      -c work_mem&#061;4MB<br \/>\n      -c maintenance_work_mem&#061;64MB<br \/>\n      -c wal_level&#061;replica<br \/>\n      -c archive_mode&#061;on<br \/>\n      -c archive_command&#061;&#039;test ! -f \/var\/lib\/postgresql\/wal_archive\/%f &amp;&amp; cp %p \/var\/lib\/postgresql\/wal_archive\/%f&#039;<br \/>\n      -c logging_collector&#061;on<br \/>\n      -c log_directory&#061;\/var\/log\/postgresql<br \/>\n      -c log_filename&#061;&#039;postgresql-%Y-%m-%d.log&#039;<br \/>\n      -c log_rotation_age&#061;1d<br \/>\n      -c log_rotation_size&#061;100MB<\/span><br \/>\n    <span class=\"token key atrule\">healthcheck<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">test<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;CMD-SHELL&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n      <span class=\"token key atrule\">interval<\/span><span class=\"token punctuation\">:<\/span> 10s<br \/>\n      <span class=\"token key atrule\">timeout<\/span><span class=\"token punctuation\">:<\/span> 5s<br \/>\n      <span class=\"token key atrule\">retries<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">5<\/span><br \/>\n      <span class=\"token key atrule\">start_period<\/span><span class=\"token punctuation\">:<\/span> 30s<br \/>\n    <span class=\"token key atrule\">shm_size<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;256m&#039;<\/span><\/p>\n<p><span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">postgres_data<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> postgres_data<br \/>\n  <span class=\"token key atrule\">postgres_wal<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> postgres_wal<br \/>\n  <span class=\"token key atrule\">postgres_logs<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> postgres_logs<\/p>\n<h5>8.2.2 PostgreSQL\u914d\u7f6e\u6587\u4ef6<\/h5>\n<p># postgres\/conf\/postgresql.conf &#8211; PostgreSQL\u914d\u7f6e\u6587\u4ef6<\/p>\n<p># \u8fde\u63a5\u8bbe\u7f6e<br \/>\nlisten_addresses &#061; &#039;*&#039;<br \/>\nmax_connections &#061; 200<br \/>\nsuperuser_reserved_connections &#061; 3<\/p>\n<p># \u5185\u5b58\u8bbe\u7f6e<br \/>\nshared_buffers &#061; 256MB<br \/>\neffective_cache_size &#061; 768MB<br \/>\nwork_mem &#061; 4MB<br \/>\nmaintenance_work_mem &#061; 64MB<br \/>\ndynamic_shared_memory_type &#061; posix<\/p>\n<p># WAL\u8bbe\u7f6e<br \/>\nwal_level &#061; replica<br \/>\narchive_mode &#061; on<br \/>\narchive_command &#061; &#039;test ! -f \/var\/lib\/postgresql\/wal_archive\/%f &amp;&amp; cp %p \/var\/lib\/postgresql\/wal_archive\/%f&#039;<br \/>\nmax_wal_size &#061; 1GB<br \/>\nmin_wal_size &#061; 80MB<br \/>\nwal_buffers &#061; 16MB<br \/>\ncheckpoint_completion_target &#061; 0.9<\/p>\n<p># \u67e5\u8be2\u4f18\u5316<br \/>\nrandom_page_cost &#061; 1.1<br \/>\neffective_io_concurrency &#061; 200<br \/>\ndefault_statistics_target &#061; 100<\/p>\n<p># \u65e5\u5fd7\u8bbe\u7f6e<br \/>\nlogging_collector &#061; on<br \/>\nlog_directory &#061; &#039;\/var\/log\/postgresql&#039;<br \/>\nlog_filename &#061; &#039;postgresql-%Y-%m-%d.log&#039;<br \/>\nlog_rotation_age &#061; 1d<br \/>\nlog_rotation_size &#061; 100MB<br \/>\nlog_min_duration_statement &#061; 1000<br \/>\nlog_checkpoints &#061; on<br \/>\nlog_connections &#061; on<br \/>\nlog_disconnections &#061; on<br \/>\nlog_line_prefix &#061; &#039;%t [%p] %u&#064;%d &#039;<\/p>\n<p># \u81ea\u52a8\u6e05\u7406<br \/>\nautovacuum &#061; on<br \/>\nautovacuum_max_workers &#061; 3<br \/>\nautovacuum_naptime &#061; 1min<br \/>\nautovacuum_vacuum_threshold &#061; 50<br \/>\nautovacuum_analyze_threshold &#061; 50<\/p>\n<p># \u65f6\u533a<br \/>\ntimezone &#061; &#039;Asia\/Shanghai&#039;<br \/>\nlog_timezone &#061; &#039;Asia\/Shanghai&#039;<\/p>\n<p># \u5b57\u7b26\u96c6<br \/>\nclient_encoding &#061; utf8<br \/>\nlc_messages &#061; &#039;C&#039;<br \/>\nlc_monetary &#061; &#039;C&#039;<br \/>\nlc_numeric &#061; &#039;C&#039;<br \/>\nlc_time &#061; &#039;C&#039;<br \/>\ndefault_text_search_config &#061; &#039;pg_catalog.english&#039;<\/p>\n<p># postgres\/conf\/pg_hba.conf &#8211; \u5ba2\u6237\u7aef\u8ba4\u8bc1\u914d\u7f6e<\/p>\n<p># TYPE  DATABASE    USER    ADDRESS         METHOD<br \/>\nlocal   all         all                     trust<br \/>\nhost    all         all     127.0.0.1\/32    md5<br \/>\nhost    all         all     ::1\/128         md5<br \/>\nhost    all         all     0.0.0.0\/0       md5<br \/>\nhost    replication all     0.0.0.0\/0       md5<\/p>\n<h5>8.2.3 \u521d\u59cb\u5316\u811a\u672c<\/h5>\n<p><span class=\"token comment\">&#8212; postgres\/init\/01-setup.sql<\/span><br \/>\n<span class=\"token comment\">&#8212; \u521b\u5efa\u989d\u5916\u6570\u636e\u5e93<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">DATABASE<\/span> logdb<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">DATABASE<\/span> testdb<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u521b\u5efa\u53ea\u8bfb\u7528\u6237<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">USER<\/span> readonly <span class=\"token keyword\">WITH<\/span> PASSWORD <span class=\"token string\">&#039;readonly123&#039;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">GRANT<\/span> <span class=\"token keyword\">CONNECT<\/span> <span class=\"token keyword\">ON<\/span> <span class=\"token keyword\">DATABASE<\/span> appdb <span class=\"token keyword\">TO<\/span> readonly<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u8fde\u63a5\u5230appdb\u5e76\u8bbe\u7f6e\u6743\u9650<\/span><br \/>\n\\\\c appdb<br \/>\n<span class=\"token keyword\">GRANT<\/span> <span class=\"token keyword\">USAGE<\/span> <span class=\"token keyword\">ON<\/span> <span class=\"token keyword\">SCHEMA<\/span> <span class=\"token keyword\">public<\/span> <span class=\"token keyword\">TO<\/span> readonly<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">GRANT<\/span> <span class=\"token keyword\">SELECT<\/span> <span class=\"token keyword\">ON<\/span> <span class=\"token keyword\">ALL<\/span> <span class=\"token keyword\">TABLES<\/span> <span class=\"token operator\">IN<\/span> <span class=\"token keyword\">SCHEMA<\/span> <span class=\"token keyword\">public<\/span> <span class=\"token keyword\">TO<\/span> readonly<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">ALTER<\/span> <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token keyword\">PRIVILEGES<\/span> <span class=\"token operator\">IN<\/span> <span class=\"token keyword\">SCHEMA<\/span> <span class=\"token keyword\">public<\/span> <span class=\"token keyword\">GRANT<\/span> <span class=\"token keyword\">SELECT<\/span> <span class=\"token keyword\">ON<\/span> <span class=\"token keyword\">TABLES<\/span> <span class=\"token keyword\">TO<\/span> readonly<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u521b\u5efa\u6269\u5c55<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> EXTENSION <span class=\"token keyword\">IF<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token keyword\">EXISTS<\/span> <span class=\"token string\">&#034;uuid-ossp&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> EXTENSION <span class=\"token keyword\">IF<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token keyword\">EXISTS<\/span> <span class=\"token string\">&#034;pgcrypto&#034;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u521b\u5efa\u8868<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> <span class=\"token keyword\">IF<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token keyword\">EXISTS<\/span> users <span class=\"token punctuation\">(<\/span><br \/>\n    id UUID <span class=\"token keyword\">PRIMARY<\/span> <span class=\"token keyword\">KEY<\/span> <span class=\"token keyword\">DEFAULT<\/span> uuid_generate_v4<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    username <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">50<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">UNIQUE<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    email <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">UNIQUE<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    password_hash <span class=\"token keyword\">TEXT<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    created_at TIMESTAMPTZ <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token function\">NOW<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    updated_at TIMESTAMPTZ <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token function\">NOW<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> <span class=\"token keyword\">IF<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token keyword\">EXISTS<\/span> products <span class=\"token punctuation\">(<\/span><br \/>\n    id UUID <span class=\"token keyword\">PRIMARY<\/span> <span class=\"token keyword\">KEY<\/span> <span class=\"token keyword\">DEFAULT<\/span> uuid_generate_v4<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    name <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">200<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    price <span class=\"token keyword\">NUMERIC<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    stock <span class=\"token keyword\">INTEGER<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span> <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    created_at TIMESTAMPTZ <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token function\">NOW<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u521b\u5efa\u7d22\u5f15<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">INDEX<\/span> <span class=\"token keyword\">IF<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token keyword\">EXISTS<\/span> idx_users_email <span class=\"token keyword\">ON<\/span> users<span class=\"token punctuation\">(<\/span>email<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">INDEX<\/span> <span class=\"token keyword\">IF<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token keyword\">EXISTS<\/span> idx_products_name <span class=\"token keyword\">ON<\/span> products<span class=\"token punctuation\">(<\/span>name<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h5>8.2.4 \u5907\u4efd\u4e0e\u6062\u590d<\/h5>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># scripts\/backup-postgres.sh &#8211; PostgreSQL\u5907\u4efd\u811a\u672c<\/span><\/p>\n<p><span class=\"token assign-left variable\">BACKUP_DIR<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\/backup\/postgres\/<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%Y%m%d<span class=\"token variable\">)<\/span><\/span>&#034;<\/span><br \/>\n<span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span><br \/>\n<span class=\"token assign-left variable\">TIMESTAMP<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%H%M%S<span class=\"token variable\">)<\/span><\/span><\/p>\n<p><span class=\"token comment\"># 1. \u903b\u8f91\u5907\u4efd(pg_dump)<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Starting pg_dump backup&#8230;&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u5907\u4efd\u6240\u6709\u6570\u636e\u5e93<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> postgres-prod <span class=\"token punctuation\">\\\\<\/span><br \/>\n  pg_dumpall <span class=\"token parameter variable\">-U<\/span> appuser <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token operator\">&gt;<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>\/alldatabases-<span class=\"token variable\">$TIMESTAMP<\/span>.sql&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u5355\u72ec\u5907\u4efdappdb(\u81ea\u5b9a\u4e49\u683c\u5f0f,\u652f\u6301\u5e76\u884c\u6062\u590d)<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> postgres-prod <span class=\"token punctuation\">\\\\<\/span><br \/>\n  pg_dump <span class=\"token parameter variable\">-U<\/span> appuser <span class=\"token parameter variable\">-Fc<\/span> <span class=\"token parameter variable\">-d<\/span> appdb <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token operator\">&gt;<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>\/appdb-<span class=\"token variable\">$TIMESTAMP<\/span>.dump&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u5355\u72ec\u5907\u4efdappdb(\u7eaf\u6587\u672c\u683c\u5f0f)<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> postgres-prod <span class=\"token punctuation\">\\\\<\/span><br \/>\n  pg_dump <span class=\"token parameter variable\">-U<\/span> appuser <span class=\"token parameter variable\">-d<\/span> appdb <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token operator\">&gt;<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>\/appdb-<span class=\"token variable\">$TIMESTAMP<\/span>.sql&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u7269\u7406\u5907\u4efd(\u5907\u4efd\u6570\u636e\u5377)<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Backing up data volume&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> postgres_data:\/var\/lib\/postgresql\/data:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span>:\/backup <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">tar<\/span> czf \/backup\/postgres-data-<span class=\"token variable\">$TIMESTAMP<\/span>.tar.gz <span class=\"token parameter variable\">-C<\/span> \/var\/lib\/postgresql\/data <span class=\"token builtin class-name\">.<\/span><\/p>\n<p><span class=\"token comment\"># 3. WAL\u5f52\u6863\u5907\u4efd<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> postgres_wal:\/wal:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span>:\/backup <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">tar<\/span> czf \/backup\/postgres-wal-<span class=\"token variable\">$TIMESTAMP<\/span>.tar.gz <span class=\"token parameter variable\">-C<\/span> \/wal <span class=\"token builtin class-name\">.<\/span><\/p>\n<p><span class=\"token comment\"># 4. \u538b\u7f29<\/span><br \/>\n<span class=\"token function\">gzip<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span>\/*.sql<\/p>\n<p><span class=\"token comment\"># 5. \u6e05\u7406\u8fc7\u671f\u5907\u4efd<\/span><br \/>\n<span class=\"token function\">find<\/span> \/backup\/postgres\/ <span class=\"token parameter variable\">-maxdepth<\/span> <span class=\"token number\">1<\/span> <span class=\"token parameter variable\">-type<\/span> d <span class=\"token parameter variable\">-mtime<\/span> &#043;7 <span class=\"token parameter variable\">-exec<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-rf<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span> <span class=\"token punctuation\">\\\\<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Backup completed.&#034;<\/span><br \/>\n<span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-lh<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span>\/<\/p>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># scripts\/restore-postgres.sh &#8211; PostgreSQL\u6062\u590d\u811a\u672c<\/span><\/p>\n<p><span class=\"token assign-left variable\">BACKUP_FILE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\">$1<\/span><br \/>\n<span class=\"token assign-left variable\">DB_NAME<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\">${2<span class=\"token operator\">:-<\/span>appdb}<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Restoring PostgreSQL from: <span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">[<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span> <span class=\"token operator\">&#061;&#061;<\/span> *.dump <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    <span class=\"token comment\"># \u81ea\u5b9a\u4e49\u683c\u5f0f\u6062\u590d<\/span><br \/>\n    <span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> <span class=\"token parameter variable\">-i<\/span> postgres-prod <span class=\"token punctuation\">\\\\<\/span><br \/>\n      pg_restore <span class=\"token parameter variable\">-U<\/span> appuser <span class=\"token parameter variable\">-d<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$DB_NAME<\/span>&#034;<\/span> <span class=\"token parameter variable\">&#8211;clean<\/span> &#8211;if-exists <span class=\"token operator\">&lt;<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span><br \/>\n<span class=\"token keyword\">elif<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">[<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span> <span class=\"token operator\">&#061;&#061;<\/span> *.sql.gz <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    <span class=\"token comment\"># gzip\u538b\u7f29\u7684SQL\u6062\u590d<\/span><br \/>\n    gunzip <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span> <span class=\"token operator\">|<\/span> <span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> <span class=\"token parameter variable\">-i<\/span> postgres-prod <span class=\"token punctuation\">\\\\<\/span><br \/>\n      psql <span class=\"token parameter variable\">-U<\/span> appuser <span class=\"token parameter variable\">-d<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$DB_NAME<\/span>&#034;<\/span><br \/>\n<span class=\"token keyword\">elif<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">[<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span> <span class=\"token operator\">&#061;&#061;<\/span> *.sql <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    <span class=\"token comment\"># \u7eaf\u6587\u672cSQL\u6062\u590d<\/span><br \/>\n    <span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> <span class=\"token parameter variable\">-i<\/span> postgres-prod <span class=\"token punctuation\">\\\\<\/span><br \/>\n      psql <span class=\"token parameter variable\">-U<\/span> appuser <span class=\"token parameter variable\">-d<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$DB_NAME<\/span>&#034;<\/span> <span class=\"token operator\">&lt;<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Restore completed.&#034;<\/span><\/p>\n<h4>8.3 MongoDB\u6570\u636e\u6301\u4e45\u5316\u65b9\u6848(\u5b8c\u6574\u914d\u7f6e)<\/h4>\n<h5>8.3.1 \u5b8c\u6574Docker Compose\u914d\u7f6e<\/h5>\n<p><span class=\"token comment\"># docker-compose.yml &#8211; MongoDB\u5b8c\u6574\u6301\u4e45\u5316\u65b9\u6848<\/span><br \/>\n<span class=\"token key atrule\">version<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;3.8&#039;<\/span><\/p>\n<p><span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">mongodb<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> mongo<span class=\"token punctuation\">:<\/span><span class=\"token number\">6.0<\/span><br \/>\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> mongodb<span class=\"token punctuation\">&#8211;<\/span>prod<br \/>\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">&#8211;<\/span>stopped<br \/>\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token string\">&#034;27017:27017&#034;<\/span><br \/>\n    <span class=\"token key atrule\">environment<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">MONGO_INITDB_ROOT_USERNAME<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span>MONGO_ROOT_USER<span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">&#8211;<\/span>root<span class=\"token punctuation\">}<\/span><br \/>\n      <span class=\"token key atrule\">MONGO_INITDB_ROOT_PASSWORD<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span>MONGO_ROOT_PASSWORD<span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">&#8211;<\/span>RootPass123<span class=\"token tag\">!<\/span><span class=\"token punctuation\">}<\/span><br \/>\n      <span class=\"token key atrule\">MONGO_INITDB_DATABASE<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span>MONGO_DB<span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">&#8211;<\/span>appdb<span class=\"token punctuation\">}<\/span><br \/>\n      <span class=\"token key atrule\">TZ<\/span><span class=\"token punctuation\">:<\/span> Asia\/Shanghai<br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token comment\"># \u6570\u636e\u6301\u4e45\u5316<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> mongo_data<span class=\"token punctuation\">:<\/span>\/data\/db<br \/>\n      <span class=\"token comment\"># \u914d\u7f6e\u6587\u4ef6<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> .\/mongo\/conf\/mongod.conf<span class=\"token punctuation\">:<\/span>\/etc\/mongo\/mongod.conf<span class=\"token punctuation\">:<\/span>ro<br \/>\n      <span class=\"token comment\"># \u521d\u59cb\u5316\u811a\u672c<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> .\/mongo\/init<span class=\"token punctuation\">:<\/span>\/docker<span class=\"token punctuation\">&#8211;<\/span>entrypoint<span class=\"token punctuation\">&#8211;<\/span>initdb.d<span class=\"token punctuation\">:<\/span>ro<br \/>\n      <span class=\"token comment\"># \u65e5\u5fd7<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> mongo_logs<span class=\"token punctuation\">:<\/span>\/var\/log\/mongodb<br \/>\n    <span class=\"token key atrule\">command<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;mongod&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;config&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\/etc\/mongo\/mongod.conf&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token key atrule\">healthcheck<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">test<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;CMD&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;mongosh&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;eval&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;db.adminCommand(&#039;ping&#039;)&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n      <span class=\"token key atrule\">interval<\/span><span class=\"token punctuation\">:<\/span> 10s<br \/>\n      <span class=\"token key atrule\">timeout<\/span><span class=\"token punctuation\">:<\/span> 5s<br \/>\n      <span class=\"token key atrule\">retries<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">5<\/span><br \/>\n      <span class=\"token key atrule\">start_period<\/span><span class=\"token punctuation\">:<\/span> 30s<\/p>\n<p><span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">mongo_data<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> mongo_data<br \/>\n  <span class=\"token key atrule\">mongo_logs<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> mongo_logs<\/p>\n<h5>8.3.2 MongoDB\u914d\u7f6e\u6587\u4ef6<\/h5>\n<p><span class=\"token comment\"># mongo\/conf\/mongod.conf &#8211; MongoDB\u914d\u7f6e\u6587\u4ef6<\/span><\/p>\n<p><span class=\"token comment\"># \u5b58\u50a8\u8bbe\u7f6e<\/span><br \/>\n<span class=\"token key atrule\">storage<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">dbPath<\/span><span class=\"token punctuation\">:<\/span> \/data\/db<br \/>\n  <span class=\"token key atrule\">journal<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">enabled<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span><br \/>\n  <span class=\"token key atrule\">wiredTiger<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">engineConfig<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">cacheSizeGB<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">1<\/span><br \/>\n      <span class=\"token key atrule\">journalCompressor<\/span><span class=\"token punctuation\">:<\/span> snappy<br \/>\n    <span class=\"token key atrule\">collectionConfig<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">blockCompressor<\/span><span class=\"token punctuation\">:<\/span> snappy<br \/>\n    <span class=\"token key atrule\">indexConfig<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">prefixCompression<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span><\/p>\n<p><span class=\"token comment\"># \u7f51\u7edc\u8bbe\u7f6e<\/span><br \/>\n<span class=\"token key atrule\">net<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">port<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">27017<\/span><br \/>\n  <span class=\"token key atrule\">bindIp<\/span><span class=\"token punctuation\">:<\/span> 0.0.0.0<br \/>\n  <span class=\"token key atrule\">maxIncomingConnections<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">1000<\/span><\/p>\n<p><span class=\"token comment\"># \u65e5\u5fd7\u8bbe\u7f6e<\/span><br \/>\n<span class=\"token key atrule\">systemLog<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">destination<\/span><span class=\"token punctuation\">:<\/span> file<br \/>\n  <span class=\"token key atrule\">path<\/span><span class=\"token punctuation\">:<\/span> \/var\/log\/mongodb\/mongod.log<br \/>\n  <span class=\"token key atrule\">logAppend<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span><br \/>\n  <span class=\"token key atrule\">logRotate<\/span><span class=\"token punctuation\">:<\/span> reopen<br \/>\n  <span class=\"token key atrule\">verbosity<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">0<\/span><\/p>\n<p><span class=\"token comment\"># \u8fdb\u7a0b\u7ba1\u7406<\/span><br \/>\n<span class=\"token key atrule\">processManagement<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">fork<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">false<\/span><br \/>\n  <span class=\"token key atrule\">pidFilePath<\/span><span class=\"token punctuation\">:<\/span> \/var\/run\/mongod.pid<\/p>\n<p><span class=\"token comment\"># \u590d\u5236\u96c6(\u53ef\u9009,\u7528\u4e8e\u9ad8\u53ef\u7528)<\/span><br \/>\n<span class=\"token comment\"># replication:<\/span><br \/>\n<span class=\"token comment\">#   replSetName: rs0<\/span><br \/>\n<span class=\"token comment\">#   oplogSizeMB: 1024<\/span><\/p>\n<p><span class=\"token comment\"># \u5b89\u5168\u8bbe\u7f6e<\/span><br \/>\n<span class=\"token key atrule\">security<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">authorization<\/span><span class=\"token punctuation\">:<\/span> enabled<\/p>\n<p><span class=\"token comment\"># \u6027\u80fd\u5206\u6790<\/span><br \/>\n<span class=\"token key atrule\">operationProfiling<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">mode<\/span><span class=\"token punctuation\">:<\/span> slowOp<br \/>\n  <span class=\"token key atrule\">slowOpThresholdMs<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">100<\/span><\/p>\n<p><span class=\"token comment\"># \u5206\u7247\u8bbe\u7f6e(\u5982\u9700\u8981)<\/span><br \/>\n<span class=\"token comment\"># sharding:<\/span><br \/>\n<span class=\"token comment\">#   clusterRole: shardsvr<\/span><\/p>\n<h5>8.3.3 \u521d\u59cb\u5316\u811a\u672c<\/h5>\n<p><span class=\"token comment\">\/\/ mongo\/init\/01-init.js &#8211; MongoDB\u521d\u59cb\u5316\u811a\u672c<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5207\u6362\u5230admin\u6570\u636e\u5e93<\/span><br \/>\ndb <span class=\"token operator\">&#061;<\/span> db<span class=\"token punctuation\">.<\/span><span class=\"token function\">getSiblingDB<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;admin&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u521b\u5efa\u5e94\u7528\u7528\u6237<\/span><br \/>\ndb<span class=\"token punctuation\">.<\/span><span class=\"token function\">createUser<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token literal-property property\">user<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;appuser&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token literal-property property\">pwd<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;apppass123&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token literal-property property\">roles<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">role<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;readWrite&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">db<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;appdb&#039;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n  <span class=\"token punctuation\">]<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u521b\u5efa\u53ea\u8bfb\u7528\u6237<\/span><br \/>\ndb<span class=\"token punctuation\">.<\/span><span class=\"token function\">createUser<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token literal-property property\">user<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;readonly&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token literal-property property\">pwd<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;readonly123&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token literal-property property\">roles<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">role<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;read&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">db<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#039;appdb&#039;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n  <span class=\"token punctuation\">]<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5207\u6362\u5230appdb<\/span><br \/>\ndb <span class=\"token operator\">&#061;<\/span> db<span class=\"token punctuation\">.<\/span><span class=\"token function\">getSiblingDB<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;appdb&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u521b\u5efa\u96c6\u5408<\/span><br \/>\ndb<span class=\"token punctuation\">.<\/span><span class=\"token function\">createCollection<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;users&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\ndb<span class=\"token punctuation\">.<\/span><span class=\"token function\">createCollection<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;products&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\ndb<span class=\"token punctuation\">.<\/span><span class=\"token function\">createCollection<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;orders&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u521b\u5efa\u7d22\u5f15<\/span><br \/>\ndb<span class=\"token punctuation\">.<\/span>users<span class=\"token punctuation\">.<\/span><span class=\"token function\">createIndex<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span> <span class=\"token string-property property\">&#034;email&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">unique<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\ndb<span class=\"token punctuation\">.<\/span>users<span class=\"token punctuation\">.<\/span><span class=\"token function\">createIndex<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span> <span class=\"token string-property property\">&#034;username&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">unique<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\ndb<span class=\"token punctuation\">.<\/span>products<span class=\"token punctuation\">.<\/span><span class=\"token function\">createIndex<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span> <span class=\"token string-property property\">&#034;name&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;text&#034;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\ndb<span class=\"token punctuation\">.<\/span>products<span class=\"token punctuation\">.<\/span><span class=\"token function\">createIndex<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span> <span class=\"token string-property property\">&#034;category&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;price&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\ndb<span class=\"token punctuation\">.<\/span>orders<span class=\"token punctuation\">.<\/span><span class=\"token function\">createIndex<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span> <span class=\"token string-property property\">&#034;userId&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;createdAt&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u63d2\u5165\u521d\u59cb\u6570\u636e<\/span><br \/>\ndb<span class=\"token punctuation\">.<\/span>products<span class=\"token punctuation\">.<\/span><span class=\"token function\">insertMany<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><br \/>\n  <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">name<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\u7b14\u8bb0\u672c\u7535\u8111&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">price<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">5999<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">stock<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">category<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;electronics&#034;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">name<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\u673a\u68b0\u952e\u76d8&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">price<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">299<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">stock<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">200<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">category<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;accessories&#034;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token punctuation\">{<\/span> <span class=\"token literal-property property\">name<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\u663e\u793a\u5668&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">price<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1599<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">stock<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">50<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token literal-property property\">category<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;electronics&#034;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h5>8.3.4 \u5907\u4efd\u4e0e\u6062\u590d<\/h5>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># scripts\/backup-mongo.sh &#8211; MongoDB\u5907\u4efd\u811a\u672c<\/span><\/p>\n<p><span class=\"token assign-left variable\">BACKUP_DIR<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\/backup\/mongo\/<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%Y%m%d<span class=\"token variable\">)<\/span><\/span>&#034;<\/span><br \/>\n<span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span><br \/>\n<span class=\"token assign-left variable\">TIMESTAMP<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%H%M%S<span class=\"token variable\">)<\/span><\/span><\/p>\n<p><span class=\"token comment\"># 1. \u903b\u8f91\u5907\u4efd(mongodump)<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Starting mongodump backup&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> mongodb-prod <span class=\"token punctuation\">\\\\<\/span><br \/>\n  mongodump <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;uri<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;mongodb:\/\/root:RootPass123!&#064;localhost:27017&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;gzip<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;archive<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>\/mongodb-<span class=\"token variable\">$TIMESTAMP<\/span>.gz&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u5907\u4efd\u5355\u4e2a\u6570\u636e\u5e93<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> mongodb-prod <span class=\"token punctuation\">\\\\<\/span><br \/>\n  mongodump <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;uri<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;mongodb:\/\/root:RootPass123!&#064;localhost:27017\/appdb&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;gzip<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;archive<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>\/appdb-<span class=\"token variable\">$TIMESTAMP<\/span>.gz&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u7269\u7406\u5907\u4efd(\u5907\u4efd\u6570\u636e\u5377)<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Backing up data volume&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> mongo_data:\/data\/db:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span>:\/backup <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">tar<\/span> czf \/backup\/mongo-data-<span class=\"token variable\">$TIMESTAMP<\/span>.tar.gz <span class=\"token parameter variable\">-C<\/span> \/data\/db <span class=\"token builtin class-name\">.<\/span><\/p>\n<p><span class=\"token comment\"># 3. \u6e05\u7406\u8fc7\u671f\u5907\u4efd<\/span><br \/>\n<span class=\"token function\">find<\/span> \/backup\/mongo\/ <span class=\"token parameter variable\">-maxdepth<\/span> <span class=\"token number\">1<\/span> <span class=\"token parameter variable\">-type<\/span> d <span class=\"token parameter variable\">-mtime<\/span> &#043;7 <span class=\"token parameter variable\">-exec<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-rf<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span> <span class=\"token punctuation\">\\\\<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Backup completed.&#034;<\/span><br \/>\n<span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-lh<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span>\/<\/p>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># scripts\/restore-mongo.sh &#8211; MongoDB\u6062\u590d\u811a\u672c<\/span><\/p>\n<p><span class=\"token assign-left variable\">BACKUP_FILE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\">$1<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Restoring MongoDB from: <span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u903b\u8f91\u6062\u590d(mongorestore)<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> <span class=\"token parameter variable\">-i<\/span> mongodb-prod <span class=\"token punctuation\">\\\\<\/span><br \/>\n  mongorestore <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;uri<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;mongodb:\/\/root:RootPass123!&#064;localhost:27017&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;gzip<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;drop<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;archive<\/span> <span class=\"token operator\">&lt;<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Restore completed.&#034;<\/span><\/p>\n<h4>8.4 Redis\u6570\u636e\u6301\u4e45\u5316\u65b9\u6848(RDB &#043; AOF)<\/h4>\n<h5>8.4.1 \u5b8c\u6574Docker Compose\u914d\u7f6e<\/h5>\n<p><span class=\"token comment\"># docker-compose.yml &#8211; Redis\u5b8c\u6574\u6301\u4e45\u5316\u65b9\u6848<\/span><br \/>\n<span class=\"token key atrule\">version<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;3.8&#039;<\/span><\/p>\n<p><span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">redis<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> redis<span class=\"token punctuation\">:<\/span>7<span class=\"token punctuation\">&#8211;<\/span>alpine<br \/>\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> redis<span class=\"token punctuation\">&#8211;<\/span>prod<br \/>\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">&#8211;<\/span>stopped<br \/>\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token string\">&#034;6379:6379&#034;<\/span><br \/>\n    <span class=\"token key atrule\">environment<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">TZ<\/span><span class=\"token punctuation\">:<\/span> Asia\/Shanghai<br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token comment\"># \u6570\u636e\u6301\u4e45\u5316<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> redis_data<span class=\"token punctuation\">:<\/span>\/data<br \/>\n      <span class=\"token comment\"># \u914d\u7f6e\u6587\u4ef6<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> .\/redis\/conf\/redis.conf<span class=\"token punctuation\">:<\/span>\/usr\/local\/etc\/redis\/redis.conf<span class=\"token punctuation\">:<\/span>ro<br \/>\n      <span class=\"token comment\"># \u65e5\u5fd7<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> redis_logs<span class=\"token punctuation\">:<\/span>\/var\/log\/redis<br \/>\n    <span class=\"token key atrule\">command<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;redis-server&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\/usr\/local\/etc\/redis\/redis.conf&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token key atrule\">healthcheck<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">test<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;CMD&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;redis-cli&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;ping&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n      <span class=\"token key atrule\">interval<\/span><span class=\"token punctuation\">:<\/span> 10s<br \/>\n      <span class=\"token key atrule\">timeout<\/span><span class=\"token punctuation\">:<\/span> 5s<br \/>\n      <span class=\"token key atrule\">retries<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">5<\/span><\/p>\n<p><span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">redis_data<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> redis_data<br \/>\n  <span class=\"token key atrule\">redis_logs<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> redis_logs<\/p>\n<h5>8.4.2 Redis\u914d\u7f6e\u6587\u4ef6<\/h5>\n<p># redis\/conf\/redis.conf &#8211; Redis\u914d\u7f6e\u6587\u4ef6<\/p>\n<p># \u7f51\u7edc\u8bbe\u7f6e<br \/>\nbind 0.0.0.0<br \/>\nprotected-mode yes<br \/>\nport 6379<br \/>\ntimeout 300<br \/>\ntcp-keepalive 60<\/p>\n<p># \u5b89\u5168\u8bbe\u7f6e<br \/>\nrequirepass YourRedisPassword123!<\/p>\n<p># \u901a\u7528\u8bbe\u7f6e<br \/>\ndaemonize no<br \/>\nsupervised no<br \/>\npidfile \/var\/run\/redis_6379.pid<br \/>\nloglevel notice<br \/>\nlogfile \/var\/log\/redis\/redis.log<br \/>\ndatabases 16<\/p>\n<p># \u5feb\u7167(RDB)\u6301\u4e45\u5316\u8bbe\u7f6e<br \/>\nsave 900 1     # 900\u79d2\u5185\u81f3\u5c111\u4e2akey\u53d8\u5316\u5219\u4fdd\u5b58<br \/>\nsave 300 10    # 300\u79d2\u5185\u81f3\u5c1110\u4e2akey\u53d8\u5316\u5219\u4fdd\u5b58<br \/>\nsave 60 10000  # 60\u79d2\u5185\u81f3\u5c1110000\u4e2akey\u53d8\u5316\u5219\u4fdd\u5b58<br \/>\nstop-writes-on-bgsave-error yes<br \/>\nrdbcompression yes<br \/>\nrdbchecksum yes<br \/>\ndbfilename dump.rdb<br \/>\ndir \/data<\/p>\n<p># AOF(Append Only File)\u6301\u4e45\u5316\u8bbe\u7f6e<br \/>\nappendonly yes<br \/>\nappendfilename &#034;appendonly.aof&#034;<br \/>\nappendfsync everysec    # \u6bcf\u79d2\u540c\u6b65\u4e00\u6b21(\u517c\u987e\u6027\u80fd\u548c\u5b89\u5168)<br \/>\nno-appendfsync-on-rewrite no<br \/>\nauto-aof-rewrite-percentage 100<br \/>\nauto-aof-rewrite-min-size 64mb<br \/>\naof-load-truncated yes<br \/>\naof-use-rdb-preamble yes<\/p>\n<p># \u5185\u5b58\u7ba1\u7406<br \/>\nmaxmemory 512mb<br \/>\nmaxmemory-policy allkeys-lru<\/p>\n<p># \u6162\u67e5\u8be2\u65e5\u5fd7<br \/>\nslowlog-log-slower-than 10000<br \/>\nslowlog-max-len 128<\/p>\n<p># \u5ba2\u6237\u7aef\u7f13\u51b2\u533a\u9650\u5236<br \/>\nclient-output-buffer-limit normal 0 0 0<br \/>\nclient-output-buffer-limit replica 256mb 64mb 60<br \/>\nclient-output-buffer-limit pubsub 32mb 8mb 60<\/p>\n<p># \u60f0\u6027\u91ca\u653e<br \/>\nlazyfree-lazy-eviction yes<br \/>\nlazyfree-lazy-expire yes<br \/>\nlazyfree-lazy-server-del yes<\/p>\n<h5>8.4.3 \u5907\u4efd\u4e0e\u6062\u590d<\/h5>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># scripts\/backup-redis.sh &#8211; Redis\u5907\u4efd\u811a\u672c<\/span><\/p>\n<p><span class=\"token assign-left variable\">BACKUP_DIR<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\/backup\/redis\/<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%Y%m%d<span class=\"token variable\">)<\/span><\/span>&#034;<\/span><br \/>\n<span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span><br \/>\n<span class=\"token assign-left variable\">TIMESTAMP<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%H%M%S<span class=\"token variable\">)<\/span><\/span><\/p>\n<p><span class=\"token comment\"># 1. \u89e6\u53d1RDB\u5feb\u7167<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Triggering BGSAVE&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> redis-prod redis-cli <span class=\"token parameter variable\">-a<\/span> YourRedisPassword123<span class=\"token operator\">!<\/span> BGSAVE<\/p>\n<p><span class=\"token comment\"># \u7b49\u5f85BGSAVE\u5b8c\u6210<\/span><br \/>\n<span class=\"token keyword\">while<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">do<\/span><br \/>\n    <span class=\"token assign-left variable\">STATUS<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> redis-prod redis-cli <span class=\"token parameter variable\">-a<\/span> YourRedisPassword123<span class=\"token operator\">!<\/span> INFO persistence <span class=\"token operator\">|<\/span> <span class=\"token function\">grep<\/span> rdb_bgsave_in_progress <span class=\"token operator\">|<\/span> <span class=\"token function\">cut<\/span> -d: <span class=\"token parameter variable\">-f2<\/span> <span class=\"token operator\">|<\/span> <span class=\"token function\">tr<\/span> <span class=\"token parameter variable\">-d<\/span> <span class=\"token string\">&#039;\\\\r&#039;<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$STATUS<\/span>&#034;<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;0&#034;<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n        <span class=\"token builtin class-name\">break<\/span><br \/>\n    <span class=\"token keyword\">fi<\/span><br \/>\n    <span class=\"token function\">sleep<\/span> <span class=\"token number\">1<\/span><br \/>\n<span class=\"token keyword\">done<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] BGSAVE completed.&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u590d\u5236RDB\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">cp<\/span> redis-prod:\/data\/dump.rdb <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>\/dump-<span class=\"token variable\">$TIMESTAMP<\/span>.rdb&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 3. \u590d\u5236AOF\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">cp<\/span> redis-prod:\/data\/appendonly.aof <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>\/appendonly-<span class=\"token variable\">$TIMESTAMP<\/span>.aof&#034;<\/span> <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null <span class=\"token operator\">||<\/span> <span class=\"token boolean\">true<\/span><\/p>\n<p><span class=\"token comment\"># 4. \u7269\u7406\u5907\u4efd(\u5907\u4efd\u6570\u636e\u5377)<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> redis_data:\/data:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span>:\/backup <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">tar<\/span> czf \/backup\/redis-data-<span class=\"token variable\">$TIMESTAMP<\/span>.tar.gz <span class=\"token parameter variable\">-C<\/span> \/data <span class=\"token builtin class-name\">.<\/span><\/p>\n<p><span class=\"token comment\"># 5. \u6e05\u7406\u8fc7\u671f\u5907\u4efd<\/span><br \/>\n<span class=\"token function\">find<\/span> \/backup\/redis\/ <span class=\"token parameter variable\">-maxdepth<\/span> <span class=\"token number\">1<\/span> <span class=\"token parameter variable\">-type<\/span> d <span class=\"token parameter variable\">-mtime<\/span> &#043;7 <span class=\"token parameter variable\">-exec<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-rf<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span> <span class=\"token punctuation\">\\\\<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Backup completed.&#034;<\/span><br \/>\n<span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-lh<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span>\/<\/p>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># scripts\/restore-redis.sh &#8211; Redis\u6062\u590d\u811a\u672c<\/span><\/p>\n<p><span class=\"token assign-left variable\">BACKUP_FILE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\">$1<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Stopping Redis&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker-compose<\/span> stop redis<\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Restoring data&#8230;&#034;<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">[<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span> <span class=\"token operator\">&#061;&#061;<\/span> *.rdb <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    <span class=\"token comment\"># \u6062\u590dRDB\u6587\u4ef6<\/span><br \/>\n    <span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n      <span class=\"token parameter variable\">-v<\/span> redis_data:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n      <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">dirname<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span><span class=\"token variable\">)<\/span><\/span>&#034;<\/span>:\/backup:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n      alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n      <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#034;cp \/backup\/<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">basename<\/span> $BACKUP_FILE<span class=\"token variable\">)<\/span><\/span> \/data\/dump.rdb &amp;&amp; rm -f \/data\/appendonly.aof&#034;<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Starting Redis&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker-compose<\/span> start redis<\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Restore completed.&#034;<\/span><\/p>\n<h4>8.5 Elasticsearch\u6570\u636e\u6301\u4e45\u5316\u65b9\u6848<\/h4>\n<h5>8.5.1 \u5b8c\u6574Docker Compose\u914d\u7f6e<\/h5>\n<p><span class=\"token comment\"># docker-compose.yml &#8211; Elasticsearch\u5b8c\u6574\u6301\u4e45\u5316\u65b9\u6848<\/span><br \/>\n<span class=\"token key atrule\">version<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;3.8&#039;<\/span><\/p>\n<p><span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">elasticsearch<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> docker.elastic.co\/elasticsearch\/elasticsearch<span class=\"token punctuation\">:<\/span>8.11.0<br \/>\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> es<span class=\"token punctuation\">&#8211;<\/span>prod<br \/>\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">&#8211;<\/span>stopped<br \/>\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token string\">&#034;9200:9200&#034;<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token string\">&#034;9300:9300&#034;<\/span><br \/>\n    <span class=\"token key atrule\">environment<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> discovery.type&#061;single<span class=\"token punctuation\">&#8211;<\/span>node<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> xpack.security.enabled&#061;false<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> ES_JAVA_OPTS&#061;<span class=\"token punctuation\">&#8211;<\/span>Xms512m <span class=\"token punctuation\">&#8211;<\/span>Xmx512m<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> cluster.name&#061;es<span class=\"token punctuation\">&#8211;<\/span>cluster<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> node.name&#061;es<span class=\"token punctuation\">&#8211;<\/span>node<span class=\"token punctuation\">&#8211;<\/span><span class=\"token number\">1<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> bootstrap.memory_lock&#061;true<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> TZ&#061;Asia\/Shanghai<br \/>\n    <span class=\"token key atrule\">ulimits<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">memlock<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token key atrule\">soft<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">-1<\/span><br \/>\n        <span class=\"token key atrule\">hard<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">-1<\/span><br \/>\n      <span class=\"token key atrule\">nofile<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token key atrule\">soft<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">65536<\/span><br \/>\n        <span class=\"token key atrule\">hard<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">65536<\/span><br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token comment\"># \u6570\u636e\u6301\u4e45\u5316<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> es_data<span class=\"token punctuation\">:<\/span>\/usr\/share\/elasticsearch\/data<br \/>\n      <span class=\"token comment\"># \u914d\u7f6e\u6587\u4ef6<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> .\/es\/conf\/elasticsearch.yml<span class=\"token punctuation\">:<\/span>\/usr\/share\/elasticsearch\/config\/elasticsearch.yml<span class=\"token punctuation\">:<\/span>ro<br \/>\n      <span class=\"token comment\"># \u65e5\u5fd7<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> es_logs<span class=\"token punctuation\">:<\/span>\/usr\/share\/elasticsearch\/logs<br \/>\n      <span class=\"token comment\"># \u5206\u6790\u63d2\u4ef6<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> es_plugins<span class=\"token punctuation\">:<\/span>\/usr\/share\/elasticsearch\/plugins<br \/>\n    <span class=\"token key atrule\">healthcheck<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">test<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;CMD-SHELL&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;curl -f http:\/\/localhost:9200\/_cluster\/health || exit 1&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n      <span class=\"token key atrule\">interval<\/span><span class=\"token punctuation\">:<\/span> 15s<br \/>\n      <span class=\"token key atrule\">timeout<\/span><span class=\"token punctuation\">:<\/span> 10s<br \/>\n      <span class=\"token key atrule\">retries<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">5<\/span><br \/>\n      <span class=\"token key atrule\">start_period<\/span><span class=\"token punctuation\">:<\/span> 60s<\/p>\n<p>  <span class=\"token key atrule\">kibana<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> docker.elastic.co\/kibana\/kibana<span class=\"token punctuation\">:<\/span>8.11.0<br \/>\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> kibana<span class=\"token punctuation\">&#8211;<\/span>prod<br \/>\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">&#8211;<\/span>stopped<br \/>\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token string\">&#034;5601:5601&#034;<\/span><br \/>\n    <span class=\"token key atrule\">environment<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> ELASTICSEARCH_HOSTS&#061;http<span class=\"token punctuation\">:<\/span>\/\/es<span class=\"token punctuation\">&#8211;<\/span>prod<span class=\"token punctuation\">:<\/span><span class=\"token number\">9200<\/span><br \/>\n    <span class=\"token key atrule\">depends_on<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">elasticsearch<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token key atrule\">condition<\/span><span class=\"token punctuation\">:<\/span> service_healthy<\/p>\n<p><span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">es_data<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> es_data<br \/>\n  <span class=\"token key atrule\">es_logs<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> es_logs<br \/>\n  <span class=\"token key atrule\">es_plugins<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> es_plugins<\/p>\n<h5>8.5.2 Elasticsearch\u914d\u7f6e\u6587\u4ef6<\/h5>\n<p><span class=\"token comment\"># es\/conf\/elasticsearch.yml &#8211; Elasticsearch\u914d\u7f6e\u6587\u4ef6<\/span><\/p>\n<p><span class=\"token key atrule\">cluster.name<\/span><span class=\"token punctuation\">:<\/span> es<span class=\"token punctuation\">&#8211;<\/span>cluster<br \/>\n<span class=\"token key atrule\">node.name<\/span><span class=\"token punctuation\">:<\/span> es<span class=\"token punctuation\">&#8211;<\/span>node<span class=\"token punctuation\">&#8211;<\/span><span class=\"token number\">1<\/span><\/p>\n<p><span class=\"token comment\"># \u6570\u636e\u548c\u65e5\u5fd7\u8def\u5f84<\/span><br \/>\n<span class=\"token key atrule\">path.data<\/span><span class=\"token punctuation\">:<\/span> \/usr\/share\/elasticsearch\/data<br \/>\n<span class=\"token key atrule\">path.logs<\/span><span class=\"token punctuation\">:<\/span> \/usr\/share\/elasticsearch\/logs<\/p>\n<p><span class=\"token comment\"># \u7f51\u7edc\u8bbe\u7f6e<\/span><br \/>\n<span class=\"token key atrule\">network.host<\/span><span class=\"token punctuation\">:<\/span> 0.0.0.0<br \/>\n<span class=\"token key atrule\">http.port<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">9200<\/span><br \/>\n<span class=\"token key atrule\">transport.port<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">9300<\/span><\/p>\n<p><span class=\"token comment\"># \u53d1\u73b0\u8bbe\u7f6e<\/span><br \/>\n<span class=\"token key atrule\">discovery.type<\/span><span class=\"token punctuation\">:<\/span> single<span class=\"token punctuation\">&#8211;<\/span>node<\/p>\n<p><span class=\"token comment\"># \u5185\u5b58\u8bbe\u7f6e<\/span><br \/>\n<span class=\"token key atrule\">bootstrap.memory_lock<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span><\/p>\n<p><span class=\"token comment\"># \u5b89\u5168\u8bbe\u7f6e<\/span><br \/>\n<span class=\"token key atrule\">xpack.security.enabled<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">false<\/span><br \/>\n<span class=\"token key atrule\">xpack.security.enrollment.enabled<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">false<\/span><br \/>\n<span class=\"token key atrule\">xpack.security.http.ssl.enabled<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">false<\/span><br \/>\n<span class=\"token key atrule\">xpack.security.transport.ssl.enabled<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">false<\/span><\/p>\n<p><span class=\"token comment\"># \u7d22\u5f15\u8bbe\u7f6e<\/span><br \/>\n<span class=\"token key atrule\">action.destructive_requires_name<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span><\/p>\n<p><span class=\"token comment\"># \u6162\u67e5\u8be2\u65e5\u5fd7<\/span><br \/>\n<span class=\"token key atrule\">indices.queries.cache.size<\/span><span class=\"token punctuation\">:<\/span> 10%<br \/>\n<span class=\"token key atrule\">indices.fielddata.cache.size<\/span><span class=\"token punctuation\">:<\/span> 40%<\/p>\n<p><span class=\"token comment\"># \u7ebf\u7a0b\u6c60<\/span><br \/>\n<span class=\"token key atrule\">thread_pool.search.size<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">12<\/span><br \/>\n<span class=\"token key atrule\">thread_pool.search.queue_size<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">1000<\/span><\/p>\n<h5>8.5.3 \u5907\u4efd\u4e0e\u6062\u590d<\/h5>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># scripts\/backup-es.sh &#8211; Elasticsearch\u5907\u4efd\u811a\u672c<\/span><\/p>\n<p><span class=\"token assign-left variable\">BACKUP_DIR<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\/backup\/es\/<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%Y%m%d<span class=\"token variable\">)<\/span><\/span>&#034;<\/span><br \/>\n<span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span><br \/>\n<span class=\"token assign-left variable\">TIMESTAMP<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%H%M%S<span class=\"token variable\">)<\/span><\/span><br \/>\n<span class=\"token assign-left variable\">ES_HOST<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;http:\/\/localhost:9200&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 1. \u6ce8\u518c\u5feb\u7167\u4ed3\u5e93(\u4f7f\u7528\u5171\u4eab\u6587\u4ef6\u7cfb\u7edf)<\/span><br \/>\n<span class=\"token comment\"># \u9700\u8981\u5728elasticsearch.yml\u4e2d\u8bbe\u7f6e path.repo: [&#034;\/usr\/share\/elasticsearch\/backup&#034;]<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> es-prod <span class=\"token function\">curl<\/span> <span class=\"token parameter variable\">-s<\/span> <span class=\"token parameter variable\">-X<\/span> PUT <span class=\"token string\">&#034;<span class=\"token variable\">$ES_HOST<\/span>\/_snapshot\/backup_repo&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-H<\/span> <span class=\"token string\">&#039;Content-Type: application\/json&#039;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-d<\/span> <span class=\"token string\">&#039;{<br \/>\n    &#034;type&#034;: &#034;fs&#034;,<br \/>\n    &#034;settings&#034;: {<br \/>\n      &#034;location&#034;: &#034;\/usr\/share\/elasticsearch\/backup&#034;,<br \/>\n      &#034;compress&#034;: true<br \/>\n    }<br \/>\n  }&#039;<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u521b\u5efa\u5feb\u7167<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> es-prod <span class=\"token function\">curl<\/span> <span class=\"token parameter variable\">-s<\/span> <span class=\"token parameter variable\">-X<\/span> PUT <span class=\"token string\">&#034;<span class=\"token variable\">$ES_HOST<\/span>\/_snapshot\/backup_repo\/snapshot_<span class=\"token variable\">$TIMESTAMP<\/span>?wait_for_completion&#061;true&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-H<\/span> <span class=\"token string\">&#039;Content-Type: application\/json&#039;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-d<\/span> <span class=\"token string\">&#039;{<br \/>\n    &#034;indices&#034;: &#034;*&#034;,<br \/>\n    &#034;ignore_unavailable&#034;: true,<br \/>\n    &#034;include_global_state&#034;: false<br \/>\n  }&#039;<\/span><\/p>\n<p><span class=\"token comment\"># 3. \u7269\u7406\u5907\u4efd(\u5907\u4efd\u6570\u636e\u5377)<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Backing up data volume&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> es_data:\/usr\/share\/elasticsearch\/data:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span>:\/backup <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">tar<\/span> czf \/backup\/es-data-<span class=\"token variable\">$TIMESTAMP<\/span>.tar.gz <span class=\"token parameter variable\">-C<\/span> \/usr\/share\/elasticsearch\/data <span class=\"token builtin class-name\">.<\/span><\/p>\n<p><span class=\"token comment\"># 4. \u6e05\u7406\u8fc7\u671f\u5907\u4efd<\/span><br \/>\n<span class=\"token function\">find<\/span> \/backup\/es\/ <span class=\"token parameter variable\">-maxdepth<\/span> <span class=\"token number\">1<\/span> <span class=\"token parameter variable\">-type<\/span> d <span class=\"token parameter variable\">-mtime<\/span> &#043;7 <span class=\"token parameter variable\">-exec<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-rf<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span> <span class=\"token punctuation\">\\\\<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Backup completed.&#034;<\/span><br \/>\n<span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-lh<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span>\/<\/p>\n<h4>8.6 \u6570\u636e\u5e93\u5b58\u50a8\u901a\u7528\u6700\u4f73\u5b9e\u8df5<\/h4>\n<h5>8.6.1 \u901a\u7528\u914d\u7f6e\u5efa\u8bae<\/h5>\n<p><span class=\"token comment\"># \u901a\u7528\u6700\u4f73\u5b9e\u8df5(\u9002\u7528\u4e8e\u6240\u6709\u6570\u636e\u5e93)<\/span><\/p>\n<p><span class=\"token comment\"># 1. \u59cb\u7ec8\u4f7f\u7528\u547d\u540d\u6570\u636e\u5377,\u4e0d\u8981\u4f7f\u7528\u533f\u540d\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token punctuation\">&#8211;<\/span> db_data<span class=\"token punctuation\">:<\/span>\/var\/lib\/database  <span class=\"token comment\"># \u547d\u540d\u6570\u636e\u5377(\u597d)<\/span><br \/>\n  <span class=\"token comment\"># &#8211; \/var\/lib\/database          # \u533f\u540d\u6570\u636e\u5377(\u5dee)<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u4e3a\u6570\u636e\u5377\u6dfb\u52a0\u6807\u7b7e<\/span><br \/>\n<span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">db_data<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> mysql_prod_data<br \/>\n    <span class=\"token key atrule\">labels<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">app<\/span><span class=\"token punctuation\">:<\/span> mysql<br \/>\n      <span class=\"token key atrule\">env<\/span><span class=\"token punctuation\">:<\/span> production<br \/>\n      <span class=\"token key atrule\">backup<\/span><span class=\"token punctuation\">:<\/span> daily<br \/>\n      <span class=\"token key atrule\">retention<\/span><span class=\"token punctuation\">:<\/span> 30d<\/p>\n<p><span class=\"token comment\"># 3. \u8bbe\u7f6e\u5408\u7406\u7684\u5065\u5eb7\u68c0\u67e5<\/span><br \/>\n<span class=\"token key atrule\">healthcheck<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">test<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;CMD-SHELL&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u68c0\u67e5\u547d\u4ee4&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n  <span class=\"token key atrule\">interval<\/span><span class=\"token punctuation\">:<\/span> 10s<br \/>\n  <span class=\"token key atrule\">timeout<\/span><span class=\"token punctuation\">:<\/span> 5s<br \/>\n  <span class=\"token key atrule\">retries<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">5<\/span><br \/>\n  <span class=\"token key atrule\">start_period<\/span><span class=\"token punctuation\">:<\/span> 30s  <span class=\"token comment\"># \u7ed9\u6570\u636e\u5e93\u8db3\u591f\u7684\u542f\u52a8\u65f6\u95f4<\/span><\/p>\n<p><span class=\"token comment\"># 4. \u8bbe\u7f6e\u8d44\u6e90\u9650\u5236<\/span><br \/>\n<span class=\"token key atrule\">deploy<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">resources<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">limits<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">memory<\/span><span class=\"token punctuation\">:<\/span> 2G<br \/>\n      <span class=\"token key atrule\">cpus<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;2.0&#039;<\/span><br \/>\n    <span class=\"token key atrule\">reservations<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">memory<\/span><span class=\"token punctuation\">:<\/span> 1G<\/p>\n<p><span class=\"token comment\"># 5. \u8bbe\u7f6e\u91cd\u542f\u7b56\u7565<\/span><br \/>\n<span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">&#8211;<\/span>stopped<\/p>\n<p><span class=\"token comment\"># 6. \u65e5\u5fd7\u9650\u5236<\/span><br \/>\n<span class=\"token key atrule\">logging<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">driver<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;json-file&#034;<\/span><br \/>\n  <span class=\"token key atrule\">options<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">max-size<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;10m&#034;<\/span><br \/>\n    <span class=\"token key atrule\">max-file<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;3&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 7. \u4f7f\u7528\u73af\u5883\u53d8\u91cf\u7ba1\u7406\u5bc6\u7801(\u914d\u5408.env\u6587\u4ef6)<\/span><br \/>\n<span class=\"token key atrule\">environment<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">DB_PASSWORD<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span>DB_PASSWORD<span class=\"token punctuation\">}<\/span><\/p>\n<h5>8.6.2 \u6570\u636e\u5377\u5206\u79bb\u7b56\u7565<\/h5>\n<p><span class=\"token comment\"># \u5c06\u4e0d\u540c\u7c7b\u578b\u7684\u6570\u636e\u5b58\u50a8\u5728\u4e0d\u540c\u7684\u6570\u636e\u5377\u4e2d,\u4fbf\u4e8e\u7ba1\u7406<\/span><\/p>\n<p><span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token comment\"># \u6838\u5fc3\u6570\u636e(\u6700\u9ad8\u4f18\u5148\u7ea7\u5907\u4efd)<\/span><br \/>\n  <span class=\"token punctuation\">&#8211;<\/span> db_data<span class=\"token punctuation\">:<\/span>\/var\/lib\/mysql<\/p>\n<p>  <span class=\"token comment\"># \u4e8c\u8fdb\u5236\u65e5\u5fd7\/WAL\u65e5\u5fd7(\u7528\u4e8e\u590d\u5236\u548c\u6062\u590d)<\/span><br \/>\n  <span class=\"token punctuation\">&#8211;<\/span> db_binlog<span class=\"token punctuation\">:<\/span>\/var\/lib\/mysql<span class=\"token punctuation\">&#8211;<\/span>bin<\/p>\n<p>  <span class=\"token comment\"># \u6162\u67e5\u8be2\u65e5\u5fd7(\u7528\u4e8e\u6027\u80fd\u4f18\u5316)<\/span><br \/>\n  <span class=\"token punctuation\">&#8211;<\/span> db_slowlog<span class=\"token punctuation\">:<\/span>\/var\/log\/mysql\/slow<\/p>\n<p>  <span class=\"token comment\"># \u9519\u8bef\u65e5\u5fd7<\/span><br \/>\n  <span class=\"token punctuation\">&#8211;<\/span> db_errorlog<span class=\"token punctuation\">:<\/span>\/var\/log\/mysql\/error<\/p>\n<p>  <span class=\"token comment\"># \u4e34\u65f6\u6587\u4ef6(tmpfs,\u4e0d\u9700\u8981\u6301\u4e45\u5316)<\/span><br \/>\n  <span class=\"token comment\"># \u901a\u8fc7tmpfs\u6302\u8f7d<\/span><\/p>\n<h4>8.7 \u6570\u636e\u5e93\u5b58\u50a8\u6027\u80fd\u4f18\u5316<\/h4>\n<h5>8.7.1 \u5b58\u50a8\u9a71\u52a8\u4f18\u5316<\/h5>\n<p><span class=\"token comment\"># 1. \u4f7f\u7528overlay2\u5b58\u50a8\u9a71\u52a8(\u6027\u80fd\u6700\u4f73)<\/span><br \/>\n<span class=\"token comment\"># \/etc\/docker\/daemon.json<\/span><br \/>\n<span class=\"token comment\"># {<\/span><br \/>\n<span class=\"token comment\">#   &#034;storage-driver&#034;: &#034;overlay2&#034;<\/span><br \/>\n<span class=\"token comment\"># }<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u5c06\u6570\u636e\u76ee\u5f55\u653e\u5728\u9ad8\u6027\u80fd\u78c1\u76d8\u4e0a<\/span><br \/>\n<span class=\"token comment\"># \u4f7f\u7528SSD\u5b58\u50a8\u6570\u636e\u5e93\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token comment\"># \u4fee\u6539Docker\u6570\u636e\u6839\u76ee\u5f55<\/span><br \/>\n<span class=\"token comment\"># \/etc\/docker\/daemon.json<\/span><br \/>\n<span class=\"token comment\"># {<\/span><br \/>\n<span class=\"token comment\">#   &#034;data-root&#034;: &#034;\/mnt\/ssd\/docker&#034;<\/span><br \/>\n<span class=\"token comment\"># }<\/span><\/p>\n<p><span class=\"token comment\"># 3. \u4f7f\u7528\u5757\u8bbe\u5907\u6570\u636e\u5377(\u7ed5\u8fc7\u6587\u4ef6\u7cfb\u7edf\u5f00\u9500)<\/span><br \/>\n<span class=\"token comment\"># \u683c\u5f0f\u5316SSD<\/span><br \/>\n<span class=\"token function\">sudo<\/span> mkfs.ext4 \/dev\/nvme0n1<br \/>\n<span class=\"token comment\"># \u521b\u5efa\u5757\u8bbe\u5907\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token builtin class-name\">local<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>ext4 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">device<\/span><span class=\"token operator\">&#061;<\/span>\/dev\/nvme0n1 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  mysql-block-data<\/p>\n<h5>8.7.2 \u5185\u5b58\u4e0e\u7f13\u5b58\u4f18\u5316<\/h5>\n<p><span class=\"token comment\"># \u6570\u636e\u5e93\u5bb9\u5668\u5185\u5b58\u4f18\u5316\u5efa\u8bae<\/span><\/p>\n<p><span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">mysql<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token comment\"># \u8bbe\u7f6e\u8db3\u591f\u7684\u5185\u5b58<\/span><br \/>\n    <span class=\"token key atrule\">deploy<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">resources<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token key atrule\">limits<\/span><span class=\"token punctuation\">:<\/span><br \/>\n          <span class=\"token key atrule\">memory<\/span><span class=\"token punctuation\">:<\/span> 4G  <span class=\"token comment\"># \u6839\u636e\u5b9e\u9645\u60c5\u51b5\u8c03\u6574<\/span><\/p>\n<p>    <span class=\"token comment\"># \u8c03\u6574InnoDB\u7f13\u51b2\u6c60(MySQL)<\/span><br \/>\n    <span class=\"token key atrule\">command<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">&gt;<\/span><span class=\"token scalar string\"><br \/>\n      &#8211;innodb_buffer_pool_size&#061;2G<br \/>\n      &#8211;innodb_buffer_pool_instances&#061;4<br \/>\n      &#8211;innodb_flush_method&#061;O_DIRECT<br \/>\n      &#8211;innodb_io_capacity&#061;2000<br \/>\n      &#8211;innodb_io_capacity_max&#061;4000<\/span><\/p>\n<p>    <span class=\"token comment\"># \u4f7f\u7528tmpfs\u5b58\u50a8\u4e34\u65f6\u8868<\/span><br \/>\n    <span class=\"token key atrule\">tmpfs<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> \/tmp<span class=\"token punctuation\">:<\/span>size&#061;256m<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> \/var\/tmp<span class=\"token punctuation\">:<\/span>size&#061;256m<\/p>\n<h5>8.7.3 I\/O\u8c03\u5ea6\u4f18\u5316<\/h5>\n<p><span class=\"token comment\"># 1. \u4e3a\u6570\u636e\u5e93\u78c1\u76d8\u9009\u62e9\u5408\u9002\u7684I\/O\u8c03\u5ea6\u5668<\/span><br \/>\n<span class=\"token comment\"># \u67e5\u770b\u5f53\u524d\u8c03\u5ea6\u5668<\/span><br \/>\n<span class=\"token function\">cat<\/span> \/sys\/block\/sda\/queue\/scheduler<\/p>\n<p><span class=\"token comment\"># \u8bbe\u7f6e\u4e3adeadline(\u9002\u5408\u6570\u636e\u5e93)<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> deadline <span class=\"token operator\">&gt;<\/span> \/sys\/block\/sda\/queue\/scheduler<\/p>\n<p><span class=\"token comment\"># \u5bf9\u4e8eNVMe SSD,\u4f7f\u7528none\u8c03\u5ea6\u5668<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> none <span class=\"token operator\">&gt;<\/span> \/sys\/block\/nvme0n1\/queue\/scheduler<\/p>\n<p><span class=\"token comment\"># 2. \u8c03\u6574\u6587\u4ef6\u7cfb\u7edf\u6302\u8f7d\u9009\u9879(\u5982\u679c\u662f\u7ed1\u5b9a\u6302\u8f7d\u6216\u81ea\u5b9a\u4e49\u6570\u636e\u6839\u76ee\u5f55)<\/span><br \/>\n<span class=\"token comment\"># \/etc\/fstab<\/span><br \/>\n<span class=\"token comment\"># \/dev\/sdb1 \/var\/lib\/docker ext4 defaults,noatime,nodiratime 0 0<\/span><br \/>\n<span class=\"token comment\"># noatime: \u4e0d\u66f4\u65b0\u6587\u4ef6\u8bbf\u95ee\u65f6\u95f4,\u51cf\u5c11I\/O<\/span><br \/>\n<span class=\"token comment\"># nodiratime: \u4e0d\u66f4\u65b0\u76ee\u5f55\u8bbf\u95ee\u65f6\u95f4<\/span><\/p>\n<p><span class=\"token comment\"># 3. \u7981\u7528\u900f\u660e\u5927\u9875(THP),\u5bf9\u6570\u636e\u5e93\u6027\u80fd\u6709\u8d1f\u9762\u5f71\u54cd<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> never <span class=\"token operator\">&gt;<\/span> \/sys\/kernel\/mm\/transparent_hugepage\/enabled<br \/>\n<span class=\"token builtin class-name\">echo<\/span> never <span class=\"token operator\">&gt;<\/span> \/sys\/kernel\/mm\/transparent_hugepage\/defrag<\/p>\n<h5>8.7.4 \u6570\u636e\u5e93\u7279\u5b9a\u4f18\u5316\u603b\u7ed3<\/h5>\n<table>\n<tr>\u6570\u636e\u5e93\u5173\u952e\u4f18\u5316\u9879\u63a8\u8350\u503c<\/tr>\n<tbody>\n<tr>\n<td>MySQL<\/td>\n<td>innodb_buffer_pool_size<\/td>\n<td>\u7269\u7406\u5185\u5b58\u768450-70%<\/td>\n<\/tr>\n<tr>\n<td>MySQL<\/td>\n<td>innodb_flush_log_at_trx_commit<\/td>\n<td>1(\u5b89\u5168)\/2(\u6027\u80fd)<\/td>\n<\/tr>\n<tr>\n<td>MySQL<\/td>\n<td>innodb_flush_method<\/td>\n<td>O_DIRECT<\/td>\n<\/tr>\n<tr>\n<td>PostgreSQL<\/td>\n<td>shared_buffers<\/td>\n<td>\u7269\u7406\u5185\u5b58\u768425%<\/td>\n<\/tr>\n<tr>\n<td>PostgreSQL<\/td>\n<td>effective_cache_size<\/td>\n<td>\u7269\u7406\u5185\u5b58\u768450-75%<\/td>\n<\/tr>\n<tr>\n<td>PostgreSQL<\/td>\n<td>wal_buffers<\/td>\n<td>16MB<\/td>\n<\/tr>\n<tr>\n<td>MongoDB<\/td>\n<td>wiredTiger.cacheSizeGB<\/td>\n<td>\u7269\u7406\u5185\u5b58\u768450%<\/td>\n<\/tr>\n<tr>\n<td>Redis<\/td>\n<td>maxmemory<\/td>\n<td>\u6839\u636e\u9700\u6c42\u8bbe\u7f6e<\/td>\n<\/tr>\n<tr>\n<td>Redis<\/td>\n<td>appendfsync<\/td>\n<td>everysec(\u517c\u987e\u5b89\u5168\u548c\u6027\u80fd)<\/td>\n<\/tr>\n<tr>\n<td>Elasticsearch<\/td>\n<td>ES_JAVA_OPTS -Xms -Xmx<\/td>\n<td>\u76f8\u540c\u503c,\u7269\u7406\u5185\u5b58\u768450%<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h3>\u7b2c\u4e5d\u7ae0 \u5b58\u50a8\u5b89\u5168\u4e0e\u5907\u4efd\u7b56\u7565<\/h3>\n<h4>9.1 \u6570\u636e\u5377\u52a0\u5bc6<\/h4>\n<h5>9.1.1 \u4e3a\u4ec0\u4e48\u9700\u8981\u52a0\u5bc6\u6570\u636e\u5377<\/h5>\n<p>\u5728\u751f\u4ea7\u73af\u5883\u4e2d,\u6570\u636e\u5377\u4e2d\u53ef\u80fd\u5b58\u50a8\u7740\u654f\u611f\u4fe1\u606f,\u5982\u7528\u6237\u6570\u636e\u3001\u5bc6\u7801\u3001\u5bc6\u94a5\u3001\u5546\u4e1a\u673a\u5bc6\u7b49\u3002\u5982\u679c\u5bbf\u4e3b\u673a\u88ab\u5165\u4fb5\u6216\u78c1\u76d8\u88ab\u76d7,\u672a\u52a0\u5bc6\u7684\u6570\u636e\u5c06\u76f4\u63a5\u66b4\u9732\u3002\u52a0\u5bc6\u6570\u636e\u5377\u53ef\u4ee5\u786e\u4fdd\u5373\u4f7f\u7269\u7406\u5b58\u50a8\u4ecb\u8d28\u6cc4\u9732,\u6570\u636e\u4e5f\u65e0\u6cd5\u88ab\u8bfb\u53d6\u3002<\/p>\n<h5>9.1.2 \u4f7f\u7528LUKS\u52a0\u5bc6(\u5757\u8bbe\u5907\u7ea7\u522b)<\/h5>\n<p><span class=\"token comment\"># \u6b65\u9aa41:\u521b\u5efa\u5e76\u683c\u5f0f\u5316LUKS\u52a0\u5bc6\u8bbe\u5907<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">apt-get<\/span> <span class=\"token function\">install<\/span> cryptsetup  <span class=\"token comment\"># \u5b89\u88c5cryptsetup<\/span><br \/>\n<span class=\"token function\">sudo<\/span> cryptsetup luksFormat \/dev\/sdb1<br \/>\n<span class=\"token comment\"># \u8f93\u5165\u52a0\u5bc6\u5bc6\u7801(\u52a1\u5fc5\u8bb0\u4f4f!)<\/span><\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa42:\u6253\u5f00\u52a0\u5bc6\u8bbe\u5907<\/span><br \/>\n<span class=\"token function\">sudo<\/span> cryptsetup luksOpen \/dev\/sdb1 encrypted_docker<br \/>\n<span class=\"token comment\"># \u8f93\u5165\u5bc6\u7801<\/span><\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa43:\u5728\u52a0\u5bc6\u8bbe\u5907\u4e0a\u521b\u5efa\u6587\u4ef6\u7cfb\u7edf<\/span><br \/>\n<span class=\"token function\">sudo<\/span> mkfs.ext4 \/dev\/mapper\/encrypted_docker<\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa44:\u6302\u8f7d\u52a0\u5bc6\u8bbe\u5907<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> \/mnt\/encrypted-docker<br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">mount<\/span> \/dev\/mapper\/encrypted_docker \/mnt\/encrypted-docker<\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa45:\u521b\u5efaDocker\u6570\u636e\u5377\u6307\u5411\u52a0\u5bc6\u8bbe\u5907<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token builtin class-name\">local<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>none <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">device<\/span><span class=\"token operator\">&#061;<\/span>\/mnt\/encrypted-docker <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">o<\/span><span class=\"token operator\">&#061;<\/span>bind <span class=\"token punctuation\">\\\\<\/span><br \/>\n  encrypted-data<\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa46:\u4f7f\u7528\u52a0\u5bc6\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> secure-db <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> encrypted-data:\/var\/lib\/mysql <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-e<\/span> <span class=\"token assign-left variable\">MYSQL_ROOT_PASSWORD<\/span><span class=\"token operator\">&#061;<\/span>RootPass123<span class=\"token operator\">!<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  mysql:8.0<\/p>\n<p><span class=\"token comment\"># \u5f00\u673a\u81ea\u52a8\u6302\u8f7d\u52a0\u5bc6\u8bbe\u5907<\/span><br \/>\n<span class=\"token comment\"># \/etc\/crypttab:<\/span><br \/>\n<span class=\"token comment\"># encrypted_docker \/dev\/sdb1 none luks<\/span><br \/>\n<span class=\"token comment\"># \/etc\/fstab:<\/span><br \/>\n<span class=\"token comment\"># \/dev\/mapper\/encrypted_docker \/mnt\/encrypted-docker ext4 defaults 0 0<\/span><\/p>\n<h5>9.1.3 \u4f7f\u7528Docker\u52a0\u5bc6\u63d2\u4ef6<\/h5>\n<p><span class=\"token comment\"># \u5b89\u88c5Docker\u52a0\u5bc6\u5377\u63d2\u4ef6(\u4ee5vieux\/sshfs\u4e3a\u4f8b,\u5b9e\u9645\u53ef\u4f7f\u7528\u4e13\u7528\u52a0\u5bc6\u63d2\u4ef6)<\/span><br \/>\n<span class=\"token comment\"># \u5e38\u89c1\u7684\u52a0\u5bc6\u5377\u63d2\u4ef6\u5305\u62ec:<\/span><br \/>\n<span class=\"token comment\"># &#8211; docker-volume-crypt(\u57fa\u4e8eLUKS)<\/span><br \/>\n<span class=\"token comment\"># &#8211; Rancher Longhorn(\u652f\u6301\u52a0\u5bc6)<\/span><br \/>\n<span class=\"token comment\"># &#8211; Portworx(\u4f01\u4e1a\u7ea7\u5b58\u50a8,\u652f\u6301\u52a0\u5bc6)<\/span><\/p>\n<p><span class=\"token comment\"># \u793a\u4f8b:\u4f7f\u7528\u7b2c\u4e09\u65b9\u52a0\u5bc6\u63d2\u4ef6<\/span><br \/>\n<span class=\"token function\">docker<\/span> plugin <span class=\"token function\">install<\/span> <span class=\"token operator\">&lt;<\/span>encryption-plugin-name<span class=\"token operator\">&gt;<\/span><\/p>\n<p><span class=\"token comment\"># \u521b\u5efa\u52a0\u5bc6\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token operator\">&lt;<\/span>encryption-plugin-name<span class=\"token operator\">&gt;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">encrypted<\/span><span class=\"token operator\">&#061;<\/span>true <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">key<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token operator\">&lt;<\/span>encryption-key-id<span class=\"token operator\">&gt;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  encrypted-volume<\/p>\n<h5>9.1.4 \u5e94\u7528\u5c42\u52a0\u5bc6<\/h5>\n<p><span class=\"token comment\"># \u5e94\u7528\u5c42\u52a0\u5bc6\u793a\u4f8b(Python)<\/span><br \/>\n<span class=\"token comment\"># \u5728\u5199\u5165\u6570\u636e\u5377\u4e4b\u524d\u52a0\u5bc6\u6570\u636e<\/span><\/p>\n<p><span class=\"token keyword\">from<\/span> cryptography<span class=\"token punctuation\">.<\/span>fernet <span class=\"token keyword\">import<\/span> Fernet<br \/>\n<span class=\"token keyword\">import<\/span> os<\/p>\n<p><span class=\"token comment\"># \u751f\u6210\u6216\u52a0\u8f7d\u5bc6\u94a5<\/span><br \/>\nkey_file <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;\/app\/keys\/fernet.key&#039;<\/span><br \/>\n<span class=\"token keyword\">if<\/span> os<span class=\"token punctuation\">.<\/span>path<span class=\"token punctuation\">.<\/span>exists<span class=\"token punctuation\">(<\/span>key_file<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">with<\/span> <span class=\"token builtin\">open<\/span><span class=\"token punctuation\">(<\/span>key_file<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;rb&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> f<span class=\"token punctuation\">:<\/span><br \/>\n        key <span class=\"token operator\">&#061;<\/span> f<span class=\"token punctuation\">.<\/span>read<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">else<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    key <span class=\"token operator\">&#061;<\/span> Fernet<span class=\"token punctuation\">.<\/span>generate_key<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    os<span class=\"token punctuation\">.<\/span>makedirs<span class=\"token punctuation\">(<\/span>os<span class=\"token punctuation\">.<\/span>path<span class=\"token punctuation\">.<\/span>dirname<span class=\"token punctuation\">(<\/span>key_file<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> exist_ok<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">with<\/span> <span class=\"token builtin\">open<\/span><span class=\"token punctuation\">(<\/span>key_file<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;wb&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> f<span class=\"token punctuation\">:<\/span><br \/>\n        f<span class=\"token punctuation\">.<\/span>write<span class=\"token punctuation\">(<\/span>key<span class=\"token punctuation\">)<\/span><\/p>\n<p>cipher <span class=\"token operator\">&#061;<\/span> Fernet<span class=\"token punctuation\">(<\/span>key<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># \u52a0\u5bc6\u6570\u636e\u5e76\u5199\u5165\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">write_encrypted<\/span><span class=\"token punctuation\">(<\/span>filepath<span class=\"token punctuation\">,<\/span> data<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    encrypted_data <span class=\"token operator\">&#061;<\/span> cipher<span class=\"token punctuation\">.<\/span>encrypt<span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">.<\/span>encode<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">with<\/span> <span class=\"token builtin\">open<\/span><span class=\"token punctuation\">(<\/span>filepath<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;wb&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> f<span class=\"token punctuation\">:<\/span><br \/>\n        f<span class=\"token punctuation\">.<\/span>write<span class=\"token punctuation\">(<\/span>encrypted_data<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># \u8bfb\u53d6\u5e76\u89e3\u5bc6\u6570\u636e<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">read_encrypted<\/span><span class=\"token punctuation\">(<\/span>filepath<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">with<\/span> <span class=\"token builtin\">open<\/span><span class=\"token punctuation\">(<\/span>filepath<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;rb&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> f<span class=\"token punctuation\">:<\/span><br \/>\n        encrypted_data <span class=\"token operator\">&#061;<\/span> f<span class=\"token punctuation\">.<\/span>read<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> cipher<span class=\"token punctuation\">.<\/span>decrypt<span class=\"token punctuation\">(<\/span>encrypted_data<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>decode<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># \u4f7f\u7528\u793a\u4f8b<\/span><br \/>\nwrite_encrypted<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;\/app\/data\/secret.txt&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;\u8fd9\u662f\u673a\u5bc6\u4fe1\u606f&#039;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span>read_encrypted<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;\/app\/data\/secret.txt&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa: \u8fd9\u662f\u673a\u5bc6\u4fe1\u606f<\/span><\/p>\n<h4>9.2 \u6570\u636e\u5377\u8bbf\u95ee\u63a7\u5236<\/h4>\n<h5>9.2.1 \u6587\u4ef6\u7cfb\u7edf\u7ea7\u522b\u6743\u9650\u63a7\u5236<\/h5>\n<p><span class=\"token comment\"># 1. \u4f7f\u7528Linux\u7528\u6237\u548c\u7ec4\u63a7\u5236\u8bbf\u95ee<\/span><br \/>\n<span class=\"token comment\"># \u521b\u5efa\u4e13\u7528\u7684Docker\u6570\u636e\u7ec4<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">groupadd<\/span> docker-data<br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">usermod<\/span> <span class=\"token parameter variable\">-aG<\/span> docker-data <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">whoami<\/span><span class=\"token variable\">)<\/span><\/span><\/p>\n<p><span class=\"token comment\"># \u8bbe\u7f6e\u6570\u636e\u5377\u76ee\u5f55\u7684\u7ec4\u548c\u6743\u9650<\/span><br \/>\n<span class=\"token assign-left variable\">VOLUME_PATH<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> volume inspect my-volume <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{.Mountpoint}}&#039;<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">chgrp<\/span> <span class=\"token parameter variable\">-R<\/span> docker-data <span class=\"token variable\">$VOLUME_PATH<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">chmod<\/span> <span class=\"token parameter variable\">-R<\/span> <span class=\"token number\">770<\/span> <span class=\"token variable\">$VOLUME_PATH<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u4f7f\u7528ACL(\u8bbf\u95ee\u63a7\u5236\u5217\u8868)\u8fdb\u884c\u66f4\u7ec6\u7c92\u5ea6\u7684\u63a7\u5236<\/span><br \/>\n<span class=\"token function\">sudo<\/span> setfacl <span class=\"token parameter variable\">-R<\/span> <span class=\"token parameter variable\">-m<\/span> u:appuser:rwx <span class=\"token variable\">$VOLUME_PATH<\/span><br \/>\n<span class=\"token function\">sudo<\/span> setfacl <span class=\"token parameter variable\">-R<\/span> <span class=\"token parameter variable\">-m<\/span> u:readonlyuser:rx <span class=\"token variable\">$VOLUME_PATH<\/span><br \/>\n<span class=\"token function\">sudo<\/span> setfacl <span class=\"token parameter variable\">-R<\/span> <span class=\"token parameter variable\">-m<\/span> o::&#8212; <span class=\"token variable\">$VOLUME_PATH<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770bACL\u8bbe\u7f6e<\/span><br \/>\n<span class=\"token function\">sudo<\/span> getfacl <span class=\"token variable\">$VOLUME_PATH<\/span><\/p>\n<h5>9.2.2 \u5bb9\u5668\u7ea7\u522b\u6743\u9650\u63a7\u5236<\/h5>\n<p><span class=\"token comment\"># 1. \u4f7f\u7528&#8211;user\u53c2\u6570\u9650\u5236\u5bb9\u5668\u5185\u7528\u6237<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;user<\/span> <span class=\"token number\">1000<\/span>:1000 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> my-data:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-app:latest<\/p>\n<p><span class=\"token comment\"># 2. \u4f7f\u7528&#8211;read-only\u4f7f\u6574\u4e2a\u6839\u6587\u4ef6\u7cfb\u7edf\u53ea\u8bfb<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> secure-app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;read-only <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> my-data:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;tmpfs<\/span> \/tmp <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-app:latest<\/p>\n<p><span class=\"token comment\"># 3. \u4f7f\u7528&#8211;cap-drop\u79fb\u9664\u4e0d\u5fc5\u8981\u7684Linux capabilities<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> secure-app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;cap-drop ALL <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;cap-add CHOWN <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;cap-add SETGID <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;cap-add SETUID <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> my-data:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-app:latest<\/p>\n<p><span class=\"token comment\"># 4. \u4f7f\u7528&#8211;security-opt\u589e\u5f3a\u5b89\u5168\u6027<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> secure-app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;security-opt no-new-privileges <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;security-opt <span class=\"token assign-left variable\">label<\/span><span class=\"token operator\">&#061;<\/span>type:container_runtime_t <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> my-data:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-app:latest<\/p>\n<h5>9.2.3 \u6570\u636e\u5377\u9694\u79bb\u7b56\u7565<\/h5>\n<p><span class=\"token comment\"># docker-compose.yml &#8211; \u591a\u79df\u6237\u6570\u636e\u9694\u79bb<\/span><br \/>\n<span class=\"token key atrule\">version<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;3.8&#039;<\/span><\/p>\n<p><span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token comment\"># \u79df\u6237A\u7684\u670d\u52a1<\/span><br \/>\n  <span class=\"token key atrule\">tenant-a-app<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> my<span class=\"token punctuation\">&#8211;<\/span>app<span class=\"token punctuation\">:<\/span>latest<br \/>\n    <span class=\"token key atrule\">user<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;1001:1001&#034;<\/span><br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> tenant_a_data<span class=\"token punctuation\">:<\/span>\/data  <span class=\"token comment\"># \u79df\u6237A\u4e13\u7528\u6570\u636e\u5377<\/span><br \/>\n    <span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> tenant_a_network     <span class=\"token comment\"># \u79df\u6237A\u4e13\u7528\u7f51\u7edc<\/span><\/p>\n<p>  <span class=\"token comment\"># \u79df\u6237B\u7684\u670d\u52a1<\/span><br \/>\n  <span class=\"token key atrule\">tenant-b-app<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> my<span class=\"token punctuation\">&#8211;<\/span>app<span class=\"token punctuation\">:<\/span>latest<br \/>\n    <span class=\"token key atrule\">user<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;1002:1002&#034;<\/span><br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> tenant_b_data<span class=\"token punctuation\">:<\/span>\/data  <span class=\"token comment\"># \u79df\u6237B\u4e13\u7528\u6570\u636e\u5377<\/span><br \/>\n    <span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> tenant_b_network     <span class=\"token comment\"># \u79df\u6237B\u4e13\u7528\u7f51\u7edc<\/span><\/p>\n<p><span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">tenant_a_data<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> tenant_a_data<br \/>\n    <span class=\"token key atrule\">labels<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">tenant<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;A&#034;<\/span><br \/>\n      <span class=\"token key atrule\">security<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;isolated&#034;<\/span><br \/>\n  <span class=\"token key atrule\">tenant_b_data<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> tenant_b_data<br \/>\n    <span class=\"token key atrule\">labels<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">tenant<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;B&#034;<\/span><br \/>\n      <span class=\"token key atrule\">security<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;isolated&#034;<\/span><\/p>\n<p><span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">tenant_a_network<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">driver<\/span><span class=\"token punctuation\">:<\/span> bridge<br \/>\n  <span class=\"token key atrule\">tenant_b_network<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">driver<\/span><span class=\"token punctuation\">:<\/span> bridge<\/p>\n<h4>9.3 \u5907\u4efd\u7b56\u7565\u8bbe\u8ba1(\u5168\u91cf\/\u589e\u91cf\/\u5dee\u5f02\u5907\u4efd)<\/h4>\n<h5>9.3.1 \u5907\u4efd\u7c7b\u578b\u8be6\u89e3<\/h5>\n<table>\n<tr>\u5907\u4efd\u7c7b\u578b\u8bf4\u660e\u4f18\u70b9\u7f3a\u70b9\u9002\u7528\u573a\u666f<\/tr>\n<tbody>\n<tr>\n<td>\u5168\u91cf\u5907\u4efd<\/td>\n<td>\u5907\u4efd\u6240\u6709\u6570\u636e<\/td>\n<td>\u6062\u590d\u7b80\u5355,\u6570\u636e\u5b8c\u6574<\/td>\n<td>\u8017\u65f6\u957f,\u7a7a\u95f4\u5927<\/td>\n<td>\u5468\u671f\u6027\u57fa\u7840\u5907\u4efd<\/td>\n<\/tr>\n<tr>\n<td>\u589e\u91cf\u5907\u4efd<\/td>\n<td>\u53ea\u5907\u4efd\u81ea\u4e0a\u6b21\u5907\u4efd\u4ee5\u6765\u53d8\u5316\u7684\u6570\u636e<\/td>\n<td>\u901f\u5ea6\u5feb,\u7a7a\u95f4\u5c0f<\/td>\n<td>\u6062\u590d\u590d\u6742,\u4f9d\u8d56\u94fe\u957f<\/td>\n<td>\u9891\u7e41\u5907\u4efd<\/td>\n<\/tr>\n<tr>\n<td>\u5dee\u5f02\u5907\u4efd<\/td>\n<td>\u53ea\u5907\u4efd\u81ea\u4e0a\u6b21\u5168\u91cf\u5907\u4efd\u4ee5\u6765\u53d8\u5316\u7684\u6570\u636e<\/td>\n<td>\u6062\u590d\u8f83\u7b80\u5355<\/td>\n<td>\u7a7a\u95f4\u9010\u6e10\u589e\u5927<\/td>\n<td>\u4e2d\u7b49\u9891\u7387\u5907\u4efd<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5>9.3.2 \u5168\u91cf\u5907\u4efd\u5b9e\u73b0<\/h5>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># full-backup.sh &#8211; \u5168\u91cf\u5907\u4efd\u811a\u672c<\/span><\/p>\n<p><span class=\"token assign-left variable\">VOLUME_NAME<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\">$1<\/span><br \/>\n<span class=\"token assign-left variable\">BACKUP_DIR<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\/backup\/full\/<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%Y%m%d<span class=\"token variable\">)<\/span><\/span>&#034;<\/span><br \/>\n<span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Starting full backup of <span class=\"token variable\">$VOLUME_NAME<\/span>&#8230;&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u5168\u91cf\u5907\u4efd:\u6253\u5305\u6574\u4e2a\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$VOLUME_NAME<\/span>&#034;<\/span>:\/data:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span>:\/backup <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">tar<\/span> czf <span class=\"token string\">&#034;\/backup\/<span class=\"token variable\">${VOLUME_NAME}<\/span>-full-<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%H%M%S<span class=\"token variable\">)<\/span><\/span>.tar.gz&#034;<\/span> <span class=\"token parameter variable\">-C<\/span> \/data <span class=\"token builtin class-name\">.<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Full backup completed.&#034;<\/span><br \/>\n<span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-lh<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span>\/<\/p>\n<h5>9.3.3 \u589e\u91cf\u5907\u4efd\u5b9e\u73b0(\u4f7f\u7528rsync)<\/h5>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># incremental-backup.sh &#8211; \u589e\u91cf\u5907\u4efd\u811a\u672c(\u57fa\u4e8ersync)<\/span><\/p>\n<p><span class=\"token assign-left variable\">VOLUME_NAME<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\">$1<\/span><br \/>\n<span class=\"token assign-left variable\">BACKUP_BASE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\/backup\/incremental&#034;<\/span><br \/>\n<span class=\"token assign-left variable\">LATEST_LINK<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_BASE<\/span>\/latest&#034;<\/span><br \/>\n<span class=\"token assign-left variable\">CURRENT_BACKUP<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_BASE<\/span>\/<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%Y%m%d-%H%M%S<span class=\"token variable\">)<\/span><\/span>&#034;<\/span><\/p>\n<p><span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$CURRENT_BACKUP<\/span>&#034;<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Starting incremental backup of <span class=\"token variable\">$VOLUME_NAME<\/span>&#8230;&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u4f7f\u7528rsync\u7684&#8211;link-dest\u8fdb\u884c\u589e\u91cf\u5907\u4efd<\/span><br \/>\n<span class=\"token comment\"># \u539f\u7406:\u4e0e\u4e0a\u6b21\u5907\u4efd\u6bd4\u8f83,\u53ea\u4f20\u8f93\u53d8\u5316\u7684\u6587\u4ef6<\/span><br \/>\n<span class=\"token comment\"># \u672a\u53d8\u5316\u7684\u6587\u4ef6\u901a\u8fc7\u786c\u94fe\u63a5\u5f15\u7528,\u4e0d\u5360\u7528\u989d\u5916\u7a7a\u95f4<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$VOLUME_NAME<\/span>&#034;<\/span>:\/data:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_BASE<\/span>&#034;<\/span>:\/backup <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#034;<br \/>\n    apk add &#8211;no-cache rsync<br \/>\n    if [ -d \/backup\/latest ]; then<br \/>\n      rsync -a &#8211;delete &#8211;link-dest&#061;\/backup\/latest \/data\/ \/backup\/current\/<br \/>\n    else<br \/>\n      rsync -a \/data\/ \/backup\/current\/<br \/>\n    fi<br \/>\n  &#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u91cd\u547d\u540dcurrent\u4e3a\u5e26\u65f6\u95f4\u6233\u7684\u76ee\u5f55<\/span><br \/>\n<span class=\"token comment\"># (\u5728\u5b9e\u9645\u5b9e\u73b0\u4e2d\u9700\u8981\u66f4\u5b8c\u5584\u7684\u903b\u8f91)<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Incremental backup completed.&#034;<\/span><\/p>\n<h5>9.3.4 \u5dee\u5f02\u5907\u4efd\u5b9e\u73b0<\/h5>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># differential-backup.sh &#8211; \u5dee\u5f02\u5907\u4efd\u811a\u672c<\/span><\/p>\n<p><span class=\"token assign-left variable\">VOLUME_NAME<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\">$1<\/span><br \/>\n<span class=\"token assign-left variable\">BACKUP_BASE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\/backup\/differential&#034;<\/span><br \/>\n<span class=\"token assign-left variable\">LAST_FULL<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-d<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_BASE<\/span>&#034;<\/span>\/full-* <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null <span class=\"token operator\">|<\/span> <span class=\"token function\">sort<\/span> <span class=\"token operator\">|<\/span> <span class=\"token function\">tail<\/span> <span class=\"token parameter variable\">-1<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n<span class=\"token assign-left variable\">CURRENT_BACKUP<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_BASE<\/span>\/diff-<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%Y%m%d-%H%M%S<span class=\"token variable\">)<\/span><\/span>&#034;<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token parameter variable\">-z<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$LAST_FULL<\/span>&#034;<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Error: No full backup found. Please run full backup first.&#034;<\/span><br \/>\n    <span class=\"token builtin class-name\">exit<\/span> <span class=\"token number\">1<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$CURRENT_BACKUP<\/span>&#034;<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Starting differential backup of <span class=\"token variable\">$VOLUME_NAME<\/span>&#8230;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  Based on full backup: <span class=\"token variable\">$LAST_FULL<\/span>&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u5dee\u5f02\u5907\u4efd:\u4e0e\u6700\u8fd1\u7684\u5168\u91cf\u5907\u4efd\u6bd4\u8f83<\/span><br \/>\n<span class=\"token comment\"># \u4f7f\u7528find\u547d\u4ee4\u627e\u51fa\u53d8\u5316\u7684\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$VOLUME_NAME<\/span>&#034;<\/span>:\/data:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_BASE<\/span>&#034;<\/span>:\/backup <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#034;<br \/>\n    REFERENCE_DIR&#061;\/backup\/<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">basename<\/span> $LAST_FULL<span class=\"token variable\">)<\/span><\/span><br \/>\n    # \u627e\u51fa\u4e0e\u5168\u91cf\u5907\u4efd\u4e0d\u540c\u7684\u6587\u4ef6\u5e76\u6253\u5305<br \/>\n    cd \/data<br \/>\n    find . -type f -newer &#034;<\/span><span class=\"token variable\">$REFERENCE_DIR<\/span><span class=\"token string\">&#034; -print0 | \\\\<br \/>\n      tar &#8211;null -czf \/backup\/<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">basename<\/span> $CURRENT_BACKUP<span class=\"token variable\">)<\/span><\/span>.tar.gz -T &#8211;<br \/>\n  &#034;<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Differential backup completed.&#034;<\/span><\/p>\n<h5>9.3.5 \u7efc\u5408\u5907\u4efd\u7b56\u7565<\/h5>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># backup-strategy.sh &#8211; \u7efc\u5408\u5907\u4efd\u7b56\u7565<\/span><br \/>\n<span class=\"token comment\"># \u7b56\u7565:\u6bcf\u5468\u4e00\u6b21\u5168\u91cf\u5907\u4efd,\u6bcf\u5929\u4e00\u6b21\u589e\u91cf\u5907\u4efd<\/span><br \/>\n<span class=\"token comment\"># \u4fdd\u7559:4\u4e2a\u5168\u91cf\u5907\u4efd(4\u5468),28\u4e2a\u589e\u91cf\u5907\u4efd(28\u5929)<\/span><\/p>\n<p><span class=\"token assign-left variable\">VOLUME_NAME<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\">$1<\/span><br \/>\n<span class=\"token assign-left variable\">DAY_OF_WEEK<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%u<span class=\"token variable\">)<\/span><\/span>  <span class=\"token comment\"># 1&#061;Monday, 7&#061;Sunday<\/span><br \/>\n<span class=\"token assign-left variable\">BACKUP_DIR<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\/backup&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u5468\u65e5\u6267\u884c\u5168\u91cf\u5907\u4efd<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$DAY_OF_WEEK<\/span>&#034;<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;7&#034;<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Running weekly full backup&#8230;&#034;<\/span><br \/>\n    \/opt\/scripts\/full-backup.sh <span class=\"token string\">&#034;<span class=\"token variable\">$VOLUME_NAME<\/span>&#034;<\/span><\/p>\n<p>    <span class=\"token comment\"># \u6e05\u7406\u8d85\u8fc74\u5468\u7684\u5168\u91cf\u5907\u4efd<\/span><br \/>\n    <span class=\"token function\">find<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>\/full\/&#034;<\/span> <span class=\"token parameter variable\">-maxdepth<\/span> <span class=\"token number\">1<\/span> <span class=\"token parameter variable\">-type<\/span> d <span class=\"token parameter variable\">-mtime<\/span> &#043;28 <span class=\"token parameter variable\">-exec<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-rf<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span> <span class=\"token punctuation\">\\\\<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">else<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Running daily incremental backup&#8230;&#034;<\/span><br \/>\n    \/opt\/scripts\/incremental-backup.sh <span class=\"token string\">&#034;<span class=\"token variable\">$VOLUME_NAME<\/span>&#034;<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token comment\"># \u6e05\u7406\u8d85\u8fc728\u5929\u7684\u589e\u91cf\u5907\u4efd<\/span><br \/>\n<span class=\"token function\">find<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>\/incremental\/&#034;<\/span> <span class=\"token parameter variable\">-maxdepth<\/span> <span class=\"token number\">1<\/span> <span class=\"token parameter variable\">-type<\/span> d <span class=\"token parameter variable\">-mtime<\/span> &#043;28 <span class=\"token parameter variable\">-exec<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-rf<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span> <span class=\"token punctuation\">\\\\<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Backup strategy executed.&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u8bbe\u7f6ecrontab\u5b9a\u65f6\u6267\u884c<\/span><br \/>\n<span class=\"token comment\"># \u6bcf\u5929\u51cc\u66682\u70b9\u6267\u884c\u5907\u4efd<\/span><br \/>\n<span class=\"token comment\"># crontab -e<\/span><br \/>\n<span class=\"token comment\"># 0 2 * * * \/opt\/scripts\/backup-strategy.sh mysql_data &gt;&gt; \/var\/log\/backup.log 2&gt;&amp;1<\/span><\/p>\n<h4>9.4 \u4f7f\u7528\u5b9a\u65f6\u4efb\u52a1\u81ea\u52a8\u5907\u4efd<\/h4>\n<h5>9.4.1 \u5bbf\u4e3b\u673acrontab\u65b9\u6848<\/h5>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># \/opt\/scripts\/auto-backup-all.sh &#8211; \u81ea\u52a8\u5907\u4efd\u6240\u6709\u6570\u636e\u5377<\/span><\/p>\n<p><span class=\"token assign-left variable\">BACKUP_ROOT<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\/backup&#034;<\/span><br \/>\n<span class=\"token assign-left variable\">LOG_FILE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\/var\/log\/docker-backup.log&#034;<\/span><br \/>\n<span class=\"token assign-left variable\">TIMESTAMP<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%Y%m%d-%H%M%S<span class=\"token variable\">)<\/span><\/span><\/p>\n<p><span class=\"token function-name function\">log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> <span class=\"token string\">&#039;&#043;%Y-%m-%d %H:%M:%S&#039;<\/span><span class=\"token variable\">)<\/span><\/span>] <span class=\"token variable\">$1<\/span>&#034;<\/span> <span class=\"token operator\">&gt;&gt;<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$LOG_FILE<\/span>&#034;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>log <span class=\"token string\">&#034;&#061;&#061;&#061; Starting automatic backup &#061;&#061;&#061;&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u83b7\u53d6\u6240\u6709\u6807\u8bb0\u4e86backup&#061;yes\u7684\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token assign-left variable\">VOLUMES<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">&#8211;filter<\/span> <span class=\"token assign-left variable\">label<\/span><span class=\"token operator\">&#061;<\/span>backup<span class=\"token operator\">&#061;<\/span>yes <span class=\"token parameter variable\">-q<\/span><span class=\"token variable\">)<\/span><\/span><\/p>\n<p><span class=\"token keyword\">for<\/span> <span class=\"token for-or-select variable\">vol<\/span> <span class=\"token keyword\">in<\/span> <span class=\"token variable\">$VOLUMES<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">do<\/span><br \/>\n    log <span class=\"token string\">&#034;Backing up volume: <span class=\"token variable\">$vol<\/span>&#034;<\/span><\/p>\n<p>    <span class=\"token comment\"># \u83b7\u53d6\u4fdd\u7559\u5929\u6570<\/span><br \/>\n    <span class=\"token assign-left variable\">RETENTION<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> volume inspect <span class=\"token string\">&#034;<span class=\"token variable\">$vol<\/span>&#034;<\/span> <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{index .Labels &#034;retention&#034;}}&#039;<\/span> <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null<span class=\"token variable\">)<\/span><\/span><br \/>\n    <span class=\"token assign-left variable\">RETENTION<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\">${RETENTION<span class=\"token operator\">:-<\/span>7}<\/span><\/p>\n<p>    <span class=\"token assign-left variable\">BACKUP_DIR<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_ROOT<\/span>\/<span class=\"token variable\">$vol<\/span>\/<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%Y%m%d<span class=\"token variable\">)<\/span><\/span>&#034;<\/span><br \/>\n    <span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span><\/p>\n<p>    <span class=\"token comment\"># \u6267\u884c\u5907\u4efd<\/span><br \/>\n    <span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n        <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$vol<\/span>&#034;<\/span>:\/data:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n        <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span>:\/backup <span class=\"token punctuation\">\\\\<\/span><br \/>\n        alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n        <span class=\"token function\">tar<\/span> czf <span class=\"token string\">&#034;\/backup\/<span class=\"token variable\">${vol}<\/span>&#8211;<span class=\"token variable\">${TIMESTAMP}<\/span>.tar.gz&#034;<\/span> <span class=\"token parameter variable\">-C<\/span> \/data <span class=\"token builtin class-name\">.<\/span> <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;&gt;<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$LOG_FILE<\/span>&#034;<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token variable\">$?<\/span> <span class=\"token parameter variable\">-eq<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n        <span class=\"token assign-left variable\">SIZE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">du<\/span> <span class=\"token parameter variable\">-sh<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>&#034;<\/span> <span class=\"token operator\">|<\/span> <span class=\"token function\">cut<\/span> <span class=\"token parameter variable\">-f1<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n        log <span class=\"token string\">&#034;  Backup OK. Size: <span class=\"token variable\">$SIZE<\/span>&#034;<\/span><\/p>\n<p>        <span class=\"token comment\"># \u6e05\u7406\u8fc7\u671f\u5907\u4efd<\/span><br \/>\n        <span class=\"token function\">find<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_ROOT<\/span>\/<span class=\"token variable\">$vol<\/span>\/&#034;<\/span> <span class=\"token parameter variable\">-maxdepth<\/span> <span class=\"token number\">1<\/span> <span class=\"token parameter variable\">-type<\/span> d <span class=\"token parameter variable\">-mtime<\/span> &#043;<span class=\"token string\">&#034;<span class=\"token variable\">$RETENTION<\/span>&#034;<\/span> <span class=\"token parameter variable\">-exec<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-rf<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span> <span class=\"token punctuation\">\\\\<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        log <span class=\"token string\">&#034;  Cleaned backups older than <span class=\"token variable\">$RETENTION<\/span> days&#034;<\/span><br \/>\n    <span class=\"token keyword\">else<\/span><br \/>\n        log <span class=\"token string\">&#034;  Backup FAILED for <span class=\"token variable\">$vol<\/span>!&#034;<\/span><br \/>\n    <span class=\"token keyword\">fi<\/span><br \/>\n<span class=\"token keyword\">done<\/span><\/p>\n<p>log <span class=\"token string\">&#034;&#061;&#061;&#061; Automatic backup completed &#061;&#061;&#061;&#034;<\/span><\/p>\n<p><span class=\"token comment\"># crontab\u914d\u7f6e<\/span><br \/>\n<span class=\"token comment\"># \u7f16\u8f91crontab<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">crontab<\/span> <span class=\"token parameter variable\">-e<\/span><\/p>\n<p><span class=\"token comment\"># \u6dfb\u52a0\u4ee5\u4e0b\u5185\u5bb9:<\/span><br \/>\n<span class=\"token comment\"># \u6bcf\u5929\u51cc\u66682:00\u6267\u884c\u5907\u4efd<\/span><br \/>\n<span class=\"token number\">0<\/span> <span class=\"token number\">2<\/span> * * * \/opt\/scripts\/auto-backup-all.sh<\/p>\n<p><span class=\"token comment\"># \u6bcf\u5468\u65e5\u51cc\u66681:00\u6267\u884c\u5168\u91cf\u5907\u4efd<\/span><br \/>\n<span class=\"token number\">0<\/span> <span class=\"token number\">1<\/span> * * <span class=\"token number\">0<\/span> \/opt\/scripts\/full-backup-all.sh<\/p>\n<p><span class=\"token comment\"># \u6bcf\u5c0f\u65f6\u6267\u884c\u589e\u91cf\u5907\u4efd(\u4ec5\u7279\u5b9a\u6570\u636e\u5377)<\/span><br \/>\n<span class=\"token number\">0<\/span> * * * * \/opt\/scripts\/incremental-backup-all.sh<\/p>\n<h5>9.4.2 \u4f7f\u7528\u5907\u4efd\u5bb9\u5668\u65b9\u6848<\/h5>\n<p><span class=\"token comment\"># docker-compose.yml &#8211; \u5907\u4efd\u5bb9\u5668<\/span><br \/>\n<span class=\"token key atrule\">version<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;3.8&#039;<\/span><\/p>\n<p><span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">backup<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> alpine<span class=\"token punctuation\">:<\/span>latest<br \/>\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> docker<span class=\"token punctuation\">&#8211;<\/span>backup<br \/>\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">&#8211;<\/span>stopped<br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token comment\"># \u9700\u8981\u5907\u4efd\u7684\u6570\u636e\u5377(\u53ea\u8bfb)<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> mysql_data<span class=\"token punctuation\">:<\/span>\/data\/mysql<span class=\"token punctuation\">:<\/span>ro<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> postgres_data<span class=\"token punctuation\">:<\/span>\/data\/postgres<span class=\"token punctuation\">:<\/span>ro<br \/>\n      <span class=\"token comment\"># \u5907\u4efd\u5b58\u50a8\u76ee\u5f55<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> \/backup<span class=\"token punctuation\">:<\/span>\/backup<br \/>\n      <span class=\"token comment\"># \u5907\u4efd\u811a\u672c<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> .\/scripts\/auto<span class=\"token punctuation\">&#8211;<\/span>backup.sh<span class=\"token punctuation\">:<\/span>\/backup.sh<span class=\"token punctuation\">:<\/span>ro<br \/>\n      <span class=\"token comment\"># crontab\u914d\u7f6e<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> .\/scripts\/crontab<span class=\"token punctuation\">:<\/span>\/etc\/crontabs\/root<span class=\"token punctuation\">:<\/span>ro<br \/>\n    <span class=\"token key atrule\">environment<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">TZ<\/span><span class=\"token punctuation\">:<\/span> Asia\/Shanghai<br \/>\n    <span class=\"token key atrule\">entrypoint<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;\/bin\/sh&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-c&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token key atrule\">command<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;apk add &#8211;no-cache docker-cli &amp;&amp; crond -f -l 2&#034;<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p><span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">mysql_data<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">external<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span><br \/>\n  <span class=\"token key atrule\">postgres_data<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">external<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span><\/p>\n<p># scripts\/crontab &#8211; \u5907\u4efd\u5bb9\u5668\u7684crontab\u914d\u7f6e<br \/>\n# \u6bcf\u59292:00\u5907\u4efdMySQL<br \/>\n0 2 * * * \/backup.sh mysql \/data\/mysql \/backup\/mysql<\/p>\n<p># \u6bcf\u59292:30\u5907\u4efdPostgreSQL<br \/>\n30 2 * * * \/backup.sh postgres \/data\/postgres \/backup\/postgres<\/p>\n<p># \u6bcf\u5468\u65e51:00\u6e05\u7406\u65e7\u5907\u4efd<br \/>\n0 1 * * 0 find \/backup -maxdepth 2 -type d -mtime &#043;30 -exec rm -rf {} \\\\;<\/p>\n<h4>9.5 \u5907\u4efd\u9a8c\u8bc1\u4e0e\u6062\u590d\u6d4b\u8bd5<\/h4>\n<h5>9.5.1 \u5907\u4efd\u9a8c\u8bc1<\/h5>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># verify-backup.sh &#8211; \u9a8c\u8bc1\u5907\u4efd\u5b8c\u6574\u6027<\/span><\/p>\n<p><span class=\"token assign-left variable\">BACKUP_FILE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\">$1<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token parameter variable\">-z<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Usage: <span class=\"token variable\">$0<\/span> &lt;backup_file&gt;&#034;<\/span><br \/>\n    <span class=\"token builtin class-name\">exit<\/span> <span class=\"token number\">1<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Verifying backup: <span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 1. \u68c0\u67e5\u6587\u4ef6\u662f\u5426\u5b58\u5728<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token operator\">!<\/span> <span class=\"token parameter variable\">-f<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;ERROR: Backup file not found!&#034;<\/span><br \/>\n    <span class=\"token builtin class-name\">exit<\/span> <span class=\"token number\">1<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u68c0\u67e5\u6587\u4ef6\u5927\u5c0f<\/span><br \/>\n<span class=\"token assign-left variable\">SIZE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">stat<\/span> -c%s <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span> <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null <span class=\"token operator\">||<\/span> <span class=\"token function\">stat<\/span> -f%z <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$SIZE<\/span>&#034;<\/span> <span class=\"token parameter variable\">-lt<\/span> <span class=\"token number\">1024<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;WARNING: Backup file is suspiciously small (<span class=\"token variable\">$SIZE<\/span> bytes)&#034;<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token comment\"># 3. \u9a8c\u8bc1tar\u5305\u5b8c\u6574\u6027<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Checking tar integrity&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">tar<\/span> tzf <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span> <span class=\"token operator\">&gt;<\/span> \/dev\/null <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span><span class=\"token file-descriptor important\">&amp;1<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token variable\">$?<\/span> <span class=\"token parameter variable\">-ne<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;ERROR: Backup file is corrupted!&#034;<\/span><br \/>\n    <span class=\"token builtin class-name\">exit<\/span> <span class=\"token number\">1<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token comment\"># 4. \u5217\u51fa\u5907\u4efd\u5185\u5bb9\u7edf\u8ba1<\/span><br \/>\n<span class=\"token assign-left variable\">FILE_COUNT<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">tar<\/span> tzf <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span> <span class=\"token operator\">|<\/span> <span class=\"token function\">wc<\/span> <span class=\"token parameter variable\">-l<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  File count: <span class=\"token variable\">$FILE_COUNT<\/span>&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  File size: <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">du<\/span> <span class=\"token parameter variable\">-h<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span> <span class=\"token operator\">|<\/span> <span class=\"token function\">cut<\/span> <span class=\"token parameter variable\">-f1<\/span><span class=\"token variable\">)<\/span><\/span>&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 5. \u9a8c\u8bc1\u7279\u5b9a\u6587\u4ef6\u662f\u5426\u5b58\u5728<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Checking key files&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">tar<\/span> tzf <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span> <span class=\"token operator\">|<\/span> <span class=\"token function\">grep<\/span> <span class=\"token parameter variable\">-q<\/span> <span class=\"token string\">&#034;ibdata1&#034;<\/span> <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  MySQL data file: OK&#034;<\/span> <span class=\"token operator\">||<\/span> <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  MySQL data file: MISSING&#034;<\/span><br \/>\n<span class=\"token function\">tar<\/span> tzf <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span> <span class=\"token operator\">|<\/span> <span class=\"token function\">grep<\/span> <span class=\"token parameter variable\">-q<\/span> <span class=\"token string\">&#034;mysql&#034;<\/span> <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  MySQL directory: OK&#034;<\/span> <span class=\"token operator\">||<\/span> <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  MySQL directory: MISSING&#034;<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Verification completed.&#034;<\/span><\/p>\n<h5>9.5.2 \u81ea\u52a8\u5316\u6062\u590d\u6d4b\u8bd5<\/h5>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># restore-test.sh &#8211; \u81ea\u52a8\u5316\u6062\u590d\u6d4b\u8bd5<\/span><br \/>\n<span class=\"token comment\"># \u5728\u9694\u79bb\u73af\u5883\u4e2d\u6d4b\u8bd5\u5907\u4efd\u6062\u590d<\/span><\/p>\n<p><span class=\"token assign-left variable\">BACKUP_FILE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\">$1<\/span><br \/>\n<span class=\"token assign-left variable\">TEST_VOLUME<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;test-restore-<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%s<span class=\"token variable\">)<\/span><\/span>&#034;<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Starting restore test&#8230;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  Backup file: <span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  Test volume: <span class=\"token variable\">$TEST_VOLUME<\/span>&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 1. \u521b\u5efa\u6d4b\u8bd5\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token string\">&#034;<span class=\"token variable\">$TEST_VOLUME<\/span>&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u4ece\u5907\u4efd\u6062\u590d\u5230\u6d4b\u8bd5\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Restoring backup to test volume&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$TEST_VOLUME<\/span>&#034;<\/span>:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">dirname<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span><span class=\"token variable\">)<\/span><\/span>&#034;<\/span>:\/backup:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">tar<\/span> xzf <span class=\"token string\">&#034;\/backup\/<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">basename<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span><span class=\"token variable\">)<\/span><\/span>&#034;<\/span> <span class=\"token parameter variable\">-C<\/span> \/data<\/p>\n<p><span class=\"token comment\"># 3. \u9a8c\u8bc1\u6062\u590d\u7684\u6570\u636e<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Verifying restored data&#8230;&#034;<\/span><br \/>\n<span class=\"token assign-left variable\">FILE_COUNT<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$TEST_VOLUME<\/span>&#034;<\/span>:\/data alpine <span class=\"token function\">find<\/span> \/data <span class=\"token parameter variable\">-type<\/span> f <span class=\"token operator\">|<\/span> <span class=\"token function\">wc<\/span> <span class=\"token parameter variable\">-l<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  Restored file count: <span class=\"token variable\">$FILE_COUNT<\/span>&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 4. \u542f\u52a8\u6d4b\u8bd5\u5bb9\u5668\u9a8c\u8bc1\u6570\u636e<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Starting test container&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> restore-test <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$TEST_VOLUME<\/span>&#034;<\/span>:\/var\/lib\/mysql <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-e<\/span> <span class=\"token assign-left variable\">MYSQL_ROOT_PASSWORD<\/span><span class=\"token operator\">&#061;<\/span>testpass <span class=\"token punctuation\">\\\\<\/span><br \/>\n  mysql:8.0<\/p>\n<p><span class=\"token comment\"># \u7b49\u5f85MySQL\u542f\u52a8<\/span><br \/>\n<span class=\"token function\">sleep<\/span> <span class=\"token number\">30<\/span><\/p>\n<p><span class=\"token comment\"># 5. \u9a8c\u8bc1\u6570\u636e\u5e93\u53ef\u7528\u6027<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Testing database connectivity&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> restore-test mysql <span class=\"token parameter variable\">-uroot<\/span> <span class=\"token parameter variable\">-ptestpass<\/span> <span class=\"token parameter variable\">-e<\/span> <span class=\"token string\">&#034;SHOW DATABASES;&#034;<\/span> <span class=\"token operator\">&gt;<\/span> \/dev\/null <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span><span class=\"token file-descriptor important\">&amp;1<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token variable\">$?<\/span> <span class=\"token parameter variable\">-eq<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  Database is accessible!&#034;<\/span><br \/>\n    <span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> restore-test mysql <span class=\"token parameter variable\">-uroot<\/span> <span class=\"token parameter variable\">-ptestpass<\/span> <span class=\"token parameter variable\">-e<\/span> <span class=\"token string\">&#034;SHOW DATABASES;&#034;<\/span><br \/>\n<span class=\"token keyword\">else<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  ERROR: Database is not accessible!&#034;<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token comment\"># 6. \u6e05\u7406\u6d4b\u8bd5\u73af\u5883<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Cleaning up&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-f<\/span> restore-test<br \/>\n<span class=\"token function\">docker<\/span> volume <span class=\"token function\">rm<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$TEST_VOLUME<\/span>&#034;<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Restore test completed.&#034;<\/span><\/p>\n<h4>9.6 \u707e\u96be\u6062\u590d\u65b9\u6848<\/h4>\n<h5>9.6.1 \u707e\u96be\u6062\u590d\u8ba1\u5212<\/h5>\n<p>\u707e\u96be\u6062\u590d\u8ba1\u5212(DR Plan)<\/p>\n<p>1. \u707e\u96be\u573a\u666f<br \/>\n   &#8211; \u5bbf\u4e3b\u673a\u786c\u4ef6\u6545\u969c<br \/>\n   &#8211; \u78c1\u76d8\u635f\u574f<br \/>\n   &#8211; \u6570\u636e\u4e2d\u5fc3\u6545\u969c<br \/>\n   &#8211; \u8bef\u64cd\u4f5c\u5bfc\u81f4\u6570\u636e\u4e22\u5931<br \/>\n   &#8211; \u52d2\u7d22\u8f6f\u4ef6\u653b\u51fb<\/p>\n<p>2. \u6062\u590d\u76ee\u6807<br \/>\n   &#8211; RTO(\u6062\u590d\u65f6\u95f4\u76ee\u6807): &lt; 4\u5c0f\u65f6<br \/>\n   &#8211; RPO(\u6062\u590d\u70b9\u76ee\u6807): &lt; 24\u5c0f\u65f6<\/p>\n<p>3. \u6062\u590d\u6b65\u9aa4<br \/>\n   Step 1: \u8bc4\u4f30\u635f\u5931 (15\u5206\u949f)<br \/>\n   Step 2: \u51c6\u5907\u6062\u590d\u73af\u5883 (30\u5206\u949f)<br \/>\n   Step 3: \u6062\u590d\u6570\u636e\u5377 (1-2\u5c0f\u65f6)<br \/>\n   Step 4: \u542f\u52a8\u670d\u52a1 (30\u5206\u949f)<br \/>\n   Step 5: \u9a8c\u8bc1\u6570\u636e\u5b8c\u6574\u6027 (30\u5206\u949f)<br \/>\n   Step 6: \u5207\u6362\u6d41\u91cf (15\u5206\u949f)<\/p>\n<h5>9.6.2 \u5f02\u5730\u5907\u4efd\u65b9\u6848<\/h5>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># offsite-backup.sh &#8211; \u5f02\u5730\u5907\u4efd\u811a\u672c<\/span><\/p>\n<p><span class=\"token assign-left variable\">LOCAL_BACKUP_DIR<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\/backup&#034;<\/span><br \/>\n<span class=\"token assign-left variable\">REMOTE_HOST<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;backup-server.example.com&#034;<\/span><br \/>\n<span class=\"token assign-left variable\">REMOTE_DIR<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\/mnt\/backup\/docker&#034;<\/span><br \/>\n<span class=\"token assign-left variable\">REMOTE_USER<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;backup&#034;<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Starting offsite backup sync&#8230;&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u4f7f\u7528rsync\u540c\u6b65\u5907\u4efd\u5230\u8fdc\u7a0b\u670d\u52a1\u5668<\/span><br \/>\n<span class=\"token function\">rsync<\/span> <span class=\"token parameter variable\">-avz<\/span> <span class=\"token parameter variable\">&#8211;progress<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;delete<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;bwlimit<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token number\">10000<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-e<\/span> <span class=\"token string\">&#034;ssh -p 22 -i \/home\/backup\/.ssh\/id_rsa&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token string\">&#034;<span class=\"token variable\">$LOCAL_BACKUP_DIR<\/span>\/&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token string\">&#034;<span class=\"token variable\">$REMOTE_USER<\/span>&#064;<span class=\"token variable\">$REMOTE_HOST<\/span>:<span class=\"token variable\">$REMOTE_DIR<\/span>\/&#034;<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token variable\">$?<\/span> <span class=\"token parameter variable\">-eq<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Offsite backup completed successfully.&#034;<\/span><br \/>\n<span class=\"token keyword\">else<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Offsite backup FAILED!&#034;<\/span><br \/>\n    <span class=\"token comment\"># \u53d1\u9001\u544a\u8b66<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Docker backup offsite sync failed!&#034;<\/span> <span class=\"token operator\">|<\/span> mail <span class=\"token parameter variable\">-s<\/span> <span class=\"token string\">&#034;Backup Alert&#034;<\/span> admin&#064;example.com<br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token comment\"># \u9a8c\u8bc1\u8fdc\u7a0b\u5907\u4efd<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>] Verifying remote backup&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">ssh<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$REMOTE_USER<\/span>&#064;<span class=\"token variable\">$REMOTE_HOST<\/span>&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token string\">&#034;ls -lh <span class=\"token variable\">$REMOTE_DIR<\/span>\/<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%Y%m%d<span class=\"token variable\">)<\/span><\/span>\/&#034;<\/span><\/p>\n<h5>9.6.3 \u5b8c\u6574\u707e\u96be\u6062\u590d\u6d41\u7a0b<\/h5>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># disaster-recovery.sh &#8211; \u707e\u96be\u6062\u590d\u811a\u672c<\/span><\/p>\n<p><span class=\"token assign-left variable\">REMOTE_HOST<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;backup-server.example.com&#034;<\/span><br \/>\n<span class=\"token assign-left variable\">REMOTE_DIR<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\/mnt\/backup\/docker&#034;<\/span><br \/>\n<span class=\"token assign-left variable\">REMOTE_USER<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;backup&#034;<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  Docker Disaster Recovery Script&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  Started at: <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#034;<\/span><\/p>\n<p><span class=\"token comment\"># Step 1: \u8bc4\u4f30\u73af\u5883<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[Step 1] Checking environment&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> version <span class=\"token operator\">&gt;<\/span> \/dev\/null <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span><span class=\"token file-descriptor important\">&amp;1<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token variable\">$?<\/span> <span class=\"token parameter variable\">-ne<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;ERROR: Docker is not running!&#034;<\/span><br \/>\n    <span class=\"token builtin class-name\">exit<\/span> <span class=\"token number\">1<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token comment\"># Step 2: \u4ece\u8fdc\u7a0b\u4e0b\u8f7d\u6700\u65b0\u5907\u4efd<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[Step 2] Downloading latest backup&#8230;&#034;<\/span><br \/>\n<span class=\"token assign-left variable\">LATEST_BACKUP<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">ssh<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$REMOTE_USER<\/span>&#064;<span class=\"token variable\">$REMOTE_HOST<\/span>&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token string\">&#034;ls -d <span class=\"token variable\">$REMOTE_DIR<\/span>\/*\/ | sort | tail -1&#034;<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  Latest backup: <span class=\"token variable\">$LATEST_BACKUP<\/span>&#034;<\/span><\/p>\n<p><span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> \/tmp\/restore<br \/>\n<span class=\"token function\">scp<\/span> <span class=\"token parameter variable\">-r<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$REMOTE_USER<\/span>&#064;<span class=\"token variable\">$REMOTE_HOST<\/span>:<span class=\"token variable\">$LATEST_BACKUP<\/span>&#034;<\/span> \/tmp\/restore\/<\/p>\n<p><span class=\"token comment\"># Step 3: \u6062\u590d\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[Step 3] Restoring volumes&#8230;&#034;<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token for-or-select variable\">backup_file<\/span> <span class=\"token keyword\">in<\/span> \/tmp\/restore\/<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">basename<\/span> $LATEST_BACKUP<span class=\"token variable\">)<\/span><\/span>\/*.tar.gz<span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">do<\/span><br \/>\n    <span class=\"token assign-left variable\">vol_name<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">basename<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$backup_file<\/span>&#034;<\/span> .tar.gz<span class=\"token variable\">)<\/span><\/span><br \/>\n    <span class=\"token assign-left variable\">vol_name<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\">${vol_name<span class=\"token operator\">%%<\/span>-*}<\/span>  <span class=\"token comment\"># \u63d0\u53d6\u5377\u540d<\/span><\/p>\n<p>    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  Restoring volume: <span class=\"token variable\">$vol_name<\/span>&#034;<\/span><br \/>\n    <span class=\"token function\">docker<\/span> volume create <span class=\"token string\">&#034;<span class=\"token variable\">$vol_name<\/span>&#034;<\/span> <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null <span class=\"token operator\">||<\/span> <span class=\"token boolean\">true<\/span><\/p>\n<p>    <span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n      <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$vol_name<\/span>&#034;<\/span>:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n      <span class=\"token parameter variable\">-v<\/span> \/tmp\/restore:\/backup:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n      alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n      <span class=\"token function\">tar<\/span> xzf <span class=\"token string\">&#034;\/backup\/<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">basename<\/span> $LATEST_BACKUP<span class=\"token variable\">)<\/span><\/span>\/<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">basename<\/span> $backup_file<span class=\"token variable\">)<\/span><\/span>&#034;<\/span> <span class=\"token parameter variable\">-C<\/span> \/data<br \/>\n<span class=\"token keyword\">done<\/span><\/p>\n<p><span class=\"token comment\"># Step 4: \u542f\u52a8\u670d\u52a1<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[Step 4] Starting services&#8230;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">cd<\/span> \/opt\/docker-compose<br \/>\n<span class=\"token function\">docker-compose<\/span> up <span class=\"token parameter variable\">-d<\/span><\/p>\n<p><span class=\"token comment\"># Step 5: \u7b49\u5f85\u670d\u52a1\u5c31\u7eea<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[Step 5] Waiting for services&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">sleep<\/span> <span class=\"token number\">60<\/span><\/p>\n<p><span class=\"token comment\"># Step 6: \u9a8c\u8bc1<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[Step 6] Verifying services&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker-compose<\/span> <span class=\"token function\">ps<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> mysql-prod mysql <span class=\"token parameter variable\">-uroot<\/span> -p<span class=\"token string\">&#034;<span class=\"token variable\">$MYSQL_ROOT_PASSWORD<\/span>&#034;<\/span> <span class=\"token parameter variable\">-e<\/span> <span class=\"token string\">&#034;SHOW DATABASES;&#034;<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  Disaster recovery completed at: <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#034;<\/span><\/p>\n<h4>9.7 \u5b58\u50a8\u5b89\u5168\u5ba1\u8ba1<\/h4>\n<h5>9.7.1 \u5ba1\u8ba1\u811a\u672c<\/h5>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># storage-audit.sh &#8211; Docker\u5b58\u50a8\u5b89\u5168\u5ba1\u8ba1<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  Docker Storage Security Audit&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  Date: <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#034;<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061; 1. Docker Configuration &#061;&#061;&#061;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Storage Driver:&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> info <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null <span class=\"token operator\">|<\/span> <span class=\"token function\">grep<\/span> <span class=\"token string\">&#034;Storage Driver&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Data Root:&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> info <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null <span class=\"token operator\">|<\/span> <span class=\"token function\">grep<\/span> <span class=\"token string\">&#034;Docker Root Dir&#034;<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061; 2. Volume Security &#061;&#061;&#061;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Total volumes: <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-q<\/span> <span class=\"token operator\">|<\/span> <span class=\"token function\">wc<\/span> <span class=\"token parameter variable\">-l<\/span><span class=\"token variable\">)<\/span><\/span>&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Dangling volumes: <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-f<\/span> <span class=\"token assign-left variable\">dangling<\/span><span class=\"token operator\">&#061;<\/span>true <span class=\"token parameter variable\">-q<\/span> <span class=\"token operator\">|<\/span> <span class=\"token function\">wc<\/span> <span class=\"token parameter variable\">-l<\/span><span class=\"token variable\">)<\/span><\/span>&#034;<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Checking volume permissions&#8230;&#034;<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token for-or-select variable\">vol<\/span> <span class=\"token keyword\">in<\/span> <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-q<\/span><span class=\"token variable\">)<\/span><\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">do<\/span><br \/>\n    <span class=\"token assign-left variable\">MOUNTPOINT<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> volume inspect <span class=\"token string\">&#034;<span class=\"token variable\">$vol<\/span>&#034;<\/span> <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{.Mountpoint}}&#039;<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n    <span class=\"token assign-left variable\">PERMS<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">stat<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#034;%a %U:%G&#034;<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$MOUNTPOINT<\/span>&#034;<\/span> <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null<span class=\"token variable\">)<\/span><\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  <span class=\"token variable\">$vol<\/span>: <span class=\"token variable\">$PERMS<\/span>&#034;<\/span><br \/>\n<span class=\"token keyword\">done<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061; 3. Container Security &#061;&#061;&#061;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Running containers with root user:&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">ps<\/span> <span class=\"token parameter variable\">-q<\/span> <span class=\"token operator\">|<\/span> <span class=\"token keyword\">while<\/span> <span class=\"token builtin class-name\">read<\/span> cid<span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">do<\/span><br \/>\n    <span class=\"token assign-left variable\"><span class=\"token environment constant\">USER<\/span><\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> inspect <span class=\"token string\">&#034;<span class=\"token variable\">$cid<\/span>&#034;<\/span> <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{.Config.User}}&#039;<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n    <span class=\"token assign-left variable\">NAME<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> inspect <span class=\"token string\">&#034;<span class=\"token variable\">$cid<\/span>&#034;<\/span> <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{.Name}}&#039;<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token parameter variable\">-z<\/span> <span class=\"token string\">&#034;<span class=\"token environment constant\">$USER<\/span>&#034;<\/span> <span class=\"token punctuation\">]<\/span> <span class=\"token operator\">||<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token string\">&#034;<span class=\"token environment constant\">$USER<\/span>&#034;<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;root&#034;<\/span> <span class=\"token punctuation\">]<\/span> <span class=\"token operator\">||<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token string\">&#034;<span class=\"token environment constant\">$USER<\/span>&#034;<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;0:0&#034;<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n        <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  WARNING: <span class=\"token variable\">$NAME<\/span> is running as root&#034;<\/span><br \/>\n    <span class=\"token keyword\">fi<\/span><br \/>\n<span class=\"token keyword\">done<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061; 4. Bind Mount Security &#061;&#061;&#061;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Containers with bind mounts to sensitive paths:&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">ps<\/span> <span class=\"token parameter variable\">-q<\/span> <span class=\"token operator\">|<\/span> <span class=\"token keyword\">while<\/span> <span class=\"token builtin class-name\">read<\/span> cid<span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">do<\/span><br \/>\n    <span class=\"token assign-left variable\">NAME<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> inspect <span class=\"token string\">&#034;<span class=\"token variable\">$cid<\/span>&#034;<\/span> <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{.Name}}&#039;<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n    <span class=\"token assign-left variable\">MOUNTS<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> inspect <span class=\"token string\">&#034;<span class=\"token variable\">$cid<\/span>&#034;<\/span> <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{json .Mounts}}&#039;<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$MOUNTS<\/span>&#034;<\/span> <span class=\"token operator\">|<\/span> <span class=\"token function\">grep<\/span> <span class=\"token parameter variable\">-q<\/span> <span class=\"token string\">&#039;&#034;Type&#034;:&#034;bind&#034;&#039;<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n        <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  <span class=\"token variable\">$NAME<\/span> has bind mounts&#034;<\/span><br \/>\n        <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$MOUNTS<\/span>&#034;<\/span> <span class=\"token operator\">|<\/span> python3 <span class=\"token parameter variable\">-m<\/span> json.tool <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null <span class=\"token operator\">|<\/span> <span class=\"token function\">grep<\/span> <span class=\"token parameter variable\">-E<\/span> <span class=\"token string\">&#039;&#034;Source&#034;|&#034;Destination&#034;&#039;<\/span><br \/>\n    <span class=\"token keyword\">fi<\/span><br \/>\n<span class=\"token keyword\">done<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061; 5. Backup Status &#061;&#061;&#061;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Recent backups:&#034;<\/span><br \/>\n<span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-lt<\/span> \/backup\/*\/*.tar.gz <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null <span class=\"token operator\">|<\/span> <span class=\"token function\">head<\/span> <span class=\"token parameter variable\">-5<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061; 6. Disk Usage &#061;&#061;&#061;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> system <span class=\"token function\">df<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  Audit completed.&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#034;<\/span><\/p>\n<h4>9.8 \u5408\u89c4\u6027\u8981\u6c42\u4e0e\u6570\u636e\u4fdd\u7559\u7b56\u7565<\/h4>\n<h5>9.8.1 \u6570\u636e\u4fdd\u7559\u7b56\u7565<\/h5>\n<p><span class=\"token comment\"># \u6570\u636e\u4fdd\u7559\u7b56\u7565\u914d\u7f6e\u793a\u4f8b<\/span><\/p>\n<p><span class=\"token comment\"># \u6570\u636e\u4fdd\u7559\u7ea7\u522b<\/span><br \/>\n<span class=\"token key atrule\">retention_policy<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token comment\"># \u5173\u952e\u4e1a\u52a1\u6570\u636e &#8211; \u957f\u671f\u4fdd\u7559<\/span><br \/>\n  <span class=\"token key atrule\">critical<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">description<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u6838\u5fc3\u4e1a\u52a1\u6570\u636e(\u7528\u6237\u6570\u636e\u3001\u4ea4\u6613\u6570\u636e)&#034;<\/span><br \/>\n    <span class=\"token key atrule\">daily_backup<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span><br \/>\n    <span class=\"token key atrule\">weekly_full_backup<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span><br \/>\n    <span class=\"token key atrule\">retention_days<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">90<\/span>        <span class=\"token comment\"># \u6bcf\u65e5\u5907\u4efd\u4fdd\u755990\u5929<\/span><br \/>\n    <span class=\"token key atrule\">retention_months<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">12<\/span>      <span class=\"token comment\"># \u6bcf\u6708\u5907\u4efd\u4fdd\u755912\u4e2a\u6708<\/span><br \/>\n    <span class=\"token key atrule\">retention_years<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">7<\/span>        <span class=\"token comment\"># \u6bcf\u5e74\u5907\u4efd\u4fdd\u75597\u5e74<\/span><br \/>\n    <span class=\"token key atrule\">encryption<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span><br \/>\n    <span class=\"token key atrule\">offsite_backup<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span><\/p>\n<p>  <span class=\"token comment\"># \u91cd\u8981\u4e1a\u52a1\u6570\u636e &#8211; \u4e2d\u671f\u4fdd\u7559<\/span><br \/>\n  <span class=\"token key atrule\">important<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">description<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u91cd\u8981\u4e1a\u52a1\u6570\u636e(\u65e5\u5fd7\u3001\u914d\u7f6e)&#034;<\/span><br \/>\n    <span class=\"token key atrule\">daily_backup<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span><br \/>\n    <span class=\"token key atrule\">weekly_full_backup<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span><br \/>\n    <span class=\"token key atrule\">retention_days<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">30<\/span><br \/>\n    <span class=\"token key atrule\">retention_months<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">6<\/span><br \/>\n    <span class=\"token key atrule\">encryption<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span><br \/>\n    <span class=\"token key atrule\">offsite_backup<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span><\/p>\n<p>  <span class=\"token comment\"># \u4e00\u822c\u6570\u636e &#8211; \u77ed\u671f\u4fdd\u7559<\/span><br \/>\n  <span class=\"token key atrule\">normal<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">description<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u4e00\u822c\u6570\u636e(\u7f13\u5b58\u3001\u4e34\u65f6\u6570\u636e)&#034;<\/span><br \/>\n    <span class=\"token key atrule\">daily_backup<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">false<\/span><br \/>\n    <span class=\"token key atrule\">weekly_full_backup<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span><br \/>\n    <span class=\"token key atrule\">retention_days<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">14<\/span><br \/>\n    <span class=\"token key atrule\">encryption<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">false<\/span><br \/>\n    <span class=\"token key atrule\">offsite_backup<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">false<\/span><\/p>\n<p>  <span class=\"token comment\"># \u4e34\u65f6\u6570\u636e &#8211; \u4e0d\u4fdd\u7559<\/span><br \/>\n  <span class=\"token key atrule\">temporary<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">description<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u4e34\u65f6\u6570\u636e(\u4e34\u65f6\u6587\u4ef6\u3001\u5904\u7406\u4e2d\u95f4\u7ed3\u679c)&#034;<\/span><br \/>\n    <span class=\"token key atrule\">backup<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">false<\/span><br \/>\n    <span class=\"token key atrule\">use_tmpfs<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span><\/p>\n<h5>9.8.2 \u5408\u89c4\u6027\u68c0\u67e5\u811a\u672c<\/h5>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># compliance-check.sh &#8211; \u5408\u89c4\u6027\u68c0\u67e5\u811a\u672c<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061; Docker Storage Compliance Check &#061;&#061;&#061;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Date: <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 1. \u68c0\u67e5\u6570\u636e\u5377\u662f\u5426\u6709\u6807\u7b7e<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#8212; Volume Labels &#8212;&#034;<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token for-or-select variable\">vol<\/span> <span class=\"token keyword\">in<\/span> <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-q<\/span><span class=\"token variable\">)<\/span><\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">do<\/span><br \/>\n    <span class=\"token assign-left variable\">LABELS<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> volume inspect <span class=\"token string\">&#034;<span class=\"token variable\">$vol<\/span>&#034;<\/span> <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{json .Labels}}&#039;<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$LABELS<\/span>&#034;<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;null&#034;<\/span> <span class=\"token punctuation\">]<\/span> <span class=\"token operator\">||<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$LABELS<\/span>&#034;<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;{}&#034;<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n        <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;WARNING: Volume &#039;<span class=\"token variable\">$vol<\/span>&#039; has no labels&#034;<\/span><br \/>\n    <span class=\"token keyword\">fi<\/span><br \/>\n<span class=\"token keyword\">done<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u68c0\u67e5\u654f\u611f\u6570\u636e\u5377\u662f\u5426\u52a0\u5bc6<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#8212; Encryption Status &#8212;&#034;<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token for-or-select variable\">vol<\/span> <span class=\"token keyword\">in<\/span> <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">&#8211;filter<\/span> <span class=\"token assign-left variable\">label<\/span><span class=\"token operator\">&#061;<\/span>sensitive<span class=\"token operator\">&#061;<\/span>true <span class=\"token parameter variable\">-q<\/span><span class=\"token variable\">)<\/span><\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">do<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Checking encryption for sensitive volume: <span class=\"token variable\">$vol<\/span>&#034;<\/span><br \/>\n    <span class=\"token assign-left variable\">MOUNTPOINT<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> volume inspect <span class=\"token string\">&#034;<span class=\"token variable\">$vol<\/span>&#034;<\/span> <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{.Mountpoint}}&#039;<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n    <span class=\"token comment\"># \u68c0\u67e5\u662f\u5426\u5728\u52a0\u5bc6\u6587\u4ef6\u7cfb\u7edf\u4e0a<\/span><br \/>\n    <span class=\"token assign-left variable\">FS_TYPE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">df<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$MOUNTPOINT<\/span>&#034;<\/span> <span class=\"token parameter variable\">&#8211;output<\/span><span class=\"token operator\">&#061;<\/span>fstype <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null <span class=\"token operator\">|<\/span> <span class=\"token function\">tail<\/span> <span class=\"token parameter variable\">-1<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  Filesystem: <span class=\"token variable\">$FS_TYPE<\/span>&#034;<\/span><br \/>\n<span class=\"token keyword\">done<\/span><\/p>\n<p><span class=\"token comment\"># 3. \u68c0\u67e5\u5907\u4efd\u72b6\u6001<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#8212; Backup Compliance &#8212;&#034;<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token for-or-select variable\">vol<\/span> <span class=\"token keyword\">in<\/span> <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">&#8211;filter<\/span> <span class=\"token assign-left variable\">label<\/span><span class=\"token operator\">&#061;<\/span>backup<span class=\"token operator\">&#061;<\/span>daily <span class=\"token parameter variable\">-q<\/span><span class=\"token variable\">)<\/span><\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">do<\/span><br \/>\n    <span class=\"token assign-left variable\">LATEST_BACKUP<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">find<\/span> \/backup\/$vol\/ <span class=\"token parameter variable\">-name<\/span> <span class=\"token string\">&#034;*.tar.gz&#034;<\/span> <span class=\"token parameter variable\">-mtime<\/span> <span class=\"token parameter variable\">-1<\/span> <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null <span class=\"token operator\">|<\/span> <span class=\"token function\">head<\/span> <span class=\"token parameter variable\">-1<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token parameter variable\">-z<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$LATEST_BACKUP<\/span>&#034;<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n        <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;VIOLATION: Volume &#039;<span class=\"token variable\">$vol<\/span>&#039; has no backup in the last 24 hours!&#034;<\/span><br \/>\n    <span class=\"token keyword\">else<\/span><br \/>\n        <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;OK: Volume &#039;<span class=\"token variable\">$vol<\/span>&#039; has recent backup&#034;<\/span><br \/>\n    <span class=\"token keyword\">fi<\/span><br \/>\n<span class=\"token keyword\">done<\/span><\/p>\n<p><span class=\"token comment\"># 4. \u68c0\u67e5\u6570\u636e\u4fdd\u7559\u5408\u89c4\u6027<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#8212; Retention Compliance &#8212;&#034;<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token for-or-select variable\">vol<\/span> <span class=\"token keyword\">in<\/span> <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-q<\/span><span class=\"token variable\">)<\/span><\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">do<\/span><br \/>\n    <span class=\"token assign-left variable\">RETENTION<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> volume inspect <span class=\"token string\">&#034;<span class=\"token variable\">$vol<\/span>&#034;<\/span> <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{index .Labels &#034;retention&#034;}}&#039;<\/span> <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null<span class=\"token variable\">)<\/span><\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token parameter variable\">-n<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$RETENTION<\/span>&#034;<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n        <span class=\"token assign-left variable\">OLD_BACKUPS<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">find<\/span> \/backup\/$vol\/ <span class=\"token parameter variable\">-maxdepth<\/span> <span class=\"token number\">1<\/span> <span class=\"token parameter variable\">-type<\/span> d <span class=\"token parameter variable\">-mtime<\/span> &#043;<span class=\"token string\">&#034;<span class=\"token variable\">${RETENTION<span class=\"token operator\">%<\/span>d}<\/span>&#034;<\/span> <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null <span class=\"token operator\">|<\/span> <span class=\"token function\">wc<\/span> <span class=\"token parameter variable\">-l<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$OLD_BACKUPS<\/span>&#034;<\/span> <span class=\"token parameter variable\">-gt<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n            <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;WARNING: Volume &#039;<span class=\"token variable\">$vol<\/span>&#039; has <span class=\"token variable\">$OLD_BACKUPS<\/span> backups exceeding retention policy (<span class=\"token variable\">$RETENTION<\/span>)&#034;<\/span><br \/>\n        <span class=\"token keyword\">fi<\/span><br \/>\n    <span class=\"token keyword\">fi<\/span><br \/>\n<span class=\"token keyword\">done<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061; Compliance check completed &#061;&#061;&#061;&#034;<\/span><\/p>\n<hr \/>\n<h3>\u7b2c\u5341\u7ae0 \u5b58\u50a8\u7ba1\u7406\u4e0e\u6545\u969c\u6392\u67e5<\/h3>\n<h4>10.1 docker system df\u67e5\u770b\u5b58\u50a8\u4f7f\u7528\u60c5\u51b5<\/h4>\n<h5>10.1.1 \u57fa\u672c\u7528\u6cd5<\/h5>\n<p><span class=\"token comment\"># \u67e5\u770bDocker\u6574\u4f53\u78c1\u76d8\u4f7f\u7528\u60c5\u51b5<\/span><br \/>\n<span class=\"token function\">docker<\/span> system <span class=\"token function\">df<\/span><\/p>\n<p><span class=\"token comment\"># \u8f93\u51fa\u793a\u4f8b:<\/span><br \/>\n<span class=\"token comment\"># TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE<\/span><br \/>\n<span class=\"token comment\"># Images          15        5         5.2GB     2.1GB (40%)<\/span><br \/>\n<span class=\"token comment\"># Containers      8         3         120MB     80MB (66%)<\/span><br \/>\n<span class=\"token comment\"># Local Volumes   12        6         8.5GB     3.2GB (37%)<\/span><br \/>\n<span class=\"token comment\"># Build Cache     0         0         0B        0B<\/span><\/p>\n<p><span class=\"token comment\"># \u5217\u8bf4\u660e:<\/span><br \/>\n<span class=\"token comment\"># TYPE: \u8d44\u6e90\u7c7b\u578b(\u955c\u50cf\/\u5bb9\u5668\/\u6570\u636e\u5377\/\u6784\u5efa\u7f13\u5b58)<\/span><br \/>\n<span class=\"token comment\"># TOTAL: \u603b\u6570\u91cf<\/span><br \/>\n<span class=\"token comment\"># ACTIVE: \u6b63\u5728\u4f7f\u7528\u7684\u6570\u91cf<\/span><br \/>\n<span class=\"token comment\"># SIZE: \u603b\u5927\u5c0f<\/span><br \/>\n<span class=\"token comment\"># RECLAIMABLE: \u53ef\u56de\u6536\u7684\u5927\u5c0f(\u672a\u4f7f\u7528\u7684\u8d44\u6e90)<\/span><\/p>\n<h5>10.1.2 \u8be6\u7ec6\u89c6\u56fe<\/h5>\n<p><span class=\"token comment\"># \u67e5\u770b\u8be6\u7ec6\u7684\u4f7f\u7528\u60c5\u51b5(-v\u53c2\u6570)<\/span><br \/>\n<span class=\"token function\">docker<\/span> system <span class=\"token function\">df<\/span> <span class=\"token parameter variable\">-v<\/span><\/p>\n<p><span class=\"token comment\"># \u8f93\u51fa\u793a\u4f8b(\u955c\u50cf\u90e8\u5206):<\/span><br \/>\n<span class=\"token comment\"># Images space usage:<\/span><br \/>\n<span class=\"token comment\"># REPOSITORY    TAG       IMAGE ID       CREATED      SIZE      SHARED SIZE   UNIQUE SIZE   CONTAINERS<\/span><br \/>\n<span class=\"token comment\"># nginx         latest    605c77e624dd   2 weeks ago  141MB     80MB          61MB          2<\/span><br \/>\n<span class=\"token comment\"># mysql         8.0       3f01e6e1e1e1   3 weeks ago  521MB     80MB          441MB         1<\/span><br \/>\n<span class=\"token comment\"># &#8230;<\/span><\/p>\n<p><span class=\"token comment\"># \u8f93\u51fa\u793a\u4f8b(\u6570\u636e\u5377\u90e8\u5206):<\/span><br \/>\n<span class=\"token comment\"># VOLUME NAME              LINKS     SIZE<\/span><br \/>\n<span class=\"token comment\"># mysql_data               1         2.3GB<\/span><br \/>\n<span class=\"token comment\"># postgres_data            1         1.5GB<\/span><br \/>\n<span class=\"token comment\"># redis_data               1         120MB<\/span><br \/>\n<span class=\"token comment\"># unused_volume_1          0         500MB    \u2190 \u672a\u4f7f\u7528\u7684(\u53ef\u6e05\u7406)<\/span><br \/>\n<span class=\"token comment\"># unused_volume_2          0         300MB    \u2190 \u672a\u4f7f\u7528\u7684(\u53ef\u6e05\u7406)<\/span><\/p>\n<h5>10.1.3 \u76d1\u63a7\u811a\u672c<\/h5>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># monitor-docker-storage.sh &#8211; Docker\u5b58\u50a8\u76d1\u63a7\u811a\u672c<\/span><\/p>\n<p><span class=\"token assign-left variable\">THRESHOLD<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token number\">80<\/span>  <span class=\"token comment\"># \u78c1\u76d8\u4f7f\u7528\u7387\u9608\u503c(%)<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061; Docker Storage Monitor &#061;&#061;&#061;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Time: <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 1. \u6574\u4f53\u78c1\u76d8\u4f7f\u7528<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#8212; Disk Usage &#8212;&#034;<\/span><br \/>\n<span class=\"token function\">df<\/span> <span class=\"token parameter variable\">-h<\/span> \/var\/lib\/docker<br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 2. Docker\u8d44\u6e90\u4f7f\u7528<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#8212; Docker Resources &#8212;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> system <span class=\"token function\">df<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 3. \u78c1\u76d8\u4f7f\u7528\u7387\u544a\u8b66<\/span><br \/>\n<span class=\"token assign-left variable\">USAGE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">df<\/span> \/var\/lib\/docker <span class=\"token parameter variable\">&#8211;output<\/span><span class=\"token operator\">&#061;<\/span>pcent <span class=\"token operator\">|<\/span> <span class=\"token function\">tail<\/span> <span class=\"token parameter variable\">-1<\/span> <span class=\"token operator\">|<\/span> <span class=\"token function\">tr<\/span> <span class=\"token parameter variable\">-d<\/span> <span class=\"token string\">&#039; %&#039;<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$USAGE<\/span>&#034;<\/span> <span class=\"token parameter variable\">-gt<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$THRESHOLD<\/span>&#034;<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;WARNING: Disk usage is <span class=\"token variable\">${USAGE}<\/span>% (threshold: <span class=\"token variable\">${THRESHOLD}<\/span>%)&#034;<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Consider cleaning up unused resources:&#034;<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  docker system prune&#034;<\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  docker volume prune&#034;<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 4. \u6570\u636e\u5377\u4f7f\u7528\u8be6\u60c5<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#8212; Volume Details &#8212;&#034;<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token for-or-select variable\">vol<\/span> <span class=\"token keyword\">in<\/span> <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-q<\/span><span class=\"token variable\">)<\/span><\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">do<\/span><br \/>\n    <span class=\"token assign-left variable\">SIZE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token parameter variable\">-v<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$vol<\/span>&#034;<\/span>:\/data alpine <span class=\"token function\">du<\/span> <span class=\"token parameter variable\">-sh<\/span> \/data <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null <span class=\"token operator\">|<\/span> <span class=\"token function\">cut<\/span> <span class=\"token parameter variable\">-f1<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n    <span class=\"token assign-left variable\">CONTAINERS<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> <span class=\"token function\">ps<\/span> <span class=\"token parameter variable\">-a<\/span> <span class=\"token parameter variable\">&#8211;filter<\/span> <span class=\"token assign-left variable\">volume<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;<span class=\"token variable\">$vol<\/span>&#034;<\/span> <span class=\"token parameter variable\">-q<\/span> <span class=\"token operator\">|<\/span> <span class=\"token function\">wc<\/span> <span class=\"token parameter variable\">-l<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n    <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;  <span class=\"token variable\">$vol<\/span>: Size&#061;<span class=\"token variable\">$SIZE<\/span>, Containers&#061;<span class=\"token variable\">$CONTAINERS<\/span>&#034;<\/span><br \/>\n<span class=\"token keyword\">done<\/span><\/p>\n<h4>10.2 \u6e05\u7406\u65e0\u7528\u6570\u636e(docker system prune, volume prune)<\/h4>\n<h5>10.2.1 docker system prune<\/h5>\n<p><span class=\"token comment\"># \u6e05\u7406\u6240\u6709\u672a\u4f7f\u7528\u7684\u8d44\u6e90(\u505c\u6b62\u7684\u5bb9\u5668\u3001\u672a\u4f7f\u7528\u7684\u7f51\u7edc\u3001\u60ac\u7a7a\u955c\u50cf\u3001\u6784\u5efa\u7f13\u5b58)<\/span><br \/>\n<span class=\"token function\">docker<\/span> system prune<\/p>\n<p><span class=\"token comment\"># \u8f93\u51fa:<\/span><br \/>\n<span class=\"token comment\"># WARNING! This will remove:<\/span><br \/>\n<span class=\"token comment\">#   &#8211; all stopped containers<\/span><br \/>\n<span class=\"token comment\">#   &#8211; all networks not used by at least one container<\/span><br \/>\n<span class=\"token comment\">#   &#8211; all dangling images<\/span><br \/>\n<span class=\"token comment\">#   &#8211; all dangling build cache<\/span><br \/>\n<span class=\"token comment\"># Are you sure you want to continue? [y\/N] y<\/span><\/p>\n<p><span class=\"token comment\"># \u6e05\u7406\u6240\u6709\u672a\u4f7f\u7528\u7684\u8d44\u6e90(\u5305\u62ec\u672a\u88ab\u5bb9\u5668\u5f15\u7528\u7684\u955c\u50cf)<\/span><br \/>\n<span class=\"token function\">docker<\/span> system prune <span class=\"token parameter variable\">-a<\/span><\/p>\n<p><span class=\"token comment\"># \u540c\u65f6\u6e05\u7406\u672a\u88ab\u4f7f\u7528\u7684\u6570\u636e\u5377(\u5371\u9669!\u8c28\u614e\u4f7f\u7528!)<\/span><br \/>\n<span class=\"token function\">docker<\/span> system prune <span class=\"token parameter variable\">-a<\/span> <span class=\"token parameter variable\">&#8211;volumes<\/span><\/p>\n<p><span class=\"token comment\"># \u8df3\u8fc7\u786e\u8ba4<\/span><br \/>\n<span class=\"token function\">docker<\/span> system prune <span class=\"token parameter variable\">-f<\/span><\/p>\n<p><span class=\"token comment\"># \u5e26\u8fc7\u6ee4\u6761\u4ef6\u7684\u6e05\u7406(\u6e05\u740624\u5c0f\u65f6\u524d\u521b\u5efa\u7684)<\/span><br \/>\n<span class=\"token function\">docker<\/span> system prune <span class=\"token parameter variable\">&#8211;filter<\/span> <span class=\"token string\">&#034;until&#061;24h&#034;<\/span><\/p>\n<h5>10.2.2 \u5206\u522b\u6e05\u7406\u5404\u7c7b\u8d44\u6e90<\/h5>\n<p><span class=\"token comment\"># 1. \u6e05\u7406\u505c\u6b62\u7684\u5bb9\u5668<\/span><br \/>\n<span class=\"token function\">docker<\/span> container prune<br \/>\n<span class=\"token comment\"># \u6216<\/span><br \/>\n<span class=\"token function\">docker<\/span> container prune <span class=\"token parameter variable\">-f<\/span>  <span class=\"token comment\"># \u8df3\u8fc7\u786e\u8ba4<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u6e05\u7406\u60ac\u7a7a\u955c\u50cf(\u6ca1\u6709\u6807\u7b7e\u7684\u955c\u50cf)<\/span><br \/>\n<span class=\"token function\">docker<\/span> image prune<br \/>\n<span class=\"token comment\"># \u6e05\u7406\u6240\u6709\u672a\u4f7f\u7528\u7684\u955c\u50cf(\u4e0d\u53ea\u662f\u60ac\u7a7a\u955c\u50cf)<\/span><br \/>\n<span class=\"token function\">docker<\/span> image prune <span class=\"token parameter variable\">-a<\/span><\/p>\n<p><span class=\"token comment\"># 3. \u6e05\u7406\u672a\u4f7f\u7528\u7684\u7f51\u7edc<\/span><br \/>\n<span class=\"token function\">docker<\/span> network prune<\/p>\n<p><span class=\"token comment\"># 4. \u6e05\u7406\u672a\u4f7f\u7528\u7684\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume prune<br \/>\n<span class=\"token comment\"># \u5e26\u8fc7\u6ee4\u6761\u4ef6<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume prune <span class=\"token parameter variable\">&#8211;filter<\/span> <span class=\"token string\">&#034;until&#061;24h&#034;<\/span><br \/>\n<span class=\"token comment\"># \u6309\u6807\u7b7e\u8fc7\u6ee4<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume prune <span class=\"token parameter variable\">&#8211;filter<\/span> <span class=\"token string\">&#034;label!&#061;keep&#061;true&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 5. \u6e05\u7406\u6784\u5efa\u7f13\u5b58<\/span><br \/>\n<span class=\"token function\">docker<\/span> builder prune<br \/>\n<span class=\"token function\">docker<\/span> builder prune <span class=\"token parameter variable\">-a<\/span>  <span class=\"token comment\"># \u6e05\u7406\u6240\u6709\u6784\u5efa\u7f13\u5b58<\/span><\/p>\n<h5>10.2.3 \u5b89\u5168\u6e05\u7406\u811a\u672c<\/h5>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># safe-cleanup.sh &#8211; \u5b89\u5168\u6e05\u7406\u811a\u672c<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061; Docker Safe Cleanup &#061;&#061;&#061;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Time: <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span><span class=\"token variable\">)<\/span><\/span>&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 1. \u663e\u793a\u5f53\u524d\u4f7f\u7528\u60c5\u51b5<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#8212; Before cleanup &#8212;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> system <span class=\"token function\">df<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u6e05\u7406\u505c\u6b62\u7684\u5bb9\u5668(\u5b89\u5168)<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Cleaning stopped containers&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> container prune <span class=\"token parameter variable\">-f<\/span><\/p>\n<p><span class=\"token comment\"># 3. \u6e05\u7406\u60ac\u7a7a\u955c\u50cf(\u5b89\u5168)<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Cleaning dangling images&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> image prune <span class=\"token parameter variable\">-f<\/span><\/p>\n<p><span class=\"token comment\"># 4. \u6e05\u7406\u672a\u4f7f\u7528\u7684\u7f51\u7edc(\u5b89\u5168)<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Cleaning unused networks&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> network prune <span class=\"token parameter variable\">-f<\/span><\/p>\n<p><span class=\"token comment\"># 5. \u6e05\u7406\u6784\u5efa\u7f13\u5b58(\u5b89\u5168)<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Cleaning build cache&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> builder prune <span class=\"token parameter variable\">-f<\/span><\/p>\n<p><span class=\"token comment\"># 6. \u663e\u793a\u6e05\u7406\u540e\u7684\u4f7f\u7528\u60c5\u51b5<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#8212; After cleanup &#8212;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> system <span class=\"token function\">df<\/span><\/p>\n<p><span class=\"token comment\"># 7. \u663e\u793a\u53ef\u8fdb\u4e00\u6b65\u6e05\u7406\u7684\u8d44\u6e90<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#8212; Further cleanup options &#8212;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Unused images (not used by any container):&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> images <span class=\"token parameter variable\">-f<\/span> <span class=\"token string\">&#034;dangling&#061;false&#034;<\/span> <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#034;{{.Repository}}:{{.Tag}} {{.Size}}&#034;<\/span> <span class=\"token operator\">|<\/span> <span class=\"token function\">head<\/span> <span class=\"token parameter variable\">-10<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Unused volumes (not used by any container):&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-f<\/span> <span class=\"token assign-left variable\">dangling<\/span><span class=\"token operator\">&#061;<\/span>true<\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061; Cleanup completed &#061;&#061;&#061;&#034;<\/span><\/p>\n<h4>10.3 \u78c1\u76d8\u7a7a\u95f4\u4e0d\u8db3\u7684\u5904\u7406<\/h4>\n<h5>10.3.1 \u8bca\u65ad\u78c1\u76d8\u7a7a\u95f4<\/h5>\n<p><span class=\"token comment\"># 1. \u67e5\u770b\u78c1\u76d8\u6574\u4f53\u4f7f\u7528\u60c5\u51b5<\/span><br \/>\n<span class=\"token function\">df<\/span> <span class=\"token parameter variable\">-h<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u67e5\u770bDocker\u76ee\u5f55\u4f7f\u7528\u60c5\u51b5<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">du<\/span> <span class=\"token parameter variable\">-sh<\/span> \/var\/lib\/docker\/<br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">du<\/span> <span class=\"token parameter variable\">-sh<\/span> \/var\/lib\/docker\/*\/<\/p>\n<p><span class=\"token comment\"># 3. \u67e5\u627e\u6700\u5927\u7684\u6587\u4ef6\u548c\u76ee\u5f55<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">du<\/span> <span class=\"token parameter variable\">-ah<\/span> \/var\/lib\/docker\/ <span class=\"token operator\">|<\/span> <span class=\"token function\">sort<\/span> <span class=\"token parameter variable\">-rh<\/span> <span class=\"token operator\">|<\/span> <span class=\"token function\">head<\/span> <span class=\"token parameter variable\">-20<\/span><\/p>\n<p><span class=\"token comment\"># 4. \u67e5\u770b\u5bb9\u5668\u65e5\u5fd7\u5927\u5c0f<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">du<\/span> <span class=\"token parameter variable\">-sh<\/span> \/var\/lib\/docker\/containers\/*\/<\/p>\n<p><span class=\"token comment\"># 5. \u67e5\u770b\u6570\u636e\u5377\u5927\u5c0f<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">du<\/span> <span class=\"token parameter variable\">-sh<\/span> \/var\/lib\/docker\/volumes\/*\/<\/p>\n<p><span class=\"token comment\"># 6. \u67e5\u770b\u955c\u50cf\u5c42\u5927\u5c0f<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">du<\/span> <span class=\"token parameter variable\">-sh<\/span> \/var\/lib\/docker\/overlay2\/*\/<\/p>\n<h5>10.3.2 \u6e05\u7406\u5bb9\u5668\u65e5\u5fd7<\/h5>\n<p><span class=\"token comment\"># \u5bb9\u5668\u65e5\u5fd7\u53ef\u80fd\u5360\u7528\u5927\u91cf\u7a7a\u95f4<\/span><br \/>\n<span class=\"token comment\"># \u67e5\u770b\u5bb9\u5668\u65e5\u5fd7\u5927\u5c0f<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;du -sh \/var\/lib\/docker\/containers\/*\/*-json.log&#039;<\/span><\/p>\n<p><span class=\"token comment\"># \u6e05\u7406\u5355\u4e2a\u5bb9\u5668\u7684\u65e5\u5fd7<\/span><br \/>\n<span class=\"token function\">sudo<\/span> truncate <span class=\"token parameter variable\">-s<\/span> <span class=\"token number\">0<\/span> \/var\/lib\/docker\/containers\/<span class=\"token operator\">&lt;<\/span>container_id<span class=\"token operator\">&gt;<\/span>\/<span class=\"token operator\">&lt;<\/span>container_id<span class=\"token operator\">&gt;<\/span>-json.log<\/p>\n<p><span class=\"token comment\"># \u6e05\u7406\u6240\u6709\u5bb9\u5668\u65e5\u5fd7<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;truncate -s 0 \/var\/lib\/docker\/containers\/*\/*-json.log&#039;<\/span><\/p>\n<p><span class=\"token comment\"># \u914d\u7f6e\u65e5\u5fd7\u8f6e\u8f6c(\u9632\u6b62\u65e5\u5fd7\u8fc7\u5927)<\/span><br \/>\n<span class=\"token comment\"># \/etc\/docker\/daemon.json<\/span><br \/>\n<span class=\"token comment\"># {<\/span><br \/>\n<span class=\"token comment\">#   &#034;log-driver&#034;: &#034;json-file&#034;,<\/span><br \/>\n<span class=\"token comment\">#   &#034;log-opts&#034;: {<\/span><br \/>\n<span class=\"token comment\">#     &#034;max-size&#034;: &#034;10m&#034;,<\/span><br \/>\n<span class=\"token comment\">#     &#034;max-file&#034;: &#034;3&#034;<\/span><br \/>\n<span class=\"token comment\">#   }<\/span><br \/>\n<span class=\"token comment\"># }<\/span><\/p>\n<h5>10.3.3 \u8fc1\u79fbDocker\u6570\u636e\u76ee\u5f55<\/h5>\n<p><span class=\"token comment\"># \u5f53\u7cfb\u7edf\u76d8\u7a7a\u95f4\u4e0d\u8db3\u65f6,\u5c06Docker\u6570\u636e\u8fc1\u79fb\u5230\u66f4\u5927\u7684\u78c1\u76d8<\/span><\/p>\n<p><span class=\"token comment\"># 1. \u505c\u6b62Docker<\/span><br \/>\n<span class=\"token function\">sudo<\/span> systemctl stop <span class=\"token function\">docker<\/span><br \/>\n<span class=\"token function\">sudo<\/span> systemctl stop docker.socket<\/p>\n<p><span class=\"token comment\"># 2. \u521b\u5efa\u65b0\u76ee\u5f55<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> \/data\/docker<\/p>\n<p><span class=\"token comment\"># 3. \u8fc1\u79fb\u6570\u636e(\u4f7f\u7528rsync\u4fdd\u7559\u6743\u9650)<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">rsync<\/span> <span class=\"token parameter variable\">-aP<\/span> \/var\/lib\/docker\/ \/data\/docker\/<\/p>\n<p><span class=\"token comment\"># 4. \u4fee\u6539Docker\u914d\u7f6e<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">tee<\/span> \/etc\/docker\/daemon.json <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#039;EOF&#039;<br \/>\n{<br \/>\n  &#034;data-root&#034;: &#034;\/data\/docker&#034;<br \/>\n}<br \/>\nEOF<\/span><\/p>\n<p><span class=\"token comment\"># 5. \u542f\u52a8Docker<\/span><br \/>\n<span class=\"token function\">sudo<\/span> systemctl start <span class=\"token function\">docker<\/span><\/p>\n<p><span class=\"token comment\"># 6. \u9a8c\u8bc1<\/span><br \/>\n<span class=\"token function\">docker<\/span> info <span class=\"token operator\">|<\/span> <span class=\"token function\">grep<\/span> <span class=\"token string\">&#034;Docker Root Dir&#034;<\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa: Docker Root Dir: \/data\/docker<\/span><\/p>\n<p><span class=\"token comment\"># 7. \u786e\u8ba4\u6240\u6709\u5bb9\u5668\u6b63\u5e38\u8fd0\u884c\u540e,\u5220\u9664\u65e7\u76ee\u5f55<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-rf<\/span> \/var\/lib\/docker<\/p>\n<h5>10.3.4 \u7d27\u6025\u7a7a\u95f4\u91ca\u653e<\/h5>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># emergency-cleanup.sh &#8211; \u7d27\u6025\u7a7a\u95f4\u91ca\u653e\u811a\u672c<\/span><\/p>\n<p><span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061; Emergency Space Cleanup &#061;&#061;&#061;&#034;<\/span><\/p>\n<p><span class=\"token comment\"># 1. \u6e05\u7406\u6240\u6709\u505c\u6b62\u7684\u5bb9\u5668<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Removing stopped containers&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">rm<\/span> <span class=\"token parameter variable\">-v<\/span> <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> <span class=\"token function\">ps<\/span> <span class=\"token parameter variable\">-aq<\/span> <span class=\"token parameter variable\">&#8211;filter<\/span> <span class=\"token assign-left variable\">status<\/span><span class=\"token operator\">&#061;<\/span>exited<span class=\"token variable\">)<\/span><\/span> <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null<\/p>\n<p><span class=\"token comment\"># 2. \u6e05\u7406\u6240\u6709\u672a\u4f7f\u7528\u7684\u955c\u50cf<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Removing unused images&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> rmi <span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> images <span class=\"token parameter variable\">-q<\/span> <span class=\"token parameter variable\">&#8211;filter<\/span> <span class=\"token string\">&#034;dangling&#061;true&#034;<\/span><span class=\"token variable\">)<\/span><\/span> <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null<br \/>\n<span class=\"token function\">docker<\/span> image prune <span class=\"token parameter variable\">-a<\/span> <span class=\"token parameter variable\">-f<\/span> <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null<\/p>\n<p><span class=\"token comment\"># 3. \u6e05\u7406\u672a\u4f7f\u7528\u7684\u6570\u636e\u5377(\u8c28\u614e!)<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Removing unused volumes&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume prune <span class=\"token parameter variable\">-f<\/span><\/p>\n<p><span class=\"token comment\"># 4. \u6e05\u7406\u6784\u5efa\u7f13\u5b58<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Cleaning build cache&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> builder prune <span class=\"token parameter variable\">-a<\/span> <span class=\"token parameter variable\">-f<\/span><\/p>\n<p><span class=\"token comment\"># 5. \u6e05\u7406\u5bb9\u5668\u65e5\u5fd7<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Truncating container logs&#8230;&#034;<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">sh<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#039;truncate -s 0 \/var\/lib\/docker\/containers\/*\/*-json.log&#039;<\/span> <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null<\/p>\n<p><span class=\"token comment\"># 6. \u663e\u793a\u7ed3\u679c<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061; After cleanup &#061;&#061;&#061;&#034;<\/span><br \/>\n<span class=\"token function\">docker<\/span> system <span class=\"token function\">df<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n<span class=\"token function\">df<\/span> <span class=\"token parameter variable\">-h<\/span> \/var\/lib\/docker<\/p>\n<h4>10.4 \u6570\u636e\u5377\u635f\u574f\u4fee\u590d<\/h4>\n<h5>10.4.1 \u8bca\u65ad\u6570\u636e\u5377\u635f\u574f<\/h5>\n<p><span class=\"token comment\"># 1. \u68c0\u67e5\u6570\u636e\u5377\u662f\u5426\u53ef\u8bbf\u95ee<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token parameter variable\">-v<\/span> my-volume:\/data alpine <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-la<\/span> \/data<\/p>\n<p><span class=\"token comment\"># \u5982\u679c\u62a5\u9519,\u53ef\u80fd\u6570\u636e\u5377\u5df2\u635f\u574f<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u68c0\u67e5\u5bbf\u4e3b\u673a\u4e0a\u7684\u6570\u636e\u5377\u76ee\u5f55<\/span><br \/>\n<span class=\"token assign-left variable\">VOLUME_PATH<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> volume inspect my-volume <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{.Mountpoint}}&#039;<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-la<\/span> <span class=\"token variable\">$VOLUME_PATH<\/span><\/p>\n<p><span class=\"token comment\"># 3. \u68c0\u67e5\u6587\u4ef6\u7cfb\u7edf<\/span><br \/>\n<span class=\"token function\">sudo<\/span> fsck.ext4 \/dev\/sda1  <span class=\"token comment\"># \u5982\u679c\u4f7f\u7528ext4<\/span><br \/>\n<span class=\"token comment\"># \u6216<\/span><br \/>\n<span class=\"token function\">sudo<\/span> xfs_repair \/dev\/sda1  <span class=\"token comment\"># \u5982\u679c\u4f7f\u7528xfs<\/span><\/p>\n<p><span class=\"token comment\"># 4. \u67e5\u770bdmesg\u4e2d\u7684\u6587\u4ef6\u7cfb\u7edf\u9519\u8bef<\/span><br \/>\n<span class=\"token function\">dmesg<\/span> <span class=\"token operator\">|<\/span> <span class=\"token function\">grep<\/span> <span class=\"token parameter variable\">-i<\/span> error<\/p>\n<h5>10.4.2 \u4fee\u590d\u6b65\u9aa4<\/h5>\n<p><span class=\"token comment\"># \u6b65\u9aa41:\u505c\u6b62\u4f7f\u7528\u8be5\u6570\u636e\u5377\u7684\u6240\u6709\u5bb9\u5668<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token function\">ps<\/span> <span class=\"token parameter variable\">&#8211;filter<\/span> <span class=\"token assign-left variable\">volume<\/span><span class=\"token operator\">&#061;<\/span>my-volume <span class=\"token parameter variable\">-q<\/span> <span class=\"token operator\">|<\/span> <span class=\"token function\">xargs<\/span> <span class=\"token function\">docker<\/span> stop<\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa42:\u5c1d\u8bd5\u4ece\u5907\u4efd\u6062\u590d<\/span><br \/>\n<span class=\"token comment\"># \u5982\u679c\u6709\u5907\u4efd,\u76f4\u63a5\u6062\u590d<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume <span class=\"token function\">rm<\/span> my-volume<br \/>\n<span class=\"token function\">docker<\/span> volume create my-volume<br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> my-volume:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> \/backup:\/backup:ro <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">tar<\/span> xzf \/backup\/my-volume-backup.tar.gz <span class=\"token parameter variable\">-C<\/span> \/data<\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa43:\u5982\u679c\u6ca1\u6709\u5907\u4efd,\u5c1d\u8bd5\u624b\u52a8\u4fee\u590d<\/span><br \/>\n<span class=\"token comment\"># \u4f7f\u7528fsck\u4fee\u590d\u5e95\u5c42\u6587\u4ef6\u7cfb\u7edf<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">umount<\/span> \/var\/lib\/docker\/volumes\/my-volume\/_data <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null<br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">fsck<\/span> <span class=\"token parameter variable\">-y<\/span> \/dev\/sda1<br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">mount<\/span> <span class=\"token parameter variable\">-a<\/span><\/p>\n<p><span class=\"token comment\"># \u6b65\u9aa44:\u5982\u679c\u6570\u636e\u5377\u76ee\u5f55\u635f\u574f,\u5c1d\u8bd5\u6062\u590d\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> \/tmp\/recovery<br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">cp<\/span> <span class=\"token parameter variable\">-a<\/span> \/var\/lib\/docker\/volumes\/my-volume\/_data\/ \/tmp\/recovery\/ <span class=\"token operator\"><span class=\"token file-descriptor important\">2<\/span>&gt;<\/span>\/dev\/null<br \/>\n<span class=\"token comment\"># \u68c0\u67e5\u6062\u590d\u7684\u6587\u4ef6<\/span><br \/>\n<span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-la<\/span> \/tmp\/recovery\/<\/p>\n<h4>10.5 \u6743\u9650\u95ee\u9898\u6392\u67e5<\/h4>\n<h5>10.5.1 \u5e38\u89c1\u6743\u9650\u95ee\u9898<\/h5>\n<p><span class=\"token comment\"># \u95ee\u98981:\u5bb9\u5668\u5185\u65e0\u6cd5\u5199\u5165\u6570\u636e\u5377<\/span><br \/>\n<span class=\"token comment\"># \u9519\u8bef\u4fe1\u606f: Permission denied<\/span><\/p>\n<p><span class=\"token comment\"># \u8bca\u65ad\u6b65\u9aa4<\/span><br \/>\n<span class=\"token comment\"># 1. \u68c0\u67e5\u5bb9\u5668\u5185\u8fdb\u7a0b\u7684\u7528\u6237<\/span><br \/>\n<span class=\"token function\">docker<\/span> <span class=\"token builtin class-name\">exec<\/span> <span class=\"token operator\">&lt;<\/span>container<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">id<\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa: uid&#061;0(root) gid&#061;0(root)<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u68c0\u67e5\u6570\u636e\u5377\u7684\u6240\u6709\u8005<\/span><br \/>\n<span class=\"token assign-left variable\">VOLUME_PATH<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> volume inspect my-volume <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{.Mountpoint}}&#039;<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-la<\/span> <span class=\"token variable\">$VOLUME_PATH<\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa: drwxr-xr-x 2 root root 4096 &#8230;<\/span><\/p>\n<p><span class=\"token comment\"># 3. \u68c0\u67e5\u5bb9\u5668\u6302\u8f7d\u4fe1\u606f<\/span><br \/>\n<span class=\"token function\">docker<\/span> inspect <span class=\"token operator\">&lt;<\/span>container<span class=\"token operator\">&gt;<\/span> <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{json .Mounts}}&#039;<\/span> <span class=\"token operator\">|<\/span> python3 <span class=\"token parameter variable\">-m<\/span> json.tool<\/p>\n<h5>10.5.2 \u89e3\u51b3\u6743\u9650\u95ee\u9898<\/h5>\n<p><span class=\"token comment\"># \u89e3\u51b3\u65b9\u68481:\u4fee\u6539\u6570\u636e\u5377\u6743\u9650<\/span><br \/>\n<span class=\"token assign-left variable\">VOLUME_PATH<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">docker<\/span> volume inspect my-volume <span class=\"token parameter variable\">&#8211;format<\/span> <span class=\"token string\">&#039;{{.Mountpoint}}&#039;<\/span><span class=\"token variable\">)<\/span><\/span><\/p>\n<p><span class=\"token comment\"># \u4fee\u6539\u4e3a\u5bb9\u5668\u5185\u7528\u6237\u7684UID<\/span><br \/>\n<span class=\"token comment\"># \u4f8b\u5982\u5bb9\u5668\u5185\u7528\u6237UID\u4e3a1000<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">chown<\/span> <span class=\"token parameter variable\">-R<\/span> <span class=\"token number\">1000<\/span>:1000 <span class=\"token variable\">$VOLUME_PATH<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">chmod<\/span> <span class=\"token parameter variable\">-R<\/span> <span class=\"token number\">755<\/span> <span class=\"token variable\">$VOLUME_PATH<\/span><\/p>\n<p><span class=\"token comment\"># \u89e3\u51b3\u65b9\u68482:\u4f7f\u7528\u521d\u59cb\u5316\u5bb9\u5668\u8bbe\u7f6e\u6743\u9650<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;rm<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> my-volume:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  alpine:latest <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token function\">chown<\/span> <span class=\"token parameter variable\">-R<\/span> <span class=\"token number\">1000<\/span>:1000 \/data<\/p>\n<p><span class=\"token comment\"># \u89e3\u51b3\u65b9\u68483:\u5728Dockerfile\u4e2d\u8bbe\u7f6e<\/span><br \/>\n<span class=\"token comment\"># Dockerfile:<\/span><br \/>\n<span class=\"token comment\"># FROM alpine<\/span><br \/>\n<span class=\"token comment\"># RUN mkdir -p \/data &amp;&amp; chown 1000:1000 \/data<\/span><br \/>\n<span class=\"token comment\"># USER 1000:1000<\/span><\/p>\n<p><span class=\"token comment\"># \u89e3\u51b3\u65b9\u68484:\u8fd0\u884c\u65f6\u6307\u5b9a\u7528\u6237<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;user<\/span> <span class=\"token number\">1000<\/span>:1000 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> my-volume:\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-app<\/p>\n<p><span class=\"token comment\"># \u89e3\u51b3\u65b9\u68485:\u4f7f\u7528entrypoint\u811a\u672c\u52a8\u6001\u8bbe\u7f6e\u6743\u9650<\/span><br \/>\n<span class=\"token comment\"># entrypoint.sh:<\/span><br \/>\n<span class=\"token comment\"># #!\/bin\/sh<\/span><br \/>\n<span class=\"token comment\"># if [ &#034;$(id -u)&#034; &#061; &#034;0&#034; ]; then<\/span><br \/>\n<span class=\"token comment\">#     chown -R appuser:appgroup \/data<\/span><br \/>\n<span class=\"token comment\">#     exec su-exec appuser &#034;$&#064;&#034;<\/span><br \/>\n<span class=\"token comment\"># fi<\/span><br \/>\n<span class=\"token comment\"># exec &#034;$&#064;&#034;<\/span><\/p>\n<h5>10.5.3 SELinux\/AppArmor\u6743\u9650\u95ee\u9898<\/h5>\n<p><span class=\"token comment\"># SELinux\u5bfc\u81f4\u7684\u6743\u9650\u95ee\u9898(\u5728CentOS\/RHEL\u4e0a\u5e38\u89c1)<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770bSELinux\u72b6\u6001<\/span><br \/>\ngetenforce<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: Enforcing<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u6587\u4ef6SELinux\u6807\u7b7e<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">ls<\/span> <span class=\"token parameter variable\">-Z<\/span> \/var\/lib\/docker\/volumes\/my-volume\/_data\/<\/p>\n<p><span class=\"token comment\"># \u89e3\u51b3\u65b9\u68481:\u6dfb\u52a0:z\u6216:Z\u540e\u7f00(Docker\u81ea\u52a8\u8bbe\u7f6eSELinux\u6807\u7b7e)<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-v<\/span> my-volume:\/data:z my-app  <span class=\"token comment\"># \u5171\u4eab\u6807\u7b7e<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-v<\/span> my-volume:\/data:Z my-app  <span class=\"token comment\"># \u79c1\u6709\u6807\u7b7e<\/span><\/p>\n<p><span class=\"token comment\"># \u89e3\u51b3\u65b9\u68482:\u4e34\u65f6\u8bbe\u7f6e\u4e3apermissive\u6a21\u5f0f(\u4e0d\u63a8\u8350\u751f\u4ea7\u4f7f\u7528)<\/span><br \/>\n<span class=\"token function\">sudo<\/span> setenforce <span class=\"token number\">0<\/span><\/p>\n<p><span class=\"token comment\"># \u89e3\u51b3\u65b9\u68483:\u6b63\u786e\u8bbe\u7f6eSELinux\u7b56\u7565<\/span><br \/>\n<span class=\"token function\">sudo<\/span> semanage fcontext <span class=\"token parameter variable\">-a<\/span> <span class=\"token parameter variable\">-t<\/span> container_file_t <span class=\"token string\">&#034;\/var\/lib\/docker\/volumes\/my-volume\/_data(\/.*)?&#034;<\/span><br \/>\n<span class=\"token function\">sudo<\/span> restorecon <span class=\"token parameter variable\">-Rv<\/span> \/var\/lib\/docker\/volumes\/my-volume\/_data\/<\/p>\n<h4>10.6 \u5b58\u50a8\u6027\u80fd\u76d1\u63a7\u4e0e\u4f18\u5316<\/h4>\n<h5>10.6.1 \u4f7f\u7528docker stats\u76d1\u63a7<\/h5>\n<p><span class=\"token comment\"># \u5b9e\u65f6\u76d1\u63a7\u5bb9\u5668\u8d44\u6e90\u4f7f\u7528<\/span><br \/>\n<span class=\"token function\">docker<\/span> stats<\/p>\n<p><span class=\"token comment\"># \u8f93\u51fa\u793a\u4f8b:<\/span><br \/>\n<span class=\"token comment\"># CONTAINER ID   NAME      CPU %     MEM USAGE \/ LIMIT   MEM %    NET I\/O          BLOCK I\/O       PIDS<\/span><br \/>\n<span class=\"token comment\"># a1b2c3d4       mysql     2.35%     512MiB \/ 2GiB       25.00%   1.2kB \/ 648B     25MB \/ 15MB     120<\/span><br \/>\n<span class=\"token comment\"># e5f6g7h8       redis     0.50%     50MiB \/ 512MiB      9.77%    648B \/ 1.2kB     5MB \/ 2MB       15<\/span><\/p>\n<p><span class=\"token comment\"># BLOCK I\/O\u5217\u663e\u793a\u78c1\u76d8\u8bfb\u5199\u91cf,\u53ef\u7528\u4e8e\u5224\u65ad\u5b58\u50a8\u6027\u80fd<\/span><\/p>\n<p><span class=\"token comment\"># \u76d1\u63a7\u7279\u5b9a\u5bb9\u5668<\/span><br \/>\n<span class=\"token function\">docker<\/span> stats mysql-prod<\/p>\n<p><span class=\"token comment\"># \u53ea\u8f93\u51fa\u4e00\u6b21(\u4e0d\u6301\u7eed\u76d1\u63a7)<\/span><br \/>\n<span class=\"token function\">docker<\/span> stats &#8211;no-stream<\/p>\n<h5>10.6.2 \u4f7f\u7528iostat\u76d1\u63a7\u78c1\u76d8I\/O<\/h5>\n<p><span class=\"token comment\"># \u5b89\u88c5sysstat\u5305<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">apt-get<\/span> <span class=\"token function\">install<\/span> sysstat  <span class=\"token comment\"># Ubuntu\/Debian<\/span><br \/>\n<span class=\"token comment\"># \u6216<\/span><br \/>\n<span class=\"token function\">sudo<\/span> yum <span class=\"token function\">install<\/span> sysstat      <span class=\"token comment\"># CentOS\/RHEL<\/span><\/p>\n<p><span class=\"token comment\"># \u76d1\u63a7\u78c1\u76d8I\/O<\/span><br \/>\niostat <span class=\"token parameter variable\">-dx<\/span> <span class=\"token number\">1<\/span><\/p>\n<p><span class=\"token comment\"># \u8f93\u51fa\u793a\u4f8b:<\/span><br \/>\n<span class=\"token comment\"># Device:  rrqm\/s  wrqm\/s  r\/s  w\/s  rkB\/s  wkB\/s  avgrq-sz  avgqu-sz  await  %util<\/span><br \/>\n<span class=\"token comment\"># sda        0.00    1.00  2.00 5.00  16.00  48.00    9.14      0.03    4.29   3.00<\/span><br \/>\n<span class=\"token comment\"># nvme0n1    0.00    0.00  0.00 0.00   0.00   0.00    0.00      0.00    0.00   0.00<\/span><\/p>\n<p><span class=\"token comment\"># \u5173\u6ce8\u6307\u6807:<\/span><br \/>\n<span class=\"token comment\"># %util: \u78c1\u76d8\u4f7f\u7528\u7387(\u63a5\u8fd1100%\u8bf4\u660e\u78c1\u76d8\u74f6\u9888)<\/span><br \/>\n<span class=\"token comment\"># await: I\/O\u7b49\u5f85\u65f6\u95f4(\u8fc7\u9ad8\u8bf4\u660e\u78c1\u76d8\u6162)<\/span><br \/>\n<span class=\"token comment\"># r\/s, w\/s: \u6bcf\u79d2\u8bfb\u5199\u6b21\u6570<\/span><br \/>\n<span class=\"token comment\"># rkB\/s, wkB\/s: \u6bcf\u79d2\u8bfb\u5199\u6570\u636e\u91cf<\/span><\/p>\n<h5>10.6.3 \u6027\u80fd\u4f18\u5316\u5efa\u8bae<\/h5>\n<p><span class=\"token comment\"># 1. \u4f7f\u7528SSD\u66ff\u6362HDD<\/span><br \/>\n<span class=\"token comment\"># SSD\u7684\u968f\u673a\u8bfb\u5199\u6027\u80fd\u8fdc\u8d85HDD,\u5bf9\u6570\u636e\u5e93\u7b49I\/O\u5bc6\u96c6\u578b\u5e94\u7528\u5f71\u54cd\u5de8\u5927<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u4f7f\u7528\u5757\u8bbe\u5907\u6570\u636e\u5377(\u7ed5\u8fc7\u6587\u4ef6\u7cfb\u7edf\u5f00\u9500)<\/span><br \/>\n<span class=\"token function\">docker<\/span> volume create <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;driver<\/span> <span class=\"token builtin class-name\">local<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>ext4 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;opt<\/span> <span class=\"token assign-left variable\">device<\/span><span class=\"token operator\">&#061;<\/span>\/dev\/nvme0n1 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  high-perf-volume<\/p>\n<p><span class=\"token comment\"># 3. \u8c03\u6574\u6587\u4ef6\u7cfb\u7edf\u6302\u8f7d\u9009\u9879<\/span><br \/>\n<span class=\"token comment\"># \/etc\/fstab<\/span><br \/>\n<span class=\"token comment\"># \/dev\/sdb1 \/var\/lib\/docker ext4 defaults,noatime,nodiratime,data&#061;writeback 0 0<\/span><br \/>\n<span class=\"token comment\"># noatime: \u4e0d\u66f4\u65b0\u8bbf\u95ee\u65f6\u95f4<\/span><br \/>\n<span class=\"token comment\"># data&#061;writeback: \u5199\u56de\u6a21\u5f0f(\u6027\u80fd\u4f18\u5148,\u4f46\u5b89\u5168\u6027\u964d\u4f4e)<\/span><\/p>\n<p><span class=\"token comment\"># 4. \u4f7f\u7528I\/O\u8c03\u5ea6\u5668<\/span><br \/>\n<span class=\"token comment\"># \u5bf9\u4e8eSSD,\u4f7f\u7528none\u8c03\u5ea6\u5668<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> none <span class=\"token operator\">&gt;<\/span> \/sys\/block\/nvme0n1\/queue\/scheduler<\/p>\n<p><span class=\"token comment\"># 5. \u8c03\u6574\u5185\u6838I\/O\u53c2\u6570<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">sysctl<\/span> <span class=\"token parameter variable\">-w<\/span> <span class=\"token assign-left variable\">vm.dirty_ratio<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token number\">10<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">sysctl<\/span> <span class=\"token parameter variable\">-w<\/span> <span class=\"token assign-left variable\">vm.dirty_background_ratio<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token number\">5<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">sysctl<\/span> <span class=\"token parameter variable\">-w<\/span> <span class=\"token assign-left variable\">vm.swappiness<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token number\">10<\/span><\/p>\n<p><span class=\"token comment\"># 6. \u4f7f\u7528\u5185\u5b58\u7f13\u5b58(tmpfs)\u51cf\u5c11\u78c1\u76d8I\/O<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;name<\/span> my-app <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">&#8211;mount<\/span> <span class=\"token assign-left variable\">type<\/span><span class=\"token operator\">&#061;<\/span>tmpfs,dst<span class=\"token operator\">&#061;<\/span>\/app\/cache,tmpfs-size<span class=\"token operator\">&#061;<\/span>512m <span class=\"token punctuation\">\\\\<\/span><br \/>\n  my-app:latest<\/p>\n<h4>10.7 \u751f\u4ea7\u73af\u5883\u5b58\u50a8\u67b6\u6784\u8bbe\u8ba1<\/h4>\n<h5>10.7.1 \u5355\u673a\u5b58\u50a8\u67b6\u6784<\/h5>\n<p>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502              \u5355\u673a\u5b58\u50a8\u67b6\u6784                 \u2502<br \/>\n\u2502                                         \u2502<br \/>\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502<br \/>\n\u2502  \u2502           Docker \u4e3b\u673a                \u2502\u2502<br \/>\n\u2502  \u2502                                     \u2502\u2502<br \/>\n\u2502  \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510        \u2502\u2502<br \/>\n\u2502  \u2502  \u2502 App\u5bb9\u5668   \u2502  \u2502 DB\u5bb9\u5668    \u2502        \u2502\u2502<br \/>\n\u2502  \u2502  \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518        \u2502\u2502<br \/>\n\u2502  \u2502       \u2502              \u2502              \u2502\u2502<br \/>\n\u2502  \u2502  \u250c\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2510       \u2502\u2502<br \/>\n\u2502  \u2502  \u2502    Docker Volumes        \u2502       \u2502\u2502<br \/>\n\u2502  \u2502  \u2502  \/var\/lib\/docker\/volumes \u2502       \u2502\u2502<br \/>\n\u2502  \u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518       \u2502\u2502<br \/>\n\u2502  \u2502               \u2502                     \u2502\u2502<br \/>\n\u2502  \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510       \u2502\u2502<br \/>\n\u2502  \u2502  \u2502   \u672c\u5730\u78c1\u76d8(SSD)          \u2502       \u2502\u2502<br \/>\n\u2502  \u2502  \u2502   ext4\/xfs \u6587\u4ef6\u7cfb\u7edf       \u2502       \u2502\u2502<br \/>\n\u2502  \u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518       \u2502\u2502<br \/>\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2502<br \/>\n\u2502                                         \u2502<br \/>\n\u2502  \u9002\u7528\u573a\u666f:\u5c0f\u578b\u5e94\u7528\u3001\u5f00\u53d1\u6d4b\u8bd5\u73af\u5883         \u2502<br \/>\n\u2502  \u4f18\u70b9:\u7b80\u5355\u3001\u6027\u80fd\u597d                       \u2502<br \/>\n\u2502  \u7f3a\u70b9:\u65e0\u9ad8\u53ef\u7528\u3001\u65e0\u6cd5\u6269\u5c55                 \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<h5>10.7.2 \u5206\u5e03\u5f0f\u5b58\u50a8\u67b6\u6784<\/h5>\n<p>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502                  \u5206\u5e03\u5f0f\u5b58\u50a8\u67b6\u6784                        \u2502<br \/>\n\u2502                                                      \u2502<br \/>\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510   \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510   \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510         \u2502<br \/>\n\u2502  \u2502 Docker   \u2502   \u2502 Docker   \u2502   \u2502 Docker   \u2502         \u2502<br \/>\n\u2502  \u2502 Node 1   \u2502   \u2502 Node 2   \u2502   \u2502 Node 3   \u2502         \u2502<br \/>\n\u2502  \u2502          \u2502   \u2502          \u2502   \u2502          \u2502         \u2502<br \/>\n\u2502  \u2502 App\u5bb9\u5668   \u2502   \u2502 App\u5bb9\u5668   \u2502   \u2502 App\u5bb9\u5668   \u2502         \u2502<br \/>\n\u2502  \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518   \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518   \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518         \u2502<br \/>\n\u2502       \u2502              \u2502              \u2502                 \u2502<br \/>\n\u2502       \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518                 \u2502<br \/>\n\u2502                  \u2502                                    \u2502<br \/>\n\u2502         \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510                           \u2502<br \/>\n\u2502         \u2502  NFS \/ GlusterFS \u2502                          \u2502<br \/>\n\u2502         \u2502  \/ Ceph \/ \u96c6\u7fa4\u5b58\u50a8 \u2502                         \u2502<br \/>\n\u2502         \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518                           \u2502<br \/>\n\u2502                  \u2502                                    \u2502<br \/>\n\u2502         \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510                           \u2502<br \/>\n\u2502         \u2502  \u5b58\u50a8\u96c6\u7fa4         \u2502                          \u2502<br \/>\n\u2502         \u2502  \u250c\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2510   \u2502                           \u2502<br \/>\n\u2502         \u2502  \u2502SSD\u2502 \u2502SSD\u2502   \u2502                           \u2502<br \/>\n\u2502         \u2502  \u2514\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2518   \u2502                           \u2502<br \/>\n\u2502         \u2502  \u250c\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2510   \u2502                           \u2502<br \/>\n\u2502         \u2502  \u2502SSD\u2502 \u2502SSD\u2502   \u2502                           \u2502<br \/>\n\u2502         \u2502  \u2514\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2518   \u2502                           \u2502<br \/>\n\u2502         \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518                           \u2502<br \/>\n\u2502                                                      \u2502<br \/>\n\u2502  \u9002\u7528\u573a\u666f:\u4e2d\u5927\u578b\u5e94\u7528\u3001\u9700\u8981\u9ad8\u53ef\u7528                      \u2502<br \/>\n\u2502  \u4f18\u70b9:\u9ad8\u53ef\u7528\u3001\u53ef\u6269\u5c55\u3001\u6570\u636e\u5171\u4eab                        \u2502<br \/>\n\u2502  \u7f3a\u70b9:\u590d\u6742\u3001\u7f51\u7edc\u5ef6\u8fdf                                  \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<h5>10.7.3 \u751f\u4ea7\u73af\u5883Docker Compose\u5b8c\u6574\u914d\u7f6e<\/h5>\n<p><span class=\"token comment\"># docker-compose.prod.yml &#8211; \u751f\u4ea7\u73af\u5883\u5b8c\u6574\u914d\u7f6e<\/span><br \/>\n<span class=\"token key atrule\">version<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;3.8&#039;<\/span><\/p>\n<p><span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token comment\"># \u53cd\u5411\u4ee3\u7406<\/span><br \/>\n  <span class=\"token key atrule\">nginx<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> nginx<span class=\"token punctuation\">:<\/span>alpine<br \/>\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> nginx<span class=\"token punctuation\">&#8211;<\/span>proxy<br \/>\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> always<br \/>\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token string\">&#034;80:80&#034;<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token string\">&#034;443:443&#034;<\/span><br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> nginx_conf<span class=\"token punctuation\">:<\/span>\/etc\/nginx\/conf.d<span class=\"token punctuation\">:<\/span>ro<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> nginx_certs<span class=\"token punctuation\">:<\/span>\/etc\/nginx\/certs<span class=\"token punctuation\">:<\/span>ro<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> nginx_logs<span class=\"token punctuation\">:<\/span>\/var\/log\/nginx<br \/>\n    <span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> frontend<br \/>\n    <span class=\"token key atrule\">depends_on<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> webapp<\/p>\n<p>  <span class=\"token comment\"># Web\u5e94\u7528<\/span><br \/>\n  <span class=\"token key atrule\">webapp<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> my<span class=\"token punctuation\">&#8211;<\/span>app<span class=\"token punctuation\">:<\/span>latest<br \/>\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> webapp<br \/>\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> always<br \/>\n    <span class=\"token key atrule\">environment<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> DB_HOST&#061;mysql<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> DB_PASSWORD&#061;$<span class=\"token punctuation\">{<\/span>DB_PASSWORD<span class=\"token punctuation\">}<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> REDIS_HOST&#061;redis<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> REDIS_PASSWORD&#061;$<span class=\"token punctuation\">{<\/span>REDIS_PASSWORD<span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> app_uploads<span class=\"token punctuation\">:<\/span>\/app\/uploads<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> app_logs<span class=\"token punctuation\">:<\/span>\/app\/logs<br \/>\n    <span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> frontend<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> backend<br \/>\n    <span class=\"token key atrule\">deploy<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">resources<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token key atrule\">limits<\/span><span class=\"token punctuation\">:<\/span><br \/>\n          <span class=\"token key atrule\">memory<\/span><span class=\"token punctuation\">:<\/span> 1G<br \/>\n          <span class=\"token key atrule\">cpus<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;1.0&#039;<\/span><br \/>\n    <span class=\"token key atrule\">healthcheck<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">test<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;CMD&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;curl&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-f&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;http:\/\/localhost:3000\/health&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n      <span class=\"token key atrule\">interval<\/span><span class=\"token punctuation\">:<\/span> 30s<br \/>\n      <span class=\"token key atrule\">timeout<\/span><span class=\"token punctuation\">:<\/span> 10s<br \/>\n      <span class=\"token key atrule\">retries<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">3<\/span><\/p>\n<p>  <span class=\"token comment\"># MySQL\u6570\u636e\u5e93<\/span><br \/>\n  <span class=\"token key atrule\">mysql<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> mysql<span class=\"token punctuation\">:<\/span><span class=\"token number\">8.0<\/span><br \/>\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> mysql<br \/>\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> always<br \/>\n    <span class=\"token key atrule\">environment<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">MYSQL_ROOT_PASSWORD<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span>MYSQL_ROOT_PASSWORD<span class=\"token punctuation\">}<\/span><br \/>\n      <span class=\"token key atrule\">MYSQL_DATABASE<\/span><span class=\"token punctuation\">:<\/span> appdb<br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> mysql_data<span class=\"token punctuation\">:<\/span>\/var\/lib\/mysql<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> mysql_conf<span class=\"token punctuation\">:<\/span>\/etc\/mysql\/conf.d<span class=\"token punctuation\">:<\/span>ro<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> mysql_logs<span class=\"token punctuation\">:<\/span>\/var\/log\/mysql<br \/>\n    <span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> backend<br \/>\n    <span class=\"token key atrule\">deploy<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">resources<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token key atrule\">limits<\/span><span class=\"token punctuation\">:<\/span><br \/>\n          <span class=\"token key atrule\">memory<\/span><span class=\"token punctuation\">:<\/span> 2G<br \/>\n          <span class=\"token key atrule\">cpus<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;2.0&#039;<\/span><br \/>\n    <span class=\"token key atrule\">healthcheck<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">test<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;CMD&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;mysqladmin&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;ping&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-h&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;localhost&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n      <span class=\"token key atrule\">interval<\/span><span class=\"token punctuation\">:<\/span> 10s<br \/>\n      <span class=\"token key atrule\">timeout<\/span><span class=\"token punctuation\">:<\/span> 5s<br \/>\n      <span class=\"token key atrule\">retries<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">5<\/span><\/p>\n<p>  <span class=\"token comment\"># Redis\u7f13\u5b58<\/span><br \/>\n  <span class=\"token key atrule\">redis<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> redis<span class=\"token punctuation\">:<\/span>7<span class=\"token punctuation\">&#8211;<\/span>alpine<br \/>\n    <span class=\"token key atrule\">container_name<\/span><span class=\"token punctuation\">:<\/span> redis<br \/>\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> always<br \/>\n    <span class=\"token key atrule\">command<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;redis-server&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;requirepass&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;${REDIS_PASSWORD}&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;appendonly&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;yes&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> redis_data<span class=\"token punctuation\">:<\/span>\/data<br \/>\n    <span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> backend<br \/>\n    <span class=\"token key atrule\">deploy<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">resources<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token key atrule\">limits<\/span><span class=\"token punctuation\">:<\/span><br \/>\n          <span class=\"token key atrule\">memory<\/span><span class=\"token punctuation\">:<\/span> 512M<\/p>\n<p><span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">nginx_conf<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">nginx_certs<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">nginx_logs<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">app_uploads<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">app_logs<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">mysql_data<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">labels<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">backup<\/span><span class=\"token punctuation\">:<\/span> daily<br \/>\n      <span class=\"token key atrule\">retention<\/span><span class=\"token punctuation\">:<\/span> 30d<br \/>\n  <span class=\"token key atrule\">mysql_conf<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">mysql_logs<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">redis_data<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">labels<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">backup<\/span><span class=\"token punctuation\">:<\/span> daily<br \/>\n      <span class=\"token key atrule\">retention<\/span><span class=\"token punctuation\">:<\/span> 7d<\/p>\n<p><span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">frontend<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">driver<\/span><span class=\"token punctuation\">:<\/span> bridge<br \/>\n  <span class=\"token key atrule\">backend<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">driver<\/span><span class=\"token punctuation\">:<\/span> bridge<br \/>\n    <span class=\"token key atrule\">internal<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span>  <span class=\"token comment\"># \u540e\u7aef\u7f51\u7edc\u4e0d\u5bf9\u5916\u66b4\u9732<\/span><\/p>\n<h4>10.8 \u672c\u7ae0\u603b\u7ed3\u4e0e\u4e0b\u4e00\u671f\u9884\u544a<\/h4>\n<h5>10.8.1 \u5168\u6587\u603b\u7ed3<\/h5>\n<p>\u672c\u6587\u5168\u9762\u6df1\u5165\u5730\u8bb2\u89e3\u4e86Docker\u5b58\u50a8\u4e0e\u6570\u636e\u6301\u4e45\u5316\u7684\u5168\u90e8\u77e5\u8bc6,\u4ece\u5e95\u5c42\u539f\u7406\u5230\u751f\u4ea7\u5b9e\u8df5,\u6db5\u76d6\u4e86\u4ee5\u4e0b\u6838\u5fc3\u5185\u5bb9:<\/p>\n<li>\n<p>Docker\u5b58\u50a8\u4f53\u7cfb\u6982\u89c8:\u7406\u89e3\u4e86\u5bb9\u5668\u5b58\u50a8\u7684\u4e34\u65f6\u6027\u6311\u6218,Docker\u4e09\u5927\u5b58\u50a8\u65b9\u5f0f(Volume\u3001Bind Mount\u3001tmpfs)\u7684\u533a\u522b,\u4ee5\u53ca\u5b58\u50a8\u9a71\u52a8\u4e0e\u6570\u636e\u5377\u7684\u5173\u7cfb\u3002<\/p>\n<\/li>\n<li>\n<p>\u5b58\u50a8\u9a71\u52a8\u8be6\u89e3:\u6df1\u5165\u5b66\u4e60\u4e86overlay2\u3001aufs\u3001devicemapper\u3001btrfs\u3001zfs\u548cvfs\u516d\u79cd\u5b58\u50a8\u9a71\u52a8\u7684\u5de5\u4f5c\u539f\u7406\u3001\u4f18\u7f3a\u70b9\u548c\u9009\u62e9\u65b9\u6cd5\u3002<\/p>\n<\/li>\n<li>\n<p>Docker Volume:\u638c\u63e1\u4e86\u6570\u636e\u5377\u7684\u521b\u5efa\u3001\u7ba1\u7406\u3001\u4f7f\u7528,\u5305\u62ec\u547d\u540d\u5377\u4e0e\u533f\u540d\u5377\u3001\u53ea\u8bfb\u5377\u3001\u6743\u9650\u7ba1\u7406,\u4ee5\u53caMySQL\u6570\u636e\u6301\u4e45\u5316\u5b9e\u6218\u3002<\/p>\n<\/li>\n<li>\n<p>Bind Mount:\u5b66\u4e60\u4e86\u7ed1\u5b9a\u6302\u8f7d\u7684\u4f7f\u7528\u65b9\u6cd5\u3001\u7edd\u5bf9\u8def\u5f84\u8981\u6c42\u3001\u53ea\u8bfb\u6302\u8f7d\u3001\u6587\u4ef6\u540c\u6b65\u673a\u5236,\u4ee5\u53ca\u5f00\u53d1\u73af\u5883\u4ee3\u7801\u70ed\u66f4\u65b0\u5b9e\u6218\u3002<\/p>\n<\/li>\n<li>\n<p>tmpfs Mount:\u4e86\u89e3\u4e86tmpfs\u7684\u5185\u5b58\u5b58\u50a8\u7279\u6027\u3001\u5927\u5c0f\u548c\u6743\u9650\u8bbe\u7f6e,\u4ee5\u53ca\u5b89\u5168\u5b58\u50a8\u4e34\u65f6\u5bc6\u94a5\u7684\u5b9e\u6218\u65b9\u6848\u3002<\/p>\n<\/li>\n<li>\n<p>\u6570\u636e\u5377\u8fdb\u9636\u64cd\u4f5c:\u638c\u63e1\u4e86\u6570\u636e\u5377\u9a71\u52a8\u3001NFS\u6570\u636e\u5377\u3001\u591a\u5bb9\u5668\u5171\u4eab\u3001\u6570\u636e\u5377\u5bb9\u5668\u6a21\u5f0f\u3001\u5907\u4efd\u6062\u590d\u548c\u8fc1\u79fb\u7b49\u9ad8\u7ea7\u64cd\u4f5c\u3002<\/p>\n<\/li>\n<li>\n<p>Dockerfile\u5b58\u50a8\u914d\u7f6e:\u5b66\u4e60\u4e86VOLUME\u6307\u4ee4\u7684\u4f7f\u7528\u3001\u6ce8\u610f\u4e8b\u9879\u3001\u4e0edocker run -v\u7684\u4ea4\u4e92,\u4ee5\u53ca\u955c\u50cf\u9884\u586b\u5145\u673a\u5236\u3002<\/p>\n<\/li>\n<li>\n<p>\u6570\u636e\u5e93\u5b58\u50a8\u65b9\u6848:\u5b8c\u6574\u5b9e\u73b0\u4e86MySQL\u3001PostgreSQL\u3001MongoDB\u3001Redis\u548cElasticsearch\u4e94\u79cd\u6570\u636e\u5e93\u7684\u6301\u4e45\u5316\u914d\u7f6e,\u5305\u62ec\u914d\u7f6e\u6587\u4ef6\u3001\u521d\u59cb\u5316\u811a\u672c\u3001\u5907\u4efd\u6062\u590d\u548c\u6027\u80fd\u4f18\u5316\u3002<\/p>\n<\/li>\n<li>\n<p>\u5b58\u50a8\u5b89\u5168\u4e0e\u5907\u4efd\u7b56\u7565:\u5b66\u4e60\u4e86\u6570\u636e\u5377\u52a0\u5bc6\u3001\u8bbf\u95ee\u63a7\u5236\u3001\u5168\u91cf\/\u589e\u91cf\/\u5dee\u5f02\u5907\u4efd\u3001\u5b9a\u65f6\u81ea\u52a8\u5907\u4efd\u3001\u5907\u4efd\u9a8c\u8bc1\u3001\u707e\u96be\u6062\u590d\u548c\u5408\u89c4\u6027\u7ba1\u7406\u3002<\/p>\n<\/li>\n<li>\n<p>\u5b58\u50a8\u7ba1\u7406\u4e0e\u6545\u969c\u6392\u67e5:\u638c\u63e1\u4e86docker system df\u3001\u8d44\u6e90\u6e05\u7406\u3001\u78c1\u76d8\u7a7a\u95f4\u5904\u7406\u3001\u6570\u636e\u5377\u635f\u574f\u4fee\u590d\u3001\u6743\u9650\u6392\u67e5\u3001\u6027\u80fd\u76d1\u63a7\u548c\u751f\u4ea7\u73af\u5883\u67b6\u6784\u8bbe\u8ba1\u3002<\/p>\n<\/li>\n<h5>10.8.2 \u5173\u952e\u8981\u70b9\u56de\u987e<\/h5>\n<table>\n<tr>\u4e3b\u9898\u5173\u952e\u8981\u70b9<\/tr>\n<tbody>\n<tr>\n<td>\u5b58\u50a8\u65b9\u5f0f\u9009\u62e9<\/td>\n<td>\u751f\u4ea7\u7528Volume,\u5f00\u53d1\u7528Bind Mount,\u654f\u611f\u6570\u636e\u7528tmpfs<\/td>\n<\/tr>\n<tr>\n<td>\u5b58\u50a8\u9a71\u52a8<\/td>\n<td>\u4f18\u5148\u4f7f\u7528overlay2,\u5185\u68384.0&#043;<\/td>\n<\/tr>\n<tr>\n<td>\u6570\u636e\u5377\u7ba1\u7406<\/td>\n<td>\u4f7f\u7528\u547d\u540d\u6570\u636e\u5377,\u6dfb\u52a0\u6807\u7b7e,\u5b9a\u671f\u6e05\u7406<\/td>\n<\/tr>\n<tr>\n<td>\u6570\u636e\u5e93\u6301\u4e45\u5316<\/td>\n<td>\u6570\u636e&#043;\u914d\u7f6e&#043;\u65e5\u5fd7\u5206\u79bb,\u8bbe\u7f6e\u5065\u5eb7\u68c0\u67e5\u548c\u8d44\u6e90\u9650\u5236<\/td>\n<\/tr>\n<tr>\n<td>\u5907\u4efd\u7b56\u7565<\/td>\n<td>3-2-1\u539f\u5219(3\u4efd\u5907\u4efd,2\u79cd\u4ecb\u8d28,1\u4efd\u5f02\u5730)<\/td>\n<\/tr>\n<tr>\n<td>\u5b89\u5168<\/td>\n<td>\u52a0\u5bc6\u654f\u611f\u6570\u636e,\u6700\u5c0f\u6743\u9650\u539f\u5219,\u5b9a\u671f\u5ba1\u8ba1<\/td>\n<\/tr>\n<tr>\n<td>\u76d1\u63a7<\/td>\n<td>docker system df, docker stats, iostat<\/td>\n<\/tr>\n<tr>\n<td>\u6545\u969c\u6392\u67e5<\/td>\n<td>\u5148\u8bca\u65ad\u540e\u5904\u7406,\u6743\u9650\u95ee\u9898\u6700\u5e38\u89c1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5>10.8.3 \u4e0b\u4e00\u671f\u9884\u544a<\/h5>\n<p>\u5728\u4e0b\u4e00\u7bc7\u6587\u7ae0\u4e2d,\u6211\u4eec\u5c06\u63a2\u8ba8Docker\u7f51\u7edc\u4e0e\u5bb9\u5668\u95f4\u901a\u4fe1\u7684\u4e3b\u9898,\u5185\u5bb9\u5305\u62ec:<\/p>\n<ul>\n<li>Docker\u7f51\u7edc\u6a21\u578b\u8be6\u89e3(bridge\u3001host\u3001overlay\u3001macvlan\u3001none)<\/li>\n<li>\u5bb9\u5668\u95f4\u901a\u4fe1\u673a\u5236<\/li>\n<li>\u7aef\u53e3\u6620\u5c04\u4e0e\u7aef\u53e3\u66b4\u9732<\/li>\n<li>Docker DNS\u4e0e\u670d\u52a1\u53d1\u73b0<\/li>\n<li>\u81ea\u5b9a\u4e49\u7f51\u7edc\u521b\u5efa\u4e0e\u7ba1\u7406<\/li>\n<li>Docker Swarm\u8986\u76d6\u7f51\u7edc<\/li>\n<li>\u7f51\u7edc\u5b89\u5168\u4e0e\u9694\u79bb<\/li>\n<li>\u8d1f\u8f7d\u5747\u8861\u4e0e\u6d41\u91cf\u5206\u53d1<\/li>\n<li>\u751f\u4ea7\u73af\u5883\u7f51\u7edc\u67b6\u6784\u8bbe\u8ba1<\/li>\n<\/ul>\n<p>\u656c\u8bf7\u671f\u5f85!<\/p>\n<hr \/>\n<h3>\u7ed3\u8bed<\/h3>\n<p>Docker\u5b58\u50a8\u4e0e\u6570\u636e\u6301\u4e45\u5316\u662f\u5bb9\u5668\u5316\u90e8\u7f72\u4e2d\u6700\u5173\u952e\u7684\u4e3b\u9898\u4e4b\u4e00\u3002\u6b63\u786e\u7406\u89e3\u548c\u8fd0\u7528Docker\u7684\u5b58\u50a8\u673a\u5236,\u4e0d\u4ec5\u80fd\u786e\u4fdd\u6570\u636e\u7684\u5b89\u5168\u6027\u548c\u6301\u4e45\u6027,\u8fd8\u80fd\u663e\u8457\u63d0\u5347\u5e94\u7528\u7684\u6027\u80fd\u548c\u53ef\u9760\u6027\u3002<\/p>\n<p>\u5728\u5b9e\u9645\u751f\u4ea7\u73af\u5883\u4e2d,\u5b58\u50a8\u65b9\u6848\u7684\u9009\u62e9\u548c\u914d\u7f6e\u9700\u8981\u6839\u636e\u5177\u4f53\u7684\u4e1a\u52a1\u9700\u6c42\u3001\u6570\u636e\u7c7b\u578b\u3001\u6027\u80fd\u8981\u6c42\u548c\u5b89\u5168\u8981\u6c42\u6765\u7efc\u5408\u8003\u8651\u3002\u6ca1\u6709\u4e00\u79cd\u65b9\u6848\u9002\u7528\u4e8e\u6240\u6709\u573a\u666f,\u5173\u952e\u5728\u4e8e\u7406\u89e3\u6bcf\u79cd\u5b58\u50a8\u65b9\u5f0f\u7684\u539f\u7406\u548c\u7279\u70b9,\u7136\u540e\u5728\u5408\u9002\u7684\u573a\u666f\u4f7f\u7528\u5408\u9002\u7684\u5de5\u5177\u3002<\/p>\n<p>\u5e0c\u671b\u672c\u6587\u80fd\u591f\u5e2e\u52a9\u4f60\u5168\u9762\u638c\u63e1Docker\u5b58\u50a8\u4e0e\u6570\u636e\u6301\u4e45\u5316\u7684\u77e5\u8bc6,\u5728\u5bb9\u5668\u5316\u90e8\u7f72\u7684\u9053\u8def\u4e0a\u66f4\u52a0\u5f97\u5fc3\u5e94\u624b\u3002\u5982\u679c\u4f60\u5728\u5b9e\u8df5\u4e2d\u9047\u5230\u4efb\u4f55\u95ee\u9898,\u6b22\u8fce\u7559\u8a00\u8ba8\u8bba\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Docker\u5b58\u50a8\u4e0e\u6570\u636e\u6301\u4e45\u5316\u672c\u6587\u662fDocker\u4e13\u680f\u7684\u7b2c\u516d\u7bc7\u6587\u7ae0,\u5c06\u5168\u9762\u6df1\u5165\u5730\u8bb2\u89e3Docker\u5b58\u50a8\u4f53\u7cfb\u3001\u5b58\u50a8\u9a71\u52a8\u3001\u6570\u636e\u5377\u3001\u7ed1\u5b9a\u6302\u8f7d\u3001tmpfs\u6302\u8f7d\u3001\u6570\u636e\u5377\u8fdb\u9636\u64cd\u4f5c\u3001Dockerfile\u5b58\u50a8\u914d\u7f6e\u3001\u6570\u636e\u5e93\u6301\u4e45\u5316\u65b9\u6848\u3001\u5b58\u50a8\u5b89\u5168\u4e0e\u5907\u4efd\u7b56\u7565\u4ee5\u53ca\u6545\u969c\u6392\u67e5\u7b49\u5168\u90e8\u77e5\u8bc6\u3002\u5168\u6587\u8d85\u8fc73\u4e07\u5b57,\u5305\u542b\u5927\u91cf\u5b9e\u6218\u6848\u4f8b\u4e0e\u4ee3\u7801\u793a\u4f8b,\u9002\u5408\u6709\u4e00\u5b9aDocker\u57fa\u7840\u7684\u5f00\u53d1\u8005\u6df1\u5165\u5b66\u4e60\u548c\u53c2\u8003\u3002\u524d\u8a00<br \/>\n\u5728Docker\u7684\u4e16\u754c\u91cc,\u5bb9\u5668\u7684\u751f\u547d\u5468\u671f\u901a\u5e38\u662f\u77ed\u6682\u7684\u3002\u4e00\u4e2a\u5bb9\u5668\u53ef\u4ee5\u88ab\u521b\u5efa\u3001\u542f\u52a8\u3001\u505c\u6b62\u3001\u5220\u9664,\u800c\u5f53\u5bb9\u5668\u88ab\u5220\u9664\u65f6,\u5bb9\u5668\u5185\u90e8\u5199\u5165\u7684\u6240\u6709\u6570<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[27,371,305],"topic":[],"class_list":["post-92246","post","type-post","status-publish","format-standard","hentry","category-server","tag-docker","tag-371","tag-305"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>06-Docker\u5b58\u50a8\u4e0e\u6570\u636e\u6301\u4e45\u5316 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/92246.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"06-Docker\u5b58\u50a8\u4e0e\u6570\u636e\u6301\u4e45\u5316 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"Docker\u5b58\u50a8\u4e0e\u6570\u636e\u6301\u4e45\u5316\u672c\u6587\u662fDocker\u4e13\u680f\u7684\u7b2c\u516d\u7bc7\u6587\u7ae0,\u5c06\u5168\u9762\u6df1\u5165\u5730\u8bb2\u89e3Docker\u5b58\u50a8\u4f53\u7cfb\u3001\u5b58\u50a8\u9a71\u52a8\u3001\u6570\u636e\u5377\u3001\u7ed1\u5b9a\u6302\u8f7d\u3001tmpfs\u6302\u8f7d\u3001\u6570\u636e\u5377\u8fdb\u9636\u64cd\u4f5c\u3001Dockerfile\u5b58\u50a8\u914d\u7f6e\u3001\u6570\u636e\u5e93\u6301\u4e45\u5316\u65b9\u6848\u3001\u5b58\u50a8\u5b89\u5168\u4e0e\u5907\u4efd\u7b56\u7565\u4ee5\u53ca\u6545\u969c\u6392\u67e5\u7b49\u5168\u90e8\u77e5\u8bc6\u3002\u5168\u6587\u8d85\u8fc73\u4e07\u5b57,\u5305\u542b\u5927\u91cf\u5b9e\u6218\u6848\u4f8b\u4e0e\u4ee3\u7801\u793a\u4f8b,\u9002\u5408\u6709\u4e00\u5b9aDocker\u57fa\u7840\u7684\u5f00\u53d1\u8005\u6df1\u5165\u5b66\u4e60\u548c\u53c2\u8003\u3002\u524d\u8a00 \u5728Docker\u7684\u4e16\u754c\u91cc,\u5bb9\u5668\u7684\u751f\u547d\u5468\u671f\u901a\u5e38\u662f\u77ed\u6682\u7684\u3002\u4e00\u4e2a\u5bb9\u5668\u53ef\u4ee5\u88ab\u521b\u5efa\u3001\u542f\u52a8\u3001\u505c\u6b62\u3001\u5220\u9664,\u800c\u5f53\u5bb9\u5668\u88ab\u5220\u9664\u65f6,\u5bb9\u5668\u5185\u90e8\u5199\u5165\u7684\u6240\u6709\u6570\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/92246.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-09T12:17:20+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"74 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/92246.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/92246.html\",\"name\":\"06-Docker\u5b58\u50a8\u4e0e\u6570\u636e\u6301\u4e45\u5316 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-08-09T12:17:20+00:00\",\"dateModified\":\"2026-08-09T12:17:20+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/92246.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/92246.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/92246.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"06-Docker\u5b58\u50a8\u4e0e\u6570\u636e\u6301\u4e45\u5316\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"06-Docker\u5b58\u50a8\u4e0e\u6570\u636e\u6301\u4e45\u5316 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/92246.html","og_locale":"zh_CN","og_type":"article","og_title":"06-Docker\u5b58\u50a8\u4e0e\u6570\u636e\u6301\u4e45\u5316 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"Docker\u5b58\u50a8\u4e0e\u6570\u636e\u6301\u4e45\u5316\u672c\u6587\u662fDocker\u4e13\u680f\u7684\u7b2c\u516d\u7bc7\u6587\u7ae0,\u5c06\u5168\u9762\u6df1\u5165\u5730\u8bb2\u89e3Docker\u5b58\u50a8\u4f53\u7cfb\u3001\u5b58\u50a8\u9a71\u52a8\u3001\u6570\u636e\u5377\u3001\u7ed1\u5b9a\u6302\u8f7d\u3001tmpfs\u6302\u8f7d\u3001\u6570\u636e\u5377\u8fdb\u9636\u64cd\u4f5c\u3001Dockerfile\u5b58\u50a8\u914d\u7f6e\u3001\u6570\u636e\u5e93\u6301\u4e45\u5316\u65b9\u6848\u3001\u5b58\u50a8\u5b89\u5168\u4e0e\u5907\u4efd\u7b56\u7565\u4ee5\u53ca\u6545\u969c\u6392\u67e5\u7b49\u5168\u90e8\u77e5\u8bc6\u3002\u5168\u6587\u8d85\u8fc73\u4e07\u5b57,\u5305\u542b\u5927\u91cf\u5b9e\u6218\u6848\u4f8b\u4e0e\u4ee3\u7801\u793a\u4f8b,\u9002\u5408\u6709\u4e00\u5b9aDocker\u57fa\u7840\u7684\u5f00\u53d1\u8005\u6df1\u5165\u5b66\u4e60\u548c\u53c2\u8003\u3002\u524d\u8a00 \u5728Docker\u7684\u4e16\u754c\u91cc,\u5bb9\u5668\u7684\u751f\u547d\u5468\u671f\u901a\u5e38\u662f\u77ed\u6682\u7684\u3002\u4e00\u4e2a\u5bb9\u5668\u53ef\u4ee5\u88ab\u521b\u5efa\u3001\u542f\u52a8\u3001\u505c\u6b62\u3001\u5220\u9664,\u800c\u5f53\u5bb9\u5668\u88ab\u5220\u9664\u65f6,\u5bb9\u5668\u5185\u90e8\u5199\u5165\u7684\u6240\u6709\u6570","og_url":"https:\/\/www.wsisp.com\/helps\/92246.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-08-09T12:17:20+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"74 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/92246.html","url":"https:\/\/www.wsisp.com\/helps\/92246.html","name":"06-Docker\u5b58\u50a8\u4e0e\u6570\u636e\u6301\u4e45\u5316 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-08-09T12:17:20+00:00","dateModified":"2026-08-09T12:17:20+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/92246.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/92246.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/92246.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"06-Docker\u5b58\u50a8\u4e0e\u6570\u636e\u6301\u4e45\u5316"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/92246","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=92246"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/92246\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=92246"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=92246"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=92246"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=92246"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}