{"id":49640,"date":"2023-04-13T12:40:43","date_gmt":"2023-09-26T19:23:30","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8docker%e7%8e%af%e5%a2%83%e4%b8%8b%e7%9a%84web3%e5%b1%82%e6%9e%84%e9%80%a0nginx%e3%80%81django%e3%80%81postgresql%e7%9a%84%e5%8d%8f%e5%90%8c%e9%85%8d%e5%90%88\/"},"modified":"2024-04-29T23:20:34","modified_gmt":"2024-04-29T15:20:34","slug":"%e5%9c%a8docker%e7%8e%af%e5%a2%83%e4%b8%8b%e7%9a%84web3%e5%b1%82%e6%9e%84%e9%80%a0nginx%e3%80%81django%e3%80%81postgresql%e7%9a%84%e5%8d%8f%e5%90%8c%e9%85%8d%e5%90%88","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8docker%e7%8e%af%e5%a2%83%e4%b8%8b%e7%9a%84web3%e5%b1%82%e6%9e%84%e9%80%a0nginx%e3%80%81django%e3%80%81postgresql%e7%9a%84%e5%8d%8f%e5%90%8c%e9%85%8d%e5%90%88\/","title":{"rendered":"\u5728Docker\u73af\u5883\u4e0b\u7684Web3\u5c42\u6784\u9020~nginx\u3001django\u3001PostgreSQL\u7684\u534f\u540c\u914d\u5408~"},"content":{"rendered":"<h1>\u9996\u5148<\/h1>\n<h3>\u6b64\u6b21\u8981\u521b\u5efa\u7684\u4e1c\u897f\u3002<\/h3>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8c83913a08637a6d0c78\/2-0.png\" alt=\"Group_3.png\" \/><\/div>\n<h3>\u7b79\u5907\u5de5\u4f5c<\/h3>\n<p>&#8211; \u53ef\u4ee5\u516c\u5f00\u8bbf\u95ee\u7684\u670d\u52a1\u5668\uff08\u5728\u672c\u7bc7\u6587\u7ae0\u4e2d\u4f7f\u7528\u4e86EC2\u5b9e\u4f8b\u3002\u9009\u62e9\u7684\u64cd\u4f5c\u7cfb\u7edf\u662fAmazon Linux 2\u3002\uff09<br \/>\n&#8211; \u5b89\u88c5Python 3\uff08\u5728\u672c\u7bc7\u6587\u7ae0\u4e2d\u4f7f\u7528\u4e86\u7248\u672c\u4e3a3.8.9\u3002\u540e\u534a\u90e8\u5206\u6709\u901a\u8fc7pyenv\u5b89\u88c5\u7684\u6b65\u9aa4\u8bf4\u660e\u3002\uff09<\/p>\n<h1>\u9a8c\u8bc1 docker-compose \u7684\u8fd0\u884c\uff08\u76f4\u5230\u542f\u52a8 nginx\uff09\u3002<\/h1>\n<h3>\u5b89\u88c5 Docker<\/h3>\n<p>\u767b\u5f55EC2\u5b9e\u4f8b\u5e76\u4f7f\u7528SSH\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\u5b89\u88c5Docker\u3002<br \/>\n\u5e76\u4e14\u8bbe\u7f6eDocker\u53ef\u4ee5\u5728\u542f\u52a8\u65f6\u81ea\u52a8\u542f\u52a8\uff0c\u5e76\u4e14\u542f\u7528\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">sudo <\/span>yum <span class=\"nb\">install<\/span> <span class=\"nt\">-y<\/span> docker\r\n<span class=\"nb\">sudo <\/span>systemctl start docker\r\n<span class=\"nb\">sudo <\/span>systemctl <span class=\"nb\">enable <\/span>docker\r\n<span class=\"nb\">sudo <\/span>docker info <span class=\"c\"># \u78ba\u8a8d<\/span>\r\n<\/code><\/pre>\n<h3>\u5c06ec2-user\u6dfb\u52a0\u5230docker\u7ec4\u4e2d\u3002<\/h3>\n<p>\u901a\u8fc7\u8fd9\u4e2a\u65b9\u6cd5\uff0c\u60a8\u53ef\u4ee5\u5728\u4e0d\u4f7f\u7528sudo\u7684\u60c5\u51b5\u4e0b\u4f7f\u7528docker\u547d\u4ee4\u3002<br \/>\n\u6b64\u5916\uff0c\u5982\u540cdocker\u5b98\u65b9\u6587\u6863\u6240\u8ff0\uff0c\u53ef\u4ee5\u5b8c\u6210\u4ee5\u4e0b\u64cd\u4f5c\u3002<\/p>\n<blockquote><p>\u5982\u679c\u5728\u865a\u62df\u673a\u4e0a\u8fdb\u884c\u6d4b\u8bd5\uff0c\u4e3a\u4e86\u4f7f\u66f4\u6539\u751f\u6548\uff0c\u53ef\u80fd\u9700\u8981\u91cd\u65b0\u542f\u52a8\u865a\u62df\u673a\u3002<\/p><\/blockquote>\n<p>\u6dfb\u52a0\u7fa4\u7ec4\u540e\u91cd\u65b0\u542f\u52a8\u5b9e\u4f8b\u3002<\/p>\n<pre class=\"post-pre\"><code>sudo usermod -aG docker $USER\r\ncat \/etc\/group | grep docker # \u78ba\u8a8d\r\nsudo reboot # \u518d\u8d77\u52d5\r\n<\/code><\/pre>\n<h3>\u5b89\u88c5Docker Compose<\/h3>\n<p>\u68c0\u67e5Docker\u5b98\u65b9\u6587\u6863\uff0c\u786e\u5b9a\u7248\u672c\uff08\u672c\u6b21\u4f7f\u75281.29.2\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">sudo <\/span>curl <span class=\"nt\">-L<\/span> <span class=\"s2\">\"https:\/\/github.com\/docker\/compose\/releases\/download\/1.29.2\/docker-compose-<\/span><span class=\"si\">$(<\/span><span class=\"nb\">uname<\/span> <span class=\"nt\">-s<\/span><span class=\"si\">)<\/span><span class=\"s2\">-<\/span><span class=\"si\">$(<\/span><span class=\"nb\">uname<\/span> <span class=\"nt\">-m<\/span><span class=\"si\">)<\/span><span class=\"s2\">\"<\/span> <span class=\"nt\">-o<\/span> \/usr\/local\/bin\/docker-compose\r\n<span class=\"nb\">sudo chmod<\/span> +x \/usr\/local\/bin\/docker-compose\r\ndocker-compose version <span class=\"c\"># \u78ba\u8a8d<\/span>\r\n<\/code><\/pre>\n<h3>\u901a\u8fc7docker-compose\u786e\u8ba4\u5bb9\u5668\u7684\u542f\u52a8<\/h3>\n<p>\u4f7f\u7528Docker Compose \u83b7\u53d6nginx\u955c\u50cf\u5e76\u663e\u793a\u6d4b\u8bd5\u9875\u9762\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">version<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">3.7'<\/span>\r\n<span class=\"na\">services<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">nginx<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">nginx<\/span>\r\n        <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">nginx:latest<\/span>\r\n        <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">80:80<\/span>\r\n<\/code><\/pre>\n<p>\u6267\u884c\u4ee5\u4e0b\u6307\u4ee4\u6765\u542f\u52a8\u5bb9\u5668\u3002<\/p>\n<pre class=\"post-pre\"><code>docker-compose up <span class=\"nt\">-d<\/span>\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8c83913a08637a6d0c78\/22-0.png\" alt=\"Screen Shot 2021-06-20 at 12.21.32.png\" \/><\/div>\n<pre class=\"post-pre\"><code>docker-compose down\r\n<\/code><\/pre>\n<h1>\u5efa\u7acb\u4e09\u5c42\u67b6\u6784<\/h1>\n<h3>\u51c6\u5907nginx\u5bb9\u5668\uff08Web\u670d\u52a1\u5668\uff09<\/h3>\n<p>\u76ee\u5f55\u7ed3\u6784<\/p>\n<blockquote><p>\u5bb9\u5668\/<br \/>\n\u251c Django\/<br \/>\n\u2502\u3000\u2514 &#8230;<br \/>\n\u251c Nginx\/<br \/>\n\u2514 \u914d\u7f6e\/<br \/>\n\u2514 nginx.conf<br \/>\n\u2514 uwsgi\u53c2\u6570<br \/>\n\u251c docker-compose.yml<\/p><\/blockquote>\n<p>\u6dfb\u52a0volume\u7684\u5206\u914d\u548c\u4f9d\u8d56\u5173\u7cfb\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">version<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">3.7'<\/span>\r\n<span class=\"na\">services<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">nginx<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">nginx<\/span>\r\n        <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">nginx:latest<\/span>\r\n        <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span> <span class=\"c1\"># add<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">.\/nginx\/conf:\/etc\/nginx\/conf.d<\/span> <span class=\"c1\"># add<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">.\/nginx\/uwsgi_params:\/etc\/nginx\/uwsgi_params<\/span> <span class=\"c1\"># add<\/span>\r\n        <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">80:80<\/span>\r\n        <span class=\"na\">depends_on<\/span><span class=\"pi\">:<\/span> <span class=\"c1\"># add<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">django<\/span> <span class=\"c1\"># add<\/span>\r\n\r\n<\/code><\/pre>\n<p>\u521b\u5efa nginx.conf \u6587\u4ef6\u3002<br \/>\n\u6839\u636e upstream \u6307\u4ee4\u4e2d\u7684\u63cf\u8ff0\uff0c\u5c06\u901a\u4fe1\u6d41\u91cf\u8bbe\u7f6e\u5230 Django \u5bb9\u5668\u76848000\u7aef\u53e3\u4e0a\u3002<\/p>\n<p>(Chinese translation)<\/p>\n<pre class=\"post-pre\"><code><span class=\"n\">upstream<\/span> <span class=\"n\">django<\/span> {\r\n    <span class=\"n\">server<\/span> <span class=\"n\">django<\/span>:<span class=\"m\">8000<\/span>;\r\n}\r\n\r\n<span class=\"n\">server<\/span> {\r\n    <span class=\"n\">listen<\/span> <span class=\"m\">80<\/span>;\r\n    <span class=\"n\">location<\/span> \/ {\r\n        <span class=\"n\">uwsgi_pass<\/span> <span class=\"n\">django<\/span>;\r\n        <span class=\"n\">include<\/span> \/<span class=\"n\">etc<\/span>\/<span class=\"n\">nginx<\/span>\/<span class=\"n\">uwsgi_params<\/span>;\r\n    }\r\n}\r\n<\/code><\/pre>\n<p>\u521b\u5efa\u7528\u4e8eWSGI\u901a\u4fe1\u6240\u9700\u7684uwsgi_params\uff08\u53c2\u8003\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code>uwsgi_param QUERY_STRING $query_string;\r\nuwsgi_param REQUEST_METHOD $request_method;\r\nuwsgi_param CONTENT_TYPE $content_type;\r\nuwsgi_param CONTENT_LENGTH $content_length;\r\nuwsgi_param REQUEST_URI $request_uri;\r\nuwsgi_param PATH_INFO $document_uri;\r\nuwsgi_param DOCUMENT_ROOT $document_root;\r\nuwsgi_param SERVER_PROTOCOL $server_protocol;\r\nuwsgi_param REMOTE_ADDR $remote_addr;\r\nuwsgi_param REMOTE_PORT $remote_port;\r\nuwsgi_param SERVER_ADDR $server_addr;\r\nuwsgi_param SERVER_PORT $server_port;\r\nuwsgi_param SERVER_NAME $server_name;\r\n<\/code><\/pre>\n<h3>\u51c6\u5907django\u5bb9\u5668\uff08\u5e94\u7528\u670d\u52a1\u5668\uff09\u3002<\/h3>\n<p>\u76ee\u5f55\u7ed3\u6784<\/p>\n<blockquote><p>\u5bb9\u5668\/<br \/>\n\u251c django\/<br \/>\n\u2502 \u2514 \u542f\u52a8<br \/>\n\u2502 \u2514 setuser.sh<br \/>\n\u2502 \u2514 startup.sh<br \/>\n\u2502 \u2514 uwsgi<br \/>\n\u2502 \u2514 uwsgi.ini<br \/>\n\u2502 \u2514 Dockerfile<br \/>\n\u2502 \u2514 requirements.txt<br \/>\n\u251c nginx\/<br \/>\n\u2502 \u2514 &#8230;<br \/>\n\u251c docker-compose.yml<\/p><\/blockquote>\n<p>\u4e3a\u4e86\u80fd\u591f\u63a5\u6536nginx\u5bb9\u5668\u53d1\u9001\u8fc7\u6765\u7684\u901a\u4fe1\u8bf7\u6c42\uff0c\u9700\u8981\u5728Django\u5bb9\u5668\u4e2d\u521b\u5efauwsgi.ini\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nn\">[uwsgi]<\/span>\r\n<span class=\"py\">socket<\/span> <span class=\"p\">=<\/span> <span class=\"s\">:8000<\/span>\r\n<span class=\"py\">module<\/span> <span class=\"p\">=<\/span> <span class=\"s\">djangoapp.wsgi<\/span>\r\n<span class=\"py\">wsgi-file<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\/app\/app\/wsgi.py<\/span>\r\n<span class=\"py\">logto<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\/wsgi\/wsgi.log<\/span>\r\n<span class=\"py\">py-autoreload<\/span> <span class=\"p\">=<\/span> <span class=\"s\">1<\/span>\r\n<\/code><\/pre>\n<p>\u521b\u5efa\u4e00\u4e2a\u7528\u4e8e\u6784\u5efaDjango\u5bb9\u5668\u955c\u50cf\u7684Dockerfile\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">FROM<\/span><span class=\"s\"> python:3<\/span>\r\n<span class=\"k\">WORKDIR<\/span><span class=\"s\"> \/app<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> requirements.txt \/app<\/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=\"k\">COPY<\/span><span class=\"s\"> . \/app<\/span>\r\n<\/code><\/pre>\n<p>\u521b\u5efa\u4e00\u4e2a\u5728Django\u5bb9\u5668\u4e2d\u6240\u9700\u7684Python\u6a21\u5757\u5217\u8868\u3002<\/p>\n<pre class=\"post-pre\"><code>django\r\npsycopg2\r\nuwsgi\r\n<\/code><\/pre>\n<p>\u5728Django\u5bb9\u5668\u4e2d\u521b\u5efa\u4e00\u4e2a\u6267\u884c\u7684shell\u811a\u672c\uff08startup.sh, setuser.sh\uff09\u3002<br \/>\n\u521b\u5efa\u7528\u6237\uff0c\u5e76\u6267\u884cuwsgi.ini\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">source<\/span> \/startup\/setuser.sh <span class=\"c\"># setuser.sh \u3092\u5b9f\u884c\u3059\u308b<\/span>\r\nuwsgi <span class=\"nt\">--ini<\/span> \/wsgi\/uwsgi.ini <span class=\"c\"># uwsgi.ini \u306e\u8a2d\u5b9a\u3092\u3082\u3068\u306b uwsgi \u3092\u5b9f\u884c\u3059\u308b<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c\">#!\/bin\/bash -e<\/span>\r\n<span class=\"nv\">SHELL_NAME<\/span><span class=\"o\">=<\/span><span class=\"s1\">'setuser.sh'<\/span>\r\n<span class=\"nb\">echo<\/span> <span class=\"s2\">\"[<\/span><span class=\"nv\">$SHELL_NAME<\/span><span class=\"s2\">] START\"<\/span>\r\n\r\n<span class=\"c\"># setup group<\/span>\r\n<span class=\"k\">if <\/span>getent group <span class=\"s2\">\"<\/span><span class=\"nv\">$GROUP_ID<\/span><span class=\"s2\">\"<\/span> <span class=\"o\">&gt;<\/span> \/dev\/null 2&gt;&amp;1<span class=\"p\">;<\/span> <span class=\"k\">then\r\n    <\/span><span class=\"nb\">echo<\/span> <span class=\"s2\">\"[<\/span><span class=\"nv\">$SHELL_NAME<\/span><span class=\"s2\">] GROUP_ID '<\/span><span class=\"nv\">$GROUP_ID<\/span><span class=\"s2\">' already exists.\"<\/span>\r\n<span class=\"k\">else\r\n    <\/span><span class=\"nb\">echo<\/span> <span class=\"s2\">\"[<\/span><span class=\"nv\">$SHELL_NAME<\/span><span class=\"s2\">] GROUP_ID '<\/span><span class=\"nv\">$GROUP_ID<\/span><span class=\"s2\">' does NOT exist. So execute [groupadd -g <\/span><span class=\"se\">\\$<\/span><span class=\"s2\">GROUP_ID <\/span><span class=\"se\">\\$<\/span><span class=\"s2\">GROUP_NAME].\"<\/span>\r\n    groupadd <span class=\"nt\">-g<\/span> <span class=\"nv\">$GROUP_ID<\/span> <span class=\"nv\">$GROUP_NAME<\/span>\r\n<span class=\"k\">fi<\/span>\r\n\r\n<span class=\"c\"># setup user<\/span>\r\n<span class=\"k\">if <\/span>getent passwd <span class=\"s2\">\"<\/span><span class=\"nv\">$USER_ID<\/span><span class=\"s2\">\"<\/span> <span class=\"o\">&gt;<\/span> \/dev\/null 2&gt;&amp;1<span class=\"p\">;<\/span> <span class=\"k\">then\r\n    <\/span><span class=\"nb\">echo<\/span> <span class=\"s2\">\"[<\/span><span class=\"nv\">$SHELL_NAME<\/span><span class=\"s2\">] USER_ID '<\/span><span class=\"nv\">$USER_ID<\/span><span class=\"s2\">' already exists.\"<\/span>\r\n<span class=\"k\">else\r\n    <\/span><span class=\"nb\">echo<\/span> <span class=\"s2\">\"[<\/span><span class=\"nv\">$SHELL_NAME<\/span><span class=\"s2\">] USER_ID '<\/span><span class=\"nv\">$USER_ID<\/span><span class=\"s2\">' does NOT exist. So execute [useradd -m -s \/bin\/bash -u <\/span><span class=\"se\">\\$<\/span><span class=\"s2\">USER_ID -g <\/span><span class=\"se\">\\$<\/span><span class=\"s2\">GROUP_ID <\/span><span class=\"se\">\\$<\/span><span class=\"s2\">USER_NAME].\"<\/span>\r\n    useradd <span class=\"nt\">-m<\/span> <span class=\"nt\">-s<\/span> \/bin\/bash <span class=\"nt\">-u<\/span> <span class=\"nv\">$USER_ID<\/span> <span class=\"nt\">-g<\/span> <span class=\"nv\">$GROUP_ID<\/span> <span class=\"nv\">$USER_NAME<\/span>\r\n<span class=\"k\">fi\r\n\r\n<\/span><span class=\"nb\">echo<\/span> <span class=\"s2\">\"[<\/span><span class=\"nv\">$SHELL_NAME<\/span><span class=\"s2\">] FINISH\"<\/span>\r\n<\/code><\/pre>\n<p>\u7ed9startup\u76ee\u5f55\u4e0b\u7684\u6240\u6709\u6587\u4ef6\u6dfb\u52a0\u6267\u884c\u6743\u9650\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">chmod<\/span> +x <span class=\"nt\">-R<\/span> ~\/dev\/3l_on_docker\/django\/startup\/\r\n<\/code><\/pre>\n<p>\u9996\u5148\uff0c\u5728\u4e3b\u673a\u7aef\u521b\u5efaDjango\u9879\u76ee\u3002\u4e3a\u6b64\uff0c\u9996\u5148\u5728\u4e3b\u673a\u7aef\u5b89\u88c5Django\u3002<\/p>\n<pre class=\"post-pre\"><code>pip install django\r\n<\/code><\/pre>\n<p>\u5728Django\u76ee\u5f55\u4e0b\u521b\u5efaDjango\u9879\u76ee\u3002<br \/>\n\u672c\u6b21\u9879\u76ee\u540d\u79f0\u5c06\u8bbe\u4e3adjangoapp\u3002<\/p>\n<pre class=\"post-pre\"><code>django-admin startproject djangoapp\r\n<\/code><\/pre>\n<p>\u521b\u5efa\u9879\u76ee\u540e\uff0c\u5728Django\u76ee\u5f55\u4e2d\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u540d\u4e3adjangoapp\u7684\u6587\u4ef6\u5939\u3002<\/p>\n<p>\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u62d2\u7edd\u6240\u6709\u6765\u81ea\u5916\u90e8\u7684\u901a\u4fe1\uff0c\u9700\u8981\u5bf9setting.py\u8fdb\u884c\u4fee\u6539\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"p\">...<\/span>\r\n\r\n<span class=\"n\">ALLOWED_HOSTS<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"s\">'*'<\/span><span class=\"p\">]<\/span>\r\n\r\n<span class=\"p\">...<\/span>\r\n<\/code><\/pre>\n<p>\u8fd9\u6b21\u8bbe\u7f6e\u4e86\u5141\u8bb8\u5916\u90e8\u6240\u6709\u901a\u4fe1\u7684&#8221;*&#8221;\u9009\u9879\u3002<\/p>\n<p>\u4f7f\u7528docker-compose up -d\u547d\u4ee4\u542f\u52a8\u5bb9\u5668\uff0c\u5e76\u8bbf\u95eeEC2\u7684\u516c\u5171IP\u5730\u5740\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8c83913a08637a6d0c78\/56-0.png\" alt=\"Screen Shot 2021-06-24 at 9.54.07.png\" \/><\/div>\n<p>\u53ea\u8981\u80fd\u770b\u5230\u7c7b\u4f3c\u4e0a\u9762\u7684 Django \u6d4b\u8bd5\u9875\u9762\u5c31\u53ef\u4ee5\u3002<\/p>\n<h4>\u521b\u5efa\u6837\u54c1\u5e94\u7528\u7a0b\u5e8f<\/h4>\n<p>\u65e2\u7ecf\u770b\u5230\u4e86\u6d4b\u8bd5\u9875\u9762\uff0c\u4ece\u8fd9\u91cc\u5f00\u59cb\u663e\u793a\u81ea\u5df1\u521b\u5efa\u7684\u9875\u9762\u3002<br \/>\n\u9996\u5148\uff0c\u5728\u4e3b\u673a\u7aef\u521b\u5efa\u4e00\u4e2a\u5e94\u7528\u7a0b\u5e8f\u3002<\/p>\n<pre class=\"post-pre\"><code>python manage.py startapp sampleapp\r\n<\/code><\/pre>\n<p>\u5728sampleapp\u6587\u4ef6\u5939\u7684\u6839\u76ee\u5f55\u4e0b\u521b\u5efaurls.py\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">from<\/span> <span class=\"nn\">django.urls<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">path<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"nn\">.<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">views<\/span>\r\n\r\n<span class=\"n\">urlpatterns<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"n\">path<\/span><span class=\"p\">(<\/span><span class=\"s\">''<\/span><span class=\"p\">,<\/span> <span class=\"n\">views<\/span><span class=\"p\">.<\/span><span class=\"n\">index<\/span><span class=\"p\">,<\/span> <span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"s\">'index'<\/span><span class=\"p\">),<\/span>\r\n<span class=\"p\">]<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"kn\">from<\/span> <span class=\"nn\">django.http<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">HttpResponse<\/span>\r\n\r\n<span class=\"k\">def<\/span> <span class=\"nf\">index<\/span><span class=\"p\">(<\/span><span class=\"n\">request<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">HttpResponse<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Hello, world. You're at the polls index.\"<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<p>\u8bbf\u95ee http:\/\/[IP\u5730\u5740]\/[\u5e94\u7528\u540d\u79f0]\uff0c\u5982\u679c\u53ef\u4ee5\u786e\u8ba4\u770b\u5230 &#8220;\u4f60\u597d\uff0c\u4e16\u754c\u3002\u4f60\u5728\u6295\u7968\u7d22\u5f15\u9875\u9762\u3002&#8221;\uff0c\u90a3\u5c31\u53ef\u4ee5\u4e86\u3002<\/p>\n<h4>\u6570\u636e\u5e93\u5e03\u5c40\uff08\u7f16\u8f91 models.py \u6587\u4ef6\uff09<\/h4>\n<pre class=\"post-pre\"><code><span class=\"k\">class<\/span> <span class=\"nc\">User<\/span><span class=\"p\">(<\/span><span class=\"n\">models<\/span><span class=\"p\">.<\/span><span class=\"n\">Model<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"n\">user_name<\/span> <span class=\"o\">=<\/span> <span class=\"n\">models<\/span><span class=\"p\">.<\/span><span class=\"n\">CharField<\/span><span class=\"p\">(<\/span><span class=\"n\">max_length<\/span><span class=\"o\">=<\/span><span class=\"mi\">200<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"n\">pub_date<\/span> <span class=\"o\">=<\/span> <span class=\"n\">models<\/span><span class=\"p\">.<\/span><span class=\"n\">DateTimeField<\/span><span class=\"p\">(<\/span><span class=\"s\">'date published'<\/span><span class=\"p\">)<\/span>\r\n\r\n<span class=\"k\">class<\/span> <span class=\"nc\">FigurePaths<\/span><span class=\"p\">(<\/span><span class=\"n\">models<\/span><span class=\"p\">.<\/span><span class=\"n\">Model<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"n\">models<\/span><span class=\"p\">.<\/span><span class=\"n\">ForeignKey<\/span><span class=\"p\">(<\/span><span class=\"n\">User<\/span><span class=\"p\">,<\/span> <span class=\"n\">on_delete<\/span><span class=\"o\">=<\/span><span class=\"n\">models<\/span><span class=\"p\">.<\/span><span class=\"n\">CASCADE<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"n\">figure_url<\/span> <span class=\"o\">=<\/span> <span class=\"n\">models<\/span><span class=\"p\">.<\/span><span class=\"n\">CharField<\/span><span class=\"p\">(<\/span><span class=\"n\">max_length<\/span><span class=\"o\">=<\/span><span class=\"mi\">200<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"n\">pub_date<\/span> <span class=\"o\">=<\/span> <span class=\"n\">models<\/span><span class=\"p\">.<\/span><span class=\"n\">DateTimeField<\/span><span class=\"p\">(<\/span><span class=\"s\">'date published'<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"n\">like_point<\/span> <span class=\"o\">=<\/span> <span class=\"n\">models<\/span><span class=\"p\">.<\/span><span class=\"n\">IntegerField<\/span><span class=\"p\">(<\/span><span class=\"n\">default<\/span><span class=\"o\">=<\/span><span class=\"mi\">0<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"n\">INSTALLED_APPS<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"s\">'instalikeapp.apps.InstalikeappConfig'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.admin'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.auth'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.contenttypes'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.sessions'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.messages'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.staticfiles'<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">]<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>python manage.py makemigrations sampleapp\r\n<\/code><\/pre>\n<p>\u5728migration\u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a0001_initial.py\u6587\u4ef6\u3002<\/p>\n<p>\u4f7f\u7528docker exec -it bash\u547d\u4ee4\u8fdb\u5165django\u5bb9\u5668\uff0c\u5e76\u6267\u884csqlmigrate\u548cmigrate\u547d\u4ee4\uff0c\u4ee5\u5b8c\u6210\u5411\u6570\u636e\u5e93\u6dfb\u52a0\u6570\u636e\u7684\u51c6\u5907\u5de5\u4f5c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">[<\/span>ec2-user@ip-10-0-1-89 djangoapp]<span class=\"nv\">$ <\/span>docker <span class=\"nb\">exec<\/span> <span class=\"nt\">-it<\/span> django bash\r\nroot@87e83722b47a:\/app# python manage.py sqlmigrate sampleapp 0001\r\nroot@87e83722b47a:\/app# python manage.py migrate\r\n<\/code><\/pre>\n<h3>\u51c6\u5907PostgreSQL\u5bb9\u5668\uff08\u6570\u636e\u5e93\u670d\u52a1\u5668\uff09\u3002<\/h3>\n<p>\u5728PostgreSQL\u5bb9\u5668\u4e2d\u6dfb\u52a0\u914d\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">version<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">3.7'<\/span>\r\n<span class=\"na\">services<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">nginx<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">nginx<\/span>\r\n        <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">nginx:latest<\/span>\r\n        <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">.\/nginx\/conf:\/etc\/nginx\/conf.d<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">.\/nginx\/uwsgi_params:\/etc\/nginx\/uwsgi_params<\/span>\r\n        <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">80:80<\/span>\r\n        <span class=\"na\">depends_on<\/span><span class=\"pi\">:<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">django<\/span>\r\n\r\n    <span class=\"na\">django<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">django<\/span>\r\n        <span class=\"na\">build<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.\/django<\/span>\r\n        <span class=\"na\">command<\/span><span class=\"pi\">:<\/span> <span class=\"s\">bash -c \/startup\/startup.sh<\/span>\r\n        <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">.\/django\/uwsgi:\/wsgi<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">.\/django\/djangoapp:\/app<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">.\/django\/startup:\/startup<\/span>\r\n        <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">8000:8000<\/span>\r\n        <span class=\"na\">environment<\/span><span class=\"pi\">:<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">USER_ID=1000<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">GROUP_ID=1000<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">USER_NAME=ec2-user<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">GROUP_NAME=ec2-user<\/span>\r\n        <span class=\"na\">depends_on<\/span><span class=\"pi\">:<\/span> <span class=\"c1\"># add<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">postgresql<\/span> <span class=\"c1\"># add<\/span>\r\n\r\n    <span class=\"na\">postgresql<\/span><span class=\"pi\">:<\/span> <span class=\"c1\"># add<\/span>\r\n        <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">postgres:latest<\/span> <span class=\"c1\"># add<\/span>\r\n        <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">postgresql<\/span> <span class=\"c1\"># add<\/span>\r\n        <span class=\"na\">environment<\/span><span class=\"pi\">:<\/span> <span class=\"c1\"># add<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">POSTGRES_DB=instalikeapp_db<\/span> <span class=\"c1\"># add<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">POSTGRES_USER=user<\/span> <span class=\"c1\"># add<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">POSTGRES_PASSWORD=password<\/span> <span class=\"c1\"># add<\/span>\r\n        <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span> <span class=\"c1\"># add<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">.\/pgdata:\/var\/lib\/postgresql\/data<\/span> <span class=\"c1\"># add<\/span>\r\n        <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span> <span class=\"c1\"># add<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">5432:5432<\/span> <span class=\"c1\"># add<\/span>\r\n\r\n<\/code><\/pre>\n<p>\u91cd\u65b0\u542f\u52a8\u5bb9\u5668\u3002<\/p>\n<pre class=\"post-pre\"><code>docker-compose restart\r\n<\/code><\/pre>\n<h1>\u5c1d\u8bd5\u4f7f\u7528Django\u5bb9\u5668\u5185\u7684Python\u89e3\u91ca\u5668\u5c06\u6570\u636e\u63d2\u5165\u6570\u636e\u5e93\u3002<\/h1>\n<p>\u53ef\u4ee5\u53c2\u8003Django\u6559\u7a0b\u4ee5\u83b7\u53d6\u8be6\u7ec6\u4fe1\u606f\u3002<br \/>\n\u8fdb\u5165Django\u5bb9\u5668\uff0c\u5e76\u901a\u8fc7Python\u89e3\u91ca\u5668\u5411\u6570\u636e\u5e93\u8f93\u5165\u6570\u636e\u3002<\/p>\n<pre class=\"post-pre\"><code>docker exec -it django bash\r\nroot@87e83722b47a:\/app# python manage.py shell\r\n&gt;&gt;&gt; from instalikeapp.models import User, FigurePaths\r\n<\/code><\/pre>\n<p>\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u767b\u5f55\u5230 PostgreSQL \u6570\u636e\u5e93\u3002<\/p>\n<pre class=\"post-pre\"><code>psql -d myapp -U USERNAME -h localhost\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8c83913a08637a6d0c78\/82-0.png\" alt=\"Screen Shot 2021-06-24 at 13.17.23.png\" \/><\/div>\n<h1>\u989d\u5916\u5956\u52b1<\/h1>\n<h3>\u901a\u8fc7pyenv\u5b89\u88c5Python 3\u7cfb\u3002<\/h3>\n<pre class=\"post-pre\"><code><span class=\"nb\">sudo <\/span>yum <span class=\"nb\">install <\/span>git\r\ngit clone https:\/\/github.com\/yyuu\/pyenv.git ~\/.pyenv\r\n<span class=\"nb\">echo<\/span> <span class=\"s1\">'export PYENV_ROOT=\"$HOME\/.pyenv\"'<\/span> <span class=\"o\">&gt;&gt;<\/span> ~\/.bashrc\r\n<span class=\"nb\">echo<\/span> <span class=\"s1\">'export PATH=\"$PYENV_ROOT\/bin:$PATH\"'<\/span> <span class=\"o\">&gt;&gt;<\/span> ~\/.bashrc\r\n<span class=\"nb\">echo<\/span> <span class=\"s1\">'eval \"$(pyenv init --path)\"'<\/span> <span class=\"o\">&gt;&gt;<\/span> ~\/.bashrc\r\n<span class=\"nb\">echo<\/span> <span class=\"nt\">-e<\/span> <span class=\"s1\">'if command -v pyenv 1&gt;\/dev\/null 2&gt;&amp;1; then\\n  eval \"$(pyenv init -)\"\\nfi'<\/span> <span class=\"o\">&gt;&gt;<\/span> ~\/.bashrc\r\n<span class=\"nb\">source<\/span> ~\/.bashrc\r\n<span class=\"nb\">sudo <\/span>yum <span class=\"nb\">install <\/span>gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel <span class=\"nt\">-y<\/span>\r\npyenv <span class=\"nb\">install <\/span>3.8.9\r\npyenv global 3.8.9\r\n<\/code><\/pre>\n<h3>\u5c06CSS\u5e94\u7528\u5230Django\u7f51\u7ad9\u4e2d<\/h3>\n<pre class=\"post-pre\"><code><span class=\"n\">STATIC_URL<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'\/static\/'<\/span>\r\n<span class=\"n\">STATIC_ROOT<\/span> <span class=\"o\">=<\/span> <span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">path<\/span><span class=\"p\">.<\/span><span class=\"n\">join<\/span><span class=\"p\">(<\/span><span class=\"n\">BASE_DIR<\/span><span class=\"p\">,<\/span> <span class=\"s\">'static'<\/span><span class=\"p\">)<\/span> <span class=\"c1\"># add\r\n<\/span><\/code><\/pre>\n<p>\u5c06\u9759\u6001\u6587\u4ef6\u590d\u5236\u5230\u9879\u76ee\u7684\u9759\u6001\u76ee\u5f55\u4e0b\u7684static\u6587\u4ef6\u5939\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code>python manage.py collectstatic\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"n\">server<\/span> {\r\n    <span class=\"n\">listen<\/span> <span class=\"m\">80<\/span>;\r\n\r\n    <span class=\"n\">location<\/span> \/ {\r\n        <span class=\"n\">uwsgi_pass<\/span> <span class=\"n\">django<\/span>;\r\n        <span class=\"n\">include<\/span> \/<span class=\"n\">etc<\/span>\/<span class=\"n\">nginx<\/span>\/<span class=\"n\">uwsgi_params<\/span>;\r\n    }\r\n\r\n    <span class=\"n\">location<\/span> \/<span class=\"n\">static<\/span>\/ {\r\n        <span class=\"n\">root<\/span>    \/<span class=\"n\">app<\/span>\/;\r\n    }\r\n}\r\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u9996\u5148 \u6b64\u6b21\u8981\u521b\u5efa\u7684\u4e1c\u897f\u3002 \u7b79\u5907\u5de5\u4f5c &#8211; \u53ef\u4ee5\u516c\u5f00\u8bbf\u95ee\u7684\u670d\u52a1\u5668\uff08\u5728\u672c\u7bc7\u6587\u7ae0\u4e2d\u4f7f\u7528\u4e86EC2\u5b9e\u4f8b\u3002\u9009\u62e9\u7684 [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-49640","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>\u5728Docker\u73af\u5883\u4e0b\u7684Web3\u5c42\u6784\u9020~nginx\u3001django\u3001PostgreSQL\u7684\u534f\u540c\u914d\u5408~ - 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\/\u5728docker\u73af\u5883\u4e0b\u7684web3\u5c42\u6784\u9020nginx\u3001django\u3001postgresql\u7684\u534f\u540c\u914d\u5408\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u5728Docker\u73af\u5883\u4e0b\u7684Web3\u5c42\u6784\u9020~nginx\u3001django\u3001PostgreSQL\u7684\u534f\u540c\u914d\u5408~\" \/>\n<meta property=\"og:description\" content=\"\u9996\u5148 \u6b64\u6b21\u8981\u521b\u5efa\u7684\u4e1c\u897f\u3002 \u7b79\u5907\u5de5\u4f5c &#8211; \u53ef\u4ee5\u516c\u5f00\u8bbf\u95ee\u7684\u670d\u52a1\u5668\uff08\u5728\u672c\u7bc7\u6587\u7ae0\u4e2d\u4f7f\u7528\u4e86EC2\u5b9e\u4f8b\u3002\u9009\u62e9\u7684 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5728docker\u73af\u5883\u4e0b\u7684web3\u5c42\u6784\u9020nginx\u3001django\u3001postgresql\u7684\u534f\u540c\u914d\u5408\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-09-26T19:23:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T15:20:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8c83913a08637a6d0c78\/2-0.png\" \/>\n<meta name=\"author\" content=\"\u65b0, \u97f5\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u65b0, \u97f5\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 \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\/%e5%9c%a8docker%e7%8e%af%e5%a2%83%e4%b8%8b%e7%9a%84web3%e5%b1%82%e6%9e%84%e9%80%a0nginx%e3%80%81django%e3%80%81postgresql%e7%9a%84%e5%8d%8f%e5%90%8c%e9%85%8d%e5%90%88\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8docker%e7%8e%af%e5%a2%83%e4%b8%8b%e7%9a%84web3%e5%b1%82%e6%9e%84%e9%80%a0nginx%e3%80%81django%e3%80%81postgresql%e7%9a%84%e5%8d%8f%e5%90%8c%e9%85%8d%e5%90%88\/\",\"name\":\"\u5728Docker\u73af\u5883\u4e0b\u7684Web3\u5c42\u6784\u9020~nginx\u3001django\u3001PostgreSQL\u7684\u534f\u540c\u914d\u5408~ - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-09-26T19:23:30+00:00\",\"dateModified\":\"2024-04-29T15:20:34+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8docker%e7%8e%af%e5%a2%83%e4%b8%8b%e7%9a%84web3%e5%b1%82%e6%9e%84%e9%80%a0nginx%e3%80%81django%e3%80%81postgresql%e7%9a%84%e5%8d%8f%e5%90%8c%e9%85%8d%e5%90%88\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8docker%e7%8e%af%e5%a2%83%e4%b8%8b%e7%9a%84web3%e5%b1%82%e6%9e%84%e9%80%a0nginx%e3%80%81django%e3%80%81postgresql%e7%9a%84%e5%8d%8f%e5%90%8c%e9%85%8d%e5%90%88\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8docker%e7%8e%af%e5%a2%83%e4%b8%8b%e7%9a%84web3%e5%b1%82%e6%9e%84%e9%80%a0nginx%e3%80%81django%e3%80%81postgresql%e7%9a%84%e5%8d%8f%e5%90%8c%e9%85%8d%e5%90%88\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u5728Docker\u73af\u5883\u4e0b\u7684Web3\u5c42\u6784\u9020~nginx\u3001django\u3001PostgreSQL\u7684\u534f\u540c\u914d\u5408~\"}]},{\"@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\/4ba4019495123db3038fd0809e6959c9\",\"name\":\"\u65b0, \u97f5\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g\",\"caption\":\"\u65b0, \u97f5\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunxin\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8docker%e7%8e%af%e5%a2%83%e4%b8%8b%e7%9a%84web3%e5%b1%82%e6%9e%84%e9%80%a0nginx%e3%80%81django%e3%80%81postgresql%e7%9a%84%e5%8d%8f%e5%90%8c%e9%85%8d%e5%90%88\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u5728Docker\u73af\u5883\u4e0b\u7684Web3\u5c42\u6784\u9020~nginx\u3001django\u3001PostgreSQL\u7684\u534f\u540c\u914d\u5408~ - 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\/\u5728docker\u73af\u5883\u4e0b\u7684web3\u5c42\u6784\u9020nginx\u3001django\u3001postgresql\u7684\u534f\u540c\u914d\u5408\/","og_locale":"zh_CN","og_type":"article","og_title":"\u5728Docker\u73af\u5883\u4e0b\u7684Web3\u5c42\u6784\u9020~nginx\u3001django\u3001PostgreSQL\u7684\u534f\u540c\u914d\u5408~","og_description":"\u9996\u5148 \u6b64\u6b21\u8981\u521b\u5efa\u7684\u4e1c\u897f\u3002 \u7b79\u5907\u5de5\u4f5c &#8211; \u53ef\u4ee5\u516c\u5f00\u8bbf\u95ee\u7684\u670d\u52a1\u5668\uff08\u5728\u672c\u7bc7\u6587\u7ae0\u4e2d\u4f7f\u7528\u4e86EC2\u5b9e\u4f8b\u3002\u9009\u62e9\u7684 [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u5728docker\u73af\u5883\u4e0b\u7684web3\u5c42\u6784\u9020nginx\u3001django\u3001postgresql\u7684\u534f\u540c\u914d\u5408\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-09-26T19:23:30+00:00","article_modified_time":"2024-04-29T15:20:34+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8c83913a08637a6d0c78\/2-0.png"}],"author":"\u65b0, \u97f5","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u65b0, \u97f5","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"5 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8docker%e7%8e%af%e5%a2%83%e4%b8%8b%e7%9a%84web3%e5%b1%82%e6%9e%84%e9%80%a0nginx%e3%80%81django%e3%80%81postgresql%e7%9a%84%e5%8d%8f%e5%90%8c%e9%85%8d%e5%90%88\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8docker%e7%8e%af%e5%a2%83%e4%b8%8b%e7%9a%84web3%e5%b1%82%e6%9e%84%e9%80%a0nginx%e3%80%81django%e3%80%81postgresql%e7%9a%84%e5%8d%8f%e5%90%8c%e9%85%8d%e5%90%88\/","name":"\u5728Docker\u73af\u5883\u4e0b\u7684Web3\u5c42\u6784\u9020~nginx\u3001django\u3001PostgreSQL\u7684\u534f\u540c\u914d\u5408~ - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-09-26T19:23:30+00:00","dateModified":"2024-04-29T15:20:34+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8docker%e7%8e%af%e5%a2%83%e4%b8%8b%e7%9a%84web3%e5%b1%82%e6%9e%84%e9%80%a0nginx%e3%80%81django%e3%80%81postgresql%e7%9a%84%e5%8d%8f%e5%90%8c%e9%85%8d%e5%90%88\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8docker%e7%8e%af%e5%a2%83%e4%b8%8b%e7%9a%84web3%e5%b1%82%e6%9e%84%e9%80%a0nginx%e3%80%81django%e3%80%81postgresql%e7%9a%84%e5%8d%8f%e5%90%8c%e9%85%8d%e5%90%88\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8docker%e7%8e%af%e5%a2%83%e4%b8%8b%e7%9a%84web3%e5%b1%82%e6%9e%84%e9%80%a0nginx%e3%80%81django%e3%80%81postgresql%e7%9a%84%e5%8d%8f%e5%90%8c%e9%85%8d%e5%90%88\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u5728Docker\u73af\u5883\u4e0b\u7684Web3\u5c42\u6784\u9020~nginx\u3001django\u3001PostgreSQL\u7684\u534f\u540c\u914d\u5408~"}]},{"@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\/4ba4019495123db3038fd0809e6959c9","name":"\u65b0, \u97f5","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g","caption":"\u65b0, \u97f5"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunxin\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8docker%e7%8e%af%e5%a2%83%e4%b8%8b%e7%9a%84web3%e5%b1%82%e6%9e%84%e9%80%a0nginx%e3%80%81django%e3%80%81postgresql%e7%9a%84%e5%8d%8f%e5%90%8c%e9%85%8d%e5%90%88\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49640","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\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=49640"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49640\/revisions"}],"predecessor-version":[{"id":88256,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49640\/revisions\/88256"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=49640"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=49640"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=49640"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}