{"id":3376,"date":"2025-03-24T08:46:20","date_gmt":"2025-03-23T23:46:20","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=3376"},"modified":"2025-03-24T08:46:51","modified_gmt":"2025-03-23T23:46:51","slug":"docker-compose-%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%ef%bc%9a%e5%ae%9f%e8%b7%b5%e3%81%a7%e4%bd%bf%e3%81%88%e3%82%8byaml%e8%a8%ad%e5%ae%9a%e3%83%86%e3%83%b3%e3%83%97%e3%83%ac%e3%83%bc%e3%83%881","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=3376","title":{"rendered":"Docker Compose \u5b8c\u5168\u30ac\u30a4\u30c9\uff1a\u5b9f\u8df5\u3067\u4f7f\u3048\u308byaml\u8a2d\u5b9a\u30c6\u30f3\u30d7\u30ec\u30fc\u30c815\u9078"},"content":{"rendered":"\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">Docker Compose \u3068\u306f\uff1a\u958b\u767a\u74b0\u5883\u69cb\u7bc9\u306e\u6551\u4e16\u4e3b<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">\u8907\u6570\u30b3\u30f3\u30c6\u30ca\u7ba1\u7406\u306e\u8ab2\u984c\u3092\u89e3\u6c7a\u3059\u308b\u30c4\u30fc\u30eb<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-2\">docker-compose.yaml\u304c\u74b0\u5883\u69cb\u7bc9\u3092\u5287\u7684\u306b\u7c21\u7565\u5316\u3059\u308b\u7406\u7531<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-3\">docker-compose.yaml\u306e\u57fa\u672c\u69cb\u6587\u3092\u7406\u89e3\u3059\u308b<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-4\">\u30d0\u30fc\u30b8\u30e7\u30f3\u6307\u5b9a\u3067\u5909\u308f\u308b\u8a18\u8ff0\u65b9\u6cd5\u306e\u9055\u3044<\/a>      <\/li>      <li>        <a href=\"#i-5\">\u30b5\u30fc\u30d3\u30b9\u30d6\u30ed\u30c3\u30af\u3067\u5b9a\u7fa9\u3059\u308b\u30b3\u30f3\u30c6\u30ca\u306e\u8a2d\u5b9a<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-6\">\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3068\u30dc\u30ea\u30e5\u30fc\u30e0\u3067\u5b9f\u73fe\u3059\u308b\u30b3\u30f3\u30c6\u30ca\u9593\u9023\u643a<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-7\">\u5b9f\u8df5\u3067\u4f7f\u3048\u308bDocker Compose\u8a2d\u5b9a\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u96c6<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-8\">PHP + Nginx + MySQL\u306e\u958b\u767a\u74b0\u5883\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8<\/a>      <\/li>      <li>        <a href=\"#i-9\">WordPress\u30b5\u30a4\u30c8\u69cb\u7bc9\u306e\u305f\u3081\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8<\/a>      <\/li>      <li>        <a href=\"#i-10\">Laravel\u958b\u767a\u74b0\u5883\u306e\u30de\u30eb\u30c1\u30b3\u30f3\u30c6\u30ca\u8a2d\u5b9a<\/a>      <\/li>      <li>        <a href=\"#i-11\">Redis\u3092\u542b\u3080\u30ad\u30e3\u30c3\u30b7\u30e5\u30b5\u30fc\u30d0\u30fc\u69cb\u6210<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-12\">MongoDB + Express.js\u306eNoSQL\u958b\u767a\u74b0\u5883<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-13\">Docker Compose \u306e\u5b9f\u8df5\u7684\u306a\u30d2\u30f3\u30c8\u96c6<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-14\">\u74b0\u5883\u5909\u6570\u306e\u52b9\u679c\u7684\u306a\u4f7f\u7528\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-15\">\u672c\u756a\u74b0\u5883\u3068\u30b9\u30c6\u30fc\u30b8\u30f3\u30b0\u74b0\u5883\u306e\u5207\u308a\u66ff\u3048\u8a2d\u5b9a<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-16\">\u30b3\u30f3\u30c6\u30ca\u9593\u306e\u4f9d\u5b58\u95a2\u4fc2\u3092\u5236\u5fa1\u3059\u308bdepends_on<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-17\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30c7\u30d0\u30c3\u30b0\u624b\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-18\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-19\">\u30ed\u30b0\u78ba\u8a8d\u3068\u30c7\u30d0\u30c3\u30b0\u306e\u52b9\u7387\u7684\u306a\u53d6\u308a\u7d44\u307f<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-20\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-21\">Docker Compose \u6d3b\u7528\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-22\">\u4fdd\u5b88\u6027\u3092\u9ad8\u3081\u308b\u30d5\u30a1\u30a4\u30eb\u5206\u5272\u306e\u624b\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-23\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u8003\u616e\u3057\u305f\u8a2d\u5b9a\u306e\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-24\">CI\u30c4\u30fc\u30eb\u3068\u9023\u643a\u3067\u5b9f\u73fe\u3059\u308b\u81ea\u52d5\u5316<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">Docker Compose \u3068\u306f\uff1a\u958b\u767a\u74b0\u5883\u69cb\u7bc9\u306e\u6551\u4e16\u4e3b<\/h2>\n\n\n\n<p>\u73fe\u4ee3\u306eWeb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u958b\u767a\u306b\u304a\u3044\u3066\u3001\u8907\u6570\u306e\u30b5\u30fc\u30d3\u30b9\u3092\u9023\u643a\u3055\u305b\u308b\u5fc5\u8981\u6027\u306f\u65e5\u3005\u5897\u52a0\u3057\u3066\u3044\u307e\u3059\u3002\u4f8b\u3048\u3070\u3001\u5178\u578b\u7684\u306aWeb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001Web\u30b5\u30fc\u30d0\u30fc\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b5\u30fc\u30d0\u30fc\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3001\u30ad\u30e3\u30c3\u30b7\u30e5\u30b5\u30fc\u30d0\u30fc\u306a\u3069\u3001\u8907\u6570\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u304c\u5354\u8abf\u3057\u3066\u52d5\u4f5c\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002Docker Compose\u306f\u3001\u3053\u306e\u3088\u3046\u306a\u8907\u96d1\u306a\u958b\u767a\u74b0\u5883\u306e\u69cb\u7bc9\u3068\u7ba1\u7406\u3092\u5287\u7684\u306b\u7c21\u7565\u5316\u3059\u308b\u30c4\u30fc\u30eb\u3067\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">\u8907\u6570\u30b3\u30f3\u30c6\u30ca\u7ba1\u7406\u306e\u8ab2\u984c\u3092\u89e3\u6c7a\u3059\u308b\u30c4\u30fc\u30eb<\/h3>\n\n\n\n<p>\u5f93\u6765\u306eDocker\u5358\u4f53\u3067\u306e\u958b\u767a\u74b0\u5883\u69cb\u7bc9\u3067\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u8ab2\u984c\u304c\u5b58\u5728\u3057\u3066\u3044\u307e\u3057\u305f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8907\u6570\u306e\u30b3\u30f3\u30c6\u30ca\u3092\u500b\u5225\u306b\u8d77\u52d5\u30fb\u7ba1\u7406\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b<\/li>\n\n\n\n<li>\u30b3\u30f3\u30c6\u30ca\u9593\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u8a2d\u5b9a\u3092\u624b\u52d5\u3067\u884c\u3046\u5fc5\u8981\u304c\u3042\u308b<\/li>\n\n\n\n<li>\u74b0\u5883\u5909\u6570\u3084\u8a2d\u5b9a\u306e\u7ba1\u7406\u304c\u7169\u96d1\u306b\u306a\u308a\u3084\u3059\u3044<\/li>\n\n\n\n<li>\u30c1\u30fc\u30e0\u9593\u3067\u306e\u74b0\u5883\u306e\u5171\u6709\u3068\u518d\u73fe\u304c\u56f0\u96e3<\/li>\n<\/ul>\n\n\n\n<p>Docker Compose\u306f\u3001\u3053\u308c\u3089\u306e\u8ab2\u984c\u3092\u4e00\u3064\u306eYAML\u5f62\u5f0f\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3067\u89e3\u6c7a\u3057\u307e\u3059\u3002<code>docker-compose.yaml<\/code>\u3068\u3044\u3046\u5358\u4e00\u306e\u30d5\u30a1\u30a4\u30eb\u306b\u3001\u5fc5\u8981\u306a\u30b5\u30fc\u30d3\u30b9\u3001\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3001\u30dc\u30ea\u30e5\u30fc\u30e0\u3001\u74b0\u5883\u5909\u6570\u306a\u3069\u306e\u8a2d\u5b9a\u3092\u307e\u3068\u3081\u3066\u8a18\u8ff0\u3059\u308b\u3053\u3068\u3067\u3001\u8907\u6570\u306e\u30b3\u30f3\u30c6\u30ca\u3092\u4e00\u5143\u7ba1\u7406\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">docker-compose.yaml\u304c\u74b0\u5883\u69cb\u7bc9\u3092\u5287\u7684\u306b\u7c21\u7565\u5316\u3059\u308b\u7406\u7531<\/h3>\n\n\n\n<p>Docker Compose\u304c\u958b\u767a\u74b0\u5883\u69cb\u7bc9\u3092\u5287\u7684\u306b\u7c21\u7565\u5316\u3067\u304d\u308b\u7406\u7531\u306f\u3001\u4ee5\u4e0b\u306e\u7279\u5fb4\u306b\u3042\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5ba3\u8a00\u7684\u306a\u8a2d\u5b9a\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30a4\u30f3\u30d5\u30e9\u30b9\u30c8\u30e9\u30af\u30c1\u30e3\u3092\u30b3\u30fc\u30c9\u3068\u3057\u3066\u7ba1\u7406\uff08Infrastructure as Code\uff09<\/li>\n\n\n\n<li>\u74b0\u5883\u306e\u518d\u73fe\u6027\u304c\u9ad8\u304f\u3001\u30d0\u30fc\u30b8\u30e7\u30f3\u7ba1\u7406\u304c\u5bb9\u6613<\/li>\n\n\n\n<li>\u30c1\u30fc\u30e0\u9593\u3067\u306e\u5171\u6709\u304c\u7c21\u5358<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b7\u30f3\u30d7\u30eb\u306a\u30b3\u30de\u30f3\u30c9\u4f53\u7cfb<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>docker-compose up<\/code> \u3067\u5168\u74b0\u5883\u3092\u8d77\u52d5<\/li>\n\n\n\n<li><code>docker-compose down<\/code> \u3067\u5168\u74b0\u5883\u3092\u505c\u6b62\u30fb\u524a\u9664<\/li>\n\n\n\n<li>\u958b\u767a\u8005\u306e\u4f5c\u696d\u52b9\u7387\u304c\u5927\u5e45\u306b\u5411\u4e0a<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u67d4\u8edf\u306a\u74b0\u5883\u5909\u6570\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>.env<\/code>\u30d5\u30a1\u30a4\u30eb\u306b\u3088\u308b\u74b0\u5883\u5909\u6570\u306e\u4e00\u62ec\u7ba1\u7406<\/li>\n\n\n\n<li>\u958b\u767a\u74b0\u5883\u3068\u672c\u756a\u74b0\u5883\u306e\u5207\u308a\u66ff\u3048\u304c\u5bb9\u6613<\/li>\n\n\n\n<li>\u6a5f\u5bc6\u60c5\u5831\u306e\u5b89\u5168\u306a\u7ba1\u7406\u304c\u53ef\u80fd<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u81ea\u52d5\u7684\u306a\u4f9d\u5b58\u95a2\u4fc2\u89e3\u6c7a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b5\u30fc\u30d3\u30b9\u9593\u306e\u8d77\u52d5\u9806\u5e8f\u3092\u5236\u5fa1\u53ef\u80fd<\/li>\n\n\n\n<li>\u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af\u306b\u3088\u308b\u8d77\u52d5\u5b8c\u4e86\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>\u8907\u96d1\u306a\u30de\u30a4\u30af\u30ed\u30b5\u30fc\u30d3\u30b9\u74b0\u5883\u3067\u3082\u5b89\u5b9a\u3057\u305f\u8d77\u52d5\u3092\u5b9f\u73fe<\/li>\n<\/ul>\n\n\n\n<p>\u4f8b\u3048\u3070\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u7c21\u5358\u306a<code>docker-compose.yaml<\/code>\u306e\u8a18\u8ff0\u3060\u3051\u3067\u3001PHP\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u57fa\u672c\u7684\u306a\u958b\u767a\u74b0\u5883\u3092\u69cb\u7bc9\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">version: '3.8'\nservices:\n  app:\n    build: .\n    volumes:\n      - .:\/var\/www\/html\n    depends_on:\n      - db\n\n  db:\n    image: mysql:8.0\n    environment:\n      MYSQL_DATABASE: app\n      MYSQL_ROOT_PASSWORD: secret\n\n  nginx:\n    image: nginx:alpine\n    ports:\n      - \"80:80\"\n    volumes:\n      - .\/nginx.conf:\/etc\/nginx\/conf.d\/default.conf<\/pre>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306b\u3001Docker Compose\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u958b\u767a\u8005\u306f\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30fc\u30c9\u4f5c\u6210\u306b\u96c6\u4e2d\u3067\u304d\u3001\u74b0\u5883\u69cb\u7bc9\u306b\u304b\u304b\u308b\u6642\u9593\u3068\u30a8\u30cd\u30eb\u30ae\u30fc\u3092\u5927\u5e45\u306b\u524a\u6e1b\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u306e<code>docker-compose.yaml<\/code>\u306e\u57fa\u672c\u7684\u306a\u69cb\u6587\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-3\">docker-compose.yaml\u306e\u57fa\u672c\u69cb\u6587\u3092\u7406\u89e3\u3059\u308b<\/h2>\n\n\n\n<p>Docker Compose\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306f\u3001\u30b5\u30fc\u30d3\u30b9\u3001\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3001\u30dc\u30ea\u30e5\u30fc\u30e0\u306a\u3069\u306e\u8981\u7d20\u3092YAML\u5f62\u5f0f\u3067\u5b9a\u7fa9\u3057\u307e\u3059\u3002\u9069\u5207\u306a\u69cb\u6587\u3067\u8a18\u8ff0\u3059\u308b\u3053\u3068\u3067\u3001\u8907\u96d1\u306a\u958b\u767a\u74b0\u5883\u3082\u7c21\u5358\u306b\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-4\">\u30d0\u30fc\u30b8\u30e7\u30f3\u6307\u5b9a\u3067\u5909\u308f\u308b\u8a18\u8ff0\u65b9\u6cd5\u306e\u9055\u3044<\/h3>\n\n\n\n<p>Docker Compose\u306e\u30d5\u30a1\u30a4\u30eb\u5f62\u5f0f\u306b\u306f\u8907\u6570\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u304c\u5b58\u5728\u3057\u3001\u4f7f\u7528\u3059\u308b\u30d0\u30fc\u30b8\u30e7\u30f3\u306b\u3088\u3063\u3066\u5229\u7528\u53ef\u80fd\u306a\u6a5f\u80fd\u3084\u8a18\u8ff0\u65b9\u6cd5\u304c\u7570\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4e3b\u8981\u306a\u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u7279\u5fb4\uff1a<\/p>\n\n\n<div id=\"id-67f5f7db-aacb-4c01-a62b-f494ba993483\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30d0\u30fc\u30b8\u30e7\u30f3<\/th><th>\u4e3b\u306a\u7279\u5fb4<\/th><th>\u5bfe\u5fdc\u3059\u308bDocker Engine\u306e\u6700\u5c0f\u30d0\u30fc\u30b8\u30e7\u30f3<\/th><\/tr><\/thead><tbody><tr><td>3.8<\/td><td>\u6700\u65b0\u306e\u6a5f\u80fd\u3092\u30b5\u30dd\u30fc\u30c8\uff08GPU\u30ea\u30bd\u30fc\u30b9\u3001\u69cb\u6210\u306e\u62e1\u5f35\u6027\uff09<\/td><td>19.03.0+<\/td><\/tr><tr><td>3.7<\/td><td>\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u6a5f\u80fd\u3001\u74b0\u5883\u5909\u6570\u306e\u62e1\u5f35\u69cb\u6587<\/td><td>18.06.0+<\/td><\/tr><tr><td>3.3<\/td><td>\u9577\u671f\u30b5\u30dd\u30fc\u30c8\u7248\u3001\u5b89\u5b9a\u6027\u91cd\u8996<\/td><td>17.06.0+<\/td><\/tr><tr><td>2.x<\/td><td>\u30ec\u30ac\u30b7\u30fc\u30b5\u30dd\u30fc\u30c8\uff08\u975e\u63a8\u5968\uff09<\/td><td>1.10.0+<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>\u6700\u65b0\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306b version: \u20183.8\u2019 \u3092\u6307\u5b9a\u3059\u308b\u3053\u3068\u3092\u63a8\u5968\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">version: '3.8'\nservices:\n  # \u30b5\u30fc\u30d3\u30b9\u5b9a\u7fa9<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">\u30b5\u30fc\u30d3\u30b9\u30d6\u30ed\u30c3\u30af\u3067\u5b9a\u7fa9\u3059\u308b\u30b3\u30f3\u30c6\u30ca\u306e\u8a2d\u5b9a<\/h3>\n\n\n\n<p>\u30b5\u30fc\u30d3\u30b9\u30d6\u30ed\u30c3\u30af\u306f\u3001\u500b\u3005\u306e\u30b3\u30f3\u30c6\u30ca\u306e\u8a2d\u5b9a\u3092\u5b9a\u7fa9\u3059\u308b\u4e2d\u5fc3\u7684\u306a\u8981\u7d20\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n  webapp:\n    # \u30b3\u30f3\u30c6\u30ca\u306e\u30d9\u30fc\u30b9\u30a4\u30e1\u30fc\u30b8\u6307\u5b9a\n    image: nginx:alpine\n    # \u30ab\u30b9\u30bf\u30e0\u30d3\u30eb\u30c9\u8a2d\u5b9a\n    build: \n      context: .\/webapp\n      dockerfile: Dockerfile.dev\n    # \u30dd\u30fc\u30c8\u8ee2\u9001\u8a2d\u5b9a\n    ports:\n      - \"80:80\"\n      - \"443:443\"\n    # \u74b0\u5883\u5909\u6570\u8a2d\u5b9a\n    environment:\n      NODE_ENV: development\n      API_KEY: ${API_KEY}\n    # \u30dc\u30ea\u30e5\u30fc\u30e0\u30de\u30a6\u30f3\u30c8\n    volumes:\n      - .\/src:\/usr\/share\/nginx\/html\n    # \u30b3\u30f3\u30c6\u30ca\u306e\u30ea\u30bd\u30fc\u30b9\u5236\u9650\n    deploy:\n      resources:\n        limits:\n          cpus: '0.50'\n          memory: 512M<\/pre>\n\n\n\n<p>\u4e3b\u8981\u306a\u8a2d\u5b9a\u30aa\u30d7\u30b7\u30e7\u30f3\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>image \/ build<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u65e2\u5b58\u306e\u30a4\u30e1\u30fc\u30b8\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\u306f<code>image<\/code><\/li>\n\n\n\n<li>\u30ab\u30b9\u30bf\u30e0\u30d3\u30eb\u30c9\u3059\u308b\u5834\u5408\u306f<code>build<\/code><\/li>\n\n\n\n<li>\u3069\u3061\u3089\u304b\u4e00\u65b9\u3001\u307e\u305f\u306f\u4e21\u65b9\u3092\u6307\u5b9a\u53ef\u80fd<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>ports<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30db\u30b9\u30c8\u3068\u30b3\u30f3\u30c6\u30ca\u306e\u30dd\u30fc\u30c8\u30de\u30c3\u30d4\u30f3\u30b0<\/li>\n\n\n\n<li>\u77ed\u7e2e\u8a18\u6cd5: \u201c80:80\u201d<\/li>\n\n\n\n<li>\u8a73\u7d30\u8a18\u6cd5: \u201c`yaml ports:\n<ul class=\"wp-block-list\">\n<li>target: 80<br>published: 8080<br>protocol: tcp<br>\u201c`<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>environment \/ env_file<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u76f4\u63a5\u6307\u5b9a: <code>environment:<\/code><\/li>\n\n\n\n<li>\u30d5\u30a1\u30a4\u30eb\u6307\u5b9a: <code>env_file: .env<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3068\u30dc\u30ea\u30e5\u30fc\u30e0\u3067\u5b9f\u73fe\u3059\u308b\u30b3\u30f3\u30c6\u30ca\u9593\u9023\u643a<\/h3>\n\n\n\n<p>\u30b3\u30f3\u30c6\u30ca\u9593\u306e\u901a\u4fe1\u3068\u30c7\u30fc\u30bf\u6c38\u7d9a\u5316\u3092\u5b9f\u73fe\u3059\u308b\u305f\u3081\u306e\u8a2d\u5b9a\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">version: '3.8'\nservices:\n  frontend:\n    image: nginx:alpine\n    networks:\n      - frontend-network\n    volumes:\n      - static-content:\/usr\/share\/nginx\/html\n\n  backend:\n    image: php:8.1-fpm\n    networks:\n      - frontend-network\n      - backend-network\n    volumes:\n      - .\/src:\/var\/www\/html\n      - vendor-cache:\/var\/www\/vendor\n\nnetworks:\n  frontend-network:\n    driver: bridge\n  backend-network:\n    driver: bridge\n    internal: true  # \u5916\u90e8\u975e\u516c\u958b\n\nvolumes:\n  static-content:\n  vendor-cache:\n    driver: local\n    driver_opts:\n      type: none\n      device: ${PWD}\/cache\n      o: bind<\/pre>\n\n\n\n<p>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u8a2d\u5b9a\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u7a2e\u985e<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>bridge: \u540c\u4e00\u30db\u30b9\u30c8\u5185\u306e\u30b3\u30f3\u30c6\u30ca\u9593\u901a\u4fe1\uff08\u30c7\u30d5\u30a9\u30eb\u30c8\uff09<\/li>\n\n\n\n<li>host: \u30db\u30b9\u30c8\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u76f4\u63a5\u4f7f\u7528<\/li>\n\n\n\n<li>overlay: Swarm\u30e2\u30fc\u30c9\u3067\u306e\u30b3\u30f3\u30c6\u30ca\u9593\u901a\u4fe1<\/li>\n\n\n\n<li>none: \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u7121\u52b9<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u30aa\u30d7\u30b7\u30e7\u30f3<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>internal: true<\/code>: \u5916\u90e8\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3068\u306e\u9694\u96e2<\/li>\n\n\n\n<li><code>enable_ipv6: true<\/code>: IPv6\u30b5\u30dd\u30fc\u30c8<\/li>\n\n\n\n<li><code>attachable: true<\/code>: \u5916\u90e8\u30b3\u30f3\u30c6\u30ca\u304b\u3089\u306e\u63a5\u7d9a\u8a31\u53ef<\/li>\n<\/ul>\n\n\n\n<p>\u30dc\u30ea\u30e5\u30fc\u30e0\u8a2d\u5b9a\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u540d\u524d\u4ed8\u304d\u30dc\u30ea\u30e5\u30fc\u30e0<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c7\u30fc\u30bf\u306e\u6c38\u7d9a\u5316<\/li>\n\n\n\n<li>\u30b3\u30f3\u30c6\u30ca\u9593\u3067\u306e\u30c7\u30fc\u30bf\u5171\u6709<\/li>\n\n\n\n<li>\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e\u5bb9\u6613\u3055<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d0\u30a4\u30f3\u30c9\u30de\u30a6\u30f3\u30c8<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30db\u30b9\u30c8\u306e\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u3092\u76f4\u63a5\u30de\u30a6\u30f3\u30c8<\/li>\n\n\n\n<li>\u958b\u767a\u6642\u306e\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u540c\u671f\u306b\u6709\u7528<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3078\u306e\u5f71\u97ff\u3092\u8003\u616e<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u57fa\u672c\u69cb\u6587\u3092\u7406\u89e3\u3059\u308b\u3053\u3068\u3067\u3001\u5fc5\u8981\u306b\u5fdc\u3058\u3066\u8a2d\u5b9a\u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3057\u3001\u6700\u9069\u306a\u958b\u767a\u74b0\u5883\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u77e5\u8b58\u3092\u6d3b\u7528\u3057\u305f\u5b9f\u8df5\u7684\u306a\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u96c6\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-7\">\u5b9f\u8df5\u3067\u4f7f\u3048\u308bDocker Compose\u8a2d\u5b9a\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u96c6<\/h2>\n\n\n\n<p>\u5b9f\u969b\u306e\u958b\u767a\u73fe\u5834\u3067\u3059\u3050\u306b\u6d3b\u7528\u3067\u304d\u308b\u3001\u5b9f\u7528\u7684\u306aDocker Compose\u8a2d\u5b9a\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002\u5404\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306b\u306f\u3001\u672c\u756a\u74b0\u5883\u3067\u306e\u5229\u7528\u3092\u60f3\u5b9a\u3057\u305f\u8a2d\u5b9a\u3084\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8003\u616e\u4e8b\u9805\u3082\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-8\">PHP + Nginx + MySQL\u306e\u958b\u767a\u74b0\u5883\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8<\/h3>\n\n\n\n<p>\u6700\u3082\u4e00\u822c\u7684\u306aPHP\u958b\u767a\u74b0\u5883\u306e\u69cb\u6210\u4f8b\u3067\u3059\u3002\u958b\u767a\u52b9\u7387\u3068\u5b9f\u904b\u7528\u6027\u3092\u4e21\u7acb\u3055\u305b\u305f\u8a2d\u5b9a\u3068\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">version: '3.8'\nservices:\n  app:\n    build:\n      context: .\/php\n      dockerfile: Dockerfile\n    volumes:\n      - .\/src:\/var\/www\/html\n      - .\/php\/php.ini:\/usr\/local\/etc\/php\/php.ini\n    networks:\n      - app-network\n    depends_on:\n      - db\n    environment:\n      PHP_IDE_CONFIG: serverName=docker\n\n  nginx:\n    image: nginx:alpine\n    ports:\n      - \"80:80\"\n      - \"443:443\"\n    volumes:\n      - .\/src:\/var\/www\/html\n      - .\/nginx\/conf.d:\/etc\/nginx\/conf.d\n      - .\/nginx\/ssl:\/etc\/nginx\/ssl\n    networks:\n      - app-network\n    depends_on:\n      - app\n\n  db:\n    image: mysql:8.0\n    ports:\n      - \"3306:3306\"\n    volumes:\n      - mysql-data:\/var\/lib\/mysql\n      - .\/mysql\/conf.d:\/etc\/mysql\/conf.d\n      - .\/mysql\/initdb.d:\/docker-entrypoint-initdb.d\n    networks:\n      - app-network\n    environment:\n      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}\n      MYSQL_DATABASE: ${MYSQL_DATABASE}\n      MYSQL_USER: ${MYSQL_USER}\n      MYSQL_PASSWORD: ${MYSQL_PASSWORD}\n    command: --default-authentication-plugin=mysql_native_password\n\nnetworks:\n  app-network:\n    driver: bridge\n\nvolumes:\n  mysql-data:\n    driver: local<\/pre>\n\n\n\n<p>\u3053\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>PHP\u30b3\u30f3\u30c6\u30ca\u3068Nginx\u30b3\u30f3\u30c6\u30ca\u306e\u5206\u96e2\u306b\u3088\u308b\u6700\u9069\u306a\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406<\/li>\n\n\n\n<li>\u30ab\u30b9\u30bf\u30e0PHP\u8a2d\u5b9a\u3068Nginx\u8a2d\u5b9a\u306e\u5916\u90e8\u5316<\/li>\n\n\n\n<li>MySQL\u30c7\u30fc\u30bf\u306e\u6c38\u7d9a\u5316\u3068\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u5bb9\u6613\u6027\u306e\u78ba\u4fdd<\/li>\n\n\n\n<li>\u74b0\u5883\u5909\u6570\u306b\u3088\u308b\u6a5f\u5bc6\u60c5\u5831\u306e\u7ba1\u7406<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">WordPress\u30b5\u30a4\u30c8\u69cb\u7bc9\u306e\u305f\u3081\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8<\/h3>\n\n\n\n<p>WordPress\u958b\u767a\u74b0\u5883\u306b\u6700\u9069\u5316\u3055\u308c\u305f\u69cb\u6210\u3067\u3059\u3002\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u8003\u616e\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">version: '3.8'\nservices:\n  wordpress:\n    image: wordpress:php8.1-fpm-alpine\n    volumes:\n      - .\/wp-content:\/var\/www\/html\/wp-content\n      - .\/php.ini:\/usr\/local\/etc\/php\/php.ini\n    environment:\n      WORDPRESS_DB_HOST: db\n      WORDPRESS_DB_NAME: wordpress\n      WORDPRESS_DB_USER: wp_user\n      WORDPRESS_DB_PASSWORD: ${WP_DB_PASSWORD}\n      WORDPRESS_TABLE_PREFIX: wp_\n    networks:\n      - wordpress-network\n    depends_on:\n      - db\n\n  nginx:\n    image: nginx:alpine\n    ports:\n      - \"80:80\"\n    volumes:\n      - .\/nginx.conf:\/etc\/nginx\/conf.d\/default.conf\n      - .\/wp-content:\/var\/www\/html\/wp-content\n    networks:\n      - wordpress-network\n    depends_on:\n      - wordpress\n\n  db:\n    image: mysql:8.0\n    volumes:\n      - wordpress-db:\/var\/lib\/mysql\n    environment:\n      MYSQL_DATABASE: wordpress\n      MYSQL_USER: wp_user\n      MYSQL_PASSWORD: ${WP_DB_PASSWORD}\n      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}\n    networks:\n      - wordpress-network\n\n  redis:\n    image: redis:alpine\n    networks:\n      - wordpress-network\n\nnetworks:\n  wordpress-network:\n    driver: bridge\n\nvolumes:\n  wordpress-db:<\/pre>\n\n\n\n<p>\u7279\u5fb4\u3068\u5229\u70b9\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Redis\u306b\u3088\u308b\u30ad\u30e3\u30c3\u30b7\u30e5\u6a5f\u80fd\u306e\u7d71\u5408<\/li>\n\n\n\n<li>wp-content\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u6c38\u7d9a\u5316<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u81ea\u52d5\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u5bfe\u5fdc<\/li>\n\n\n\n<li>\u958b\u767a\u74b0\u5883\u3068\u672c\u756a\u74b0\u5883\u306e\u5bb9\u6613\u306a\u5207\u308a\u66ff\u3048<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">Laravel\u958b\u767a\u74b0\u5883\u306e\u30de\u30eb\u30c1\u30b3\u30f3\u30c6\u30ca\u8a2d\u5b9a<\/h3>\n\n\n\n<p>Laravel\u56fa\u6709\u306e\u8981\u4ef6\u306b\u5bfe\u5fdc\u3057\u305f\u958b\u767a\u74b0\u5883\u8a2d\u5b9a\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">version: '3.8'\nservices:\n  laravel:\n    build:\n      context: .\/docker\/php\n      dockerfile: Dockerfile\n    volumes:\n      - .:\/var\/www\/html\n      - .\/storage:\/var\/www\/html\/storage\n      - vendor:\/var\/www\/html\/vendor\n    networks:\n      - laravel-network\n    depends_on:\n      - db\n      - redis\n\n  nginx:\n    image: nginx:alpine\n    ports:\n      - \"80:80\"\n    volumes:\n      - .:\/var\/www\/html\n      - .\/docker\/nginx\/conf.d:\/etc\/nginx\/conf.d\n    networks:\n      - laravel-network\n    depends_on:\n      - laravel\n\n  db:\n    image: mysql:8.0\n    volumes:\n      - laravel-db:\/var\/lib\/mysql\n    environment:\n      MYSQL_DATABASE: laravel\n      MYSQL_USER: laravel\n      MYSQL_PASSWORD: ${DB_PASSWORD}\n      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}\n    networks:\n      - laravel-network\n\n  redis:\n    image: redis:alpine\n    volumes:\n      - redis-data:\/data\n    networks:\n      - laravel-network\n\n  queue:\n    build:\n      context: .\/docker\/php\n      dockerfile: Dockerfile\n    command: php artisan queue:work\n    volumes:\n      - .:\/var\/www\/html\n    networks:\n      - laravel-network\n    depends_on:\n      - db\n      - redis\n\nnetworks:\n  laravel-network:\n    driver: bridge\n\nvolumes:\n  laravel-db:\n  redis-data:\n  vendor:<\/pre>\n\n\n\n<p>Laravel\u74b0\u5883\u306e\u7279\u5fb4\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Artisan\u30b3\u30de\u30f3\u30c9\u5b9f\u884c\u7528\u306e\u5c02\u7528\u30b3\u30f3\u30c6\u30ca<\/li>\n\n\n\n<li>\u30ad\u30e5\u30fc\u30ef\u30fc\u30ab\u30fc\u306e\u500b\u5225\u7ba1\u7406<\/li>\n\n\n\n<li>Redis\u30bb\u30c3\u30b7\u30e7\u30f3\u7ba1\u7406\u306e\u7d71\u5408<\/li>\n\n\n\n<li>Composer\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u6c38\u7d9a\u5316<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">Redis\u3092\u542b\u3080\u30ad\u30e3\u30c3\u30b7\u30e5\u30b5\u30fc\u30d0\u30fc\u69cb\u6210<\/h3>\n\n\n\n<p>\u9ad8\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306a\u30ad\u30e3\u30c3\u30b7\u30e5\u5c64\u306e\u5b9f\u88c5\u4f8b\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">version: '3.8'\nservices:\n  redis-master:\n    image: redis:6-alpine\n    command: redis-server --requirepass ${REDIS_PASSWORD}\n    ports:\n      - \"6379:6379\"\n    volumes:\n      - redis-master-data:\/data\n    networks:\n      - cache-network\n\n  redis-slave:\n    image: redis:6-alpine\n    command: redis-server --slaveof redis-master 6379 --requirepass ${REDIS_PASSWORD} --masterauth ${REDIS_PASSWORD}\n    depends_on:\n      - redis-master\n    networks:\n      - cache-network\n\n  redis-sentinel:\n    build:\n      context: .\/sentinel\n      dockerfile: Dockerfile\n    depends_on:\n      - redis-master\n      - redis-slave\n    networks:\n      - cache-network\n\nnetworks:\n  cache-network:\n    driver: bridge\n\nvolumes:\n  redis-master-data:<\/pre>\n\n\n\n<p>\u30ad\u30e3\u30c3\u30b7\u30e5\u69cb\u6210\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30de\u30b9\u30bf\u30fc\/\u30b9\u30ec\u30fc\u30d6\u30ec\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3<\/li>\n\n\n\n<li>Sentinel\u306b\u3088\u308b\u81ea\u52d5\u30d5\u30a7\u30a4\u30eb\u30aa\u30fc\u30d0\u30fc<\/li>\n\n\n\n<li>\u30d1\u30b9\u30ef\u30fc\u30c9\u8a8d\u8a3c\u306b\u3088\u308b\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5f37\u5316<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u6c38\u7d9a\u5316\u30aa\u30d7\u30b7\u30e7\u30f3<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-12\">MongoDB + Express.js\u306eNoSQL\u958b\u767a\u74b0\u5883<\/h3>\n\n\n\n<p>NoSQL\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4f7f\u7528\u3059\u308bNode.js\u958b\u767a\u74b0\u5883\u306e\u4f8b\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">version: '3.8'\nservices:\n  app:\n    build:\n      context: .\n      dockerfile: Dockerfile\n    ports:\n      - \"3000:3000\"\n    volumes:\n      - .:\/usr\/src\/app\n      - node_modules:\/usr\/src\/app\/node_modules\n    environment:\n      - NODE_ENV=development\n      - MONGO_URL=mongodb:\/\/mongo:27017\/myapp\n    networks:\n      - mern-network\n    depends_on:\n      - mongo\n\n  mongo:\n    image: mongo:latest\n    ports:\n      - \"27017:27017\"\n    volumes:\n      - mongodb-data:\/data\/db\n      - .\/mongo-init.js:\/docker-entrypoint-initdb.d\/mongo-init.js\n    environment:\n      - MONGO_INITDB_ROOT_USERNAME=${MONGO_ROOT_USER}\n      - MONGO_INITDB_ROOT_PASSWORD=${MONGO_ROOT_PASSWORD}\n    networks:\n      - mern-network\n\n  mongo-express:\n    image: mongo-express\n    ports:\n      - \"8081:8081\"\n    environment:\n      - ME_CONFIG_MONGODB_ADMINUSERNAME=${MONGO_ROOT_USER}\n      - ME_CONFIG_MONGODB_ADMINPASSWORD=${MONGO_ROOT_PASSWORD}\n      - ME_CONFIG_MONGODB_URL=mongodb:\/\/mongo:27017\/\n    networks:\n      - mern-network\n    depends_on:\n      - mongo\n\nnetworks:\n  mern-network:\n    driver: bridge\n\nvolumes:\n  mongodb-data:\n  node_modules:<\/pre>\n\n\n\n<p>NoSQL\u74b0\u5883\u306e\u7279\u5fb4\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>MongoDB\u7ba1\u7406\u30c4\u30fc\u30eb\uff08mongo-express\uff09\u306e\u7d71\u5408<\/li>\n\n\n\n<li>Node.js\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u52b9\u7387\u7684\u306a\u7ba1\u7406<\/li>\n\n\n\n<li>\u521d\u671f\u5316\u30b9\u30af\u30ea\u30d7\u30c8\u306b\u3088\u308b\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u8a2d\u5b9a\u306e\u81ea\u52d5\u5316<\/li>\n\n\n\n<li>\u958b\u767a\u52b9\u7387\u3092\u91cd\u8996\u3057\u305f\u30db\u30c3\u30c8\u30ea\u30ed\u30fc\u30c9\u5bfe\u5fdc<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306f\u3001\u305d\u308c\u305e\u308c\u306e\u958b\u767a\u30cb\u30fc\u30ba\u306b\u5fdc\u3058\u3066\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3057\u3066\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u74b0\u5883\u3092\u3088\u308a\u52b9\u679c\u7684\u306b\u904b\u7528\u3059\u308b\u305f\u3081\u306e\u5b9f\u8df5\u7684\u306a\u30d2\u30f3\u30c8\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-13\">Docker Compose \u306e\u5b9f\u8df5\u7684\u306a\u30d2\u30f3\u30c8\u96c6<\/h2>\n\n\n\n<p>Docker Compose\u3092\u672c\u756a\u74b0\u5883\u3067\u52b9\u679c\u7684\u306b\u6d3b\u7528\u3059\u308b\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3068\u5b9f\u8df5\u7684\u306a\u30d2\u30f3\u30c8\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">\u74b0\u5883\u5909\u6570\u306e\u52b9\u679c\u7684\u306a\u4f7f\u7528\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u74b0\u5883\u5909\u6570\u306e\u9069\u5207\u306a\u7ba1\u7406\u306f\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3068\u67d4\u8edf\u6027\u306e\u4e21\u9762\u3067\u91cd\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># .env.example\nDB_HOST=mysql\nDB_PORT=3306\nDB_DATABASE=myapp\nDB_USERNAME=dbuser\nDB_PASSWORD=secret\nREDIS_HOST=redis\nREDIS_PASSWORD=secret\nAPP_KEY=base64:your-base64-encoded-key<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># docker-compose.yaml\nversion: '3.8'\nservices:\n  app:\n    build: .\n    environment:\n      - DB_HOST=${DB_HOST}\n      - DB_PORT=${DB_PORT}\n      - DB_DATABASE=${DB_DATABASE}\n      - DB_USERNAME=${DB_USERNAME}\n      - DB_PASSWORD=${DB_PASSWORD}\n      - REDIS_HOST=${REDIS_HOST}\n      - REDIS_PASSWORD=${REDIS_PASSWORD}\n      - APP_KEY=${APP_KEY}<\/pre>\n\n\n\n<p>\u74b0\u5883\u5909\u6570\u7ba1\u7406\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8907\u6570\u306e\u74b0\u5883\u30d5\u30a1\u30a4\u30eb\u306e\u4f7f\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   # \u958b\u767a\u74b0\u5883\u7528\n   docker-compose --env-file .env.development up\n\n   # \u30b9\u30c6\u30fc\u30b8\u30f3\u30b0\u74b0\u5883\u7528\n   docker-compose --env-file .env.staging up\n\n   # \u672c\u756a\u74b0\u5883\u7528\n   docker-compose --env-file .env.production up<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u6a5f\u5bc6\u60c5\u5831\u306e\u5b89\u5168\u306a\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>.env<\/code>\u30d5\u30a1\u30a4\u30eb\u306f\u30d0\u30fc\u30b8\u30e7\u30f3\u7ba1\u7406\u304b\u3089\u9664\u5916<\/li>\n\n\n\n<li>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u306f<code>.env.example<\/code>\u306e\u307f\u3092\u30b3\u30df\u30c3\u30c8<\/li>\n\n\n\n<li>\u672c\u756a\u74b0\u5883\u306e\u5024\u306f\u5b89\u5168\u306a\u65b9\u6cd5\u3067\u7ba1\u7406\u8005\u9593\u3067\u5171\u6709<\/li>\n<\/ul>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u5909\u6570\u306e\u5c55\u958b\u3068\u6761\u4ef6\u5206\u5c90<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   services:\n     app:\n       environment:\n         - NODE_ENV=${NODE_ENV:-development}\n         - PORT=${PORT:-3000}\n         - DB_URL=${DB_URL:-mongodb:\/\/localhost:27017}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-15\">\u672c\u756a\u74b0\u5883\u3068\u30b9\u30c6\u30fc\u30b8\u30f3\u30b0\u74b0\u5883\u306e\u5207\u308a\u66ff\u3048\u8a2d\u5b9a<\/h3>\n\n\n\n<p>\u7570\u306a\u308b\u74b0\u5883\u306b\u5bfe\u5fdc\u3059\u308b\u305f\u3081\u306e\u52b9\u679c\u7684\u306a\u8a2d\u5b9a\u7ba1\u7406\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># docker-compose.base.yaml\nversion: '3.8'\nservices:\n  app:\n    build: .\n    networks:\n      - app-network\n\n  db:\n    image: mysql:8.0\n    networks:\n      - app-network\n\nnetworks:\n  app-network:\n    driver: bridge<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># docker-compose.development.yaml\nversion: '3.8'\nservices:\n  app:\n    volumes:\n      - .:\/app\n    environment:\n      - DEBUG=true\n    ports:\n      - \"3000:3000\"\n      - \"9229:9229\"  # \u30c7\u30d0\u30c3\u30b0\u30dd\u30fc\u30c8\n\n  db:\n    ports:\n      - \"3306:3306\"\n    volumes:\n      - db-data:\/var\/lib\/mysql\n    environment:\n      - MYSQL_ROOT_PASSWORD=development_password\n\nvolumes:\n  db-data:<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># docker-compose.production.yaml\nversion: '3.8'\nservices:\n  app:\n    restart: always\n    deploy:\n      replicas: 3\n      resources:\n        limits:\n          cpus: '0.5'\n          memory: 512M\n    environment:\n      - NODE_ENV=production\n\n  db:\n    restart: always\n    volumes:\n      - \/data\/mysql:\/var\/lib\/mysql\n    environment:\n      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}<\/pre>\n\n\n\n<p>\u74b0\u5883\u5207\u308a\u66ff\u3048\u306e\u30b3\u30de\u30f3\u30c9\u4f8b\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u958b\u767a\u74b0\u5883\u306e\u8d77\u52d5\ndocker-compose -f docker-compose.base.yaml -f docker-compose.development.yaml up\n\n# \u672c\u756a\u74b0\u5883\u306e\u8d77\u52d5\ndocker-compose -f docker-compose.base.yaml -f docker-compose.production.yaml up -d<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-16\">\u30b3\u30f3\u30c6\u30ca\u9593\u306e\u4f9d\u5b58\u95a2\u4fc2\u3092\u5236\u5fa1\u3059\u308bdepends_on<\/h3>\n\n\n\n<p>\u30b5\u30fc\u30d3\u30b9\u9593\u306e\u8d77\u52d5\u9806\u5e8f\u3068\u4f9d\u5b58\u95a2\u4fc2\u3092\u9069\u5207\u306b\u7ba1\u7406\u3059\u308b\u3053\u3068\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5b89\u5b9a\u6027\u306b\u91cd\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">version: '3.8'\nservices:\n  app:\n    build: .\n    depends_on:\n      db:\n        condition: service_healthy\n      redis:\n        condition: service_healthy\n    healthcheck:\n      test: [\"CMD\", \"curl\", \"-f\", \"http:\/\/localhost:3000\/health\"]\n      interval: 30s\n      timeout: 10s\n      retries: 3\n      start_period: 40s\n\n  db:\n    image: mysql:8.0\n    healthcheck:\n      test: [\"CMD\", \"mysqladmin\", \"ping\", \"-h\", \"localhost\"]\n      interval: 10s\n      timeout: 5s\n      retries: 5\n      start_period: 30s\n\n  redis:\n    image: redis:alpine\n    healthcheck:\n      test: [\"CMD\", \"redis-cli\", \"ping\"]\n      interval: 10s\n      timeout: 5s\n      retries: 3\n      start_period: 20s<\/pre>\n\n\n\n<p>depends_on\u306e\u9ad8\u5ea6\u306a\u4f7f\u7528\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5404\u30b5\u30fc\u30d3\u30b9\u306e\u8d77\u52d5\u72b6\u614b\u3092\u78ba\u5b9f\u306b\u691c\u8a3c<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30bf\u30a4\u30df\u30f3\u30b0\u3067\u306e\u4f9d\u5b58\u30b5\u30fc\u30d3\u30b9\u3078\u306e\u63a5\u7d9a<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u6642\u306e\u81ea\u52d5\u30ea\u30ab\u30d0\u30ea\u30fc<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8d77\u52d5\u9806\u5e8f\u306e\u5236\u5fa1<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   services:\n     db:\n       image: mysql:8.0\n\n     cache:\n       image: redis:alpine\n       depends_on:\n         - db\n\n     app:\n       build: .\n       depends_on:\n         - db\n         - cache<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u6761\u4ef6\u4ed8\u304d\u8d77\u52d5\u306e\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   services:\n     app:\n       depends_on:\n         db:\n           condition: service_healthy\n           restart: true<\/pre>\n\n\n\n<p>\u5b9f\u8df5\u7684\u306a\u30d2\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ea\u30bd\u30fc\u30b9\u5236\u9650\u306e\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   services:\n     app:\n       deploy:\n         resources:\n           limits:\n             cpus: '0.50'\n             memory: 512M\n           reservations:\n             cpus: '0.25'\n             memory: 256M<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30ed\u30ae\u30f3\u30b0\u306e\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   services:\n     app:\n       logging:\n         driver: \"json-file\"\n         options:\n           max-size: \"10m\"\n           max-file: \"3\"<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u30bb\u30b0\u30e1\u30f3\u30c6\u30fc\u30b7\u30e7\u30f3<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   services:\n     frontend:\n       networks:\n         - frontend-network\n\n     backend:\n       networks:\n         - frontend-network\n         - backend-network\n\n     db:\n       networks:\n         - backend-network\n\n   networks:\n     frontend-network:\n     backend-network:\n       internal: true<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u8df5\u7684\u306a\u30d2\u30f3\u30c8\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u5b89\u5b9a\u3057\u305f\u904b\u7528\u74b0\u5883\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u5b9f\u969b\u306e\u904b\u7528\u3067\u906d\u9047\u3059\u308b\u53ef\u80fd\u6027\u306e\u3042\u308b\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30c7\u30d0\u30c3\u30b0\u624b\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-17\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30c7\u30d0\u30c3\u30b0\u624b\u6cd5<\/h2>\n\n\n\n<p>Docker Compose\u74b0\u5883\u3067\u767a\u751f\u3059\u308b\u4e00\u822c\u7684\u306a\u554f\u984c\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5\u3001\u52b9\u7387\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u624b\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-18\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b3\u30f3\u30c6\u30ca\u8d77\u52d5\u6642\u306e\u30a8\u30e9\u30fc<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u4f8b\nError response from daemon: Ports are not available: listen tcp 0.0.0.0:3306: bind: address already in use<\/pre>\n\n\n\n<p>\u89e3\u6c7a\u624b\u9806\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u4f7f\u7528\u4e2d\u306e\u30dd\u30fc\u30c8\u306e\u78ba\u8a8d\nsudo lsof -i :3306\n\n# \u7af6\u5408\u3059\u308b\u30d7\u30ed\u30bb\u30b9\u306e\u505c\u6b62\nsudo service mysql stop  # \u30ed\u30fc\u30ab\u30eb\u306eMySQL\u304c\u52d5\u3044\u3066\u3044\u308b\u5834\u5408\n\n# \u307e\u305f\u306f\u5168\u3066\u306e\u30b3\u30f3\u30c6\u30ca\u3092\u505c\u6b62\u3057\u3066\u518d\u8d77\u52d5\ndocker-compose down\ndocker-compose up -d<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u95a2\u9023\u306e\u30a8\u30e9\u30fc<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u4f8b\nERROR: Network backend-network declared as internal but is used by a service with public ports<\/pre>\n\n\n\n<p>\u89e3\u6c7a\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># docker-compose.yaml\nnetworks:\n  frontend-network:\n    driver: bridge\n  backend-network:\n    driver: bridge\n    internal: true  # \u5185\u90e8\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u6b63\u3057\u3044\u8a2d\u5b9a\n\nservices:\n  web:\n    networks:\n      - frontend-network  # \u516c\u958b\u30dd\u30fc\u30c8\u3092\u6301\u3064\u30b5\u30fc\u30d3\u30b9\u306f\u5916\u90e8\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306b\u63a5\u7d9a\n  db:\n    networks:\n      - backend-network  # \u5185\u90e8\u30b5\u30fc\u30d3\u30b9\u306f\u5185\u90e8\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u307f\u306b\u63a5\u7d9a<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30dc\u30ea\u30e5\u30fc\u30e0\u95a2\u9023\u306e\u30a8\u30e9\u30fc<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u4f8b\nERROR: for db  Cannot create container for service db: create .: volume name is too short<\/pre>\n\n\n\n<p>\u89e3\u6c7a\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">version: '3.8'\nservices:\n  db:\n    volumes:\n      - mysql_data:\/var\/lib\/mysql  # \u660e\u793a\u7684\u306a\u30dc\u30ea\u30e5\u30fc\u30e0\u540d\u306e\u6307\u5b9a\n\nvolumes:\n  mysql_data:  # \u30c8\u30c3\u30d7\u30ec\u30d9\u30eb\u3067\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u5b9a\u7fa9\n    name: myproject_mysql_data  # \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u56fa\u6709\u306e\u540d\u524d\u3092\u4ed8\u3051\u308b<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">\u30ed\u30b0\u78ba\u8a8d\u3068\u30c7\u30d0\u30c3\u30b0\u306e\u52b9\u7387\u7684\u306a\u53d6\u308a\u7d44\u307f<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ed\u30b0\u306e\u78ba\u8a8d\u65b9\u6cd5<\/strong><\/li>\n<\/ol>\n\n\n\n<p>\u57fa\u672c\u7684\u306a\u30ed\u30b0\u78ba\u8a8d\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u5168\u3066\u306e\u30b5\u30fc\u30d3\u30b9\u306e\u30ed\u30b0\u3092\u8868\u793a\ndocker-compose logs\n\n# \u7279\u5b9a\u306e\u30b5\u30fc\u30d3\u30b9\u306e\u30ed\u30b0\u3092\u8868\u793a\ndocker-compose logs app\n\n# \u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u3067\u30ed\u30b0\u3092\u8ffd\u8de1\ndocker-compose logs -f\n\n# \u6700\u65b0\u306e100\u884c\u306e\u307f\u8868\u793a\ndocker-compose logs --tail=100<\/pre>\n\n\n\n<p>\u9ad8\u5ea6\u306a\u30ed\u30b0\u7ba1\u7406\u8a2d\u5b9a\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n  app:\n    logging:\n      driver: \"json-file\"\n      options:\n        max-size: \"10m\"\n        max-file: \"3\"\n        labels: \"app_logs\"\n        env: \"production\"<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<p>\u30c7\u30d0\u30c3\u30b0\u7528\u306e\u8a2d\u5b9a\u4f8b\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n  app:\n    build:\n      context: .\n      dockerfile: Dockerfile.dev\n    environment:\n      - DEBUG=true\n      - NODE_ENV=development\n    volumes:\n      - .:\/app\n      - \/app\/node_modules\n    command: [\"npm\", \"run\", \"debug\"]\n    ports:\n      - \"9229:9229\"  # Node.js\u30c7\u30d0\u30c3\u30b0\u30dd\u30fc\u30c8<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30b3\u30f3\u30c6\u30ca\u5185\u90e8\u306e\u8abf\u67fb<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30b3\u30f3\u30c6\u30ca\u5185\u3067\u30b7\u30a7\u30eb\u3092\u5b9f\u884c\ndocker-compose exec app sh\n\n# \u7279\u5b9a\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\ndocker-compose exec db mysql -u root -p\n\n# \u30d7\u30ed\u30bb\u30b9\u4e00\u89a7\u306e\u78ba\u8a8d\ndocker-compose top<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-20\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ea\u30bd\u30fc\u30b9\u4f7f\u7528\u91cf\u306e\u76e3\u8996<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30b3\u30f3\u30c6\u30ca\u306e\u30ea\u30bd\u30fc\u30b9\u4f7f\u7528\u72b6\u6cc1\u3092\u78ba\u8a8d\ndocker stats\n\n# \u7279\u5b9a\u306e\u30b5\u30fc\u30d3\u30b9\u306e\u8a73\u7d30\u306a\u72b6\u614b\u3092\u78ba\u8a8d\ndocker-compose ps\ndocker inspect &lt;container_id&gt;<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u8a2d\u5b9a\u306e\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n  app:\n    deploy:\n      resources:\n        limits:\n          cpus: '0.5'\n          memory: 512M\n        reservations:\n          cpus: '0.25'\n          memory: 256M\n\n    # \u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u6d3b\u7528\n    volumes:\n      - cache:\/tmp\/cache\n\n  db:\n    command: mysqld --performance_schema=OFF\n    volumes:\n      - .\/mysql\/my.cnf:\/etc\/mysql\/conf.d\/my.cnf:ro\n\nvolumes:\n  cache:<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u4e00\u822c\u7684\u306a\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u554f\u984c\u306e\u89e3\u6c7a\u7b56<\/strong><\/li>\n<\/ol>\n\n\n\n<p>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u6539\u5584\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n  app:\n    dns:\n      - 8.8.8.8\n      - 8.8.4.4\n    networks:\n      app_net:\n        ipv4_address: 172.16.238.10\n\nnetworks:\n  app_net:\n    driver: bridge\n    driver_opts:\n      com.docker.network.driver.mtu: 1450<\/pre>\n\n\n\n<p>\u30dc\u30ea\u30e5\u30fc\u30e0\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u6700\u9069\u5316\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n  app:\n    volumes:\n      - type: bind\n        source: .\/src\n        target: \/app\n        consistency: cached  # MacOS\u3067\u306e\u6027\u80fd\u6539\u5584<\/pre>\n\n\n\n<p>\u30c7\u30d0\u30c3\u30b0\u306e\u305f\u3081\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8d77\u52d5\u6642\u306e\u78ba\u8a8d\u4e8b\u9805<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b3\u30f3\u30c6\u30ca\u306e\u30b9\u30c6\u30fc\u30bf\u30b9\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u63a5\u7d9a\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30de\u30a6\u30f3\u30c8\u72b6\u614b\u78ba\u8a8d<\/li>\n\n\n\n<li>\u74b0\u5883\u5909\u6570\u306e\u8a2d\u5b9a\u78ba\u8a8d<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5b9f\u884c\u6642\u306e\u78ba\u8a8d\u4e8b\u9805<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ea\u30bd\u30fc\u30b9\u4f7f\u7528\u72b6\u6cc1\u306e\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u30ed\u30b0\u306e\u76e3\u8996<\/li>\n\n\n\n<li>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5fdc\u7b54\u6642\u9593\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u5206\u6790<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c8\u30e9\u30d6\u30eb\u767a\u751f\u6642\u306e\u5bfe\u5fdc\u624b\u9806<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30a8\u30e9\u30fc\u30ed\u30b0\u306e\u53ce\u96c6<\/li>\n\n\n\n<li>\u30b3\u30f3\u30c6\u30ca\u306e\u518d\u8d77\u52d5<\/li>\n\n\n\n<li>\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u691c\u8a3c<\/li>\n\n\n\n<li>\u4f9d\u5b58\u95a2\u4fc2\u306e\u78ba\u8a8d<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30c7\u30d0\u30c3\u30b0\u624b\u6cd5\u3092\u7406\u89e3\u3059\u308b\u3053\u3068\u3067\u3001Docker Compose\u74b0\u5883\u3067\u767a\u751f\u3059\u308b\u554f\u984c\u306b\u52b9\u7387\u7684\u306b\u5bfe\u5fdc\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001Docker Compose\u6d3b\u7528\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-21\">Docker Compose \u6d3b\u7528\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<p>\u9577\u671f\u7684\u306a\u904b\u7528\u3092\u898b\u636e\u3048\u305f Docker Compose \u306e\u52b9\u679c\u7684\u306a\u6d3b\u7528\u65b9\u6cd5\u3068\u3001\u30c1\u30fc\u30e0\u958b\u767a\u306b\u304a\u3051\u308b\u5b9f\u8df5\u7684\u306a\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-22\">\u4fdd\u5b88\u6027\u3092\u9ad8\u3081\u308b\u30d5\u30a1\u30a4\u30eb\u5206\u5272\u306e\u624b\u6cd5<\/h3>\n\n\n\n<p>\u5927\u898f\u6a21\u306a\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306f\u3001Docker Compose \u30d5\u30a1\u30a4\u30eb\u3092\u9069\u5207\u306b\u5206\u5272\u3059\u308b\u3053\u3068\u3067\u3001\u4fdd\u5b88\u6027\u3068\u518d\u5229\u7528\u6027\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u74b0\u5883\u5225\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u5206\u5272<\/strong><\/li>\n<\/ol>\n\n\n\n<p>\u57fa\u672c\u69cb\u6210\u30d5\u30a1\u30a4\u30eb\uff08docker-compose.yaml\uff09:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">version: '3.8'\nservices:\n  app:\n    build:\n      context: .\n      target: development\n    volumes:\n      - .:\/app\n    networks:\n      - app-network\n\n  db:\n    image: mysql:8.0\n    networks:\n      - app-network\n\nnetworks:\n  app-network:<\/pre>\n\n\n\n<p>\u958b\u767a\u74b0\u5883\u7528\uff08docker-compose.dev.yaml\uff09:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n  app:\n    environment:\n      - NODE_ENV=development\n      - DEBUG=true\n    ports:\n      - \"3000:3000\"\n      - \"9229:9229\"\n    volumes:\n      - .:\/app\n      - \/app\/node_modules\n\n  db:\n    ports:\n      - \"3306:3306\"\n    environment:\n      - MYSQL_ROOT_PASSWORD=development\n    volumes:\n      - db_data:\/var\/lib\/mysql\n\nvolumes:\n  db_data:<\/pre>\n\n\n\n<p>\u672c\u756a\u74b0\u5883\u7528\uff08docker-compose.prod.yaml\uff09:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n  app:\n    build:\n      target: production\n    environment:\n      - NODE_ENV=production\n    deploy:\n      replicas: 3\n      update_config:\n        parallelism: 1\n        delay: 10s\n    restart: always\n\n  db:\n    environment:\n      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}\n    volumes:\n      - \/data\/mysql:\/var\/lib\/mysql\n    restart: always<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u6a5f\u80fd\u5225\u306e\u30d5\u30a1\u30a4\u30eb\u5206\u5272<\/strong><\/li>\n<\/ol>\n\n\n\n<p>\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u8a2d\u5b9a\uff08docker-compose.monitoring.yaml\uff09:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n  prometheus:\n    image: prom\/prometheus\n    volumes:\n      - .\/prometheus.yml:\/etc\/prometheus\/prometheus.yml\n    ports:\n      - \"9090:9090\"\n\n  grafana:\n    image: grafana\/grafana\n    ports:\n      - \"3000:3000\"\n    depends_on:\n      - prometheus<\/pre>\n\n\n\n<p>\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u8a2d\u5b9a\uff08docker-compose.backup.yaml\uff09:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n  backup:\n    image: backup-service\n    volumes:\n      - db_data:\/backup\/data:ro\n    environment:\n      - AWS_ACCESS_KEY_ID=${AWS_KEY}\n      - AWS_SECRET_ACCESS_KEY=${AWS_SECRET}\n    command: [\"backup\", \"--destination\", \"s3:\/\/my-bucket\/backup\"]<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-23\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u8003\u616e\u3057\u305f\u8a2d\u5b9a\u306e\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6700\u5c0f\u6a29\u9650\u306e\u539f\u5247\u306b\u57fa\u3065\u304f\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n  app:\n    user: node\n    security_opt:\n      - no-new-privileges:true\n    read_only: true\n    tmpfs:\n      - \/tmp\n      - \/var\/run\n    environment:\n      - NODE_ENV=production\n    secrets:\n      - db_password\n      - api_key\n\n  db:\n    user: mysql\n    security_opt:\n      - no-new-privileges:true\n    environment:\n      - MYSQL_ROOT_PASSWORD_FILE=\/run\/secrets\/db_root_password\n    secrets:\n      - db_root_password\n\nsecrets:\n  db_password:\n    file: .\/secrets\/db_password.txt\n  api_key:\n    file: .\/secrets\/api_key.txt\n  db_root_password:\n    file: .\/secrets\/db_root_password.txt<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u5f37\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n  frontend:\n    networks:\n      - frontend-network\n    ports:\n      - \"443:443\"\n    security_opt:\n      - no-new-privileges:true\n\n  backend:\n    networks:\n      - frontend-network\n      - backend-network\n    expose:\n      - \"8080\"\n\n  db:\n    networks:\n      - backend-network\n    expose:\n      - \"3306\"\n\nnetworks:\n  frontend-network:\n    driver: bridge\n  backend-network:\n    driver: bridge\n    internal: true\n    driver_opts:\n      encrypt: \"true\"<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30bb\u30ad\u30e5\u30a2\u306a\u74b0\u5883\u5909\u6570\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n  app:\n    env_file:\n      - .env.production\n    environment:\n      - JWT_SECRET_FILE=\/run\/secrets\/jwt_secret\n      - API_KEY_FILE=\/run\/secrets\/api_key\n    secrets:\n      - jwt_secret\n      - api_key\n\nsecrets:\n  jwt_secret:\n    external: true\n  api_key:\n    external: true<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-24\">CI\u30c4\u30fc\u30eb\u3068\u9023\u643a\u3067\u5b9f\u73fe\u3059\u308b\u81ea\u52d5\u5316<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>GitHub Actions\u3068\u306e\u9023\u643a\u4f8b<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># .github\/workflows\/docker-compose.yml\nname: Docker Compose CI\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n\njobs:\n  build-and-test:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\/checkout@v2\n\n      - name: Build and start services\n        run: docker-compose -f docker-compose.yaml -f docker-compose.ci.yaml up -d\n\n      - name: Run tests\n        run: docker-compose exec -T app npm run test\n\n      - name: Cleanup\n        run: docker-compose down<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u7d99\u7d9a\u7684\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u306e\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># docker-compose.ci.yaml\nservices:\n  app:\n    build:\n      context: .\n      dockerfile: Dockerfile.ci\n    environment:\n      - CI=true\n      - TEST_DATABASE_URL=postgres:\/\/test:test@db:5432\/testdb\n    command: [\"npm\", \"run\", \"test\"]\n\n  db:\n    environment:\n      - POSTGRES_USER=test\n      - POSTGRES_PASSWORD=test\n      - POSTGRES_DB=testdb<\/pre>\n\n\n\n<p>\u5b9f\u8df5\u7684\u306a\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306e\u307e\u3068\u3081\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u69cb\u6210\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u74b0\u5883\u5225\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u5206\u5272<\/li>\n\n\n\n<li>\u6a5f\u80fd\u5225\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u5316<\/li>\n\n\n\n<li>\u518d\u5229\u7528\u53ef\u80fd\u306a\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u8a2d\u8a08<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u904b\u7528\u9762\u3067\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u81ea\u52d5\u5316\u3055\u308c\u305f\u30d3\u30eb\u30c9\u3068\u30c6\u30b9\u30c8<\/li>\n\n\n\n<li>\u7d99\u7d9a\u7684\u306a\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u76e3\u67fb<\/li>\n\n\n\n<li>\u52b9\u7387\u7684\u306a\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c1\u30fc\u30e0\u958b\u767a\u3067\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u660e\u78ba\u306a\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u5316<\/li>\n\n\n\n<li>\u30d0\u30fc\u30b8\u30e7\u30f3\u7ba1\u7406\u306e\u5fb9\u5e95<\/li>\n\n\n\n<li>\u30b3\u30fc\u30c9\u30ec\u30d3\u30e5\u30fc\u306e\u4fc3\u9032<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u52b9\u7387\u7684\u3067\u5b89\u5168\u306aDocker Compose\u74b0\u5883\u3092\u69cb\u7bc9\u30fb\u904b\u7528\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u307e\u305f\u3001\u30c1\u30fc\u30e0\u5168\u4f53\u3067\u306e\u958b\u767a\u52b9\u7387\u3082\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":{"0":"post-3376","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-php","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3376","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3376"}],"version-history":[{"count":3,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3376\/revisions"}],"predecessor-version":[{"id":3484,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3376\/revisions\/3484"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3376"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3376"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3376"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}