{"id":805,"date":"2025-03-24T08:53:01","date_gmt":"2025-03-23T23:53:01","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=805"},"modified":"2025-03-24T08:53:01","modified_gmt":"2025-03-23T23:53:01","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91dockerxjava%e9%96%8b%e7%99%ba%e7%92%b0%e5%a2%83%e6%a7%8b%e7%af%89%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%892024-%e7%8f%be%e5%a0%b4%e3%81%a7","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=805","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011Docker\u00d7Java\u958b\u767a\u74b0\u5883\u69cb\u7bc9\u5b8c\u5168\u30ac\u30a4\u30c92024 &#8211; \u73fe\u5834\u3067\u4f7f\u3048\u308b15\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9"},"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\">    <span><\/span>    <ul class=\"menu_level_1\">      <li class=\"first last\">        <a href=\"#i-0\">\u76ee\u6b21<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-1\">Docker\u3092\u4f7f\u7528\u3057\u305fJava\u958b\u767a\u74b0\u5883\u306e\u57fa\u790e\u77e5\u8b58<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-2\">Docker\u3067Java\u958b\u767a\u74b0\u5883\u3092\u69cb\u7bc9\u3059\u308b\u30e1\u30ea\u30c3\u30c8<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-6\">\u5fc5\u8981\u306a\u524d\u63d0\u77e5\u8b58\u3068\u74b0\u5883\u6e96\u5099<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-11\">Java\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306eDockerfile\u4f5c\u6210\u65b9\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-12\">\u57fa\u672c\u7684\u306aDockerfile\u306e\u69cb\u9020\u3068\u66f8\u304d\u65b9<\/a>      <\/li>      <li>        <a href=\"#i-15\">\u30de\u30eb\u30c1\u30b9\u30c6\u30fc\u30b8\u30d3\u30eb\u30c9\u306b\u3088\u308b\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-18\">\u5b9f\u8df5\u7684\u306aDockerfile\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u96c6<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-22\">Docker Compose\u3092\u6d3b\u7528\u3057\u305f\u958b\u767a\u74b0\u5883\u306e\u69cb\u7bc9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-23\">docker-compose.yml\u306e\u57fa\u672c\u8a2d\u5b9a\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-26\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3068\u306e\u9023\u643a\u8a2d\u5b9a<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-30\">\u958b\u767a\u74b0\u5883\u3068\u672c\u756a\u74b0\u5883\u306e\u5207\u308a\u66ff\u3048\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-36\">\u5b9f\u8df5\u7684\u306a\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-37\">JVM\u306e\u30e1\u30e2\u30ea\u8a2d\u5b9a\u6700\u9069\u5316<\/a>      <\/li>      <li>        <a href=\"#i-40\">\u30b3\u30f3\u30c6\u30ca\u30ea\u30bd\u30fc\u30b9\u306e\u9069\u5207\u306a\u8a2d\u5b9a\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-44\">\u30d3\u30eb\u30c9\u6642\u9593\u3092\u77ed\u7e2e\u3059\u308b\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-51\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-52\">\u8106\u5f31\u6027\u30b9\u30ad\u30e3\u30f3\u306e\u5c0e\u5165\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-56\">\u30bb\u30ad\u30e5\u30a2\u306a\u30a4\u30e1\u30fc\u30b8\u69cb\u7bc9\u306e\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-60\">\u6a29\u9650\u7ba1\u7406\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8a2d\u5b9a<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-65\">CI\/CD\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u3078\u306e\u7d71\u5408<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-66\">GitHub Actions\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-69\">\u81ea\u52d5\u30c6\u30b9\u30c8\u3068\u54c1\u8cea\u30c1\u30a7\u30c3\u30af\u306e\u5b9f\u88c5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-73\">\u672c\u756a\u74b0\u5883\u3078\u306e\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u6226\u7565<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-78\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30ac\u30a4\u30c9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-79\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u89e3\u6c7a\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-83\">\u30c7\u30d0\u30c3\u30b0\u3068\u30ed\u30b0\u53ce\u96c6\u306e\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-87\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u554f\u984c\u306e\u8a3a\u65ad\u3068\u6539\u5584<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-92\">\u307e\u3068\u3081<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-93\">Docker\u00d7Java\u958b\u767a\u74b0\u5883\u69cb\u7bc9\u306e\u91cd\u8981\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>      <li>        <a href=\"#i-96\">\u958b\u767a\u52b9\u7387\u306e\u6700\u9069\u5316<\/a>      <\/li>      <li>        <a href=\"#i-97\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u78ba\u4fdd<\/a>      <\/li>      <li>        <a href=\"#i-98\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u6700\u9069\u5316<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-99\">\u6b21\u306e\u30b9\u30c6\u30c3\u30d7\u3068\u30ea\u30bd\u30fc\u30b9<\/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\">\u76ee\u6b21<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Docker\u3092\u4f7f\u7528\u3057\u305fJava\u958b\u767a\u74b0\u5883\u306e\u57fa\u790e\u77e5\u8b58\n<ul class=\"wp-block-list\">\n<li>Docker\u3067Java\u958b\u767a\u74b0\u5883\u3092\u69cb\u7bc9\u3059\u308b\u30e1\u30ea\u30c3\u30c8<\/li>\n\n\n\n<li>\u5fc5\u8981\u306a\u524d\u63d0\u77e5\u8b58\u3068\u74b0\u5883\u6e96\u5099<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Java\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306eDockerfile\u4f5c\u6210\u65b9\u6cd5\n<ul class=\"wp-block-list\">\n<li>\u57fa\u672c\u7684\u306aDockerfile\u306e\u69cb\u9020\u3068\u66f8\u304d\u65b9<\/li>\n\n\n\n<li>\u30de\u30eb\u30c1\u30b9\u30c6\u30fc\u30b8\u30d3\u30eb\u30c9\u306b\u3088\u308b\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af<\/li>\n\n\n\n<li>\u5b9f\u8df5\u7684\u306aDockerfile\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u96c6<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Docker Compose\u3092\u6d3b\u7528\u3057\u305f\u958b\u767a\u74b0\u5883\u306e\u69cb\u7bc9\n<ul class=\"wp-block-list\">\n<li>docker-compose.yml\u306e\u57fa\u672c\u8a2d\u5b9a\u65b9\u6cd5<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3068\u306e\u9023\u643a\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u958b\u767a\u74b0\u5883\u3068\u672c\u756a\u74b0\u5883\u306e\u5207\u308a\u66ff\u3048\u65b9\u6cd5<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u5b9f\u8df5\u7684\u306a\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0\n<ul class=\"wp-block-list\">\n<li>JVM\u306e\u30e1\u30e2\u30ea\u8a2d\u5b9a\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30b3\u30f3\u30c6\u30ca\u30ea\u30bd\u30fc\u30b9\u306e\u9069\u5207\u306a\u8a2d\u5b9a\u65b9\u6cd5<\/li>\n\n\n\n<li>\u30d3\u30eb\u30c9\u6642\u9593\u3092\u77ed\u7e2e\u3059\u308b\u30c6\u30af\u30cb\u30c3\u30af<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\n<ul class=\"wp-block-list\">\n<li>\u8106\u5f31\u6027\u30b9\u30ad\u30e3\u30f3\u306e\u5c0e\u5165\u65b9\u6cd5<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30a2\u306a\u30a4\u30e1\u30fc\u30b8\u69cb\u7bc9\u306e\u30dd\u30a4\u30f3\u30c8<\/li>\n\n\n\n<li>\u6a29\u9650\u7ba1\u7406\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8a2d\u5b9a<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>CI\/CD\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u3078\u306e\u7d71\u5408\n<ul class=\"wp-block-list\">\n<li>GitHub Actions\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/li>\n\n\n\n<li>\u81ea\u52d5\u30c6\u30b9\u30c8\u3068\u54c1\u8cea\u30c1\u30a7\u30c3\u30af\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u672c\u756a\u74b0\u5883\u3078\u306e\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u6226\u7565<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30ac\u30a4\u30c9\n<ul class=\"wp-block-list\">\n<li>\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u89e3\u6c7a\u65b9\u6cd5<\/li>\n\n\n\n<li>\u30c7\u30d0\u30c3\u30b0\u3068\u30ed\u30b0\u53ce\u96c6\u306e\u30c6\u30af\u30cb\u30c3\u30af<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u554f\u984c\u306e\u8a3a\u65ad\u3068\u6539\u5584<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-1\">Docker\u3092\u4f7f\u7528\u3057\u305fJava\u958b\u767a\u74b0\u5883\u306e\u57fa\u790e\u77e5\u8b58<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-2\">Docker\u3067Java\u958b\u767a\u74b0\u5883\u3092\u69cb\u7bc9\u3059\u308b\u30e1\u30ea\u30c3\u30c8<\/h2>\n\n\n\n<p>Docker\uff08\u30b3\u30f3\u30c6\u30ca\u6280\u8853\uff09\u3092\u4f7f\u7528\u3057\u3066Java\u958b\u767a\u74b0\u5883\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u3067\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u5927\u304d\u306a\u30e1\u30ea\u30c3\u30c8\u304c\u5f97\u3089\u308c\u307e\u3059\uff1a<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt\"><strong>\u30e1\u30ea\u30c3\u30c8<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-3\">1. \u74b0\u5883\u306e\u4e00\u8cab\u6027\u78ba\u4fdd<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u958b\u767a\u74b0\u5883\u306e\u6a19\u6e96\u5316<\/strong><\/li>\n\n\n\n<li>\u5168\u958b\u767a\u8005\u304c\u540c\u3058Java\u30d0\u30fc\u30b8\u30e7\u30f3\u3001\u540c\u3058\u30e9\u30a4\u30d6\u30e9\u30ea\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u4f7f\u7528<\/li>\n\n\n\n<li>\u300c\u81ea\u5206\u306e\u74b0\u5883\u3067\u306f\u52d5\u304f\u306e\u306b\u300d\u554f\u984c\u306e\u89e3\u6d88<\/li>\n\n\n\n<li><strong>\u672c\u756a\u74b0\u5883\u3068\u306e\u4e00\u81f4<\/strong><\/li>\n\n\n\n<li>\u958b\u767a\u74b0\u5883\u3068\u672c\u756a\u74b0\u5883\u306e\u5dee\u7570\u3092\u6700\u5c0f\u5316<\/li>\n\n\n\n<li>\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u30ea\u30b9\u30af\u306e\u4f4e\u6e1b<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-4\">2. \u8fc5\u901f\u306a\u74b0\u5883\u69cb\u7bc9<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u65b0\u898f\u30e1\u30f3\u30d0\u30fc\u306e\u30aa\u30f3\u30dc\u30fc\u30c7\u30a3\u30f3\u30b0\u6642\u9593\u77ed\u7e2e<\/strong><\/li>\n\n\n\n<li><code>docker-compose up<\/code>\u3060\u3051\u3067\u74b0\u5883\u69cb\u7bc9\u5b8c\u4e86<\/li>\n\n\n\n<li>\u8907\u96d1\u306a\u8a2d\u5b9a\u4f5c\u696d\u304c\u4e0d\u8981<\/li>\n\n\n\n<li><strong>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u5207\u308a\u66ff\u3048\u306e\u5bb9\u6613\u3055<\/strong><\/li>\n\n\n\n<li>\u7570\u306a\u308bJava\u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3082\u5171\u5b58\u53ef\u80fd<\/li>\n\n\n\n<li>\u30b3\u30f3\u30c6\u30ca\u306e\u8d77\u52d5\/\u505c\u6b62\u3067\u5373\u5ea7\u306b\u5207\u308a\u66ff\u3048<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">3. \u30ea\u30bd\u30fc\u30b9\u52b9\u7387\u306e\u5411\u4e0a<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u30b7\u30b9\u30c6\u30e0\u30ea\u30bd\u30fc\u30b9\u306e\u6700\u9069\u5316<\/strong><\/li>\n\n\n\n<li>\u5fc5\u8981\u306a\u3068\u304d\u3060\u3051\u30b3\u30f3\u30c6\u30ca\u3092\u8d77\u52d5<\/li>\n\n\n\n<li>\u8907\u6570\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u52b9\u7387\u7684\u306a\u7ba1\u7406<\/li>\n\n\n\n<li><strong>\u30af\u30ea\u30fc\u30f3\u306a\u74b0\u5883\u7dad\u6301<\/strong><\/li>\n\n\n\n<li>\u4e0d\u8981\u306b\u306a\u3063\u305f\u3089<code>docker rm<\/code>\u3067\u5b8c\u5168\u524a\u9664<\/li>\n\n\n\n<li>\u30db\u30b9\u30c8\u30de\u30b7\u30f3\u3092\u6c5a\u3055\u306a\u3044<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-6\">\u5fc5\u8981\u306a\u524d\u63d0\u77e5\u8b58\u3068\u74b0\u5883\u6e96\u5099<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">1. \u5fc5\u8981\u306a\u524d\u63d0\u77e5\u8b58<\/h3>\n\n\n<div id=\"id-f8b22b7c-141f-4b27-9e08-b38b02c9d0c8\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u5206\u91ce<\/th><th>\u5fc5\u8981\u306a\u77e5\u8b58\u30ec\u30d9\u30eb<\/th><th>\u5177\u4f53\u7684\u306a\u5185\u5bb9<\/th><\/tr><\/thead><tbody><tr><td>Java<\/td><td>\u57fa\u672c\u7684\u306a\u7406\u89e3<\/td><td>\u2013 JDK\u306e\u57fa\u790e\u77e5\u8b58<br>\u2013 \u30d3\u30eb\u30c9\u30c4\u30fc\u30eb\uff08Maven\/Gradle\uff09\u306e\u4f7f\u7528\u7d4c\u9a13<\/td><\/tr><tr><td>Docker<\/td><td>\u57fa\u672c\u6982\u5ff5\u306e\u7406\u89e3<\/td><td>\u2013 \u30b3\u30f3\u30c6\u30ca\u306e\u6982\u5ff5<br>\u2013 \u30a4\u30e1\u30fc\u30b8\u3068\u30b3\u30f3\u30c6\u30ca\u306e\u9055\u3044<br>\u2013 \u57fa\u672c\u7684\u306aDocker\u30b3\u30de\u30f3\u30c9<\/td><\/tr><tr><td>Linux<\/td><td>\u57fa\u672c\u7684\u306a\u30b3\u30de\u30f3\u30c9<\/td><td>\u2013 \u30b7\u30a7\u30eb\u306e\u57fa\u672c\u64cd\u4f5c<br>\u2013 \u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u30b3\u30de\u30f3\u30c9<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"i-8\">2. \u74b0\u5883\u6e96\u5099\u624b\u9806<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Docker\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/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=\"\"># macOS\u306e\u5834\u5408\uff08Homebrew\u4f7f\u7528\uff09\nbrew install --cask docker\n\n# Ubuntu\u306e\u5834\u5408\nsudo apt-get update\nsudo apt-get install docker-ce docker-ce-cli containerd.io\n\n# Windows\u306e\u5834\u5408\n# Docker Desktop for Windows\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Docker Compose\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/strong>\uff08Docker Desktop\u306b\u306f\u540c\u68b1\uff09<\/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=\"\"># Linux\u74b0\u5883\u3067\u306e\u500b\u5225\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\nsudo curl -L \"https:\/\/github.com\/docker\/compose\/releases\/latest\/download\/docker-compose-$(uname -s)-$(uname -m)\" -o \/usr\/local\/bin\/docker-compose\nsudo chmod +x \/usr\/local\/bin\/docker-compose<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u52d5\u4f5c\u78ba\u8a8d<\/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\u30c7\u30fc\u30e2\u30f3\u306e\u8d77\u52d5\u78ba\u8a8d\ndocker --version\ndocker-compose --version\n\n# \u30c6\u30b9\u30c8\u30b3\u30f3\u30c6\u30ca\u306e\u5b9f\u884c\ndocker run hello-world<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">3. \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u56fa\u6709\u306e\u6e96\u5099<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30d5\u30a9\u30eb\u30c0\u69cb\u6210<\/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=\"\">project-root\/\n\u251c\u2500\u2500 src\/\n\u2502   \u2514\u2500\u2500 main\/\n\u2502       \u2514\u2500\u2500 java\/\n\u251c\u2500\u2500 Dockerfile\n\u251c\u2500\u2500 docker-compose.yml\n\u251c\u2500\u2500 .dockerignore\n\u2514\u2500\u2500 pom.xml\uff08\u307e\u305f\u306f build.gradle\uff09<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>.dockerignore\u30d5\u30a1\u30a4\u30eb\u306e\u4f5c\u6210<\/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=\"\">target\/\n.git\/\n.gitignore\n*.md<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u5fc5\u8981\u306a\u30dd\u30fc\u30c8\u306e\u78ba\u8a8d<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b5\u30fc\u30d0\u30fc\u7528\u30dd\u30fc\u30c8\uff08\u30c7\u30d5\u30a9\u30eb\u30c8: 8080\uff09<\/li>\n\n\n\n<li>\u30c7\u30d0\u30c3\u30b0\u30dd\u30fc\u30c8\uff08\u30c7\u30d5\u30a9\u30eb\u30c8: 5005\uff09<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\u30dd\u30fc\u30c8\uff08MySQL: 3306\u3001PostgreSQL: 5432\u306a\u3069\uff09<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u958b\u767a\u74b0\u5883\u306e\u8981\u4ef6\u78ba\u8a8d\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] JDK\u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u6c7a\u5b9a<\/li>\n\n\n\n<li>[ ] \u4f7f\u7528\u3059\u308b\u30d3\u30eb\u30c9\u30c4\u30fc\u30eb\u306e\u9078\u629e\uff08Maven\/Gradle\uff09<\/li>\n\n\n\n<li>[ ] \u5fc5\u8981\u306a\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306e\u7279\u5b9a\uff08DB\u3001\u30ad\u30e3\u30c3\u30b7\u30e5\u306a\u3069\uff09<\/li>\n\n\n\n<li>[ ] \u958b\u767a\u30c4\u30fc\u30eb\u9023\u643a\u306e\u78ba\u8a8d\uff08IDE\u3001\u30c7\u30d0\u30c3\u30ac\u30fc\uff09<\/li>\n\n\n\n<li>[ ] \u30c1\u30fc\u30e0\u5185\u3067\u306e\u904b\u7528\u30eb\u30fc\u30eb\u7b56\u5b9a<\/li>\n<\/ul>\n\n\n\n<p>\u4ee5\u4e0a\u304c\u57fa\u790e\u77e5\u8b58\u30bb\u30af\u30b7\u30e7\u30f3\u306e\u5185\u5bb9\u3068\u306a\u308a\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u306b\u9032\u3080\u3079\u304d\u3067\u3057\u3087\u3046\u304b\uff1f<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-11\">Java\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306eDockerfile\u4f5c\u6210\u65b9\u6cd5<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-12\">\u57fa\u672c\u7684\u306aDockerfile\u306e\u69cb\u9020\u3068\u66f8\u304d\u65b9<\/h2>\n\n\n\n<p>Dockerfile\u306f\u3001Java\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30f3\u30c6\u30ca\u30a4\u30e1\u30fc\u30b8\u3092\u4f5c\u6210\u3059\u308b\u305f\u3081\u306e\u8a2d\u8a08\u56f3\u3067\u3059\u3002\u4ee5\u4e0b\u3067\u3001\u57fa\u672c\u7684\u306a\u69cb\u9020\u3068\u91cd\u8981\u306a\u547d\u4ee4\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">1. \u57fa\u672c\u69cb\u9020<\/h3>\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=\"\"># \u30d9\u30fc\u30b9\u30a4\u30e1\u30fc\u30b8\u306e\u6307\u5b9a\nFROM eclipse-temurin:17-jdk\n\n# \u4f5c\u696d\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u8a2d\u5b9a\nWORKDIR \/app\n\n# \u30d3\u30eb\u30c9\u306b\u5fc5\u8981\u306a\u30d5\u30a1\u30a4\u30eb\u306e\u30b3\u30d4\u30fc\nCOPY pom.xml .\nCOPY src .\/src\n\n# Maven\u30d3\u30eb\u30c9\u306e\u5b9f\u884c\nRUN mvn clean package\n\n# JAR\u30d5\u30a1\u30a4\u30eb\u306e\u5b9f\u884c\nCMD [\"java\", \"-jar\", \"target\/application.jar\"]<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">2. \u91cd\u8981\u306aDockerfile\u547d\u4ee4\u306e\u89e3\u8aac<\/h3>\n\n\n<div id=\"id-08f130ba-c1b4-488f-a1ee-6fefb9f31fe6\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u547d\u4ee4<\/th><th>\u7528\u9014<\/th><th>\u4f7f\u7528\u4f8b<\/th><\/tr><\/thead><tbody><tr><td>FROM<\/td><td>\u30d9\u30fc\u30b9\u30a4\u30e1\u30fc\u30b8\u306e\u6307\u5b9a<\/td><td><code>FROM eclipse-temurin:17-jdk<\/code><\/td><\/tr><tr><td>WORKDIR<\/td><td>\u4f5c\u696d\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u8a2d\u5b9a<\/td><td><code>WORKDIR \/app<\/code><\/td><\/tr><tr><td>COPY<\/td><td>\u30d5\u30a1\u30a4\u30eb\u306e\u30b3\u30d4\u30fc<\/td><td><code>COPY src .\/src<\/code><\/td><\/tr><tr><td>ADD<\/td><td>\u30d5\u30a1\u30a4\u30eb\u306e\u8ffd\u52a0\uff08\u5727\u7e2e\u30d5\u30a1\u30a4\u30eb\u306f\u89e3\u51cd\uff09<\/td><td><code>ADD archive.tar.gz \/app<\/code><\/td><\/tr><tr><td>RUN<\/td><td>\u30d3\u30eb\u30c9\u6642\u306e\u30b3\u30de\u30f3\u30c9\u5b9f\u884c<\/td><td><code>RUN mvn package<\/code><\/td><\/tr><tr><td>CMD<\/td><td>\u30b3\u30f3\u30c6\u30ca\u8d77\u52d5\u6642\u306e\u30b3\u30de\u30f3\u30c9<\/td><td><code>CMD [\"java\", \"-jar\", \"app.jar\"]<\/code><\/td><\/tr><tr><td>ENTRYPOINT<\/td><td>\u56fa\u5b9a\u306e\u8d77\u52d5\u30b3\u30de\u30f3\u30c9<\/td><td><code>ENTRYPOINT [\"java\"]<\/code><\/td><\/tr><tr><td>ENV<\/td><td>\u74b0\u5883\u5909\u6570\u306e\u8a2d\u5b9a<\/td><td><code>ENV JAVA_OPTS=\"-Xmx512m\"<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"i-15\">\u30de\u30eb\u30c1\u30b9\u30c6\u30fc\u30b8\u30d3\u30eb\u30c9\u306b\u3088\u308b\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af<\/h2>\n\n\n\n<p>\u30de\u30eb\u30c1\u30b9\u30c6\u30fc\u30b8\u30d3\u30eb\u30c9\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u6700\u7d42\u7684\u306a\u30a4\u30e1\u30fc\u30b8\u30b5\u30a4\u30ba\u3092\u5927\u5e45\u306b\u524a\u6e1b\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-16\">1. \u30de\u30eb\u30c1\u30b9\u30c6\u30fc\u30b8\u30d3\u30eb\u30c9\u306e\u57fa\u672c\u69cb\u9020<\/h3>\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=\"\"># \u30d3\u30eb\u30c9\u30b9\u30c6\u30fc\u30b8\nFROM maven:3.8.4-eclipse-temurin-17 AS builder\nWORKDIR \/build\nCOPY pom.xml .\nCOPY src .\/src\nRUN mvn clean package\n\n# \u5b9f\u884c\u30b9\u30c6\u30fc\u30b8\nFROM eclipse-temurin:17-jre-alpine\nWORKDIR \/app\nCOPY --from=builder \/build\/target\/*.jar app.jar\nENTRYPOINT [\"java\", \"-jar\", \"app.jar\"]<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">2. \u6700\u9069\u5316\u306e\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u4f9d\u5b58\u95a2\u4fc2\u306e\u30ad\u30e3\u30c3\u30b7\u30e5<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>\u30ec\u30a4\u30e4\u30fc\u306e\u6700\u9069\u5316<\/strong><\/li>\n\n\n\n<li>\u5909\u66f4\u983b\u5ea6\u306e\u4f4e\u3044\u30ec\u30a4\u30e4\u30fc\u3092\u5148\u306b\u914d\u7f6e<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u63a1\u7528<\/li>\n\n\n\n<li>\u4e0d\u8981\u306a\u30d5\u30a1\u30a4\u30eb\u306e\u9664\u5916<\/li>\n<\/ul>\n<\/li>\n<\/ul>\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=\"\"># \u4f9d\u5b58\u95a2\u4fc2\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u5c64\nFROM maven:3.8.4-eclipse-temurin-17 AS deps\nWORKDIR \/build\nCOPY pom.xml .\nRUN mvn dependency:go-offline\n\n# \u30d3\u30eb\u30c9\u5c64\nFROM deps AS builder\nCOPY src .\/src\nRUN mvn clean package\n\n# \u5b9f\u884c\u5c64\nFROM eclipse-temurin:17-jre-alpine\nWORKDIR \/app\nCOPY --from=builder \/build\/target\/*.jar app.jar\nENTRYPOINT [\"java\", \"-jar\", \"app.jar\"]<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-18\">\u5b9f\u8df5\u7684\u306aDockerfile\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u96c6<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">1. Spring Boot\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u7528\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8<\/h3>\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=\"\"># \u30d9\u30fc\u30b9\u30a4\u30e1\u30fc\u30b8\u306e\u9078\u629e\nFROM maven:3.8.4-eclipse-temurin-17 AS builder\n\n# \u30ad\u30e3\u30c3\u30b7\u30e5\u6700\u9069\u5316\u306e\u305f\u3081\u306epom.xml\u30b3\u30d4\u30fc\nWORKDIR \/build\nCOPY pom.xml .\nRUN mvn dependency:go-offline\n\n# \u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u306e\u30b3\u30d4\u30fc\u3068\u30d3\u30eb\u30c9\nCOPY src .\/src\nRUN mvn clean package -DskipTests\n\n# \u5b9f\u884c\u74b0\u5883\u306e\u6e96\u5099\nFROM eclipse-temurin:17-jre-alpine\nWORKDIR \/app\n\n# \u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af\u7528\u306e\u30c4\u30fc\u30eb\u8ffd\u52a0\nRUN apk add --no-cache curl\n\n# \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30d4\u30fc\nCOPY --from=builder \/build\/target\/*.jar app.jar\n\n# \u74b0\u5883\u5909\u6570\u306e\u8a2d\u5b9a\nENV JAVA_OPTS=\"-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0\"\n\n# \u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af\u306e\u8a2d\u5b9a\nHEALTHCHECK --interval=30s --timeout=3s \\\n  CMD curl -f http:\/\/localhost:8080\/actuator\/health || exit 1\n\n# \u8d77\u52d5\u30b3\u30de\u30f3\u30c9\nENTRYPOINT [\"sh\", \"-c\", \"java $JAVA_OPTS -jar app.jar\"]<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-20\">2. \u30de\u30a4\u30af\u30ed\u30b5\u30fc\u30d3\u30b9\u7528\u8efd\u91cf\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8<\/h3>\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=\"\"># \u30d3\u30eb\u30c9\u30b9\u30c6\u30fc\u30b8\nFROM maven:3.8.4-eclipse-temurin-17 AS builder\nWORKDIR \/build\n\n# \u4f9d\u5b58\u95a2\u4fc2\u306e\u7ba1\u7406\nCOPY pom.xml .\nRUN mvn dependency:go-offline\n\n# \u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u306e\u30d3\u30eb\u30c9\nCOPY src .\/src\nRUN mvn clean package -DskipTests\n\n# \u5b9f\u884c\u30b9\u30c6\u30fc\u30b8\nFROM eclipse-temurin:17-jre-alpine\nWORKDIR \/app\n\n# \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5f37\u5316\nRUN addgroup -S appgroup &amp;&amp; adduser -S appuser -G appgroup\nUSER appuser\n\n# \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30d4\u30fc\nCOPY --from=builder \/build\/target\/*.jar app.jar\n\n# \u74b0\u5883\u5909\u6570\u3068\u30dd\u30fc\u30c8\u306e\u8a2d\u5b9a\nENV JAVA_OPTS=\"-Xms256m -Xmx512m\"\nEXPOSE 8080\n\n# \u8d77\u52d5\u30b3\u30de\u30f3\u30c9\nENTRYPOINT [\"sh\", \"-c\", \"java $JAVA_OPTS -jar app.jar\"]<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">3. \u958b\u767a\u74b0\u5883\u7528\u30c7\u30d0\u30c3\u30b0\u5bfe\u5fdc\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8<\/h3>\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=\"\">FROM eclipse-temurin:17-jdk\nWORKDIR \/app\n\n# \u958b\u767a\u30c4\u30fc\u30eb\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\nRUN apt-get update &amp;&amp; apt-get install -y \\\n    maven \\\n    git \\\n    &amp;&amp; rm -rf \/var\/lib\/apt\/lists\/*\n\n# \u30c7\u30d0\u30c3\u30b0\u30dd\u30fc\u30c8\u306e\u516c\u958b\nEXPOSE 8080 5005\n\n# \u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u3067\u306e\u8d77\u52d5\u30b9\u30af\u30ea\u30d7\u30c8\nCOPY docker-entrypoint.sh \/usr\/local\/bin\/\nRUN chmod +x \/usr\/local\/bin\/docker-entrypoint.sh\n\nENTRYPOINT [\"docker-entrypoint.sh\"]<\/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-entrypoint.sh\n#!\/bin\/sh\nexec java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 \\\n    -jar app.jar<\/pre>\n\n\n\n<p>\u4ee5\u4e0a\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306f\u3001\u5b9f\u969b\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u8981\u4ef6\u306b\u5fdc\u3058\u3066\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3057\u3066\u3054\u5229\u7528\u304f\u3060\u3055\u3044\u3002\u7279\u306b\u74b0\u5883\u5909\u6570\u3001\u30e1\u30e2\u30ea\u8a2d\u5b9a\u3001\u30dd\u30fc\u30c8\u756a\u53f7\u306a\u3069\u306f\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u8981\u4ef6\u306b\u5408\u308f\u305b\u3066\u9069\u5207\u306b\u8abf\u6574\u3059\u308b\u3053\u3068\u3092\u304a\u52e7\u3081\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-22\">Docker Compose\u3092\u6d3b\u7528\u3057\u305f\u958b\u767a\u74b0\u5883\u306e\u69cb\u7bc9<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-23\">docker-compose.yml\u306e\u57fa\u672c\u8a2d\u5b9a\u65b9\u6cd5<\/h2>\n\n\n\n<p>Docker Compose\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u8907\u6570\u306e\u30b3\u30f3\u30c6\u30ca\u3092\u4e00\u5143\u7ba1\u7406\u3057\u3001\u958b\u767a\u74b0\u5883\u3092\u7c21\u5358\u306b\u69cb\u7bc9\u30fb\u904b\u7528\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-24\">1. \u57fa\u672c\u7684\u306a\u69cb\u9020<\/h3>\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      - \"8080:8080\"\n    environment:\n      - SPRING_PROFILES_ACTIVE=dev\n    volumes:\n      - .\/:\/app\n      - ~\/.m2:\/root\/.m2\n    depends_on:\n      - db<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-25\">2. \u4e3b\u8981\u306a\u8a2d\u5b9a\u9805\u76ee\u306e\u89e3\u8aac<\/h3>\n\n\n<div id=\"id-390869fc-51fd-4720-af4f-97220ce57de1\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u8a2d\u5b9a\u9805\u76ee<\/th><th>\u8aac\u660e<\/th><th>\u4f7f\u7528\u4f8b<\/th><\/tr><\/thead><tbody><tr><td>version<\/td><td>Compose file\u306e\u30d0\u30fc\u30b8\u30e7\u30f3<\/td><td><code>version: '3.8'<\/code><\/td><\/tr><tr><td>services<\/td><td>\u30b3\u30f3\u30c6\u30ca\u306e\u5b9a\u7fa9<\/td><td><code>services: app: ...<\/code><\/td><\/tr><tr><td>build<\/td><td>\u30d3\u30eb\u30c9\u8a2d\u5b9a<\/td><td><code>build: context: .<\/code><\/td><\/tr><tr><td>ports<\/td><td>\u30dd\u30fc\u30c8\u30de\u30c3\u30d4\u30f3\u30b0<\/td><td><code>ports: - \"8080:8080\"<\/code><\/td><\/tr><tr><td>environment<\/td><td>\u74b0\u5883\u5909\u6570\u8a2d\u5b9a<\/td><td><code>environment: - KEY=VALUE<\/code><\/td><\/tr><tr><td>volumes<\/td><td>\u30dc\u30ea\u30e5\u30fc\u30e0\u30de\u30a6\u30f3\u30c8<\/td><td><code>volumes: - .\/:\/app<\/code><\/td><\/tr><tr><td>depends_on<\/td><td>\u4f9d\u5b58\u95a2\u4fc2\u306e\u5b9a\u7fa9<\/td><td><code>depends_on: - db<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"i-26\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3068\u306e\u9023\u643a\u8a2d\u5b9a<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-27\">1. \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30b5\u30fc\u30d3\u30b9\u306e\u8a2d\u5b9a<\/h3>\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    ports:\n      - \"8080:8080\"\n    environment:\n      - SPRING_DATASOURCE_URL=jdbc:postgresql:\/\/db:5432\/myapp\n      - SPRING_DATASOURCE_USERNAME=postgres\n      - SPRING_DATASOURCE_PASSWORD=secret\n    depends_on:\n      - db\n\n  db:\n    image: postgres:14-alpine\n    ports:\n      - \"5432:5432\"\n    environment:\n      - POSTGRES_DB=myapp\n      - POSTGRES_USER=postgres\n      - POSTGRES_PASSWORD=secret\n    volumes:\n      - postgres_data:\/var\/lib\/postgresql\/data\n      - .\/init.sql:\/docker-entrypoint-initdb.d\/init.sql\n\nvolumes:\n  postgres_data:<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-28\">2. \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u521d\u671f\u5316\u30b9\u30af\u30ea\u30d7\u30c8\uff08init.sql\uff09<\/h3>\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=\"\">-- \u30c6\u30fc\u30d6\u30eb\u4f5c\u6210\nCREATE TABLE IF NOT EXISTS users (\n    id SERIAL PRIMARY KEY,\n    username VARCHAR(50) NOT NULL,\n    email VARCHAR(100) NOT NULL UNIQUE,\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\n-- \u521d\u671f\u30c7\u30fc\u30bf\u6295\u5165\nINSERT INTO users (username, email) VALUES\n    ('test_user', 'test@example.com');<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-29\">3. \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u7ba1\u7406\u30c4\u30fc\u30eb\u306e\u8ffd\u52a0<\/h3>\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=\"\">  adminer:\n    image: adminer\n    ports:\n      - \"8081:8080\"\n    depends_on:\n      - db<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-30\">\u958b\u767a\u74b0\u5883\u3068\u672c\u756a\u74b0\u5883\u306e\u5207\u308a\u66ff\u3048\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-31\">1. \u74b0\u5883\u5225\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u69cb\u6210<\/h3>\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=\"\">project\/\n\u251c\u2500\u2500 docker-compose.yml          # \u57fa\u672c\u8a2d\u5b9a\n\u251c\u2500\u2500 docker-compose.dev.yml      # \u958b\u767a\u74b0\u5883\u7528\n\u251c\u2500\u2500 docker-compose.prod.yml     # \u672c\u756a\u74b0\u5883\u7528\n\u2514\u2500\u2500 docker-compose.test.yml     # \u30c6\u30b9\u30c8\u74b0\u5883\u7528<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-32\">2. \u958b\u767a\u74b0\u5883\u8a2d\u5b9a\uff08docker-compose.dev.yml\uff09<\/h3>\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.dev\n    volumes:\n      - .\/:\/app\n      - ~\/.m2:\/root\/.m2\n    environment:\n      - SPRING_PROFILES_ACTIVE=dev\n      - JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005\n    ports:\n      - \"8080:8080\"\n      - \"5005:5005\"\n\n  db:\n    ports:\n      - \"5432:5432\"\n    volumes:\n      - .\/init-dev.sql:\/docker-entrypoint-initdb.d\/init.sql<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-33\">3. \u672c\u756a\u74b0\u5883\u8a2d\u5b9a\uff08docker-compose.prod.yml\uff09<\/h3>\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.prod\n    environment:\n      - SPRING_PROFILES_ACTIVE=prod\n      - JAVA_OPTS=-XX:+UseG1GC -XX:MaxRAMPercentage=75\n    deploy:\n      resources:\n        limits:\n          cpus: '2'\n          memory: 2G\n    restart: always\n\n  db:\n    volumes:\n      - postgres_prod_data:\/var\/lib\/postgresql\/data\n    deploy:\n      resources:\n        limits:\n          memory: 1G\n    restart: always\n\nvolumes:\n  postgres_prod_data:<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-34\">4. \u74b0\u5883\u5207\u308a\u66ff\u3048\u30b3\u30de\u30f3\u30c9<\/h3>\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.yml -f docker-compose.dev.yml up -d\n\n# \u672c\u756a\u74b0\u5883\u306e\u8d77\u52d5\ndocker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d\n\n# \u30c6\u30b9\u30c8\u74b0\u5883\u306e\u8d77\u52d5\ndocker-compose -f docker-compose.yml -f docker-compose.test.yml up -d<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-35\">5. \u74b0\u5883\u5225\u306e\u8a2d\u5b9a\u7ba1\u7406\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u74b0\u5883\u5909\u6570\u306e\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=\"\"># .env.dev\nPOSTGRES_DB=myapp_dev\nPOSTGRES_USER=dev_user\nPOSTGRES_PASSWORD=dev_password\n\n# .env.prod\nPOSTGRES_DB=myapp_prod\nPOSTGRES_USER=prod_user\nPOSTGRES_PASSWORD=${PROD_DB_PASSWORD}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u5225\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=\"\"># application-dev.yml\nspring:\n  datasource:\n    url: jdbc:postgresql:\/\/db:5432\/myapp_dev\n    username: dev_user\n    password: dev_password\n\n# application-prod.yml\nspring:\n  datasource:\n    url: jdbc:postgresql:\/\/db:5432\/myapp_prod\n    username: prod_user\n    password: ${PROD_DB_PASSWORD}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u8a2d\u5b9a\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u958b\u767a\u304b\u3089\u30d7\u30ed\u30c0\u30af\u30b7\u30e7\u30f3\u307e\u3067\u306e\u30b9\u30e0\u30fc\u30ba\u306a\u74b0\u5883\u79fb\u884c\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u307e\u305f\u3001\u5404\u74b0\u5883\u306b\u7279\u5316\u3057\u305f\u6700\u9069\u306a\u8a2d\u5b9a\u3092\u7dad\u6301\u3057\u306a\u304c\u3089\u3001\u7d71\u4e00\u7684\u306a\u7ba1\u7406\u304c\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-36\">\u5b9f\u8df5\u7684\u306a\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-37\">JVM\u306e\u30e1\u30e2\u30ea\u8a2d\u5b9a\u6700\u9069\u5316<\/h2>\n\n\n\n<p>\u30b3\u30f3\u30c6\u30ca\u74b0\u5883\u3067\u306eJava\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u6700\u5927\u5316\u3059\u308b\u306b\u306f\u3001\u9069\u5207\u306aJVM\u30e1\u30e2\u30ea\u8a2d\u5b9a\u304c\u4e0d\u53ef\u6b20\u3067\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-38\">1. \u30b3\u30f3\u30c6\u30ca\u5bfe\u5fdc\u306eJVM\u30aa\u30d7\u30b7\u30e7\u30f3<\/h3>\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 JAVA_OPTS=\"\\\n    -XX:+UseContainerSupport \\\n    -XX:MaxRAMPercentage=75.0 \\\n    -XX:InitialRAMPercentage=50.0 \\\n    -XX:+UseG1GC \\\n    -XX:+HeapDumpOnOutOfMemoryError \\\n    -XX:HeapDumpPath=\/dumps\"<\/pre>\n\n\n<div id=\"id-c60bddcf-dad7-48e4-9643-875b4146ffec\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30aa\u30d7\u30b7\u30e7\u30f3<\/th><th>\u8aac\u660e<\/th><th>\u63a8\u5968\u5024<\/th><\/tr><\/thead><tbody><tr><td>UseContainerSupport<\/td><td>\u30b3\u30f3\u30c6\u30ca\u30ea\u30bd\u30fc\u30b9\u306e\u8a8d\u8b58\u3092\u6709\u52b9\u5316<\/td><td>\u5e38\u306b\u6709\u52b9\u5316<\/td><\/tr><tr><td>MaxRAMPercentage<\/td><td>\u6700\u5927\u30d2\u30fc\u30d7\u30b5\u30a4\u30ba\u306e\u5272\u5408<\/td><td>70-80%<\/td><\/tr><tr><td>InitialRAMPercentage<\/td><td>\u521d\u671f\u30d2\u30fc\u30d7\u30b5\u30a4\u30ba\u306e\u5272\u5408<\/td><td>40-60%<\/td><\/tr><tr><td>UseG1GC<\/td><td>G1GC\u306e\u4f7f\u7528<\/td><td>\u6a19\u6e96\u8a2d\u5b9a<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"i-39\">2. \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u8a2d\u5b9a<\/h3>\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.yml\nservices:\n  app:\n    environment:\n      - JAVA_TOOL_OPTIONS=\"-Dcom.sun.management.jmxremote \n        -Dcom.sun.management.jmxremote.port=9010 \n        -Dcom.sun.management.jmxremote.authenticate=false \n        -Dcom.sun.management.jmxremote.ssl=false\"\n    ports:\n      - \"9010:9010\"<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-40\">\u30b3\u30f3\u30c6\u30ca\u30ea\u30bd\u30fc\u30b9\u306e\u9069\u5207\u306a\u8a2d\u5b9a\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-41\">1. \u30ea\u30bd\u30fc\u30b9\u5236\u9650\u306e\u8a2d\u5b9a<\/h3>\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: '2'\n          memory: 2G\n        reservations:\n          cpus: '1'\n          memory: 1G<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-42\">2. \u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u6226\u7565<\/h3>\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      mode: replicated\n      replicas: 3\n      update_config:\n        parallelism: 1\n        delay: 10s\n      restart_policy:\n        condition: on-failure\n        max_attempts: 3\n        window: 120s<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-43\">3. \u30ea\u30bd\u30fc\u30b9\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u306e\u8a2d\u5b9a<\/h3>\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<h2 class=\"wp-block-heading\" id=\"i-44\">\u30d3\u30eb\u30c9\u6642\u9593\u3092\u77ed\u7e2e\u3059\u308b\u30c6\u30af\u30cb\u30c3\u30af<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-45\">1. \u30de\u30eb\u30c1\u30b9\u30c6\u30fc\u30b8\u30d3\u30eb\u30c9\u306e\u6700\u9069\u5316<\/h3>\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=\"\"># \u30d9\u30fc\u30b9\u30a4\u30e1\u30fc\u30b8\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\nFROM maven:3.8.4-eclipse-temurin-17 AS deps\nWORKDIR \/build\nCOPY pom.xml .\nRUN mvn dependency:go-offline\n\n# \u30d3\u30eb\u30c9\u30b9\u30c6\u30fc\u30b8\nFROM deps AS builder\nCOPY src .\/src\nRUN mvn package -DskipTests \\\n    -Dmaven.javadoc.skip=true \\\n    -Dmaven.source.skip=true\n\n# \u5b9f\u884c\u74b0\u5883\nFROM eclipse-temurin:17-jre-alpine\nCOPY --from=builder \/build\/target\/*.jar app.jar<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-46\">2. Maven\u30d3\u30eb\u30c9\u306e\u6700\u9069\u5316<\/h3>\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=\"\">&lt;!-- pom.xml --&gt;\n&lt;properties&gt;\n    &lt;maven.test.skip&gt;true&lt;\/maven.test.skip&gt;\n    &lt;maven.javadoc.skip&gt;true&lt;\/maven.javadoc.skip&gt;\n    &lt;maven.source.skip&gt;true&lt;\/maven.source.skip&gt;\n&lt;\/properties&gt;\n\n&lt;build&gt;\n    &lt;plugins&gt;\n        &lt;plugin&gt;\n            &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n            &lt;artifactId&gt;maven-compiler-plugin&lt;\/artifactId&gt;\n            &lt;configuration&gt;\n                &lt;fork&gt;true&lt;\/fork&gt;\n                &lt;meminitial&gt;128m&lt;\/meminitial&gt;\n                &lt;maxmem&gt;512m&lt;\/maxmem&gt;\n            &lt;\/configuration&gt;\n        &lt;\/plugin&gt;\n    &lt;\/plugins&gt;\n&lt;\/build&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-47\">3. \u30d3\u30eb\u30c9\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u6700\u9069\u5316\u6226\u7565<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-48\">Docker\u30d3\u30eb\u30c9\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u8a2d\u5b9a<\/h4>\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.yml\nservices:\n  app:\n    build:\n      context: .\n      dockerfile: Dockerfile\n      cache_from:\n        - myapp:latest\n      args:\n        BUILDKIT_INLINE_CACHE: 1<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-49\">\u30d3\u30eb\u30c9\u30b9\u30af\u30ea\u30d7\u30c8\u306e\u4f8b<\/h4>\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=\"\">#!\/bin\/bash\n# build-optimized.sh\n\n# \u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u6d3b\u7528\ndocker pull myapp:latest || true\n\n# BuildKit\u3092\u4f7f\u7528\u3057\u305f\u30d3\u30eb\u30c9\nDOCKER_BUILDKIT=1 docker build \\\n  --cache-from myapp:latest \\\n  --build-arg BUILDKIT_INLINE_CACHE=1 \\\n  -t myapp:latest .\n\n# \u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u4fdd\u5b58\ndocker push myapp:latest<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-50\">4. \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>JVM\u30e1\u30e2\u30ea\u8a2d\u5b9a<\/strong>\n<ul class=\"wp-block-list\">\n<li>[ ] \u30b3\u30f3\u30c6\u30ca\u8a8d\u8b58\u306e\u6709\u52b9\u5316\u78ba\u8a8d<\/li>\n\n\n\n<li>[ ] \u30d2\u30fc\u30d7\u30b5\u30a4\u30ba\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/li>\n\n\n\n<li>[ ] GC\u30ed\u30b0\u306e\u6709\u52b9\u5316\u3068\u76e3\u8996<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30b3\u30f3\u30c6\u30ca\u30ea\u30bd\u30fc\u30b9<\/strong>\n<ul class=\"wp-block-list\">\n<li>[ ] CPU\u5236\u9650\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>[ ] \u30e1\u30e2\u30ea\u5236\u9650\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>[ ] \u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u8a2d\u5b9a\u306e\u6700\u9069\u5316<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30d3\u30eb\u30c9\u6700\u9069\u5316<\/strong>\n<ul class=\"wp-block-list\">\n<li>[ ] \u30de\u30eb\u30c1\u30b9\u30c6\u30fc\u30b8\u30d3\u30eb\u30c9\u306e\u5229\u7528<\/li>\n\n\n\n<li>[ ] \u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>[ ] \u4e0d\u8981\u306a\u51e6\u7406\u306e\u30b9\u30ad\u30c3\u30d7<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u8a2d\u5b9a\u3068\u30c6\u30af\u30cb\u30c3\u30af\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u958b\u767a\u74b0\u5883\u304b\u3089\u672c\u756a\u74b0\u5883\u307e\u3067\u3001\u52b9\u7387\u7684\u306a\u30b3\u30f3\u30c6\u30ca\u904b\u7528\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u7279\u306b\u3001\u30ea\u30bd\u30fc\u30b9\u4f7f\u7528\u72b6\u6cc1\u3092\u5b9a\u671f\u7684\u306b\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u3057\u3001\u5fc5\u8981\u306b\u5fdc\u3058\u3066\u8a2d\u5b9a\u3092\u8abf\u6574\u3059\u308b\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-51\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-52\">\u8106\u5f31\u6027\u30b9\u30ad\u30e3\u30f3\u306e\u5c0e\u5165\u65b9\u6cd5<\/h2>\n\n\n\n<p>\u30b3\u30f3\u30c6\u30ca\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u78ba\u4fdd\u3059\u308b\u305f\u3081\u306e\u7b2c\u4e00\u6b69\u306f\u3001\u7d99\u7d9a\u7684\u306a\u8106\u5f31\u6027\u30b9\u30ad\u30e3\u30f3\u306e\u5b9f\u65bd\u3067\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-53\">1. Trivy\u3092\u4f7f\u7528\u3057\u305f\u8106\u5f31\u6027\u30b9\u30ad\u30e3\u30f3<\/h3>\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\/security-scan.yml\nname: Security Scan\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n  schedule:\n    - cron: '0 0 * * *'\n\njobs:\n  scan:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\/checkout@v2\n\n      - name: Run Trivy vulnerability scanner\n        uses: aquasecurity\/trivy-action@master\n        with:\n          image-ref: 'myapp:latest'\n          format: 'table'\n          exit-code: '1'\n          severity: 'CRITICAL,HIGH'<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-54\">2. \u30b9\u30ad\u30e3\u30f3\u7d50\u679c\u306e\u7ba1\u7406<\/h3>\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  defectdojo:\n    image: defectdojo\/defectdojo\n    ports:\n      - \"8080:8080\"\n    environment:\n      - DD_DATABASE_URL=postgresql:\/\/defectdojo:secret@db:5432\/defectdojo\n    volumes:\n      - defectdojo_media:\/app\/media<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-55\">3. \u81ea\u52d5\u30b9\u30ad\u30e3\u30f3\u30b9\u30af\u30ea\u30d7\u30c8<\/h3>\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=\"\">#!\/bin\/bash\n# scan-image.sh\n\nIMAGE_NAME=$1\nTAG=${2:-latest}\n\n# \u30a4\u30e1\u30fc\u30b8\u306e\u30b9\u30ad\u30e3\u30f3\ntrivy image --severity HIGH,CRITICAL \\\n  --output trivy-results.json \\\n  --format json \\\n  ${IMAGE_NAME}:${TAG}\n\n# \u7d50\u679c\u306e\u89e3\u6790\u3068\u5831\u544a\nif [ $? -eq 0 ]; then\n  echo \"No security issues found\"\nelse\n  echo \"Security issues detected. Check trivy-results.json\"\n  exit 1\nfi<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-56\">\u30bb\u30ad\u30e5\u30a2\u306a\u30a4\u30e1\u30fc\u30b8\u69cb\u7bc9\u306e\u30dd\u30a4\u30f3\u30c8<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-57\">1. \u30bb\u30ad\u30e5\u30a2\u30d9\u30fc\u30b9\u30a4\u30e1\u30fc\u30b8\u306e\u9078\u629e<\/h3>\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=\"\"># \u30bb\u30ad\u30e5\u30a2\u306a\u30d9\u30fc\u30b9\u30a4\u30e1\u30fc\u30b8\u3092\u4f7f\u7528\nFROM eclipse-temurin:17-jre-alpine\n\n# \u5fc5\u8981\u6700\u5c0f\u9650\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u307f\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\nRUN apk add --no-cache \\\n    curl \\\n    tzdata \\\n    &amp;&amp; rm -rf \/var\/cache\/apk\/*\n\n# \u975eroot\u30e6\u30fc\u30b6\u30fc\u306e\u4f5c\u6210\u3068\u5207\u308a\u66ff\u3048\nRUN addgroup -S appgroup &amp;&amp; adduser -S appuser -G appgroup\nUSER appuser\n\n# \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u914d\u7f6e\nCOPY --chown=appuser:appgroup target\/*.jar app.jar\n\n# \u6700\u5c0f\u9650\u306e\u74b0\u5883\u5909\u6570\u8a2d\u5b9a\nENV JAVA_OPTS=\"-Djava.security.egd=file:\/dev\/.\/urandom -Dfile.encoding=UTF-8\"\n\n# \u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af\u306e\u8ffd\u52a0\nHEALTHCHECK --interval=30s --timeout=3s \\\n  CMD curl -f http:\/\/localhost:8080\/actuator\/health || exit 1\n\nENTRYPOINT [\"java\", \"-jar\", \"app.jar\"]<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-58\">2. \u30de\u30eb\u30c1\u30b9\u30c6\u30fc\u30b8\u30d3\u30eb\u30c9\u3067\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5f37\u5316<\/h3>\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=\"\"># \u30d3\u30eb\u30c9\u30b9\u30c6\u30fc\u30b8\nFROM maven:3.8.4-eclipse-temurin-17 AS builder\nWORKDIR \/build\n\n# \u4f9d\u5b58\u95a2\u4fc2\u306e\u30c1\u30a7\u30c3\u30af\nCOPY pom.xml .\nRUN mvn dependency-check:check\n\n# \u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u306e\u9759\u7684\u89e3\u6790\nCOPY src .\/src\nRUN mvn verify -Psecurity\n\n# \u5b9f\u884c\u74b0\u5883\nFROM eclipse-temurin:17-jre-alpine\nUSER appuser\nCOPY --from=builder --chown=appuser:appgroup \/build\/target\/*.jar app.jar<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-59\">3. \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30b9\u30ad\u30e3\u30f3\u81ea\u52d5\u5316\u306e\u8a2d\u5b9a<\/h3>\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.security.yml\nservices:\n  clair:\n    image: quay.io\/coreos\/clair\n    ports:\n      - \"6060:6060\"\n    depends_on:\n      - clairdb\n\n  clairdb:\n    image: postgres:14-alpine\n    environment:\n      - POSTGRES_PASSWORD=secret<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-60\">\u6a29\u9650\u7ba1\u7406\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8a2d\u5b9a<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-61\">1. \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u6a29\u9650\u8a2d\u5b9a<\/h3>\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.yml\nservices:\n  app:\n    security_opt:\n      - no-new-privileges:true\n    cap_drop:\n      - ALL\n    cap_add:\n      - NET_BIND_SERVICE\n    read_only: true\n    tmpfs:\n      - \/tmp<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-62\">2. \u30b7\u30fc\u30af\u30ec\u30c3\u30c8\u7ba1\u7406<\/h3>\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    environment:\n      - SPRING_PROFILES_ACTIVE=prod\n    secrets:\n      - db_password\n      - api_key\n\nsecrets:\n  db_password:\n    file: .\/secrets\/db_password.txt\n  api_key:\n    file: .\/secrets\/api_key.txt<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-63\">3. \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8a2d\u5b9a<\/h3>\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.yml\nnetworks:\n  frontend:\n    driver: overlay\n    internal: false\n  backend:\n    driver: overlay\n    internal: true\n\nservices:\n  app:\n    networks:\n      - frontend\n      - backend\n\n  db:\n    networks:\n      - backend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-64\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a4\u30e1\u30fc\u30b8\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3<\/strong>\n<ul class=\"wp-block-list\">\n<li>[ ] \u6700\u5c0f\u9650\u306e\u30d9\u30fc\u30b9\u30a4\u30e1\u30fc\u30b8\u4f7f\u7528<\/li>\n\n\n\n<li>[ ] \u5b9a\u671f\u7684\u306a\u8106\u5f31\u6027\u30b9\u30ad\u30e3\u30f3\u5b9f\u65bd<\/li>\n\n\n\n<li>[ ] \u30de\u30eb\u30c1\u30b9\u30c6\u30fc\u30b8\u30d3\u30eb\u30c9\u63a1\u7528<\/li>\n\n\n\n<li>[ ] \u4e0d\u8981\u306a\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u9664\u53bb<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u5b9f\u884c\u6642\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3<\/strong>\n<ul class=\"wp-block-list\">\n<li>[ ] \u975eroot\u30e6\u30fc\u30b6\u30fc\u3067\u306e\u5b9f\u884c<\/li>\n\n\n\n<li>[ ] \u5fc5\u8981\u6700\u5c0f\u9650\u306e\u6a29\u9650\u8a2d\u5b9a<\/li>\n\n\n\n<li>[ ] read-only\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0<\/li>\n\n\n\n<li>[ ] \u30bb\u30ad\u30e5\u30a2\u306a\u74b0\u5883\u5909\u6570\u7ba1\u7406<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30a2\u30af\u30bb\u30b9\u5236\u5fa1<\/strong>\n<ul class=\"wp-block-list\">\n<li>[ ] \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u30bb\u30b0\u30e1\u30f3\u30c6\u30fc\u30b7\u30e7\u30f3<\/li>\n\n\n\n<li>[ ] \u30b7\u30fc\u30af\u30ec\u30c3\u30c8\u7ba1\u7406\u306e\u9069\u5207\u306a\u5b9f\u88c5<\/li>\n\n\n\n<li>[ ] \u30b3\u30f3\u30c6\u30ca\u9593\u901a\u4fe1\u306e\u5236\u9650<\/li>\n\n\n\n<li>[ ] \u30dd\u30fc\u30c8\u516c\u958b\u306e\u6700\u5c0f\u5316<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u3068\u76e3\u67fb<\/strong>\n<ul class=\"wp-block-list\">\n<li>[ ] \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30ed\u30b0\u306e\u53ce\u96c6<\/li>\n\n\n\n<li>[ ] \u7570\u5e38\u691c\u77e5\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>[ ] \u5b9a\u671f\u7684\u306a\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u76e3\u67fb<\/li>\n\n\n\n<li>[ ] \u30a4\u30f3\u30b7\u30c7\u30f3\u30c8\u5bfe\u5fdc\u8a08\u753b\u306e\u7b56\u5b9a<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u30b3\u30f3\u30c6\u30ca\u5316\u3055\u308c\u305fJava\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5b89\u5168\u6027\u3092\u5927\u5e45\u306b\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u5b9a\u671f\u7684\u306a\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8a55\u4fa1\u3068\u66f4\u65b0\u3092\u884c\u3046\u3053\u3068\u3082\u91cd\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-65\">CI\/CD\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u3078\u306e\u7d71\u5408<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-66\">GitHub Actions\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/h2>\n\n\n\n<p>GitHub Actions\u3092\u4f7f\u7528\u3057\u3066Java\u00d7Docker\u306e\u7d99\u7d9a\u7684\u30a4\u30f3\u30c6\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\/\u30c7\u30ea\u30d0\u30ea\u30fc\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-67\">1. \u57fa\u672c\u7684\u306aCI\/CD\u30ef\u30fc\u30af\u30d5\u30ed\u30fc<\/h3>\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\/ci-cd.yml\nname: Java Docker CI\/CD\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@v3\n\n      - name: Set up JDK 17\n        uses: actions\/setup-java@v3\n        with:\n          java-version: '17'\n          distribution: 'temurin'\n          cache: 'maven'\n\n      - name: Build and Test\n        run: mvn clean verify\n\n      - name: Build Docker image\n        run: docker build -t myapp:${GITHUB_SHA} .\n\n      - name: Login to GitHub Container Registry\n        uses: docker\/login-action@v2\n        with:\n          registry: ghcr.io\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Push Docker image\n        run: |\n          docker tag myapp:${GITHUB_SHA} ghcr.io\/${{ github.repository }}\/myapp:${GITHUB_SHA}\n          docker push ghcr.io\/${{ github.repository }}\/myapp:${GITHUB_SHA}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-68\">2. \u74b0\u5883\u5225\u306e\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u30ef\u30fc\u30af\u30d5\u30ed\u30fc<\/h3>\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\/deployment.yml\nname: Deploy to Environment\n\non:\n  workflow_run:\n    workflows: [\"Java Docker CI\/CD\"]\n    types:\n      - completed\n    branches:\n      - main\n\njobs:\n  deploy-staging:\n    runs-on: ubuntu-latest\n    environment: staging\n    steps:\n      - name: Deploy to Staging\n        uses: azure\/webapps-deploy@v2\n        with:\n          app-name: myapp-staging\n          images: ghcr.io\/${{ github.repository }}\/myapp:${GITHUB_SHA}\n\n  deploy-production:\n    needs: deploy-staging\n    runs-on: ubuntu-latest\n    environment: production\n    steps:\n      - name: Deploy to Production\n        uses: azure\/webapps-deploy@v2\n        with:\n          app-name: myapp-production\n          images: ghcr.io\/${{ github.repository }}\/myapp:${GITHUB_SHA}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-69\">\u81ea\u52d5\u30c6\u30b9\u30c8\u3068\u54c1\u8cea\u30c1\u30a7\u30c3\u30af\u306e\u5b9f\u88c5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-70\">1. \u30c6\u30b9\u30c8\u81ea\u52d5\u5316\u306e\u8a2d\u5b9a<\/h3>\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\/tests.yml\nname: Automated Tests\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Unit Tests\n        run: mvn test\n\n      - name: Integration Tests\n        run: |\n          docker-compose -f docker-compose.test.yml up -d\n          mvn verify -P integration-test\n\n      - name: Code Coverage\n        run: mvn jacoco:report\n\n      - name: SonarQube Analysis\n        run: |\n          mvn sonar:sonar \\\n            -Dsonar.host.url=${{ secrets.SONAR_URL }} \\\n            -Dsonar.login=${{ secrets.SONAR_TOKEN }}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-71\">2. \u54c1\u8cea\u30b2\u30fc\u30c8\u306e\u8a2d\u5b9a<\/h3>\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=\"\">jobs:\n  quality-check:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Code Style Check\n        run: mvn checkstyle:check\n\n      - name: Dependency Check\n        run: mvn dependency-check:check\n\n      - name: SpotBugs Analysis\n        run: mvn spotbugs:check\n\n      - name: Quality Gate\n        run: |\n          if [ $(mvn sonar:sonar -Dsonar.qualitygate.wait=true) -eq 1 ]; then\n            echo \"Quality Gate failed!\"\n            exit 1\n          fi<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-72\">3. \u30c6\u30b9\u30c8\u7d50\u679c\u306e\u4fdd\u5b58\u3068\u53ef\u8996\u5316<\/h3>\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=\"\">      - name: Publish Test Results\n        uses: actions\/upload-artifact@v3\n        with:\n          name: test-results\n          path: |\n            target\/surefire-reports\n            target\/failsafe-reports\n            target\/site\/jacoco<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-73\">\u672c\u756a\u74b0\u5883\u3078\u306e\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u6226\u7565<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-74\">1. \u30d6\u30eb\u30fc\u30b0\u30ea\u30fc\u30f3\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u306e\u5b9f\u88c5<\/h3>\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\/blue-green-deployment.yml\nname: Blue-Green Deployment\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Deploy Green Environment\n        run: |\n          # \u65b0\u30d0\u30fc\u30b8\u30e7\u30f3\u3092Green\u306b\u30c7\u30d7\u30ed\u30a4\n          kubectl apply -f k8s\/green-deployment.yml\n\n          # \u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af\n          .\/scripts\/health-check.sh green\n\n          # \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u5207\u308a\u66ff\u3048\n          kubectl apply -f k8s\/switch-to-green.yml\n\n          # \u53e4\u3044Blue\u74b0\u5883\u306e\u524a\u9664\n          kubectl delete -f k8s\/blue-deployment.yml<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-75\">2. \u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u30b9\u30af\u30ea\u30d7\u30c8\u4f8b<\/h3>\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=\"\">#!\/bin\/bash\n# scripts\/deploy.sh\n\n# \u74b0\u5883\u5909\u6570\u306e\u8a2d\u5b9a\nENV=$1\nVERSION=$2\n\n# \u30a4\u30e1\u30fc\u30b8\u306e\u6e96\u5099\ndocker pull ghcr.io\/myapp:${VERSION}\n\n# \u65b0\u74b0\u5883\u306e\u30c7\u30d7\u30ed\u30a4\nenvsubst &lt; k8s\/deployment.template.yml | kubectl apply -f -\n\n# \u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af\nattempt=1\nmax_attempts=30\nuntil $(curl --output \/dev\/null --silent --head --fail http:\/\/localhost:8080\/actuator\/health); do\n    if [ ${attempt} -eq ${max_attempts} ]; then\n        echo \"Max attempts reached. Deployment failed!\"\n        exit 1\n    fi\n\n    printf '.'\n    attempt=$(( attempt + 1 ))\n    sleep 2\ndone\n\necho \"Deployment successful!\"<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-76\">3. \u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u8a2d\u5b9a\u4f8b<\/h3>\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=\"\"># k8s\/deployment.template.yml\napiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: myapp-${COLOR}\nspec:\n  replicas: 3\n  strategy:\n    type: RollingUpdate\n    rollingUpdate:\n      maxSurge: 1\n      maxUnavailable: 0\n  template:\n    spec:\n      containers:\n      - name: myapp\n        image: ghcr.io\/myapp:${VERSION}\n        readinessProbe:\n          httpGet:\n            path: \/actuator\/health\n            port: 8080\n          initialDelaySeconds: 10\n          periodSeconds: 3\n        livenessProbe:\n          httpGet:\n            path: \/actuator\/health\n            port: 8080\n          initialDelaySeconds: 30\n          periodSeconds: 10<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-77\">\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6bb5\u968e\u7684\u306a\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u6226\u7565<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30b9\u30c6\u30fc\u30b8\u30f3\u30b0\u74b0\u5883\u3067\u306e\u4e8b\u524d\u691c\u8a3c<\/li>\n\n\n\n<li>\u30ab\u30ca\u30ea\u30a2\u30ea\u30ea\u30fc\u30b9\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u624b\u9806\u306e\u6574\u5099<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u3068\u691c\u8a3c<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u524d\u5f8c\u306e\u5065\u5168\u6027\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30e1\u30c8\u30ea\u30af\u30b9\u306e\u53ce\u96c6<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30ec\u30fc\u30c8\u76e3\u8996<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8003\u616e\u4e8b\u9805<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30b7\u30fc\u30af\u30ec\u30c3\u30c8\u7ba1\u7406\u306e\u81ea\u52d5\u5316<\/li>\n\n\n\n<li>\u74b0\u5883\u5909\u6570\u306e\u9069\u5207\u306a\u53d6\u308a\u6271\u3044<\/li>\n\n\n\n<li>\u30a2\u30af\u30bb\u30b9\u5236\u5fa1\u306e\u78ba\u4fdd<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u81ea\u52d5\u5316\u306e\u30dd\u30a4\u30f3\u30c8<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u306e\u5b8c\u5168\u81ea\u52d5\u5316<\/li>\n\n\n\n<li>\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u306e\u81ea\u52d5\u5316<\/li>\n\n\n\n<li>\u901a\u77e5\u306e\u81ea\u52d5\u5316<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306eCI\/CD\u8a2d\u5b9a\u306b\u3088\u308a\u3001\u5b89\u5168\u3067\u52b9\u7387\u7684\u306a\u958b\u767a\u30fb\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u30b5\u30a4\u30af\u30eb\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-78\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30ac\u30a4\u30c9<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-79\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u89e3\u6c7a\u65b9\u6cd5<\/h2>\n\n\n\n<p>Docker\u00d7Java\u74b0\u5883\u3067\u767a\u751f\u3059\u308b\u4e3b\u306a\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5\u3092\u307e\u3068\u3081\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-80\">1. \u30e1\u30e2\u30ea\u95a2\u9023\u306e\u554f\u984c<\/h3>\n\n\n<div id=\"id-0725ed58-d2a8-4d60-8910-3cc9963347e3\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30a8\u30e9\u30fc<\/th><th>\u539f\u56e0<\/th><th>\u89e3\u6c7a\u7b56<\/th><\/tr><\/thead><tbody><tr><td><code>java.lang.OutOfMemoryError: Java heap space<\/code><\/td><td>JVM\u30d2\u30fc\u30d7\u30e1\u30e2\u30ea\u4e0d\u8db3<\/td><td>\u2013 \u30b3\u30f3\u30c6\u30ca\u30e1\u30e2\u30ea\u5236\u9650\u306e\u78ba\u8a8d<br>\u2013 JVM\u30e1\u30e2\u30ea\u8a2d\u5b9a\u306e\u8abf\u6574<\/td><\/tr><tr><td><code>java.lang.OutOfMemoryError: Metaspace<\/code><\/td><td>\u30e1\u30bf\u30b9\u30da\u30fc\u30b9\u9818\u57df\u4e0d\u8db3<\/td><td>\u2013 <code>-XX:MaxMetaspaceSize<\/code>\u306e\u5897\u52a0<br>\u2013 \u4e0d\u8981\u306a\u30af\u30e9\u30b9\u30ed\u30fc\u30c9\u306e\u524a\u6e1b<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\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=\"\"># \u30e1\u30e2\u30ea\u4f7f\u7528\u72b6\u6cc1\u306e\u78ba\u8a8d\ndocker stats\n\n# JVM\u30e1\u30e2\u30ea\u8a2d\u5b9a\u306e\u8abf\u6574\u4f8b\ndocker run -e JAVA_OPTS=\"-Xmx1g -XX:MaxMetaspaceSize=256m\" myapp<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-81\">2. \u30b3\u30f3\u30c6\u30ca\u8d77\u52d5\u306e\u554f\u984c<\/h3>\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\u30ed\u30b0\u306e\u78ba\u8a8d\ndocker logs &lt;container_id&gt;\n\n# \u8a73\u7d30\u306a\u30b7\u30b9\u30c6\u30e0\u60c5\u5831\u306e\u53d6\u5f97\ndocker inspect &lt;container_id&gt;\n\n# \u30b3\u30f3\u30c6\u30ca\u5185\u3067\u306e\u30c7\u30d0\u30c3\u30b0\u5b9f\u884c\ndocker exec -it &lt;container_id&gt; \/bin\/sh<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-82\">3. \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u63a5\u7d9a\u306e\u554f\u984c<\/h3>\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.debug.yml\nservices:\n  app:\n    networks:\n      - backend\n    depends_on:\n      db:\n        condition: service_healthy\n    healthcheck:\n      test: [\"CMD\", \"curl\", \"-f\", \"http:\/\/localhost:8080\/actuator\/health\"]\n      interval: 10s\n      timeout: 5s\n      retries: 3<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-83\">\u30c7\u30d0\u30c3\u30b0\u3068\u30ed\u30b0\u53ce\u96c6\u306e\u30c6\u30af\u30cb\u30c3\u30af<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-84\">1. \u30ea\u30e2\u30fc\u30c8\u30c7\u30d0\u30c3\u30b0\u306e\u8a2d\u5b9a<\/h3>\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=\"\"># Dockerfile.debug\nFROM eclipse-temurin:17-jdk\nENV JAVA_TOOL_OPTIONS=\"-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005\"\nEXPOSE 5005<\/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=\"\"># \u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u3067\u306e\u8d77\u52d5\ndocker-compose -f docker-compose.debug.yml up<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-85\">2. \u30ed\u30b0\u53ce\u96c6\u30b7\u30b9\u30c6\u30e0\u306e\u69cb\u7bc9<\/h3>\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.logging.yml\nservices:\n  app:\n    logging:\n      driver: \"json-file\"\n      options:\n        max-size: \"10m\"\n        max-file: \"3\"\n\n  filebeat:\n    image: docker.elastic.co\/beats\/filebeat:7.15.0\n    volumes:\n      - .\/filebeat.yml:\/usr\/share\/filebeat\/filebeat.yml:ro\n      - \/var\/lib\/docker\/containers:\/var\/lib\/docker\/containers:ro\n\n  elasticsearch:\n    image: docker.elastic.co\/elasticsearch\/elasticsearch:7.15.0\n    environment:\n      - discovery.type=single-node\n\n  kibana:\n    image: docker.elastic.co\/kibana\/kibana:7.15.0\n    ports:\n      - \"5601:5601\"<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-86\">3. \u30c7\u30d0\u30c3\u30b0\u30b9\u30af\u30ea\u30d7\u30c8\u96c6<\/h3>\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=\"\">#!\/bin\/bash\n# debug-tools.sh\n\n# \u30d2\u30fc\u30d7\u30c0\u30f3\u30d7\u306e\u53d6\u5f97\nget_heap_dump() {\n    container_id=$1\n    docker exec $container_id jmap -dump:format=b,file=\/dumps\/heap.hprof 1\n    docker cp $container_id:\/dumps\/heap.hprof .\/heap.hprof\n}\n\n# \u30b9\u30ec\u30c3\u30c9\u30c0\u30f3\u30d7\u306e\u53d6\u5f97\nget_thread_dump() {\n    container_id=$1\n    docker exec $container_id jstack 1 &gt; thread_dump.txt\n}\n\n# GC\u30ed\u30b0\u306e\u6709\u52b9\u5316\nenable_gc_logging() {\n    docker run -e JAVA_OPTS=\"-Xlog:gc*=debug:file=\/logs\/gc.log\" myapp\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-87\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u554f\u984c\u306e\u8a3a\u65ad\u3068\u6539\u5584<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-88\">1. \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u76e3\u8996\u8a2d\u5b9a<\/h3>\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.monitoring.yml\nservices:\n  app:\n    ports:\n      - \"8080:8080\"\n      - \"9090:9090\"  # JMX Exporter\n    environment:\n      - JAVA_OPTS=-javaagent:\/app\/jmx_prometheus_javaagent.jar=9090:\/app\/config.yaml\n    volumes:\n      - .\/monitoring\/jmx_prometheus_javaagent.jar:\/app\/jmx_prometheus_javaagent.jar\n      - .\/monitoring\/config.yaml:\/app\/config.yaml<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-89\">2. \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u8a3a\u65ad\u30b9\u30af\u30ea\u30d7\u30c8<\/h3>\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=\"\">#!\/bin\/bash\n# performance-analysis.sh\n\n# CPU\u4f7f\u7528\u7387\u306e\u78ba\u8a8d\ncheck_cpu() {\n    docker stats --no-stream --format \"table {{.Container}}\\t{{.CPUPerc}}\\t{{.MemUsage}}\"\n}\n\n# \u30dc\u30c8\u30eb\u30cd\u30c3\u30af\u691c\u51fa\ndetect_bottlenecks() {\n    container_id=$1\n    echo \"=== CPU Hot Spots ===\"\n    docker exec $container_id jcmd 1 VM.native_memory\n\n    echo \"=== Thread Analysis ===\"\n    docker exec $container_id jcmd 1 Thread.print\n\n    echo \"=== GC Analysis ===\"\n    docker exec $container_id jcmd 1 GC.heap_info\n}\n\n# \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c6\u30b9\u30c8\u5b9f\u884c\nrun_performance_test() {\n    docker run --rm -v $(pwd):\/scripts gatling\/gatling:latest \\\n        -sf \/scripts\/gatling\/simulations \\\n        -rf \/scripts\/gatling\/results\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-90\">3. \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30ec\u30d9\u30eb<\/strong>\n<ul class=\"wp-block-list\">\n<li>[ ] JVM\u30e1\u30e2\u30ea\u8a2d\u5b9a\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>[ ] GC\u8a2d\u5b9a\u306e\u8abf\u6574<\/li>\n\n\n\n<li>[ ] \u30b9\u30ec\u30c3\u30c9\u30d7\u30fc\u30eb\u8a2d\u5b9a\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>[ ] \u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30d7\u30fc\u30eb\u8a2d\u5b9a\u306e\u78ba\u8a8d<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30b3\u30f3\u30c6\u30ca\u30ec\u30d9\u30eb<\/strong>\n<ul class=\"wp-block-list\">\n<li>[ ] \u30ea\u30bd\u30fc\u30b9\u5236\u9650\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/li>\n\n\n\n<li>[ ] \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u8a2d\u5b9a\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>[ ] \u30dc\u30ea\u30e5\u30fc\u30e0\u30de\u30a6\u30f3\u30c8\u306e\u52b9\u7387\u5316<\/li>\n\n\n\n<li>[ ] \u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u78ba\u8a8d<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u76e3\u8996\u3068\u5206\u6790<\/strong>\n<ul class=\"wp-block-list\">\n<li>[ ] \u30e1\u30c8\u30ea\u30af\u30b9\u53ce\u96c6\u306e\u8a2d\u5b9a<\/li>\n\n\n\n<li>[ ] \u30a2\u30e9\u30fc\u30c8\u95be\u5024\u306e\u8a2d\u5b9a<\/li>\n\n\n\n<li>[ ] \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c6\u30b9\u30c8\u306e\u81ea\u52d5\u5316<\/li>\n\n\n\n<li>[ ] \u30ed\u30b0\u5206\u6790\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-91\">4. \u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30d5\u30ed\u30fc\u30c1\u30e3\u30fc\u30c8<\/h3>\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=\"\">graph TD\n    A[\u554f\u984c\u767a\u751f] --&gt; B{\u30a8\u30e9\u30fc\u7a2e\u5225\u5224\u65ad}\n    B --&gt;|\u30e1\u30e2\u30ea\u30a8\u30e9\u30fc| C[\u30e1\u30e2\u30ea\u8a3a\u65ad]\n    B --&gt;|\u8d77\u52d5\u30a8\u30e9\u30fc| D[\u30b3\u30f3\u30c6\u30ca\u30ed\u30b0\u78ba\u8a8d]\n    B --&gt;|\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u4f4e\u4e0b| E[\u30ea\u30bd\u30fc\u30b9\u4f7f\u7528\u7387\u78ba\u8a8d]\n\n    C --&gt; F[\u30d2\u30fc\u30d7\u30c0\u30f3\u30d7\u5206\u6790]\n    D --&gt; G[Dockerfile\u78ba\u8a8d]\n    E --&gt; H[\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u78ba\u8a8d]\n\n    F --&gt; I[\u30e1\u30e2\u30ea\u8a2d\u5b9a\u8abf\u6574]\n    G --&gt; J[\u30a4\u30e1\u30fc\u30b8\u518d\u30d3\u30eb\u30c9]\n    H --&gt; K[\u30ea\u30bd\u30fc\u30b9\u5236\u9650\u8abf\u6574]<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30c4\u30fc\u30eb\u3068\u624b\u9806\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001Docker\u00d7Java\u74b0\u5883\u3067\u306e\u554f\u984c\u3092\u3088\u308a\u52b9\u7387\u7684\u306b\u89e3\u6c7a\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-92\">\u307e\u3068\u3081<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-93\">Docker\u00d7Java\u958b\u767a\u74b0\u5883\u69cb\u7bc9\u306e\u91cd\u8981\u30dd\u30a4\u30f3\u30c8<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-94\">1. \u74b0\u5883\u69cb\u7bc9\u306e\u57fa\u672c\u539f\u5247<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e00\u8cab\u6027\u306e\u3042\u308b\u958b\u767a\u74b0\u5883\u306e\u7dad\u6301<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30d9\u30fc\u30b9\u30a4\u30e1\u30fc\u30b8\u306e\u9078\u629e<\/li>\n\n\n\n<li>\u52b9\u7387\u7684\u306a\u30d3\u30eb\u30c9\u30d7\u30ed\u30bb\u30b9\u306e\u78ba\u7acb<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u8003\u616e\u3057\u305f\u8a2d\u8a08<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-95\">2. \u5b9f\u88c5\u6642\u306e\u6ce8\u610f\u70b9\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-96\">\u958b\u767a\u52b9\u7387\u306e\u6700\u9069\u5316<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30de\u30eb\u30c1\u30b9\u30c6\u30fc\u30b8\u30d3\u30eb\u30c9\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u4f9d\u5b58\u95a2\u4fc2\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565<\/li>\n\n\n\n<li>\u958b\u767a\u74b0\u5883\u3068\u672c\u756a\u74b0\u5883\u306e\u5206\u96e2<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-97\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u78ba\u4fdd<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8106\u5f31\u6027\u30b9\u30ad\u30e3\u30f3\u306e\u5b9a\u671f\u5b9f\u884c<\/li>\n\n\n\n<li>\u6700\u5c0f\u6a29\u9650\u306e\u539f\u5247\u306e\u9075\u5b88<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30a2\u306a\u8a2d\u5b9a\u306e\u5fb9\u5e95<\/li>\n\n\n\n<li>\u76e3\u67fb\u30ed\u30b0\u306e\u9069\u5207\u306a\u7ba1\u7406<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-98\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u6700\u9069\u5316<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>JVM\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30b3\u30f3\u30c6\u30ca\u30ea\u30bd\u30fc\u30b9\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30d3\u30eb\u30c9\u30d7\u30ed\u30bb\u30b9\u306e\u52b9\u7387\u5316<\/li>\n\n\n\n<li>\u76e3\u8996\u4f53\u5236\u306e\u78ba\u7acb<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-99\">\u6b21\u306e\u30b9\u30c6\u30c3\u30d7\u3068\u30ea\u30bd\u30fc\u30b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-100\">1. \u3055\u3089\u306a\u308b\u5b66\u7fd2\u306e\u305f\u3081\u306b<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Docker\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8: <a href=\"https:\/\/docs.docker.com\/\">https:\/\/docs.docker.com\/<\/a><\/li>\n\n\n\n<li>Spring Boot with Docker: <a href=\"https:\/\/spring.io\/guides\/topicals\/spring-boot-docker\/\">https:\/\/spring.io\/guides\/topicals\/spring-boot-docker\/<\/a><\/li>\n\n\n\n<li>Java Performance Tuning: <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/17\/performance\/\">https:\/\/docs.oracle.com\/en\/java\/javase\/17\/performance\/<\/a><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-101\">2. \u63a8\u5968\u30c4\u30fc\u30eb<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Container Security Scanner: Trivy<\/li>\n\n\n\n<li>Performance Monitoring: Prometheus + Grafana<\/li>\n\n\n\n<li>CI\/CD: GitHub Actions<\/li>\n\n\n\n<li>Log Management: ELK Stack<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-102\">3. \u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u30ea\u30bd\u30fc\u30b9<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Docker Community Forums<\/li>\n\n\n\n<li>Stack Overflow \u2013 Docker \u30bf\u30b0<\/li>\n\n\n\n<li>GitHub \u2013 Java Docker \u30b5\u30f3\u30d7\u30eb\u30d7\u30ed\u30b8\u30a7\u30af\u30c8<\/li>\n<\/ul>\n\n\n\n<p>\u4ee5\u4e0a\u304c\u3001Docker\u00d7Java\u958b\u767a\u74b0\u5883\u306e\u69cb\u7bc9\u304b\u3089\u904b\u7528\u307e\u3067\u306e\u5305\u62ec\u7684\u306a\u30ac\u30a4\u30c9\u3067\u3057\u305f\u3002\u3053\u306e\u30ac\u30a4\u30c9\u3067\u7d39\u4ecb\u3057\u305f\u624b\u6cd5\u3084\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u52b9\u7387\u7684\u3067\u5b89\u5168\u306a\u958b\u767a\u74b0\u5883\u3092\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002\u6280\u8853\u306e\u9032\u5316\u306b\u5408\u308f\u305b\u3066\u5b9a\u671f\u7684\u306b\u8a2d\u5b9a\u3092\u898b\u76f4\u3057\u3001\u5e38\u306b\u6700\u9069\u306a\u958b\u767a\u74b0\u5883\u3092\u7dad\u6301\u3059\u308b\u3053\u3068\u3092\u63a8\u5968\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>\u6ce8\u610f<\/strong>: \u672c\u8a18\u4e8b\u306e\u5185\u5bb9\u306f2024\u5e74\u6642\u70b9\u306e\u3082\u306e\u3067\u3059\u3002Docker\u3001Java\u3001\u304a\u3088\u3073\u95a2\u9023\u30c4\u30fc\u30eb\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u30a2\u30c3\u30d7\u306b\u5fdc\u3058\u3066\u3001\u9069\u5b9c\u8a2d\u5b9a\u3092\u8abf\u6574\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<\/blockquote>\n\n\n\n<p>Last edited 5 \u6642\u9593\u524d<\/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":[2],"tags":[],"class_list":{"0":"post-805","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-java","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/805","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=805"}],"version-history":[{"count":2,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/805\/revisions"}],"predecessor-version":[{"id":855,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/805\/revisions\/855"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=805"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=805"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=805"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}