dockerを使ってPython+django+nginx+MySQL環境を構築

#Dockerを使ってWebシステム開発環境を構築

#Dockerを使う理由
###自身での環境構築に苦戦
別記事で環境構築について投稿しています。
その時に非常に苦戦しました。(というか敗北しました…)

「今回はDockerを使って環境構築をするのも手。」

ということで、自身での環境構築はまた理解が深まった際に、もう1度リベンジしようと思います。

##なぜDockerなのか？
まずDockerについて理解を深めます。
以下の記事を参照しました。
https://koni.hateblo.jp/entry/2017/01/28/150522
https://knowledge.sakura.ad.jp/13265/
https://www.kagoya.jp/howto/rentalserver/container-03/

##Docker-composeとは
Docker compose とは、複数のコンテナから成るサービスを構築・実行する手順を自動的にし、管理を容易にする機能です。
Docker compose では、compose ファイルを用意してコマンドを1 回実行することで、そのファイルから設定を読み込んですべてのコンテナサービスを起動することができます。

参照
https://qiita.com/TsutomuNakamura/items/7e90e5efb36601c5bc8a

```
# yum install git
```

```
#~~~の部分は自身が構築する環境に合わせて、githubからコピー
# git clone https://github.com/~~~~~~

Cloning into 'docker-django'...
remote: Enumerating objects: 315, done.
remote: Counting objects: 100% (315/315), done.
remote: Compressing objects: 100% (96/96), done.
remote: Total 315 (delta 214), reused 308 (delta 211), pack-reused 0
Receiving objects: 100% (315/315), 5.81 MiB | 1.48 MiB/s, done.
Resolving deltas: 100% (214/214), done.
```

ダウンロード完了後の階層は以下のようになっています。

```
# ll
total 0
drwxr-xr-x. 8 root root 99 Dec 17 07:36 docker-django
```
##Dockerのインストール
インストールに関しては以下の記事を参考にしました。
https://zenn.dev/ymasaoka/articles/install-docker-centos-7

Dockerのバージョンを確認します。

```
# docker --version
-bash: docker: command not found
```

当然インストールされていないので、インストールしていきます。

公式サイトではCentOSのメンテナンスバージョンのみサポートと記載されています。
https://docs.docker.com/engine/install/centos/

そこでまずCentOSを最新の状態にします。
5分ほど時間がかかります。

```
# yum update
```

###公式レポジトリのインストール

```
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```

###Docker CEのインストール

```
yum install -y docker-ce docker-ce-cli containerd.io
```

###バージョン確認

```
# docker --version
Docker version 20.10.1, build 831ebea
```

###Dockerの起動

```
# systemctl start docker
```

###自動起動設定

```
# systemctl enable docker
```












###Docker-composeのインストール
以下の公式サイトを参考にしました。
https://docs.docker.com/compose/install/

```
# sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   651  100   651    0     0   4672      0 --:--:-- --:--:-- --:--:--  4683
100 11.6M  100 11.6M    0     0  1663k      0  0:00:07  0:00:07 --:--:-- 1983k
```

###Docker-composeインストールの確認

```
# docker-compose --version
docker-compose version 1.27.4, build 40524192
```

###Docker-composeの権限
まずDocker-compose upを行ったところ、権限に関するエラーが発生しました

```
# docker-compose up
-bash: /usr/local/bin/docker-compose: Permission denied
```

権限を付与します。
+xで実行権限を付与します。
権限の付与については以下の記事を参考にしました。
https://qiita.com/ntkgcj/items/6450e25c5564ccaa1b95

```
sudo chmod +x /usr/local/bin/docker-compose
```

###Docker-composeの実行

```
# docker-compose up
```
【メモ】
最後に-dをつけるとバックグラウンドで起動します。


docker-composeでコンテナを起動します。

実行結果の最後の方のみ記載。
(エラーは出ていないはず？？次回作業時確認！)

```
Digest: sha256:b1d09e9718890e6ebbbd2bc319ef1611559e30ce1b6f56b2e3b479d9da51dc35
Status: Downloaded newer image for nginx:1.13
Creating docker-django_db_1 ... done
Creating docker-django_python_1 ... done
Creating docker-django_nginx_1  ... done
Attaching to docker-django_db_1, docker-django_python_1, docker-django_nginx_1
db_1      | 2020-12-17 08:26:22+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.32-1debian10 started.
db_1      | 2020-12-17 08:26:23+09:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
db_1      | 2020-12-17 08:26:23+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.32-1debian10 started.
db_1      | 2020-12-16T23:26:23.591372Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
db_1      | 2020-12-16T23:26:23.598365Z 0 [Note] mysqld (mysqld 5.7.32) starting as process 1 ...
db_1      | 2020-12-16T23:26:23.601759Z 0 [Note] InnoDB: PUNCH HOLE support available
db_1      | 2020-12-16T23:26:23.601790Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
db_1      | 2020-12-16T23:26:23.601798Z 0 [Note] InnoDB: Uses event mutexes
db_1      | 2020-12-16T23:26:23.601806Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
db_1      | 2020-12-16T23:26:23.601814Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
db_1      | 2020-12-16T23:26:23.601824Z 0 [Note] InnoDB: Using Linux native AIO
db_1      | 2020-12-16T23:26:23.602178Z 0 [Note] InnoDB: Number of pools: 1
db_1      | 2020-12-16T23:26:23.602323Z 0 [Note] InnoDB: Using CPU crc32 instructions
db_1      | 2020-12-16T23:26:23.613511Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
db_1      | 2020-12-16T23:26:23.626984Z 0 [Note] InnoDB: Completed initialization of buffer pool
db_1      | 2020-12-16T23:26:23.629335Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
db_1      | 2020-12-16T23:26:23.651521Z 0 [Note] InnoDB: Highest supported file format is Barracuda.
db_1      | 2020-12-16T23:26:23.750055Z 0 [Note] InnoDB: Creating shared tablespace for temporary tables
db_1      | 2020-12-16T23:26:23.760013Z 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
db_1      | 2020-12-16T23:26:23.819358Z 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
db_1      | 2020-12-16T23:26:23.820262Z 0 [Note] InnoDB: 96 redo rollback segment(s) found. 96 redo rollback segment(s) are active.
db_1      | 2020-12-16T23:26:23.820287Z 0 [Note] InnoDB: 32 non-redo rollback segment(s) are active.
db_1      | 2020-12-16T23:26:23.820537Z 0 [Note] InnoDB: Waiting for purge to start
db_1      | 2020-12-16T23:26:23.871301Z 0 [Note] InnoDB: 5.7.32 started; log sequence number 13003109
db_1      | 2020-12-16T23:26:23.873814Z 0 [Note] Plugin 'FEDERATED' is disabled.
db_1      | 2020-12-16T23:26:23.874376Z 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
db_1      | 2020-12-16T23:26:23.950993Z 0 [Note] Found ca.pem, server-cert.pem and server-key.pem in data directory. Trying to enable SSL support using them.
db_1      | 2020-12-16T23:26:23.951023Z 0 [Note] Skipping generation of SSL certificates as certificate files are present in data directory.
db_1      | 2020-12-16T23:26:23.963368Z 0 [Warning] CA certificate ca.pem is self signed.
db_1      | 2020-12-16T23:26:23.963432Z 0 [Note] Skipping generation of RSA key pair as key files are present in data directory.
db_1      | 2020-12-16T23:26:23.974071Z 0 [Note] Server hostname (bind-address): '*'; port: 3306
db_1      | 2020-12-16T23:26:23.974182Z 0 [Note] IPv6 is available.
db_1      | 2020-12-16T23:26:23.974204Z 0 [Note]   - '::' resolves to '::';
db_1      | 2020-12-16T23:26:23.974242Z 0 [Note] Server socket created on IP: '::'.
db_1      | 2020-12-16T23:26:24.040014Z 0 [Warning] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
db_1      | 2020-12-16T23:26:24.067064Z 0 [Note] InnoDB: Buffer pool(s) load completed at 201217  8:26:24
db_1      | 2020-12-16T23:26:24.350990Z 0 [Note] Event Scheduler: Loaded 0 events
db_1      | 2020-12-16T23:26:24.351267Z 0 [Note] mysqld: ready for connections.
db_1      | Version: '5.7.32'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)
```

###docker-compose.ymlの中身

```
version: '3'
services:
    nginx:
       image: nginx:1.13
       ports:
          - "80:80"
       volumes:
          - ./nginx/conf:/etc/nginx/conf.d
       depends_on:
          - python
    db:
        image: mysql:5.7
        ports:
          - "3306:3306"
        environment:
          MYSQL_ROOT_PASSWORD: mysql
          MYSQL_DATABASE: mysql
          MYSQL_USER: mysql
          MYSQL_PASSWORD: mysql
          TZ: 'Asia/Tokyo'
        volumes:
          - ./mysql:/var/lib/mysql
          - ./sql:/docker-entrypoint-initdb.d
    python:
        build: ./python
        command: uwsgi --socket :8001 --module app.wsgi --py-autoreload 1 --logt
o /tmp/mylog.log
        volumes:
           - ./src:/code
           - ./static:/static
        expose:
           - "8001"
        depends_on:
           - db
```

###ブラウザからのアクセス

docker-composeで起動した後、webからアクセスしてみます。
http://[IPアドレス]
http://[IPアドレス]:80

アクセス画面(上手くいっていない？)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764778/95595d1b-170b-57c0-49a4-5bb6a5bbdc13.png)

アクセスするとTera Term上でこのように反応がありました。

```
nginx_1   | 103.5.140.159 - - [17/Dec/2020:22:45:03 +0000] "GET / HTTP/1.1" 500 32 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" "-"
nginx_1   | 103.5.140.159 - - [17/Dec/2020:22:45:04 +0000] "GET /favicon.ico HTTP/1.1" 500 32 "http://140.227.75.4/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" "-"
```

ALLOWD HOSTを設定していませんでした。

./src/mysite/settings.pyの

```
ALLOWED_HOSTS = ['[IPアドレス]',]
```

まだアクセスできない。
docker-ps
を使って状態を見てみます。

```
# docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS                               NAMES
f4ef866fe8e8   nginx:1.13             "nginx -g 'daemon of…"   24 hours ago     Up 3 minutes    0.0.0.0:80->80/tcp                  docker-django_nginx_1
6c7057c4c1fd   docker-django_python   "uwsgi --socket :800…"   24 hours ago     Up 3 minutes    8001/tcp                            docker-django_python_1
ba3f3cfef45d   mysql:5.7              "docker-entrypoint.s…"   24 hours ago     Up 3 minutes    0.0.0.0:3306->3306/tcp, 33060/tcp   docker-django_db_1
[root@qsbbvu1t docker-django]#
```

STATUSがupなので立ち上がってはいそうです。

##Dockerのマイグレーション
マイグレーション作業を行っていませんでした。
以下のサイトを参考に作業を行います。
https://qiita.com/kenkono/items/6221ad12670d1ae8b1dd#django%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E5%AE%9F%E8%A1%8C

以下のエラー発生。
MySQL関連ですね。
pymysqlがdjangoの新バージョンにまだ対応していないとのこと。

```
# docker-compose run python ./manage.py makemigrations

raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.8.0.
```

同じエラー発生。
調べたところpymysqlはそもそもdjango2.2に対応していないとのこと。

解決するには、
①pymysqlの代わりにmysqlclientを入れる(django推奨)
②djangoのバージョンを2.2から2.1に下げる

###sqlclientのインストール
djangoのバージョンを下げることはセキュリティ上適切ではありません。
そこで、今回はpymysqlの代わりにmysqlclientを使用することにしました。

エラーの中にはmysqlclientのバージョン1.3.13以上が必要と記載されていました。
そこで、requirements.txtの内容を以下にかきかえました。


```
# vi requirements.txt

Django==2.2.13
uwsgi==2.0.17
mysqlclient==1.3.13
```

###マイグレーション

マイグレーションとは以下の意味です。
プログラムやデータ、OSなどの環境やプラットフォームを移行、変換すること。

manage.pyが存在するディレクトリまで移動して以下を実行。

```
[root@qsbbvu1t src]# docker-compose run python ./manage.py makemigrations
```

以下、エラー発生。

```
Creating docker-django_python_run ... done
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 323, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 361, in execute
    self.check()
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 390, in check
    include_deployment_checks=include_deployment_checks,
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 377, in _run_checks
    return checks.run_checks(**kwargs)
  File "/usr/local/lib/python3.6/site-packages/django/core/checks/registry.py", line 72, in run_checks
    new_errors = check(app_configs=app_configs)
  File "/usr/local/lib/python3.6/site-packages/django/core/checks/urls.py", line 10, in check_url_config
    if getattr(settings, 'ROOT_URLCONF', None):
  File "/usr/local/lib/python3.6/site-packages/django/conf/__init__.py", line 79, in __getattr__
    self._setup(name)
  File "/usr/local/lib/python3.6/site-packages/django/conf/__init__.py", line 66, in _setup
    self._wrapped = Settings(settings_module)
  File "/usr/local/lib/python3.6/site-packages/django/conf/__init__.py", line 157, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/usr/local/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/code/app/settings.py", line 14, in <module>
    import pymysql
ModuleNotFoundError: No module named 'pymysql'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 336, in run_from_argv
    connections.close_all()
  File "/usr/local/lib/python3.6/site-packages/django/db/utils.py", line 219, in close_all
    for alias in self:
  File "/usr/local/lib/python3.6/site-packages/django/db/utils.py", line 213, in __iter__
    return iter(self.databases)
  File "/usr/local/lib/python3.6/site-packages/django/utils/functional.py", line 80, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/usr/local/lib/python3.6/site-packages/django/db/utils.py", line 147, in databases
    self._databases = settings.DATABASES
  File "/usr/local/lib/python3.6/site-packages/django/conf/__init__.py", line 79, in __getattr__
    self._setup(name)
  File "/usr/local/lib/python3.6/site-packages/django/conf/__init__.py", line 66, in _setup
    self._wrapped = Settings(settings_module)
  File "/usr/local/lib/python3.6/site-packages/django/conf/__init__.py", line 157, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/usr/local/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/code/app/settings.py", line 14, in <module>
    import pymysql
ModuleNotFoundError: No module named 'pymysql'
```

pymysqlの記述があるところがエラーの原因みたいです。
mysqlclientに書き換えていきます。

```
# vi settings.py
```

pymysqlをコメントアウトし、mysqlclientのimportを追記しました。

```
import os
import mysqlclient
# import pymysql

# connect mysql
#pymysql.install_as_MySQLdb()
mysqlclient.install_as_MySQLdb()
```

もう1回マイグレーションしてみます。

エラー発生。

```
# docker-compose run python ./manage.py makemigrations
Creating docker-django_python_run ... done
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 323, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 361, in execute
    self.check()
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 390, in check
    include_deployment_checks=include_deployment_checks,
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 377, in _run_checks
    return checks.run_checks(**kwargs)
  File "/usr/local/lib/python3.6/site-packages/django/core/checks/registry.py", line 72, in run_checks
    new_errors = check(app_configs=app_configs)
  File "/usr/local/lib/python3.6/site-packages/django/core/checks/urls.py", line 10, in check_url_config
    if getattr(settings, 'ROOT_URLCONF', None):
  File "/usr/local/lib/python3.6/site-packages/django/conf/__init__.py", line 79, in __getattr__
    self._setup(name)
  File "/usr/local/lib/python3.6/site-packages/django/conf/__init__.py", line 66, in _setup
    self._wrapped = Settings(settings_module)
  File "/usr/local/lib/python3.6/site-packages/django/conf/__init__.py", line 157, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/usr/local/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/code/app/settings.py", line 14, in <module>
    import mysqlclient
ModuleNotFoundError: No module named 'mysqlclient'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 336, in run_from_argv
    connections.close_all()
  File "/usr/local/lib/python3.6/site-packages/django/db/utils.py", line 219, in close_all
    for alias in self:
  File "/usr/local/lib/python3.6/site-packages/django/db/utils.py", line 213, in __iter__
    return iter(self.databases)
  File "/usr/local/lib/python3.6/site-packages/django/utils/functional.py", line 80, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/usr/local/lib/python3.6/site-packages/django/db/utils.py", line 147, in databases
    self._databases = settings.DATABASES
  File "/usr/local/lib/python3.6/site-packages/django/conf/__init__.py", line 79, in __getattr__
    self._setup(name)
  File "/usr/local/lib/python3.6/site-packages/django/conf/__init__.py", line 66, in _setup
    self._wrapped = Settings(settings_module)
  File "/usr/local/lib/python3.6/site-packages/django/conf/__init__.py", line 157, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/usr/local/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/code/app/settings.py", line 14, in <module>
    import mysqlclient
ModuleNotFoundError: No module named 'mysqlclient'
```

んー。上手くいかない。
調べていたところ、settings.pyにimport mysqlclientを記載しなくてよいような情報を発見。
https://zerofromlight.com/blogs/detail/29/

試してみます。

```
# vi settings.py
```

```
import os
#import mysqlclient
# import pymysql

# connect mysql
#pymysql.install_as_MySQLdb()
#mysqlclient.install_as_MySQLdb()
```

```
# docker-compose run python ./manage.py makemigrations
Creating docker-django_python_run ... done
No changes detected
```

上手くいったのか？
マイグレーションを実行。

```
# docker-compose run python ./manage.py migrate
Creating docker-django_python_run ... done
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
```

お、行けたっぽい気がする。

##dockerコンテナの立ち上げ

```
# docker-compose build
db uses an image, skipping
nginx uses an image, skipping
Building python
Step 1/7 : FROM python:3.6
 ---> 4a03e5e8adde
Step 2/7 : ENV PYTHONUNBUFFERED 1
 ---> Using cache
 ---> 8c1a88d570f3
Step 3/7 : RUN mkdir /code
 ---> Using cache
 ---> 7f012356f716
Step 4/7 : WORKDIR /code
 ---> Using cache
 ---> 647e9247446c
Step 5/7 : ADD requirements.txt /code/
 ---> Using cache
 ---> 31fc46edeab4
Step 6/7 : RUN pip install -r requirements.txt
 ---> Using cache
 ---> ec091df899d8
Step 7/7 : ADD . /code/
 ---> Using cache
 ---> ff87162e0f0d

Successfully built ff87162e0f0d
Successfully tagged docker-django_python:latest
```

```
# docker-compose up
```

特にエラーは出ず、以下のところでストップ。
(コマンドは入力できない状態)

```
db_1      | Version: '5.7.32'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)
```

コマンド入力できないので、バックグラウンドで立ち上げます。

```
# docker-compose up -d
Starting docker-django_db_1 ... done
Starting docker-django_python_1 ... done
Starting docker-django_nginx_1  ... done
```

起動できているかの確認。
STATUSがUpなので大丈夫っぽいです。

```
# docker-compose ps
         Name                   Command           State           Ports
--------------------------------------------------------------------------------
docker-django_db_1       docker-entrypoint.sh     Up      0.0.0.0:3306->3306/tcp
                         mysql ...                        , 33060/tcp
docker-django_nginx_1    nginx -g daemon off;     Up      0.0.0.0:80->80/tcp
docker-django_python_1   uwsgi --socket :8001     Up      8001/tcp
                         --mod ...
```

http://[IPアドレス]:[ポート番号(自分は80)]
でwebから接続。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764778/2525ebdc-0e0c-2ed3-1f90-f3b72aec2eff.png)

やっとアクセスできました！！

##CSSの適用

管理者画面(http://[IPアドレス]/admin)に行くと、CSSが適用されていないことが確認されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764778/673081d2-a903-3774-cc4e-d8409f22d1d9.png)

CSSを適用させます。

```
# vi settings.py
```

STATIC_ROOTを追記しました。

```
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.0/howto/static-files/

STATIC_URL = '/static/'
STATIC_ROOT = '/static'
```

以下のコマンドを実行。

```
# docker-compose run python ./manage.py collectstatic
Creating docker-django_python_run ... done

119 static files copied to '/static'.
```

ブラウザのページを更新します。
CSSが適用されて見やすくなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764778/59b3c265-3f01-7767-1b9a-00034bcb9c1c.png)