{"id":365,"date":"2022-08-26T01:52:29","date_gmt":"2022-08-25T16:52:29","guid":{"rendered":"https:\/\/www.kd2.jp\/memo3\/?p=365"},"modified":"2023-01-16T09:19:03","modified_gmt":"2023-01-16T00:19:03","slug":"docker-flask-apache","status":"publish","type":"post","link":"https:\/\/www.kd2.jp\/memo3\/?p=365","title":{"rendered":"Docker + Flask + Apache"},"content":{"rendered":"<p>Python\u306e\u516c\u5f0f\u30a4\u30e1\u30fc\u30b8\u306bApache\u3068Flask\u3092\u5165\u308c\u3066wsgi\u3067\u9023\u643a\u3059\u308b\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u69cb\u6210<br \/>\n\uff5c- app\/<br \/>\n\uff5c \u251c app.wsgi<br \/>\n\uff5c \u2514 hello.py<br \/>\n\u251c conf\/<br \/>\n\uff5c \u2514 000-default.conf<br \/>\n\u251c Dockerfile<br \/>\n\u2514 docker-compose.yml<\/p>\n<p>&nbsp;<\/p>\n<p>Dockerfile<\/p>\n<div class=\"wp-block-codemirror-blocks code-block\">\n<pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;null&quot;,&quot;mime&quot;:&quot;text\/plain&quot;,&quot;theme&quot;:&quot;eclipse&quot;,&quot;lineNumbers&quot;:true,&quot;lineWrapping&quot;:false,&quot;styleActiveLine&quot;:false,&quot;readOnly&quot;:true,&quot;align&quot;:&quot;&quot;}\">FROM python:3\r\nUSER root\r\n\r\nWORKDIR \/app\r\n\r\nRUN apt-get update\r\nRUN apt-get -y install locales &amp;&amp; \\\r\n    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8\r\nENV LANG ja_JP.UTF-8\r\nENV LANGUAGE jp_JP:ja\r\nENV LC_ALL ja_JP.UTF-8\r\nENV TZ JST-9\r\nENV TERM xterm\r\n\r\nRUN apt-get install -y vim less\r\nRUN apt-get install -y apache2\r\nRUN apt-get install -y apache2-dev\r\n\r\nRUN pip install --upgrade pip\r\nRUN pip install --upgrade setuptools\r\nRUN pip install --upgrade Flask\r\nRUN pip install --upgrade mod_wsgi\r\n\r\nCMD [\"apachectl\", \"-D\", \"FOREGROUND\"]<\/pre>\n<\/div>\n<p>docker-compose.yml<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;yaml&quot;,&quot;mime&quot;:&quot;text\/yaml&quot;,&quot;theme&quot;:&quot;eclipse&quot;,&quot;lineNumbers&quot;:true,&quot;lineWrapping&quot;:false,&quot;styleActiveLine&quot;:false,&quot;readOnly&quot;:true,&quot;align&quot;:&quot;&quot;}\">version: '3'\r\nservices:\r\n  python3:\r\n    build: .\r\n    container_name: flask_apache_test\r\n    hostname: flask_apache_test\r\n    tty: true\r\n    volumes:\r\n      - .\/app:\/app\r\n      - .\/conf\/000-default.conf:\/etc\/apache2\/sites-available\/000-default.conf\r\n    ports:\r\n      - 18080:80<\/pre>\n<\/div>\n<p>conf\/000-default.conf<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;null&quot;,&quot;mime&quot;:&quot;text\/plain&quot;,&quot;theme&quot;:&quot;eclipse&quot;,&quot;lineNumbers&quot;:true,&quot;lineWrapping&quot;:false,&quot;styleActiveLine&quot;:false,&quot;readOnly&quot;:true,&quot;align&quot;:&quot;&quot;}\">&lt;VirtualHost *:80&gt;\r\n    ServerAdmin webmaster@localhost\r\n    DocumentRoot \/app\r\n\r\n    ErrorLog ${APACHE_LOG_DIR}\/error.log\r\n    CustomLog ${APACHE_LOG_DIR}\/acceess.log combined\r\n\r\n    # Python\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u306b\u5408\u308f\u305b\u3066LoadModule\u3092\u5909\u66f4\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u3002\r\n    # \u30d0\u30fc\u30b8\u30e7\u30f3\u304c\u308f\u304b\u3089\u306a\u3044\u5834\u5408\u306f\u3001\u4ee5\u4e0b\u306e\u884c\u3092\u30b3\u30e1\u30f3\u30c8\u30a2\u30a6\u30c8\u3057\u3066\u30b3\u30f3\u30c6\u30ca\u3092\u8d77\u52d5\u3057\u3001\u30b3\u30f3\u30bd\u30fc\u30eb\u3067\u30ed\u30b0\u30a4\u30f3\u3057\u3066\u30d1\u30b9\u3092\u78ba\u8a8d\u3059\u308b\u3002\r\n    # docker-compose exec ${container_id} bash\r\n    #LoadModule wsgi_module \/usr\/local\/lib\/python3.10\/site-packages\/mod_wsgi\/server\/mod_wsgi-py310.cpython-310-x86_64-linux-gnu.so\r\n    LoadModule wsgi_module \/usr\/local\/lib\/python3.11\/site-packages\/mod_wsgi\/server\/mod_wsgi-py311.cpython-311-x86_64-linux-gnu.so\r\n    WSGIDaemonProcess myapp processes=1 threads=5 python-path=\"\/usr\/local\/bin\/python3\"\r\n    WSGIScriptAlias \/ \/app\/app.wsgi\r\n\r\n    &lt;Directory \/app&gt;\r\n        WSGIProcessGroup myapp\r\n        WSGIApplicationGroup %{GLOBAL}\r\n        Require all granted\r\n    &lt;\/Directory&gt;\r\n\r\n&lt;\/VirtualHost&gt;<\/pre>\n<\/div>\n<p>app\/app.wsgi<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;python&quot;,&quot;mime&quot;:&quot;text\/x-python&quot;,&quot;theme&quot;:&quot;eclipse&quot;,&quot;lineNumbers&quot;:true,&quot;lineWrapping&quot;:false,&quot;styleActiveLine&quot;:false,&quot;readOnly&quot;:true,&quot;align&quot;:&quot;&quot;}\">import sys\r\nsys.path.insert(0, '\/app')\r\n\r\nfrom hello import app as application<\/pre>\n<\/div>\n<p>app\/hello.py<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;python&quot;,&quot;mime&quot;:&quot;text\/x-python&quot;,&quot;theme&quot;:&quot;eclipse&quot;,&quot;lineNumbers&quot;:true,&quot;lineWrapping&quot;:false,&quot;styleActiveLine&quot;:false,&quot;readOnly&quot;:true,&quot;align&quot;:&quot;&quot;}\">from flask import Flask\r\napp = Flask(__name__)\r\n\r\n@app.route('\/')\r\ndef index():\r\n    return 'Hello World!'\r\n\r\nif __name__ == '__main__':\r\n    app.run(debug=True)<\/pre>\n<\/div>\n<p>\u66f4\u65b0\u3092\u53cd\u6620\u3059\u308b\u3068\u304d\u306fwsgi\u30d5\u30a1\u30a4\u30eb\u306e\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u3092\u66f4\u65b0\u3059\u308b\u3002\u300ctouch app.wsgi\u300d<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Python\u306e\u516c\u5f0f\u30a4\u30e1\u30fc\u30b8\u306bApache\u3068Flask\u3092\u5165\u308c\u3066wsgi\u3067\u9023\u643a\u3059\u308b\u3002 &nbsp; \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u69cb\u6210 \uff5c- app\/ \uff5c \u251c app.wsgi \uff5c \u2514 hello.py \u251c conf\/ \uff5c \u2514 000-def&hellip; <a class=\"more-link\" href=\"https:\/\/www.kd2.jp\/memo3\/?p=365\">\u7d9a\u304d\u3092\u8aad\u3080 <span class=\"screen-reader-text\">Docker + Flask + Apache<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[18,4],"tags":[],"_links":{"self":[{"href":"https:\/\/www.kd2.jp\/memo3\/index.php?rest_route=\/wp\/v2\/posts\/365"}],"collection":[{"href":"https:\/\/www.kd2.jp\/memo3\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kd2.jp\/memo3\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kd2.jp\/memo3\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kd2.jp\/memo3\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=365"}],"version-history":[{"count":18,"href":"https:\/\/www.kd2.jp\/memo3\/index.php?rest_route=\/wp\/v2\/posts\/365\/revisions"}],"predecessor-version":[{"id":384,"href":"https:\/\/www.kd2.jp\/memo3\/index.php?rest_route=\/wp\/v2\/posts\/365\/revisions\/384"}],"wp:attachment":[{"href":"https:\/\/www.kd2.jp\/memo3\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=365"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kd2.jp\/memo3\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=365"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kd2.jp\/memo3\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}