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

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

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

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


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

```shell:powershell
$ docker --version
```

## CentOS7をコンテナ起動(PowerShell)
以下のページからOSイメージを探して使います。
https://hub.docker.com/_/centos/

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

## ポートつないでコンテナ開く(PowerShell)
ここがかなりの躓きポイントでした。
あとからApache使うつもりだったのですが

```shell: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の代わりに使うみたいなことを
書いていたところもあったので

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

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

## Pythonセットアップ

```terminal: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
```

```shell: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のコンテナ上に
ファイルをコピーする方法です。

```shell:powershell
# docker cp [Windows上のソースパス] [コンテナ名]:[コピー先パス]
docker cp .\src\ docker_test:/var/lib/src
```

```terminal: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>
```