Python+Flask+Docker使ってブラウザでサイト見れるようにする


これは備忘録なので、ほぼコマンドだけ羅列する感じの記事です。
調べながらやってると、一つの記事で何回か躓いたので、
うまくいった流れを書いておきます。

誰かの役に立てばそんなにうれしいことはないです。

本当はPython+Flask+ApacheでWSGI使ってやりたいんですけど、
まずはその手前までの分をメモしておきます。

Dockerインストール(公式サイト)

公式サイトからダウンロード
今回はWindowsマシンでやってます。
https://docs.docker.com/engine/installation/
次のコマンドインストール成功したか確認

powershell
$ docker --version

CentOS7をコンテナ起動(PowerShell)

以下のページからOSイメージを探して使います。
https://hub.docker.com/_/centos/

powershell
# docker pull [イメージ名]:[タグ名]
$docker pull centos:centos7
# インストールされたか確認
$docker images

ポートつないでコンテナ開く(PowerShell)

ここがかなりの躓きポイントでした。
あとからApache使うつもりだったのですが

powershell
docker run -d --privileged --name docker_test -it -p 5000:5000 centos:centos7 /sbin/init

docker exec -it docker_test /bin/bash
# LinuxCUI 終了コマンド
> exit

今後再起動するとき用に--name docker_testでコンテナに名前を付けてます。

ポートをつなぐ

Linux上でFlaskをLocalhostの5000番ポートで実行したとき
それをWindowsマシンのLocalhost5000番ポートにつなぐみたいな感じ?
-it -p 5000:5000
-p [Windowsマシン側]:[コンテナ側]
仕事で急を要したから今回挑戦しているのですが、このあたりの知識かなり弱いので
もっと勉強しないといけないですね。。。
正確な表現あればコメントで教えてください~~

特権モードでコンテナを起動

これは私がこのあと、Apacheを使いたかったのでやっています。
systemctlがcentos上で使えなかったので調べてみたところ
最初にコンテナを作成するときに以下のように
--privileged, /sbin/init
つけないといけないっぽかったです。
-dはなくてもいいかも -itの代わりに使うみたいなことを
書いていたところもあったので

再起動

先ほど終了したコンテナを再起動してログインします。

powershell
docker start -a -i [コンテナ名(docker_test)]

Pythonセットアップ

CentOS
$ yum install python3
$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
$ python3 get-pip.py
$ pip3 install flask
$ pip3 install ipaddress
CentOS
 $ yum install wget
yum install gcc
yum --setopt=group_package_types=mandatory,default,optional groupinstall "Development Tools"
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel python-devel libffi-devel
cd /usr/local/src
wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz
$ tar xvfz Python-3.7.2.tgz
   $ cd Python-3.7.2
  ./configure -prefix=/usr/local/
  ./configure --enable-shared
make altinstall

又、シンボリック・リンクにの作成例は以下の通り。

$ ln -s /usr/local/bin/python3.7 /usr/bin/python3

$ ln -s /usr/local/lib/libpython3.7m.so.1.0 /lib64/

$ ln -s /usr/local/bin/pip3.7 /usr/bin/pip3.7

ソースファイルの転送

WindowsマシンからDockerのコンテナ上に
ファイルをコピーする方法です。

powershell
# docker cp [Windows上のソースパス] [コンテナ名]:[コピー先パス]
docker cp .\src\ docker_test:/var/lib/src
CentOS
# Python実行
$ cd /var/lib/src
$ python3 main.py

以下ほんとのメモ

httpdインストール
$ docker run -d --privileged --name docker_test centos /sbin/init
$ docker exec -it docker_test /bin/bash
yum install -y httpd httpd-devel
# yum install -y httpd
# systemctl start httpd
# systemctl status httpd
WSGIインストール
yum install mod_wsgi
pip3 install mod_wsgi
find / -name mod_wsgi*so  
cd /etc/httpd/conf.d
vi wsgi.conf
systemctl restart httpd.service
chmod +x /var/lib/app/app.wsgi 
# wsgi.conf
LoadModule wsgi_module /usr/local/lib/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so


WSGIDaemonProcess myapp user=apache group=apache
WSGIProcessGroup myapp
WSGISocketPrefix /var/run/wsgi
WSGIScriptAlias /app /var/lib/app/yourapplication.wsgi

<Directory /var/lib/app/>

  Options ExecCGI MultiViews Indexes
  MultiViewsMatch Handlers

  AddHandler wsgi-script .py
  AddHandler wsgi-script .wsgi

  DirectoryIndex index.html index.py app.wsgi

  Order allow,deny
  Allow from all

</Directory>