{"id":33428,"date":"2023-12-19T18:49:39","date_gmt":"2023-09-15T04:19:01","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8dockerdjangonginxmysqlgunicorn%e8%bf%9b%e8%a1%8c%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba%ef%bc%8c%e6%94%af%e6%8c%81m1mac%e3%80%82\/"},"modified":"2024-05-04T14:19:35","modified_gmt":"2024-05-04T06:19:35","slug":"%e4%bd%bf%e7%94%a8dockerdjangonginxmysqlgunicorn%e8%bf%9b%e8%a1%8c%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba%ef%bc%8c%e6%94%af%e6%8c%81m1mac%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8dockerdjangonginxmysqlgunicorn%e8%bf%9b%e8%a1%8c%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba%ef%bc%8c%e6%94%af%e6%8c%81m1mac%e3%80%82\/","title":{"rendered":"\u4f7f\u7528Docker+Django+Nginx+MySQL+Gunicorn\u8fdb\u884c\u73af\u5883\u642d\u5efa\uff0c\u652f\u6301M1Mac"},"content":{"rendered":"<h2>\u524d\u63d0<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306fDjango<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">DB\u306fMySQL<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b5\u30fc\u30d0\u306fGunicorn<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Web\u30b5\u30fc\u30d0\u306fNginx<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">DB\u5074\u306e\u30b3\u30f3\u30c6\u30ca\u540d\u306fmysql\u3001django\u5074\u306e\u30b3\u30f3\u30c6\u30ca\u540d\u306fapp\u3001nginx\u5074\u306fweb\u306b\u3057\u307e\u3059<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u958b\u767a\u7528\u306fdocker-compose.yml(Django+MySQL)\u3068\u3057\u3066\u4f5c\u6210\u3057\u307e\u3059<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u672c\u756a\u7528\u306fdocker-compose.prod.yml(Django+MySQL+Nginx)\u3068\u3057\u3066\u4f5c\u6210\u3057\u307e\u3059<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u4f5c\u6210\u3059\u308b\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d\u306fdjangopj\u306b\u3057\u3066\u3044\u307e\u3059\u304c\u5225\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d\u3067\u4f5c\u6210\u3059\u308b\u969b\u306fdjangopj\u3068\u7f6e\u304d\u63db\u3048\u3066\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044<\/ul>\n<h2>\u603b\u7ed3<\/h2>\n<p>\u5982\u6807\u9898\u6240\u793a\uff0c<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Django<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">MySQL<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Nginx<\/ul>\n<\/li>\n<\/ul>\n<p>Gunicorn<\/p>\n<p>\u6211\u5c06\u89e3\u91ca\u5982\u4f55\u521b\u5efa\u4e00\u4e2a\u4f7f\u7528\u5bb9\u5668\u5f00\u53d1\u73af\u5883\u7684\u65b9\u6cd5\uff0c\u540c\u65f6\u4f7f\u7528requirements.txt\u6765\u8fdb\u884c\u8f6f\u4ef6\u5305\u7ba1\u7406\u3002<\/p>\n<p>\u53e6\u5916\uff0c\u5728\u6587\u7ae0\u7684\u540e\u534a\u90e8\u5206\u4f5c\u4e3a\u5e94\u7528\u7bc7<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Poetry\u3092\u4f7f\u3063\u305f\u958b\u767a\u74b0\u5883\u306e\u69cb\u7bc9\u65b9\u6cd5<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Pydantic\u3092\u4f7f\u3063\u305f\u74b0\u5883\u5909\u6570\u306e\u7ba1\u7406\u65b9\u6cd5<\/ul>\n<p>\u6211\u5c06\u89e3\u91ca\u5173\u4e8e\u8fd9\u4e2a\u95ee\u9898\uff0c\u5e76\u5e0c\u671b\u9996\u6b21\u4f7f\u7528Docker\u7684\u4eba\u5148\u7406\u89e3\u57fa\u672c\u7684\u6784\u5efa\u65b9\u6cd5\uff0c\u4f7f\u7528requirements.txt\u8fdb\u884c\u6311\u6218\u3002<\/p>\n<h2>\u76ee\u5f55\u7ed3\u6784<\/h2>\n<p>\u8bf7\u6309\u7167\u4ee5\u4e0b\u65b9\u5f0f\u521b\u5efa\u521d\u59cb\u76ee\u5f55\u7ed3\u6784\uff1a<br \/>\n\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a&#8221;containers&#8221;\u7684\u6587\u4ef6\u5939\uff0c\u5e76\u5728\u5176\u4e2d\u521b\u5efa&#8221;Django&#8221;\u3001&#8221;MySQL&#8221;\u548c&#8221;Nginx&#8221;\u6587\u4ef6\u5939\u3002<br \/>\n\u53e6\u5916\uff0c\u5728&#8221;Nginx&#8221;\u6587\u4ef6\u5939\u4e2d\u4e5f\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a&#8221;conf.d&#8221;\u7684\u6587\u4ef6\u5939\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">tree\r\n<\/span><span class=\"c\">.\r\n<\/span><span class=\"go\">\u251c\u2500\u2500 containers\r\n\u2502   \u251c\u2500\u2500 django\r\n\u2502   \u2502   \u2514\u2500\u2500 Dockerfile\r\n\u2502   \u251c\u2500\u2500 mysql\r\n\u2502   \u2502   \u251c\u2500\u2500 Dockerfile\r\n\u2502   \u2502   \u251c\u2500\u2500 init.sql\r\n\u2502   \u2502   \u2514\u2500\u2500 my.cnf\r\n\u2502   \u2514\u2500\u2500 nginx\r\n\u2502       \u251c\u2500\u2500 Dockerfile\r\n\u2502       \u2514\u2500\u2500 conf.d\r\n\u2502           \u2514\u2500\u2500 default.conf\r\n\u251c\u2500\u2500 .gitignore\r\n\u251c\u2500\u2500 .env\r\n\u251c\u2500\u2500 .env.prod\r\n\u251c\u2500\u2500 entrypoint.sh\r\n\u251c\u2500\u2500 docker-compose.prod.yml\r\n\u251c\u2500\u2500 docker-compose.yml\r\n\u2514\u2500\u2500 requirements.txt\r\n<\/span><\/code><\/pre>\n<h2>\u521b\u5efa\u6587\u4ef6<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Django\u306eDockerfile<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">MySQL\u306eDockerfile<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Nginx\u306eDockerfile<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">my.cnf(MySQL\u7528\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb)<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">init.sql(MySQL\u306e\u30e6\u30fc\u30b6\u306b\u6a29\u9650\u3092\u4ed8\u4e0e)<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">default.conf(Nginx\u7528\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb)<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">docker-compose.yml(\u958b\u767a\u7528)<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">docker-compose.prod.yml(\u672c\u756a\u7528)<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">requirements.txt(\u3056\u3063\u304f\u308a\u8a00\u3046\u3068Rails\u3067\u3044\u3046Gemfile\u306b\u3042\u305f\u308b)<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">.env(\u958b\u767a\u7528\u306e\u74b0\u5883\u5909\u6570\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb)<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">.env.prod(\u672c\u756a\u7528\u306e\u74b0\u5883\u5909\u6570\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb)<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">entrypoint.sh(Django\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3059\u308b\u7528\u306e\u30b7\u30a7\u30eb\u30b9\u30af\u30ea\u30d7\u30c8)<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">.gitignore<\/ul>\n<p>\u4ee5\u4e0b\u662f\u4ee5\u9806\u5e8f\u9032\u884c\u8aaa\u660e\u7684\u5275\u5efa\u65b9\u6cd5\u3002<\/p>\n<h2>\u4e3a\u4ec0\u4e48\u8981\u5c06\u5f00\u53d1\u73af\u5883\u548c\u751f\u4ea7\u73af\u5883\u5206\u5f00\uff1f<\/h2>\n<p>\u5982\u679c\u4f7f\u7528Django+MySQL+Nginx\u7684\u914d\u7f6e\u8fdb\u884c\u5f00\u53d1\uff0c\u5219\u7531\u4e8eNginx\u4ec5\u5177\u6709\u663e\u793a\u9759\u6001\u6587\u4ef6\u7684\u529f\u80fd\uff0c\u56e0\u6b64\u5fc5\u987b\u6bcf\u6b21\u91cd\u65b0\u542f\u52a8\u5bb9\u5668\u624d\u80fd\u53cd\u6620View\u548cModel\u7684\u66f4\u6539\uff08\u6362\u53e5\u8bdd\u8bf4\uff0c\u65e0\u6cd5\u8fdb\u884c\u70ed\u91cd\u8f7d\uff0c\u5f00\u53d1\u6548\u7387\u8f83\u4f4e\uff09\u3002<br \/>\n\u56e0\u6b64\uff0c\u5f00\u53d1\u53ef\u4ee5\u5728Django+MySQL\u5bb9\u5668\u4e2d\u8fdb\u884c\uff0c\u800c\u5728\u751f\u4ea7\u73af\u5883\u4e2d\uff0c\u53ef\u4ee5\u901a\u8fc7Nginx\u7aef\u53e3\u6765\u67e5\u770b\u9875\u9762\u3002\u5b9e\u9645\u4e0a\uff0c\u5728\u751f\u4ea7\u73af\u5883\u4e2d\uff0c\u6211\u4eec\u4f1a\u4f7f\u7528AWS\u7684ECS\u6216Fargate\u7b49\u670d\u52a1\uff0c\u4f46\u5728\u672c\u6587\u4e2d\uff0c\u6211\u4e5f\u4f1a\u4ecb\u7ecd\u5728\u672c\u5730\u4f7f\u7528\u7684\u5f00\u53d1\u548c\u751f\u4ea7\u73af\u5883\u7684Dockerfile\u548cdocker-compose.yml\u7684\u7f16\u5199\u65b9\u6cd5\u3002<\/p>\n<h2>\u8bf7\u4e3a\u6bcf\u4e2a\u6587\u4ef6\u586b\u5199\u5fc5\u8981\u7684\u4ee3\u7801\u3002<\/h2>\n<h3>Dockerfile\uff08Django\uff09-Dockerfile\u6587\u4ef6\uff08Django\uff09<\/h3>\n<pre class=\"post-pre\"><code><span class=\"c\"># Python\u306e\u30a4\u30e1\u30fc\u30b8\u3092\u6307\u5b9a<\/span>\r\n<span class=\"k\">FROM<\/span><span class=\"s\"> python:3<\/span>\r\n<span class=\"c\"># PYTHONDONTWRITEBYTECODE\u3068PYTHONUNBUFFERED\u306f\u30aa\u30d7\u30b7\u30e7\u30f3<\/span>\r\n<span class=\"c\"># pyc\u30d5\u30a1\u30a4\u30eb(\u304a\u3088\u3073__pycache__)\u306e\u751f\u6210\u3092\u884c\u308f\u306a\u3044\u3088\u3046\u306b\u3059\u308b<\/span>\r\n<span class=\"k\">ENV<\/span><span class=\"s\"> PYTHONDONTWRITEBYTECODE=1<\/span>\r\n<span class=\"c\"># \u6a19\u6e96\u51fa\u529b\u30fb\u6a19\u6e96\u30a8\u30e9\u30fc\u306e\u30b9\u30c8\u30ea\u30fc\u30e0\u306e\u30d0\u30c3\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u884c\u308f\u306a\u3044<\/span>\r\n<span class=\"k\">ENV<\/span><span class=\"s\"> PYTHONUNBUFFERED=1<\/span>\r\n<span class=\"c\"># \u30b3\u30f3\u30c6\u30ca\u306e\u30ef\u30fc\u30af\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\/code\u306b\u6307\u5b9a<\/span>\r\n<span class=\"k\">WORKDIR<\/span><span class=\"s\"> \/code<\/span>\r\n<span class=\"c\"># \u30ed\u30fc\u30ab\u30eb\u306erequirements.txt\u3092\u30b3\u30f3\u30c6\u30ca\u306e\/code\u30d5\u30a9\u30eb\u30c0\u76f4\u4e0b\u306b\u7f6e\u304f<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> requirements.txt \/code\/<\/span>\r\n<span class=\"c\"># \u30b3\u30f3\u30c6\u30ca\u5185\u3067pip\u3092\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9<\/span>\r\n<span class=\"k\">RUN <\/span>pip <span class=\"nb\">install<\/span> <span class=\"nt\">--upgrade<\/span> pip\r\n<span class=\"c\"># pip install -r requirements.txt\u3092\u5b9f\u884c<\/span>\r\n<span class=\"k\">RUN <\/span>pip <span class=\"nb\">install<\/span> <span class=\"nt\">-r<\/span> requirements.txt\r\n<span class=\"c\"># \u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3092\u30b3\u30f3\u30c6\u30ca\u306b\u30b3\u30d4\u30fc<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> . \/code\/<\/span>\r\n<span class=\"c\"># entrypoint.sh\u306b\u5b9f\u884c\u6a29\u9650\u3092\u4ed8\u4e0e<\/span>\r\n<span class=\"k\">RUN <\/span><span class=\"nb\">chmod <\/span>755 entrypoint.sh\r\n<\/code><\/pre>\n<h3>MySQL\u662f\u4e00\u79cd\u5f00\u6e90\u7684\u5173\u7cfb\u578b\u6570\u636e\u5e93\u7ba1\u7406\u7cfb\u7edf\u3002<\/h3>\n<pre class=\"post-pre\"><code><span class=\"c\"># MySQL8\u7cfb\u306e\u30a4\u30e1\u30fc\u30b8\u3092\u6307\u5b9a<\/span>\r\n<span class=\"k\">FROM<\/span><span class=\"s\"> mysql:8.0<\/span>\r\n\r\n<span class=\"c\"># MySQL\u306e\u30ed\u30fc\u30ab\u30eb\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3092\u30b3\u30f3\u30c6\u30ca\u306b\u30b3\u30d4\u30fc<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> containers\/mysql\/my.cnf \/etc\/mysql\/conf.d\/my.cnf<\/span>\r\n<span class=\"c\"># init.sql\u3092\u30b3\u30f3\u30c6\u30ca\u306e\/docker-entrypoint-init.db.d\u3068\u5171\u6709<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> containers\/mysql\/init.sql \/docker-entrypoint-initdb.d<\/span>\r\n<\/code><\/pre>\n<h3>Nginx \u2014 \u5f15\u64ce\u6267\u884c \u2014 \u4e00\u6b3e\u6d41\u884c\u7684\u9ad8\u6027\u80fdWeb\u670d\u52a1\u5668\u3002<\/h3>\n<pre class=\"post-pre\"><code><span class=\"k\">FROM<\/span><span class=\"s\"> nginx:1.21-alpine<\/span>\r\n\r\n<span class=\"c\"># \u30ed\u30fc\u30ab\u30eb\u306edefault.conf\u3092\u30b3\u30f3\u30c6\u30ca\u306b\u30b3\u30d4\u30fc<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> containers\/nginx\/conf.d\/default.conf \/etc\/nginx\/conf.d\/default.conf<\/span>\r\n<\/code><\/pre>\n<h3>my.cnf\uff08MySQL\u7684\u914d\u7f6e\u6587\u4ef6\uff09<\/h3>\n<pre class=\"post-pre\"><code># MySQL\u30b5\u30fc\u30d0\u30fc\u3078\u306e\u8a2d\u5b9a\r\n[mysqld]\r\n# \u6587\u5b57\u30b3\u30fc\u30c9\/\u7167\u5408\u9806\u5e8f\u306e\u8a2d\u5b9a\r\ncharacter_set_server=utf8mb4\r\ncollation_server=utf8mb4_bin\r\n# \u30bf\u30a4\u30e0\u30be\u30fc\u30f3\u306e\u8a2d\u5b9a\r\ndefault_time_zone=SYSTEM\r\nlog_timestamps=SYSTEM\r\n# MySQL8.0\u4ee5\u4e0a\u7528\u306e\u30c7\u30d5\u30a9\u30eb\u30c8\u8a8d\u8a3c\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u8a2d\u5b9a\r\ndefault_authentication_plugin=caching_sha2_password\r\n# mysql\u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u8a2d\u5b9a\r\n[mysql]\r\n# \u6587\u5b57\u30b3\u30fc\u30c9\u306e\u8a2d\u5b9a\r\ndefault_character_set=utf8mb4\r\n# mysql\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30c4\u30fc\u30eb\u306e\u8a2d\u5b9a\r\n[client]\r\n# \u6587\u5b57\u30b3\u30fc\u30c9\u306e\u8a2d\u5b9a\r\ndefault_character_set=utf8mb4\r\n<\/code><\/pre>\n<h3>\u521b\u5efa.sql<\/h3>\n<pre class=\"post-pre\"><code><span class=\"c1\">-- MYSQL_USER\u306b\u6a29\u9650\u3092\u4ed8\u4e0e<\/span>\r\n<span class=\"c1\">-- \u4eca\u56de\u306fdjango\u3068\u3044\u3046\u30e6\u30fc\u30b6\u3092\u6307\u5b9a<\/span>\r\n<span class=\"k\">GRANT<\/span> <span class=\"k\">ALL<\/span> <span class=\"k\">PRIVILEGES<\/span> <span class=\"k\">ON<\/span> <span class=\"o\">*<\/span><span class=\"p\">.<\/span><span class=\"o\">*<\/span> <span class=\"k\">TO<\/span> <span class=\"s1\">'django'<\/span><span class=\"o\">@<\/span><span class=\"s1\">'%'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"n\">FLUSH<\/span> <span class=\"k\">PRIVILEGES<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<h3>\u9ed8\u8ba4.conf\uff08\u9002\u7528\u4e8eNginx\u7684\u914d\u7f6e\u6587\u4ef6\uff09<\/h3>\n<pre class=\"post-pre\"><code><span class=\"c1\"># Django(Gunicorn)\u306e8000\u756a\u30dd\u30fc\u30c8\u3068\u3064\u306a\u3050<\/span>\r\n<span class=\"k\">upstream<\/span> <span class=\"s\">django<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"c1\"># \u30b5\u30fc\u30d0\u306bDjango\u306e\u30b3\u30f3\u30c6\u30ca\u540d\u3092\u6307\u5b9a\u3002\u4eca\u56de\u306fapp<\/span>\r\n    <span class=\"c1\"># \u30dd\u30fc\u30c8\u306fDjango\u306e\u30b3\u30f3\u30c6\u30ca\u306e8000\u756a\u30dd\u30fc\u30c8<\/span>\r\n    <span class=\"kn\">server<\/span> <span class=\"nf\">app<\/span><span class=\"p\">:<\/span><span class=\"mi\">8000<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">server<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"c1\"># HTTP\u306e80\u756a\u30dd\u30fc\u30c8\u3092\u6307\u5b9a<\/span>\r\n    <span class=\"kn\">listen<\/span> <span class=\"mi\">80<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"kn\">server_name<\/span> <span class=\"mi\">0<\/span><span class=\"s\">.0.0.0<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"c1\"># \u30d7\u30ed\u30ad\u30b7\u8a2d\u5b9a<\/span>\r\n    <span class=\"c1\"># \u5b9f\u969b\u306fNginx\u306e\u30b3\u30f3\u30c6\u30ca\u306b\u30a2\u30af\u30bb\u30b9\u3057\u3066\u308b\u306e\u3092Django\u306b\u30a2\u30af\u30bb\u30b9\u3057\u3066\u308b\u304b\u306e\u3088\u3046\u306b\u307f\u305b\u308b<\/span>\r\n    <span class=\"kn\">location<\/span> <span class=\"n\">\/<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"kn\">proxy_pass<\/span> <span class=\"s\">http:\/\/django<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"kn\">proxy_set_header<\/span> <span class=\"s\">Host<\/span> <span class=\"nv\">$host<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"kn\">proxy_set_header<\/span> <span class=\"s\">X-Forwarded-For<\/span> <span class=\"nv\">$proxy_add_x_forwarded_for<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"kn\">proxy_redirect<\/span> <span class=\"no\">off<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    \r\n    <span class=\"c1\"># django\u306e\u9759\u7684\u30d5\u30a1\u30a4\u30eb(HTML\u3001CSS\u3001Javascript\u306a\u3069)\u3092\u7ba1\u7406<\/span>\r\n    <span class=\"kn\">location<\/span> <span class=\"n\">\/static\/<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"kn\">alias<\/span> <span class=\"n\">\/static\/<\/span><span class=\"p\">;<\/span>\r\n\t<span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h3>docker-compose.yml\uff08\u7528\u4e8e\u5f00\u53d1\uff09<\/h3>\n<pre class=\"post-pre\"><code><span class=\"c1\"># docker-compose\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u6307\u5b9a<\/span>\r\n<span class=\"na\">version<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">3.9\"<\/span>\r\n\r\n<span class=\"c1\"># db(MySQL),app(Django)\u306e\u30b3\u30f3\u30c6\u30ca\u3092\u4f5c\u6210<\/span>\r\n<span class=\"na\">services<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">db<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"c1\"># \u30b3\u30f3\u30c6\u30ca\u540d\u3092mysql\u306b\u8a2d\u5b9a<\/span>\r\n    <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">mysql<\/span>\r\n    <span class=\"c1\"># MySQL\u306eDockerfile\u3092\u30d3\u30eb\u30c9\u3059\u308b<\/span>\r\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"c1\"># \u30d3\u30eb\u30c9\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u306f\u30ab\u30ec\u30f3\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea<\/span>\r\n      <span class=\"na\">context<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.<\/span>\r\n      <span class=\"na\">dockerfile<\/span><span class=\"pi\">:<\/span> <span class=\"s\">containers\/mysql\/Dockerfile<\/span>\r\n    <span class=\"c1\"># M1\u30c1\u30c3\u30d7\u3067\u3082\u52d5\u304f\u3088\u3046\u306b<\/span>\r\n    <span class=\"c1\"># Intel Mac\u306e\u5834\u5408\u3042\u3063\u3066\u3082\u306a\u304f\u3066\u3082\u52d5\u304f<\/span>\r\n    <span class=\"na\">platform<\/span><span class=\"pi\">:<\/span> <span class=\"s\">linux\/x86_64<\/span>\r\n    <span class=\"c1\"># DB\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u6307\u5b9a<\/span>\r\n    <span class=\"c1\"># \u30ed\u30fc\u30ab\u30eb\u306e\/data\/db\u3092\u30b3\u30f3\u30c6\u30ca\u306e\/var\/lib\/mysql\u306b\u30de\u30a6\u30f3\u30c8\u3059\u308b<\/span>\r\n    <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">db_data:\/var\/lib\/mysql<\/span>\r\n    <span class=\"c1\"># \u74b0\u5883\u5909\u6570\u3092.env\u3092\u4f7f\u3063\u3066\u8a2d\u5b9a<\/span>\r\n    <span class=\"na\">env_file<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">.env<\/span>\r\n    <span class=\"c1\"># DB\u306e\u30b3\u30f3\u30c6\u30ca\u306e\u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af\u3092\u884c\u3046<\/span>\r\n    <span class=\"c1\"># mysqladmin(MySQL\u30b5\u30fc\u30d0\u30fc\u306e\u7ba1\u7406\u3092\u884c\u3046\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3092\u4f7f\u3063\u3066DB\u30b3\u30f3\u30c6\u30ca\u81ea\u8eab(127.0.0.1)\u306bping\u3092\u9001\u3063\u3066\u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af\u3092\u884c\u3046<\/span>\r\n    <span class=\"na\">healthcheck<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">test<\/span><span class=\"pi\">:<\/span> <span class=\"s\">mysqladmin ping -h 127.0.0.1 -u$$MYSQL_USER -p$$MYSQL_PASSWORD<\/span>\r\n      <span class=\"c1\"># \u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af\u306e\u30a4\u30f3\u30bf\u30fc\u30d0\u30eb\u306f10\u79d2<\/span>\r\n      <span class=\"na\">interval<\/span><span class=\"pi\">:<\/span> <span class=\"s\">10s<\/span>\r\n      <span class=\"c1\"># \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u6642\u9593\u306f10\u79d2<\/span>\r\n      <span class=\"na\">timeout<\/span><span class=\"pi\">:<\/span> <span class=\"s\">10s<\/span>\r\n      <span class=\"c1\"># \u30ea\u30c8\u30e9\u30a4\u56de\u6570\u306f3\u56de<\/span>\r\n      <span class=\"na\">retries<\/span><span class=\"pi\">:<\/span> <span class=\"m\">3<\/span>\r\n      <span class=\"c1\"># \u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af\u304c\u5931\u6557\u3057\u3066\u3082\u7121\u8996\u3059\u308b\u6642\u9593\u306f30\u79d2<\/span>\r\n      <span class=\"na\">start_period<\/span><span class=\"pi\">:<\/span> <span class=\"s\">30s<\/span>\r\n  <span class=\"na\">app<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"c1\"># \u30b3\u30f3\u30c6\u30ca\u540d\u3092app\u306b\u8a2d\u5b9a<\/span>\r\n    <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">app<\/span>\r\n    <span class=\"c1\"># Django\u306eDockerfile\u3092\u30d3\u30eb\u30c9\u3059\u308b<\/span>\r\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"c1\"># \u30d3\u30eb\u30c9\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u306f\u30ab\u30ec\u30f3\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea<\/span>\r\n      <span class=\"na\">context<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.<\/span>\r\n      <span class=\"na\">dockerfile<\/span><span class=\"pi\">:<\/span> <span class=\"s\">containers\/django\/Dockerfile<\/span>\r\n    <span class=\"c1\"># \u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u6307\u5b9a<\/span>\r\n    <span class=\"c1\"># \u30ed\u30fc\u30ab\u30eb\u306e\u30ab\u30ec\u30f3\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u30b3\u30f3\u30c6\u30ca\u306e\/code\u306b\u30de\u30a6\u30f3\u30c8\u3059\u308b<\/span>\r\n    <span class=\"c1\"># \u30ed\u30fc\u30ab\u30eb\u306e\/static\u3092\u30b3\u30f3\u30c6\u30ca\u306e\/static\u306b\u30de\u30a6\u30f3\u30c8\u3059\u308b<\/span>\r\n    <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">.:\/code<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">.\/static:\/static<\/span>\r\n    <span class=\"c1\"># \u30ed\u30fc\u30ab\u30eb\u306e8000\u756a\u30dd\u30fc\u30c8\u3068\u30b3\u30f3\u30c6\u30ca\u306e8000\u756a\u30dd\u30fc\u30c8\u3092\u3064\u306a\u3050<\/span>\r\n    <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">8000:8000\"<\/span>\r\n    <span class=\"c1\"># \u30b7\u30a7\u30eb\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u5b9f\u884c<\/span>\r\n    <span class=\"na\">command<\/span><span class=\"pi\">:<\/span> <span class=\"s\">sh -c \"\/code\/entrypoint.sh\"<\/span>\r\n    <span class=\"c1\"># \u74b0\u5883\u5909\u6570\u3092.env\u3092\u4f7f\u3063\u3066\u8a2d\u5b9a<\/span>\r\n    <span class=\"na\">env_file<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">.env<\/span>\r\n    <span class=\"c1\"># \u5148\u306bdb\u3092\u8d77\u52d5\u3057\u3066\u304b\u3089app\u3092\u8d77\u52d5\u3059\u308b<\/span>\r\n    <span class=\"na\">depends_on<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">db<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"c1\"># db\u306e\u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af\u304c\u7d42\u308f\u3063\u3066\u304b\u3089app\u3092\u8d77\u52d5\u3055\u305b\u308b<\/span>\r\n        <span class=\"na\">condition<\/span><span class=\"pi\">:<\/span> <span class=\"s\">service_healthy<\/span>\r\n<span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">db_data<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">static<\/span><span class=\"pi\">:<\/span>\r\n<\/code><\/pre>\n<h3>docker-compose.prod.yml\uff08\u7528\u4e8e\u751f\u4ea7\u73af\u5883\uff09<\/h3>\n<pre class=\"post-pre\"><code><span class=\"na\">version<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">3.9\"<\/span>\r\n\r\n<span class=\"c1\"># db(MySQL),app(Django),web(Nginx)\u306e\u30b3\u30f3\u30c6\u30ca\u3092\u4f5c\u6210<\/span>\r\n<span class=\"na\">services<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">db<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">mysql<\/span>\r\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">context<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.<\/span>\r\n      <span class=\"na\">dockerfile<\/span><span class=\"pi\">:<\/span> <span class=\"s\">containers\/mysql\/Dockerfile<\/span>\r\n    <span class=\"na\">platform<\/span><span class=\"pi\">:<\/span> <span class=\"s\">linux\/x86_64<\/span>\r\n    <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">db_data:\/var\/lib\/mysql<\/span>\r\n    <span class=\"c1\"># \u30b3\u30f3\u30c6\u30ca\u5185\u306e\u74b0\u5883\u5909\u6570\u3092.env.prod\u3092\u4f7f\u3063\u3066\u8a2d\u5b9a<\/span>\r\n    <span class=\"na\">env_file<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">.env.prod<\/span>\r\n    <span class=\"na\">healthcheck<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">test<\/span><span class=\"pi\">:<\/span> <span class=\"s\">mysqladmin ping -h 127.0.0.1 -u$$MYSQL_USER -p$$MYSQL_PASSWORD<\/span>\r\n      <span class=\"na\">interval<\/span><span class=\"pi\">:<\/span> <span class=\"s\">10s<\/span>\r\n      <span class=\"na\">timeout<\/span><span class=\"pi\">:<\/span> <span class=\"s\">10s<\/span>\r\n      <span class=\"na\">retries<\/span><span class=\"pi\">:<\/span> <span class=\"m\">3<\/span>\r\n      <span class=\"na\">start_period<\/span><span class=\"pi\">:<\/span> <span class=\"s\">30s<\/span>\r\n  <span class=\"na\">app<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">app<\/span>\r\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">context<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.<\/span>\r\n      <span class=\"na\">dockerfile<\/span><span class=\"pi\">:<\/span> <span class=\"s\">containers\/django\/Dockerfile<\/span>\r\n    <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">.:\/code<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">.\/static:\/static<\/span>\r\n    <span class=\"c1\"># 8000\u756a\u30dd\u30fc\u30c8\u3092Nginx\u5074\u304c\u63a5\u7d9a\u3067\u304d\u308b\u3088\u3046\u958b\u304f<\/span>\r\n    <span class=\"na\">expose<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">8000\"<\/span>\r\n    <span class=\"na\">command<\/span><span class=\"pi\">:<\/span> <span class=\"s\">sh -c \"\/code\/entrypoint.sh\"<\/span>\r\n    <span class=\"c1\"># \u30b3\u30f3\u30c6\u30ca\u5185\u306e\u74b0\u5883\u5909\u6570\u3092.env.prod\u3092\u4f7f\u3063\u3066\u8a2d\u5b9a<\/span>\r\n    <span class=\"na\">env_file<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">.env.prod<\/span>\r\n    <span class=\"na\">depends_on<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">db<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"c1\"># db\u306e\u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af\u304c\u7d42\u308f\u3063\u3066\u304b\u3089app\u3092\u8d77\u52d5\u3055\u305b\u308b<\/span>\r\n        <span class=\"na\">condition<\/span><span class=\"pi\">:<\/span> <span class=\"s\">service_healthy<\/span>\r\n  <span class=\"na\">web<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"c1\"># \u30b3\u30f3\u30c6\u30ca\u540d\u3092web\u306b\u6307\u5b9a<\/span>\r\n    <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">web<\/span>\r\n    <span class=\"c1\"># Nginx\u306eDockerfile\u3092\u30d3\u30eb\u30c9\u3059\u308b<\/span>\r\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"c1\"># \u30d3\u30eb\u30c9\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u306f\u30ab\u30ec\u30f3\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea<\/span>\r\n      <span class=\"na\">context<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.<\/span>\r\n      <span class=\"na\">dockerfile<\/span><span class=\"pi\">:<\/span> <span class=\"s\">containers\/nginx\/Dockerfile<\/span>\r\n    <span class=\"c1\"># \u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u6307\u5b9a<\/span>\r\n    <span class=\"c1\"># \u30ed\u30fc\u30ab\u30eb\u306e\/static\u3092\u30b3\u30f3\u30c6\u30ca\u306e\/static\u306b\u30de\u30a6\u30f3\u30c8\u3059\u308b<\/span>\r\n    <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">.\/static:\/static<\/span>\r\n    <span class=\"c1\"># \u30ed\u30fc\u30ab\u30eb\u306e80\u756a\u30dc\u30fc\u30c8\u3092\u30b3\u30f3\u30c6\u30ca\u306e80\u756a\u30dd\u30fc\u30c8\u3068\u3064\u306a\u3050<\/span>\r\n    <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">80:80\"<\/span>\r\n    <span class=\"c1\"># \u5148\u306bapp\u3092\u8d77\u52d5\u3057\u3066\u304b\u3089web\u3092\u8d77\u52d5\u3059\u308b<\/span>\r\n    <span class=\"na\">depends_on<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">app<\/span>\r\n<span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">db_data<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">static<\/span><span class=\"pi\">:<\/span>\r\n<\/code><\/pre>\n<h3>\u8981\u6c42\u6587\u672c<\/h3>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Django<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">mysqlclient<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Gunicorn<\/ul>\n<p>\u6211\u5c06\u5728 Django \u5bb9\u5668\u4e2d\u5b89\u88c5\u3002<\/p>\n<pre class=\"post-pre\"><code>Django&gt;=3.0,&lt;4.0\r\nmysqlclient&gt;=1.3.6,&lt;2.0\r\ngunicorn&gt;=19.9.0,&lt;20.0\r\n<\/code><\/pre>\n<h3>.env (development purpose)<br \/>\n\u5730\u5716\u74b0\u5883(\u958b\u767c\u76ee\u7684\u5730)<\/h3>\n<p>\u5199\u5165MySQL\u7684root\u7528\u6237\u5bc6\u7801\u7b49\u4fe1\u606f\u5230docker-compose.yml\u6216Django\u7684settings.py\u662f\u5371\u9669\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u4f7f\u7528.env\u6587\u4ef6\u3002<br \/>\n\u8fd9\u6b21\u662f\u7528\u4e8e\u5f00\u53d1\u7684\uff0c\u6240\u4ee5\u9700\u8981\u5c06DEBUG\u8bbe\u7f6e\u4e3aTrue\u3002<br \/>\n\u7531\u4e8e\u6709.gitignore\uff08\u7a0d\u540e\u4f1a\u63d0\u5230\uff09\uff0c.env\u6587\u4ef6\u4e0d\u4f1a\u4e0a\u4f20\u5230GitHub\u3002<br \/>\n\u8fd9\u6b21\u7684\u5185\u5bb9\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<pre class=\"post-pre\"><code>MYSQL_ROOT_PASSWORD=root\r\nMYSQL_DATABASE=django-db\r\nMYSQL_USER=django\r\nMYSQL_PASSWORD=django\r\n# SECRET_KEY\u306b\u4efb\u610f\u306e\u5024\u3092\u5165\u529b\r\nSECRET_KEY=django\r\nALLOWED_HOSTS=localhost 127.0.0.1 [::1]\r\n# \u958b\u767a\u74b0\u5883\u306e\u305f\u3081True\r\nDEBUG=True\r\n<\/code><\/pre>\n<h3>\u751f\u4ea7\u73af\u5883\u914d\u7f6e\u6587\u4ef6 (\u672c\u756a\u7528)<\/h3>\n<p>\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u8bbe\u7f6e\u7528\u4e8e\u751f\u4ea7\u73af\u5883\u7684\u73af\u5883\u53d8\u91cf\u3002<br \/>\n\u5b9e\u9645\u4e0a\uff0c\u751f\u4ea7\u73af\u5883\u7684\u73af\u5883\u53d8\u91cf\u901a\u5e38\u4fdd\u5b58\u5728AWS\u7684\u53c2\u6570\u5b58\u50a8\u6216\u5176\u4ed6\u7c7b\u4f3c\u7684\u5730\u65b9\uff0c\u4f46\u5728\u672c\u6b21\u4e2d\u6211\u4eec\u5c06\u4f7f\u7528.env.prod\u6587\u4ef6\u3002<br \/>\n\u7531\u4e8e\u8fd9\u662f\u751f\u4ea7\u73af\u5883\uff0c\u6240\u4ee5\u9700\u8981\u5c06DEBUG\u8bbe\u7f6e\u4e3aFalse\u3002<\/p>\n<pre class=\"post-pre\"><code>MYSQL_ROOT_PASSWORD=root\r\nMYSQL_DATABASE=django-db\r\nMYSQL_USER=django-prod\r\nMYSQL_PASSWORD=django-prod\r\n# SECRET_KEY\u306b\u3064\u3044\u3066\u306f\u672c\u756a\u74b0\u5883\u3067\u306f\u63a8\u6e2c\u3055\u308c\u306a\u3044\u5024\u306b\u5909\u66f4\u3057\u3066\u304a\u304d\u307e\u3057\u3087\u3046\r\nSECRET_KEY=xdmjx=9l@x)-jitznpb^%yjn6h=7g)$%e8_+1s)o+8o79csa4d\r\nALLOWED_HOSTS=localhost 127.0.0.1 [::1]\r\n# \u958b\u767a\u74b0\u5883\u306e\u305f\u3081False\r\nDEBUG=False\r\n<\/code><\/pre>\n<h3>\u5165\u53e3\u811a\u672c.sh<\/h3>\n<p>\u5728\u8fd9\u91cc\u5b9a\u4e49\u4e86\u7528\u4e8e\u6536\u96c6Django\u8fc1\u79fb\u3001\u7ba1\u7406\u754c\u9762\u4ee5\u53caDjango Rest Framework\u9759\u6001\u6587\u4ef6\u7684\u547d\u4ee4\u3002<br \/>\n\u6b64\u5916\uff0c\u7531\u4e8e\u5728\u5f00\u53d1\u73af\u5883\u548c\u751f\u4ea7\u73af\u5883\u4e2d\u4f7f\u7528\u7684\u547d\u4ee4\u4e0d\u540c\uff0c\u5c06\u5b83\u4eec\u5199\u5728\u4e00\u4e2aShell\u811a\u672c\u4e2d\u4e0d\u4ec5\u53ef\u4ee5\u907f\u514d\u5728docker-compose.yml\u4e2d\u91cd\u590d\u7f16\u5199\u7c7b\u4f3c\u7684\u63cf\u8ff0\uff0c\u8fd8\u53ef\u4ee5\u63d0\u9ad8\u53ef\u8bfb\u6027\u3002<\/p>\n<pre class=\"post-pre\"><code>#!\/bin\/sh\r\n<\/code><\/pre>\n<p>\u56e0\u4e3ashebang\u662f\u7528\u6765\u6267\u884cshell\u811a\u672c\u7684\u5492\u8bed\uff0c\u6240\u4ee5\u4e0d\u8981\u5fd8\u8bb0\u5199\u4e0a\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\">#!\/bin\/sh<\/span>\r\npython manage.py makemigrations <span class=\"nt\">--noinput<\/span>\r\npython manage.py migrate <span class=\"nt\">--noinput<\/span>\r\npython manage.py collectstatic <span class=\"nt\">--noinput<\/span>\r\n<span class=\"c\"># \u74b0\u5883\u5909\u6570\u306eDEBUG\u306e\u5024\u304cTrue\u306e\u6642\u306frunserver\u3092\u3001False\u306e\u6642\u306fgunicorn\u3092\u5b9f\u884c\u3057\u307e\u3059<\/span>\r\n<span class=\"k\">if<\/span> <span class=\"o\">[<\/span> <span class=\"nv\">$DEBUG<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"True\"<\/span> <span class=\"o\">]<\/span>\r\n<span class=\"k\">then\r\n    <\/span>python manage.py runserver 0.0.0.0:8000\r\n<span class=\"k\">else<\/span>\r\n    <span class=\"c\"># gunicorn\u3092\u8d77\u52d5\u3055\u305b\u308b\u6642\u306f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d\u3092\u6307\u5b9a\u3057\u307e\u3059<\/span>\r\n    <span class=\"c\"># \u4eca\u56de\u306fdjangopj\u306b\u3057\u307e\u3059<\/span>\r\n    gunicorn djangopj.wsgi:application <span class=\"nt\">--bind<\/span> 0.0.0.0:8000\r\n<span class=\"k\">fi<\/span>\r\n<\/code><\/pre>\n<h3>\u5ffd\u7565\u6587\u4ef6<\/h3>\n<p>\u4eceGitHub\u7684\u5b98\u65b9\u7f51\u7ad9\u521b\u5efaPython\u7684.gitignore\u6587\u4ef6<br \/>\n\u7531\u4e8e.gitignore\u4e2d\u6ca1\u6709.env.prod\uff0c\u56e0\u6b64\u9700\u8981\u6dfb\u52a0<br \/>\n\u53e6\u5916\uff0c\u5728\u5b9e\u9645\u5f00\u53d1\u4e2d\uff0cmigration\u548cstatic\u4e0d\u9700\u8981\u53d7Git\u7ba1\u7406\uff0c\u56e0\u6b64\u4e5f\u9700\u8981\u6dfb\u52a0\u5230.gitignore\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code># Environments\r\n.env\r\n# .env.prod\u3092.gitignore\u3059\u308b\r\n.env.prod\r\n.venv\r\nenv\/\r\nvenv\/\r\nENV\/\r\nenv.bak\/\r\nvenv.bak\/\r\n\r\n\u30fb\u30fb\u30fb\r\n\r\n# ignore static files\r\nstatic\/\r\n# ignore migration files\r\nmigrations\/\r\n<\/code><\/pre>\n<p>&nbsp;<\/p>\n<h2>\u8ba9\u6211\u4eec\u5f00\u59cb\u6784\u5efa\u56fe\u50cf\uff0c\u76f4\u5230\u5c55\u793aDjango\u7684\u9875\u9762\u3002<\/h2>\n<p>\u9019\u6b21\u6211\u5011\u5e0c\u671b\u901a\u904e\u8a2a\u554fNginx\u7684\u7aef\u53e3\u4f86\u986f\u793aDjango\u7684\u754c\u9762\uff0c\u56e0\u6b64\u6211\u5011\u5c07\u4f7f\u7528docker-compose.prod.yml\uff08\u751f\u7522\u74b0\u5883\uff09\u3002<br \/>\n\u5982\u679c\u662f\u5728\u958b\u767c\u4e2d\uff0c\u8acb\u5c07\u6307\u5b9a\u7684\u6587\u4ef6\u66ff\u63db\u70badocker-compose.yml\uff0c\u7136\u5f8c\u8a2a\u554f8000\u7aef\u53e3\u3002<\/p>\n<h3>\u5728docker-compose\u4e2d\u521b\u5efaDocker\u955c\u50cf\uff08\u521d\u6b21\uff09<\/h3>\n<p>\u5728\u521b\u5efa\u65b0\u9879\u76ee\u65f6\uff0c\u8bf7\u6307\u5b9a\u9879\u76ee\u540d\u79f0\u548c\u8981\u521b\u5efa\u7684\u76ee\u5f55\uff0c\u5e76\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\u3002\u672c\u6b21\u5c06\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u540d\u4e3adjangopj\u7684\u9879\u76ee\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">docker-compose -f docker-compose.prod.yml run app django-admin startproject djangopj .\r\n<\/span><\/code><\/pre>\n<p>\u8fd0\u884c\u540e\uff0c\u672c\u5730\u76ee\u5f55\u7ed3\u6784\u5982\u4e0b\u6240\u793a\uff1a<br \/>\n\u7531\u4e8edata\/db\u5185\u7684\u6587\u4ef6\u975e\u5e38\u591a\uff0c\u56e0\u6b64\u7701\u7565\u663e\u793a\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">tree\r\n<\/span><span class=\"c\">.\r\n<\/span><span class=\"go\">\u251c\u2500\u2500 containers\r\n\u2502   \u251c\u2500\u2500 django\r\n\u2502   \u2502   \u2514\u2500\u2500 Dockerfile\r\n\u2502   \u251c\u2500\u2500 mysql\r\n\u2502   \u2502   \u251c\u2500\u2500 Dockerfile\r\n\u2502   \u2502   \u251c\u2500\u2500 init.sql\r\n\u2502   \u2502   \u2514\u2500\u2500 my.cnf\r\n\u2502   \u2514\u2500\u2500 nginx\r\n\u2502       \u251c\u2500\u2500 Dockerfile\r\n\u2502       \u2514\u2500\u2500 conf.d\r\n\u2502           \u2514\u2500\u2500 default.conf\r\n\u251c\u2500\u2500 djangopj\r\n\u2502   \u251c\u2500\u2500 __init__.py\r\n\u2502   \u251c\u2500\u2500 asgi.py\r\n\u2502   \u251c\u2500\u2500 settings.py\r\n\u2502   \u251c\u2500\u2500 urls.py\r\n\u2502   \u2514\u2500\u2500 wsgi.py\r\n\u251c\u2500\u2500 .env\r\n\u251c\u2500\u2500 .env.prod\r\n\u251c\u2500\u2500 .gitignore\r\n\u251c\u2500\u2500 docker-compose.prod.yml\r\n\u251c\u2500\u2500 docker-compose.yml\r\n\u251c\u2500\u2500 entrypoint.sh\r\n\u251c\u2500\u2500 manage.py\r\n\u251c\u2500\u2500 requirements.txt\r\n\u2514\u2500\u2500 static\r\n<\/span><\/code><\/pre>\n<h3>\u5982\u679c\u5df2\u7ecf\u6709\u4e00\u4e2a\u9879\u76ee\u5b58\u5728\u7684\u8bdd<\/h3>\n<p>GitHub\u306b\u3042\u308b\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3092clone\u3059\u308b\u5834\u5408\u306a\u3069\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u304c\u4f5c\u6210\u6e08\u307f\u306e\u6642\u306f\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u307e\u3059<\/p>\n<pre class=\"post-pre\"><code>docker-compose -f docker-compose.prod.yml build\r\n<\/code><\/pre>\n<h3>settings.py\u306eDATABASES\u3092\u5909\u66f4<\/h3>\n<p>Django\u7684\u9ed8\u8ba4\u6570\u636e\u5e93\u662fSQlite\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u5176\u66f4\u6539\u4e3aMySQL\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">from<\/span> <span class=\"n\">pathlib<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">Path<\/span>\r\n<span class=\"c1\"># os\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\r\n<\/span><span class=\"kn\">import<\/span> <span class=\"n\">os<\/span>\r\n\r\n<span class=\"c1\"># [\u30fb\u30fb\u30fb]\r\n<\/span>\r\n<span class=\"c1\"># SECRET_KEY\u3092.env\u304b\u3089\u53d6\u5f97\r\n<\/span><span class=\"n\">SECRET_KEY<\/span> <span class=\"o\">=<\/span> <span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">environ<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">SECRET_KEY<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\r\n\r\n<span class=\"c1\"># DEBUG\u3092.env\u304b\u3089\u53d6\u5f97\r\n# env\u30d5\u30a1\u30a4\u30eb\u306bTrue\u3001False\u3068\u66f8\u304f\u3068Django\u304cString\u578b\u3068\u8a8d\u8b58\u3057\u3066\u3057\u307e\u3044\u307e\u3059\r\n# os.environ.get(\"DEBUG\") == \"True\"\u3092\u6e80\u305f\u3059\u3068boolean\u578b\u306eTrue\u306b\u306a\u308a\u3001\r\n# env\u5185\u306eDEBUG\u304cTrue\u4ee5\u5916\u306a\u3089False\u306b\u306a\u308a\u307e\u3059\r\n<\/span><span class=\"n\">DEBUG<\/span> <span class=\"o\">=<\/span> <span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">environ<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">DEBUG<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span> <span class=\"o\">==<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">True<\/span><span class=\"sh\">\"<\/span>\r\n\r\n<span class=\"c1\"># ALLOWED_HOSTS\u3092.env\u304b\u3089\u53d6\u5f97\r\n<\/span><span class=\"n\">ALLOWED_HOSTS<\/span> <span class=\"o\">=<\/span> <span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">environ<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">ALLOWED_HOSTS<\/span><span class=\"sh\">\"<\/span><span class=\"p\">).<\/span><span class=\"nf\">split<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span> <span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\r\n\r\n<span class=\"c1\"># [\u30fb\u30fb\u30fb]\r\n<\/span>\r\n<span class=\"c1\"># MySQL\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u3092.env\u304b\u3089\u53d6\u5f97\r\n<\/span><span class=\"n\">DATABASES<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"sh\">\"<\/span><span class=\"s\">default<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"sh\">\"<\/span><span class=\"s\">ENGINE<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">django.db.backends.mysql<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"c1\"># \u30b3\u30f3\u30c6\u30ca\u5185\u306e\u74b0\u5883\u5909\u6570\u3092DATABASES\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u306b\u53cd\u6620\r\n<\/span>        <span class=\"sh\">\"<\/span><span class=\"s\">NAME<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">environ<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">MYSQL_DATABASE<\/span><span class=\"sh\">\"<\/span><span class=\"p\">),<\/span>\r\n        <span class=\"sh\">\"<\/span><span class=\"s\">USER<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">environ<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">MYSQL_USER<\/span><span class=\"sh\">\"<\/span><span class=\"p\">),<\/span>\r\n        <span class=\"sh\">\"<\/span><span class=\"s\">PASSWORD<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">environ<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">MYSQL_PASSWORD<\/span><span class=\"sh\">\"<\/span><span class=\"p\">),<\/span>\r\n        <span class=\"sh\">\"<\/span><span class=\"s\">HOST<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">db<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"sh\">\"<\/span><span class=\"s\">PORT<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"mi\">3306<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"sh\">\"<\/span><span class=\"s\">OPTIONS<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"sh\">\"<\/span><span class=\"s\">init_command<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">SET sql_mode=<\/span><span class=\"sh\">'<\/span><span class=\"s\">STRICT_TRANS_TABLES<\/span><span class=\"sh\">'\"<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"p\">},<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n\r\n<span class=\"c1\"># [\u30fb\u30fb\u30fb]\r\n<\/span>\r\n<span class=\"c1\"># \u8a00\u8a9e\u3092\u65e5\u672c\u8a9e\u306b\u8a2d\u5b9a\r\n<\/span><span class=\"n\">LANGUAGE_CODE<\/span> <span class=\"o\">=<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">ja<\/span><span class=\"sh\">\"<\/span>\r\n<span class=\"c1\"># \u30bf\u30a4\u30e0\u30be\u30fc\u30f3\u3092Asia\/Tokyo\u306b\u8a2d\u5b9a\r\n<\/span><span class=\"n\">TIME_ZONE<\/span> <span class=\"o\">=<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">Asia\/Tokyo<\/span><span class=\"sh\">\"<\/span>\r\n\r\n<span class=\"c1\"># [\u30fb\u30fb\u30fb]\r\n<\/span>\r\n<span class=\"c1\"># STATIC_ROOT\u3092\u8a2d\u5b9a\r\n# Django\u306e\u7ba1\u7406\u8005\u753b\u9762\u306bHTML\u3001CSS\u3001Javascript\u304c\u9069\u7528\u3055\u308c\u307e\u3059\r\n<\/span><span class=\"n\">STATIC_ROOT<\/span> <span class=\"o\">=<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">\/static\/<\/span><span class=\"sh\">\"<\/span>\r\n<span class=\"n\">STATIC_URL<\/span> <span class=\"o\">=<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">\/static\/<\/span><span class=\"sh\">\"<\/span>\r\n<\/code><\/pre>\n<h3>\u30b3\u30f3\u30c6\u30ca\u3092\u8d77\u52d5<\/h3>\n<p>\u30b3\u30f3\u30c6\u30ca\u3092\u30c7\u30bf\u30c3\u30c1\u30e2\u30fc\u30c9\u3067\u8d77\u52d5\u3059\u308b<br \/>\n\u30c7\u30bf\u30c3\u30c1\u30e2\u30fc\u30c9\u8d77\u52d5\u3059\u308b\u3053\u3068\u3067\u30b3\u30f3\u30c6\u30ca\u306e\u4e2d\u306b\u5165\u3089\u305a\u306b\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u3067\u8d77\u52d5\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">docker-compose -f docker-compose.prod.yml up -d\r\n<\/span><\/code><\/pre>\n<h3>\u8ba9\u6211\u4eec\u5c1d\u8bd5\u8bbf\u95ee 127.0.0.1:80\u3002<\/h3>\n<p>\u30db\u30b9\u30c8\u304b\u3089Nginx\u306e\u30dd\u30fc\u30c8\u306b\u63a5\u7d9a\u3057\u307e\u3059<br \/>\n\u30d6\u30e9\u30a6\u30b6\u306b\u30a2\u30af\u30bb\u30b9\u3057\u3001Nginx\u306e\u30dd\u30fc\u30c8\u304b\u3089Django\u306e\u30dd\u30fc\u30c8\u3078\u30a2\u30af\u30bb\u30b9\u3067\u304d\u307e\u3059<br \/>\n\u4ee5\u4e0b\u306e\u30da\u30fc\u30b8\u304c\u8868\u793a\u3055\u308c\u307e\u3059<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d179d37434c4406c045db\/71-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2022-10-16 21.03.54.png\" \/><\/div>\n<p>\u8bf7\u8bbf\u95ee 127.0.0.1:80\/admin\uff0c\u5e76\u4e14\u6210\u529f\u5730\u5728\u4ee5\u4e0b\u9875\u9762\u4e0a\u663e\u793a\u51fa\u6765\u5b8c\u6210\u4e86\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d179d37434c4406c045db\/73-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2022-10-16 21.06.04.png\" \/><\/div>\n<p>\u5982\u679c\u5c06DEBUG\u8bbe\u7f6e\u4e3aTrue\uff0c\u5219\u4f1a\u663e\u793a\u4e0b\u9762\u7684\u56fe\u50cf\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d179d37434c4406c045db\/75-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2022-08-17 21.10.44.png\" \/><\/div>\n<div>\u5f53\u753b\u9762\u65e0\u6cd5\u663e\u793a\u65f6\u5e94\u8be5\u600e\u4e48\u529e\uff1f<\/div>\n<p>\u5982\u679c\u6ca1\u6709\u663e\u793a\u7c7b\u4f3c\u4e0a\u8ff0\u7684\u753b\u9762\uff0c\u5219\u53ef\u80fd\u662f\u7531\u4e8eMySQL\u5bb9\u5668\u5728\u521d\u6b21\u542f\u52a8\u65f6\u6ca1\u6709\u6210\u529f\u542f\u52a8<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">docker-compose -f docker-compose.prod.yml down\r\n<\/span><\/code><\/pre>\n<p>\u505c\u6b62\u5bb9\u5668\u540e<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">docker compose -f docker-compose.prod.yml up -d\r\n<\/span><\/code><\/pre>\n<p>\u8bf7\u518d\u6b21\u542f\u52a8\u5bb9\u5668\u8bd5\u8bd5\u770b\u3002<\/p>\n<h3>\u5f53\u65e0\u6cd5\u8fde\u63a5\u65f6\uff0c\u8bf7\u518d\u6b21\u5728\u672c\u5730\u73af\u5883\u4e2d\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1adocker compose -f docker-compose.prod.yml up -d\u3002<\/h3>\n<h4>\u8fde\u63a5\u5230\u4e0a\u6e38\u65f6\u53d1\u751f\u5931\u8d25\uff08111\uff1a\u8fde\u63a5\u88ab\u62d2\u7edd\uff09\u3002<\/h4>\n<p>\u9700\u8981\u91cd\u65b0\u5ba1\u89c6Nginx\u7684default.conf\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code>upstream django {\r\n    server app:8000;\r\n}\r\n<\/code><\/pre>\n<p>\u8bf7\u4f7f\u7528docker ps\u547d\u4ee4\u786e\u8ba4\u662f\u5426\u6307\u5b9a\u4e86Django\u5bb9\u5668\u540d\u79f0\uff0c\u56e0\u4e3a\u7ecf\u5e38\u4f1a\u51fa\u73b0\u5728\u670d\u52a1\u5668\u540e\u9762\u9519\u8bef\u5730\u6307\u5b9a\u4e86Nginx\u5bb9\u5668\u540d\u79f0\u800c\u4e0d\u662fDjango\u7684\u60c5\u51b5\u3002<\/p>\n<h4>django.db.utils.OperationalError\uff1a\u4e25\u91cd\u9519\u8bef\uff1a\u6570\u636e\u5e93\u4e0d\u5b58\u5728<\/h4>\n<p>\u5982\u679c.env\u6587\u4ef6\u4e2d\u7684MYSQL_DATABASE\u540d\u79f0\u4e0d\u7b26\u5408\u547d\u540d\u89c4\u5219\uff0c\u53ef\u80fd\u4f1a\u51fa\u73b0\u4e0a\u8ff0\u9519\u8bef\u3002\u8bf7\u4ece\u4ee5\u4e0b\u7f51\u7ad9\u786e\u8ba4\u60a8\u8bbe\u7f6e\u7684\u6570\u636e\u5e93\u540d\u79f0\u662f\u5426\u7b26\u5408MySQL\u7684\u547d\u540d\u89c4\u5219\u3002<\/p>\n<p>&nbsp;<\/p>\n<h2>\u5229\u7528\u8bd7\u6b4c\u6784\u5efa\u5bb9\u5668\u73af\u5883<\/h2>\n<p>\u53ef\u4ee5\u66f4\u65b9\u4fbf\u5730\u7ba1\u7406\u548c\u53d1\u5e03Python\u7684\u8f6f\u4ef6\u5305<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30b3\u30de\u30f3\u30c9\u4e00\u3064\u3067\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u304d\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30d1\u30c3\u30b1\u30fc\u30b8\u9593\u306e\u4f9d\u5b58\u95a2\u4fc2\u3092\u81ea\u52d5\u3067\u89e3\u6d88\u3057\u3066\u304f\u308c\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Black\u306a\u3069\u306e\u8a2d\u5b9a\u3092\u5171\u901a\u306e\u30d5\u30a1\u30a4\u30eb\u306b\u307e\u3068\u3081\u308b\u3053\u3068\u304c\u3067\u304d\u308b<\/ul>\n<p>\u5982\u679c\u53ef\u80fd\u7684\u8bdd\uff0c\u8bf7\u5728\u5b9e\u9645\u7684\u5f00\u53d1\u73b0\u573a\u4e2d\u5b66\u4f1a\u4f7f\u7528\u5b83\uff0c\u56e0\u4e3a\u5b83\u975e\u5e38\u65b9\u4fbf\u3002\u8bf7\u53c2\u8003\u4ee5\u4e0b\u6587\u7ae0\u4ee5\u83b7\u53d6\u8be6\u7ec6\u4fe1\u606f\u3002<\/p>\n<p>&nbsp;<\/p>\n<h3>\u76ee\u5f55\u7ed3\u6784<\/h3>\n<p>\u5173\u4e8e\u76ee\u5f55\u7ed3\u6784\uff0crequirements.txt\u5c06\u88ab\u66ff\u6362\u4e3apyproject.toml\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">tree\r\n<\/span><span class=\"c\">.\r\n<\/span><span class=\"go\">\u251c\u2500\u2500 containers\r\n\u2502   \u251c\u2500\u2500 django\r\n\u2502   \u2502   \u2514\u2500\u2500 Dockerfile\r\n\u2502   \u251c\u2500\u2500 mysql\r\n\u2502   \u2502   \u251c\u2500\u2500 Dockerfile\r\n\u2502   \u2502   \u251c\u2500\u2500 init.sql\r\n\u2502   \u2502   \u2514\u2500\u2500 my.cnf\r\n\u2502   \u2514\u2500\u2500 nginx\r\n\u2502       \u251c\u2500\u2500 Dockerfile\r\n\u2502       \u2514\u2500\u2500 conf.d\r\n\u2502           \u2514\u2500\u2500 default.conf\r\n\u251c\u2500\u2500 .gitignore\r\n\u251c\u2500\u2500 .env\r\n\u251c\u2500\u2500 .env.prod\r\n\u251c\u2500\u2500 entrypoint.sh\r\n\u251c\u2500\u2500 docker-compose.prod.yml\r\n\u251c\u2500\u2500 docker-compose.yml\r\n\u2514\u2500\u2500 pyproject.toml\r\n<\/span><\/code><\/pre>\n<h3>pyproject.toml \u7684\u4e2d\u6587\u91ca\u4e49\u3002<\/h3>\n<p>\u548crequirements.txt\u4e00\u6837<\/p>\n<pre class=\"post-pre\"><code>[tool.poetry.dependencies]\r\n<\/code><\/pre>\n<p>\u5b89\u88c5\u4ee5\u4e0b\u7684\u8f6f\u4ef6\u5305\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nn\">[tool.poetry]<\/span>\r\n<span class=\"py\">name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"api\"<\/span>\r\n<span class=\"py\">version<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"0.1.0\"<\/span>\r\n<span class=\"py\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"api\"<\/span>\r\n<span class=\"py\">authors<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s\">\"shun198\"<\/span><span class=\"p\">]<\/span>\r\n<span class=\"py\">readme<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"README.md\"<\/span>\r\n\r\n<span class=\"nn\">[tool.poetry.dependencies]<\/span>\r\n<span class=\"py\">python<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"^3.11\"<\/span>\r\n<span class=\"py\">Django<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"^4.2.3\"<\/span>\r\n<span class=\"py\">djangorestframework<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"^3.14.0\"<\/span>\r\n<span class=\"py\">mysqlclient<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"^2.1.1\"<\/span>\r\n<span class=\"py\">gunicorn<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"^20.1.0\"<\/span>\r\n<\/code><\/pre>\n<h3>Dockerfile\uff08Django\uff09<\/h3>\n<pre class=\"post-pre\"><code><span class=\"k\">FROM<\/span><span class=\"s\"> python:3.11<\/span>\r\n\r\n<span class=\"k\">ENV<\/span><span class=\"s\"> PYTHONDONTWRITEBYTECODE=1<\/span>\r\n<span class=\"k\">ENV<\/span><span class=\"s\"> PYTHONUNBUFFERED=1<\/span>\r\n\r\n<span class=\"k\">WORKDIR<\/span><span class=\"s\"> \/code<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> pyproject.toml \/code\/<\/span>\r\n<span class=\"c\"># Initialize python project with Poetry<\/span>\r\n<span class=\"k\">RUN <\/span>pip <span class=\"nb\">install<\/span> <span class=\"nt\">--upgrade<\/span> pip <span class=\"o\">&amp;&amp;<\/span> pip <span class=\"nb\">install <\/span>poetry\r\n<span class=\"k\">RUN <\/span>poetry <span class=\"nb\">install<\/span>\r\n<span class=\"c\"># entrypoint.sh\u306b\u5b9f\u884c\u6a29\u9650\u3092\u4ed8\u4e0e<\/span>\r\n<span class=\"k\">RUN <\/span><span class=\"nb\">chmod <\/span>755 entrypoint.sh\r\n<\/code><\/pre>\n<h3>\u521b\u5efa\u65b0\u9879\u76ee<\/h3>\n<p>\u5728\u521b\u5efa\u65b0\u9879\u76ee\u65f6\uff0c\u8bf7\u8f93\u5165\u4ee5\u4e0b\u547d\u4ee4\u3002<\/p>\n<pre class=\"post-pre\"><code>docker-compose -f docker-compose.prod.yml run app poetry run django-admin startproject djangopj .\r\n<\/code><\/pre>\n<p>\u5982\u679c\u80fd\u8fbe\u5230\u4ee5\u4e0b\u76ee\u6807\uff0c\u5c31\u7b97\u662f\u6210\u529f\u4e86\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">tree\r\n<\/span><span class=\"c\">.\r\n<\/span><span class=\"go\">\u251c\u2500\u2500 containers\r\n\u2502   \u251c\u2500\u2500 django\r\n\u2502   \u2502   \u2514\u2500\u2500 Dockerfile\r\n\u2502   \u251c\u2500\u2500 mysql\r\n\u2502   \u2502   \u251c\u2500\u2500 Dockerfile\r\n\u2502   \u2502   \u251c\u2500\u2500 init.sql\r\n\u2502   \u2502   \u2514\u2500\u2500 my.cnf\r\n\u2502   \u2514\u2500\u2500 nginx\r\n\u2502       \u251c\u2500\u2500 Dockerfile\r\n\u2502       \u2514\u2500\u2500 conf.d\r\n\u2502           \u2514\u2500\u2500 default.conf\r\n\u251c\u2500\u2500 djangopj\r\n\u2502   \u251c\u2500\u2500 __init__.py\r\n\u2502   \u251c\u2500\u2500 asgi.py\r\n\u2502   \u251c\u2500\u2500 settings.py\r\n\u2502   \u251c\u2500\u2500 urls.py\r\n\u2502   \u2514\u2500\u2500 wsgi.py\r\n\u251c\u2500\u2500 .env\r\n\u251c\u2500\u2500 .env.prod\r\n\u251c\u2500\u2500 .gitignore\r\n\u251c\u2500\u2500 docker-compose.prod.yml\r\n\u251c\u2500\u2500 docker-compose.yml\r\n\u251c\u2500\u2500 entrypoint.sh\r\n\u251c\u2500\u2500 manage.py\r\n\u251c\u2500\u2500 poetry.lock\r\n\u251c\u2500\u2500 pyproject.toml\r\n\u2514\u2500\u2500 static\r\n<\/span><\/code><\/pre>\n<h2>\u4f7f\u7528Pydantic\u7ba1\u7406\u73af\u5883\u53d8\u91cf<\/h2>\n<p>Pydantic\u662f\u4e00\u4e2a\u4f7f\u7528Python\u7c7b\u578b\u6ce8\u89e3\u63d0\u4f9b\u7c7b\u578b\u63d0\u793a\u5e76\u5e2e\u52a9\u7b80\u5316\u9a8c\u8bc1\u9519\u8bef\u7684\u5e93\u3002\u5b83\u53ef\u4ee5\u7528\u4e8e\u73af\u5883\u53d8\u91cf\u7684\u8bbe\u7f6e\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u4f7f\u7528\u3057\u3066\u3044\u308b\u74b0\u5883\u5909\u6570\u306e\u578b\u304c\u76f4\u611f\u7684\u306b\u308f\u304b\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u74b0\u5883\u5909\u6570\u95a2\u9023\u3067\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3059\u308b\u3068Pydantic\u306e\u30a8\u30e9\u30fc\u304c\u51fa\u308b\u306e\u3067\u30c7\u30d0\u30c3\u30b0\u304c\u5bb9\u6613\u306b\u306a\u308b<\/ul>\n<p>\u6709\u8bb8\u591a\u597d\u5904<\/p>\n<h3>pyproject.toml \u6587\u4ef6<\/h3>\n<p>\u6211\u5c06\u5b89\u88c5Pydantic\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nn\">[tool.poetry]<\/span>\r\n<span class=\"py\">name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"djangopj\"<\/span>\r\n<span class=\"py\">version<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"0.1.0\"<\/span>\r\n<span class=\"py\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"api\"<\/span>\r\n<span class=\"py\">authors<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s\">\"shun198\"<\/span><span class=\"p\">]<\/span>\r\n<span class=\"py\">readme<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"README.md\"<\/span>\r\n\r\n<span class=\"nn\">[tool.poetry.dependencies]<\/span>\r\n<span class=\"py\">python<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"^3.11\"<\/span>\r\n<span class=\"py\">Django<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"^4.2.3\"<\/span>\r\n<span class=\"py\">djangorestframework<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"^3.14.0\"<\/span>\r\n<span class=\"py\">mysqlclient<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"^2.1.1\"<\/span>\r\n<span class=\"py\">gunicorn<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"^20.1.0\"<\/span>\r\n<span class=\"py\">pydantic<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"^1.10.6\"<\/span>\r\n<\/code><\/pre>\n<h3>\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf<\/h3>\n<p>\u8fd9\u6b21\u6211\u4eec\u5c06\u5728djangopj\u4e2d\u521b\u5efa\u4e00\u4e2aenvironment.py\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">tree\r\n<\/span><span class=\"c\">.\r\n<\/span><span class=\"go\">\u251c\u2500\u2500 containers\r\n\u2502   \u251c\u2500\u2500 django\r\n\u2502   \u2502   \u2514\u2500\u2500 Dockerfile\r\n\u2502   \u251c\u2500\u2500 mysql\r\n\u2502   \u2502   \u251c\u2500\u2500 Dockerfile\r\n\u2502   \u2502   \u251c\u2500\u2500 init.sql\r\n\u2502   \u2502   \u2514\u2500\u2500 my.cnf\r\n\u2502   \u2514\u2500\u2500 nginx\r\n\u2502       \u251c\u2500\u2500 Dockerfile\r\n\u2502       \u2514\u2500\u2500 conf.d\r\n\u2502           \u2514\u2500\u2500 default.conf\r\n\u251c\u2500\u2500 djangopj\r\n\u2502   \u251c\u2500\u2500 __init__.py\r\n\u2502   \u251c\u2500\u2500 asgi.py\r\n\u2502   \u251c\u2500\u2500 settings.py\r\n\u2502   \u251c\u2500\u2500 environment.py\r\n\u2502   \u251c\u2500\u2500 urls.py\r\n\u2502   \u2514\u2500\u2500 wsgi.py\r\n\u251c\u2500\u2500 .env\r\n\u251c\u2500\u2500 .env.prod\r\n\u251c\u2500\u2500 .gitignore\r\n\u251c\u2500\u2500 docker-compose.prod.yml\r\n\u251c\u2500\u2500 docker-compose.yml\r\n\u251c\u2500\u2500 entrypoint.sh\r\n\u251c\u2500\u2500 manage.py\r\n\u251c\u2500\u2500 poetry.lock\r\n\u251c\u2500\u2500 pyproject.toml\r\n\u2514\u2500\u2500 static\r\n<\/span><\/code><\/pre>\n<h3>\u73af\u5883.py<\/h3>\n<p>\u8bf7\u6309\u7167\u4ee5\u4e0b\u65b9\u5f0f\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"sh\">\"\"\"<\/span><span class=\"s\">\u74b0\u5883\u5909\u6570\u5b9a\u7fa9\u7528\u306e\u30e2\u30b8\u30e5\u30fc\u30eb<\/span><span class=\"sh\">\"\"\"<\/span>\r\n\r\n<span class=\"kn\">from<\/span> <span class=\"n\">pydantic<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">BaseSettings<\/span>\r\n\r\n\r\n<span class=\"k\">class<\/span> <span class=\"nc\">DjangoSettings<\/span><span class=\"p\">(<\/span><span class=\"n\">BaseSettings<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"sh\">\"\"\"<\/span><span class=\"s\">Django\u95a2\u9023\u306e\u74b0\u5883\u5909\u6570\u3092\u8a2d\u5b9a\u3059\u308b\u30af\u30e9\u30b9<\/span><span class=\"sh\">\"\"\"<\/span>\r\n\r\n    <span class=\"n\">SECRET_KEY<\/span><span class=\"p\">:<\/span> <span class=\"nb\">str<\/span> <span class=\"o\">=<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">secretkey<\/span><span class=\"sh\">\"<\/span>\r\n    <span class=\"n\">ALLOWED_HOSTS<\/span><span class=\"p\">:<\/span> <span class=\"nb\">str<\/span> <span class=\"o\">=<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">localhost 127.0.0.1 [::1] back web<\/span><span class=\"sh\">\"<\/span>\r\n    <span class=\"n\">MYSQL_DATABASE<\/span><span class=\"p\">:<\/span> <span class=\"nb\">str<\/span> <span class=\"o\">=<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">django<\/span><span class=\"sh\">\"<\/span>\r\n    <span class=\"n\">MYSQL_USER<\/span><span class=\"p\">:<\/span> <span class=\"nb\">str<\/span> <span class=\"o\">=<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">django<\/span><span class=\"sh\">\"<\/span>\r\n    <span class=\"n\">MYSQL_PASSWORD<\/span><span class=\"p\">:<\/span> <span class=\"nb\">str<\/span> <span class=\"o\">=<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">django<\/span><span class=\"sh\">\"<\/span>\r\n    <span class=\"n\">MYSQL_HOST<\/span><span class=\"p\">:<\/span> <span class=\"nb\">str<\/span> <span class=\"o\">=<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">db<\/span><span class=\"sh\">\"<\/span>\r\n    <span class=\"n\">MYSQL_PORT<\/span><span class=\"p\">:<\/span> <span class=\"nb\">int<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">3306<\/span>\r\n\r\n\r\n<span class=\"n\">django_settings<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">DjangoSettings<\/span><span class=\"p\">()<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u5bfc\u5165django_settings\u5982\u4e0b\u6240\u793a\uff0c\u5219\u53ef\u4ee5\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf\uff1a<br \/>\n\u4f7f\u7528\u7f16\u8f91\u5668\u7684\u81ea\u52a8\u8865\u5168\u529f\u80fd\uff0c\u60a8\u53ef\u4ee5\u65e0\u8bef\u5730\u8bbe\u7f6e\u76f8\u5e94\u7684\u73af\u5883\u53d8\u91cf\uff0c\u4ece\u800c\u52a0\u5feb\u5f00\u53d1\u901f\u5ea6\u3002<br \/>\n\u6b64\u5916\uff0c\u60a8\u53ef\u4ee5\u50cf\u4e0a\u9762\u90a3\u6837\u8bbe\u7f6e\u9ed8\u8ba4\u503c\uff0c<br \/>\n\u4f46\u662f\uff0c\u5728\u542f\u52a8MySQL\u5bb9\u5668\u65f6\uff0c\u9700\u8981MySQL\u73af\u5883\u53d8\u91cf\u5728docker-compose.yml\u6587\u4ef6\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code>MYSQL_ROOT_PASSWORD=root\r\nMYSQL_DATABASE=django-db\r\nMYSQL_USER=django\r\nMYSQL_PASSWORD=django\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"kn\">from<\/span> <span class=\"n\">.environment<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">django_settings<\/span>\r\n\r\n<span class=\"c1\"># SECRET_KEY\u3092.env\u304b\u3089\u53d6\u5f97\r\n<\/span><span class=\"n\">SECRET_KEY<\/span> <span class=\"o\">=<\/span> <span class=\"n\">django_settings<\/span><span class=\"p\">.<\/span><span class=\"n\">SECRET_KEY<\/span>\r\n\r\n<span class=\"c1\"># ALLOWED_HOSTS\u3092.env\u304b\u3089\u53d6\u5f97\r\n<\/span><span class=\"n\">ALLOWED_HOSTS<\/span> <span class=\"o\">=<\/span> <span class=\"n\">django_settings<\/span><span class=\"p\">.<\/span><span class=\"n\">ALLOWED_HOSTS<\/span><span class=\"p\">.<\/span><span class=\"nf\">split<\/span><span class=\"p\">()<\/span>\r\n\r\n<span class=\"n\">DATABASES<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"sh\">\"<\/span><span class=\"s\">default<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"sh\">\"<\/span><span class=\"s\">ENGINE<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">django.db.backends.mysql<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"c1\"># \u30b3\u30f3\u30c6\u30ca\u5185\u306e\u74b0\u5883\u5909\u6570\u3092DATABASES\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u306b\u53cd\u6620\r\n<\/span>        <span class=\"sh\">\"<\/span><span class=\"s\">NAME<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"n\">django_settings<\/span><span class=\"p\">.<\/span><span class=\"n\">MYSQL_DATABASE<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"sh\">\"<\/span><span class=\"s\">USER<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"n\">django_settings<\/span><span class=\"p\">.<\/span><span class=\"n\">MYSQL_USER<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"sh\">\"<\/span><span class=\"s\">PASSWORD<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"n\">django_settings<\/span><span class=\"p\">.<\/span><span class=\"n\">MYSQL_PASSWORD<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"sh\">\"<\/span><span class=\"s\">HOST<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"n\">django_settings<\/span><span class=\"p\">.<\/span><span class=\"n\">MYSQL_HOST<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"sh\">\"<\/span><span class=\"s\">PORT<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"n\">django_settings<\/span><span class=\"p\">.<\/span><span class=\"n\">MYSQL_PORT<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"sh\">\"<\/span><span class=\"s\">OPTIONS<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"sh\">\"<\/span><span class=\"s\">init_command<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">SET sql_mode=<\/span><span class=\"sh\">'<\/span><span class=\"s\">STRICT_TRANS_TABLES<\/span><span class=\"sh\">'\"<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"p\">},<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u4ee5\u4e0b\u662f\u4ee5\u4e0a\u7684\u5185\u5bb9\u3002<\/p>\n<h2>\u4ecb\u7d39\u9019\u7bc7\u6587\u7ae0<\/h2>\n<p>\u6211\u8fd8\u5199\u4e86\u4ee5\u4e0b\u7684\u6587\u7ae0\uff0c\u5982\u679c\u60a8\u80fd\u9605\u8bfb\u5e76\u89c9\u5f97\u4e0d\u9519\uff0c\u6211\u4f1a\u975e\u5e38\u9ad8\u5174\u3002<\/p>\n<p>&nbsp;<\/p>\n<h2>\u8bf7\u63d0\u4f9b\u5f15\u7528\u7684\u6765\u6e90\u3002<\/h2>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u524d\u63d0 \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306fDjango &nbsp; DB\u306fMySQL &nbsp; \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b5\u30fc\u30d0\u306fGu [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-33428","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u4f7f\u7528Docker+Django+Nginx+MySQL+Gunicorn\u8fdb\u884c\u73af\u5883\u642d\u5efa\uff0c\u652f\u6301M1Mac - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528dockerdjangonginxmysqlgunicorn\u8fdb\u884c\u73af\u5883\u642d\u5efa\uff0c\u652f\u6301m1mac\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f7f\u7528Docker+Django+Nginx+MySQL+Gunicorn\u8fdb\u884c\u73af\u5883\u642d\u5efa\uff0c\u652f\u6301M1Mac\" \/>\n<meta property=\"og:description\" content=\"\u524d\u63d0 \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306fDjango &nbsp; DB\u306fMySQL &nbsp; \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b5\u30fc\u30d0\u306fGu [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528dockerdjangonginxmysqlgunicorn\u8fdb\u884c\u73af\u5883\u642d\u5efa\uff0c\u652f\u6301m1mac\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-09-15T04:19:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-04T06:19:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d179d37434c4406c045db\/71-0.png\" \/>\n<meta name=\"author\" content=\"\u6e05, \u5b87\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u6e05, \u5b87\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8dockerdjangonginxmysqlgunicorn%e8%bf%9b%e8%a1%8c%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba%ef%bc%8c%e6%94%af%e6%8c%81m1mac%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8dockerdjangonginxmysqlgunicorn%e8%bf%9b%e8%a1%8c%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba%ef%bc%8c%e6%94%af%e6%8c%81m1mac%e3%80%82\/\",\"name\":\"\u4f7f\u7528Docker+Django+Nginx+MySQL+Gunicorn\u8fdb\u884c\u73af\u5883\u642d\u5efa\uff0c\u652f\u6301M1Mac - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-09-15T04:19:01+00:00\",\"dateModified\":\"2024-05-04T06:19:35+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/1a6ecd3d914d22a5ac32791ffc1fbd8e\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8dockerdjangonginxmysqlgunicorn%e8%bf%9b%e8%a1%8c%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba%ef%bc%8c%e6%94%af%e6%8c%81m1mac%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8dockerdjangonginxmysqlgunicorn%e8%bf%9b%e8%a1%8c%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba%ef%bc%8c%e6%94%af%e6%8c%81m1mac%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8dockerdjangonginxmysqlgunicorn%e8%bf%9b%e8%a1%8c%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba%ef%bc%8c%e6%94%af%e6%8c%81m1mac%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4f7f\u7528Docker+Django+Nginx+MySQL+Gunicorn\u8fdb\u884c\u73af\u5883\u642d\u5efa\uff0c\u652f\u6301M1Mac\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/1a6ecd3d914d22a5ac32791ffc1fbd8e\",\"name\":\"\u6e05, \u5b87\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/4b2016c18459a605fc469c7566608f5686491baa112d0871ee613f61b7210565?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/4b2016c18459a605fc469c7566608f5686491baa112d0871ee613f61b7210565?s=96&d=mm&r=g\",\"caption\":\"\u6e05, \u5b87\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/qingyu\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8dockerdjangonginxmysqlgunicorn%e8%bf%9b%e8%a1%8c%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba%ef%bc%8c%e6%94%af%e6%8c%81m1mac%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4f7f\u7528Docker+Django+Nginx+MySQL+Gunicorn\u8fdb\u884c\u73af\u5883\u642d\u5efa\uff0c\u652f\u6301M1Mac - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528dockerdjangonginxmysqlgunicorn\u8fdb\u884c\u73af\u5883\u642d\u5efa\uff0c\u652f\u6301m1mac\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4f7f\u7528Docker+Django+Nginx+MySQL+Gunicorn\u8fdb\u884c\u73af\u5883\u642d\u5efa\uff0c\u652f\u6301M1Mac","og_description":"\u524d\u63d0 \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306fDjango &nbsp; DB\u306fMySQL &nbsp; \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b5\u30fc\u30d0\u306fGu [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528dockerdjangonginxmysqlgunicorn\u8fdb\u884c\u73af\u5883\u642d\u5efa\uff0c\u652f\u6301m1mac\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-09-15T04:19:01+00:00","article_modified_time":"2024-05-04T06:19:35+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d179d37434c4406c045db\/71-0.png"}],"author":"\u6e05, \u5b87","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u6e05, \u5b87","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"7 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8dockerdjangonginxmysqlgunicorn%e8%bf%9b%e8%a1%8c%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba%ef%bc%8c%e6%94%af%e6%8c%81m1mac%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8dockerdjangonginxmysqlgunicorn%e8%bf%9b%e8%a1%8c%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba%ef%bc%8c%e6%94%af%e6%8c%81m1mac%e3%80%82\/","name":"\u4f7f\u7528Docker+Django+Nginx+MySQL+Gunicorn\u8fdb\u884c\u73af\u5883\u642d\u5efa\uff0c\u652f\u6301M1Mac - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-09-15T04:19:01+00:00","dateModified":"2024-05-04T06:19:35+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/1a6ecd3d914d22a5ac32791ffc1fbd8e"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8dockerdjangonginxmysqlgunicorn%e8%bf%9b%e8%a1%8c%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba%ef%bc%8c%e6%94%af%e6%8c%81m1mac%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8dockerdjangonginxmysqlgunicorn%e8%bf%9b%e8%a1%8c%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba%ef%bc%8c%e6%94%af%e6%8c%81m1mac%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8dockerdjangonginxmysqlgunicorn%e8%bf%9b%e8%a1%8c%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba%ef%bc%8c%e6%94%af%e6%8c%81m1mac%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4f7f\u7528Docker+Django+Nginx+MySQL+Gunicorn\u8fdb\u884c\u73af\u5883\u642d\u5efa\uff0c\u652f\u6301M1Mac"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/1a6ecd3d914d22a5ac32791ffc1fbd8e","name":"\u6e05, \u5b87","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/4b2016c18459a605fc469c7566608f5686491baa112d0871ee613f61b7210565?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4b2016c18459a605fc469c7566608f5686491baa112d0871ee613f61b7210565?s=96&d=mm&r=g","caption":"\u6e05, \u5b87"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/qingyu\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8dockerdjangonginxmysqlgunicorn%e8%bf%9b%e8%a1%8c%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba%ef%bc%8c%e6%94%af%e6%8c%81m1mac%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/33428","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=33428"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/33428\/revisions"}],"predecessor-version":[{"id":98833,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/33428\/revisions\/98833"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=33428"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=33428"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=33428"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}