Python
Django
docker
centos7

CentOS7.4上でdocker-ceを利用してptyhen+django環境を構築した件

目的

CentOS7にdockerを利用してpython3.6.4、django2.0.2環境を作る
python案件を紹介してもらって1週間経過しておらず、初心者が起動できるまでを調査した件です。
間違っていたら、ご指摘ください。

動作環境

CentOS Linux release 7.4.1708 (Core)

参考URL

古いバージョンのdockerを削除する

  • ほぼインストールされているものはないと思いますが、一応削除する
sudo yum remove docker \
                  docker-common \
                  docker-selinux \
                  docker-engine

バージョンアップなどに備えてリポジトリを設定する

必要なパッケージをインストールします。 yum-utilsはyum-config-managerユーティリティを提供し、device-mapper-persistent-dataとlvm2はdevicemapperストレージドライバによって必要とされます。

sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

安定リポジトリを設定するには、次のコマンドを使用します。
エッジやテストリポジトリからビルドをインストールする場合でも、常に安定したリポジトリが必要です。

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

エッジとテストリポジトリを有効にします。これらのリポジトリは上記のdocker.repoファイルに含まれていますが、デフォルトでは無効になっています。安定したリポジトリとともにそれらを有効にすることができます。

sudo yum-config-manager --enable docker-ce-test
sudo yum-config-manager --enable docker-ce-edge

Docker CEの最新バージョン

最新版のインストールする。

sudo yum install docker-ce

特定のバージョンをインストールする

yum list docker-ce --showduplicates | sort -r

上記の検索結果をもとにインストールしたいバージョンを指定してインストールする

sudo yum install <FULLY-QUALIFIED-PACKAGE-NAME>

Docker CEの起動

起動

systemctl start docker

起動の状態確認

systemctl status docker

centos7上にdocker-composeをインストール

curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

dockerでdjangoを起動させるための準備

  • インストールするpythoneのライブラリーを指定する
vi Dockerfile


FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/

- インストールするpythoneのライブラリーを指定する

vi requirements.txt


Django
psycopg2   ## ポスグレのライブラリ。使わないなら不要
pymysql
  • docker-compose.ymlファイルの作成
vi docker-compose.yml

version: '3'

services:

  # https://hub.docker.com/r/mysql/mysql-server/
  db:
    image: mysql/mysql-server:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=P@ssw0rd
      - MYSQL_ROOT_HOST=%
    volumes:
      - ./db-datadir:/var/lib/mysql
      - ./sql:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"

  web:
    build: .
    command: sh -c "sleep 3; ./manage.py runserver 0.0.0.0:8000"
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

docker-composeでWebを起動

- webサーバー上でdjango-admin.py startproject composeexampleを実行し、djangoのプロジェクトを作成して起動させる

$ docker-compose run web django-admin.py startproject composeexample .


Starting root_db_1 ... done
Building web
Step 1/7 : FROM python:3
3: Pulling from library/python
Digest: sha256:98149ed5f37f48ea3fad26ae6c0042dd2b08228d58edc95ef0fce35f1b3d9e9f
Status: Downloaded newer image for python:3
 ---> c1e459c00dc3
Step 2/7 : ENV PYTHONUNBUFFERED 1
 ---> Running in 10de77547637
Removing intermediate container 10de77547637
 ---> 187aa051f7e0
Step 3/7 : RUN mkdir /code
 ---> Running in 5f9f9ca58abe
Removing intermediate container 5f9f9ca58abe
 ---> 3c22401b69b1
Step 4/7 : WORKDIR /code
Removing intermediate container 12b66078a0ce
 ---> 9bd699610356
Step 5/7 : ADD requirements.txt /code/
 ---> 24bb011932ed
Step 6/7 : RUN pip install -r requirements.txt
 ---> Running in 1ea60fc1ae3d
Collecting Django<2.0,>=1.8 (from -r requirements.txt (line 1))
  Downloading Django-1.11.10-py2.py3-none-any.whl (6.9MB)
Collecting psycopg2 (from -r requirements.txt (line 2))
  Downloading psycopg2-2.7.4-cp36-cp36m-manylinux1_x86_64.whl (2.7MB)
Collecting pytz (from Django<2.0,>=1.8->-r requirements.txt (line 1))
  Downloading pytz-2018.3-py2.py3-none-any.whl (509kB)
Installing collected packages: pytz, Django, psycopg2
Successfully installed Django-1.11.10 psycopg2-2.7.4 pytz-2018.3
Removing intermediate container 1ea60fc1ae3d
 ---> ed602ebc04b9
Step 7/7 : ADD . /code/
 ---> afc30222238c
Successfully built afc30222238c
Successfully tagged root_web:latest

- 実行結果を確認すると関連するcomposeexampleプロジェクトフォルダが作成されている事が確認できる。

$ ls -l

total 32
drwxr-xr-x 2 root  root  4096 Feb 14 22:13 composeexample
drwxr-xr-x 6 mysql mysql 4096 Feb 14 22:13 db-datadir
-rw-r--r-- 1 root  root   489 Feb 14 07:57 docker-compose.yml
-rw-r--r-- 1 root  root   153 Feb 14 08:06 Dockerfile
-rwxr-xr-x 1 root  root   812 Feb 14 22:13 manage.py
-rw-r--r-- 1 root  root    29 Feb 14 08:08 requirements.txt

MySQLの設定

- DBの接続情報の設定(下記の設定はと参考サイトから抜粋)

vi composeexample/settings.py

import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',
        'USER': 'django',
        'PASSWORD': 'P@ssw0rd_django',
        'HOST': 'db',
        'PORT': 3306,
        'OPTIONS': {
            'charset': 'utf8mb4',
        },
    }
}

- migrate処理

$ docker-compose run web ./manage.py migrate

Starting root_db_1 ... done
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying sessions.0001_initial... OK

- 管理者ユーザーの作成

$ docker-compose run web ./manage.py createsuperuser --username hoge --email hogehoge@hoge.com
>パスワードを2回求められるのでパスワードを設定する

バックグランドで実行する

$ docker-compose up -d

- アプリケーションサーバーとMySQLが起動していることが確認できる

$ docker ps

CONTAINER ID        IMAGE                    COMMAND                  CREATED              STATUS                   PORTS                               NAMES
1d7cb198d25c        root_web                 "sh -c 'sleep 3; ./m…"   About a minute ago   Up About a minute        0.0.0.0:8000->8000/tcp              root_web_1
28940c954ea6        mysql/mysql-server:5.7   "/entrypoint.sh mysq…"   9 minutes ago        Up 9 minutes (healthy)   0.0.0.0:3306->3306/tcp, 33060/tcp   root_db_1

ブラウザからのアクセスを確認する

下記の画面が表示されてしまい、IPアドレスの許可をしないといけないということが解り。
doja.png

- settings.pyに下記の箇所に自分のサーバーのIPアドレスを指定する

vi composeexample/settings.py

ALLOWED_HOSTS = [‘xxx.xxx.xxx.xxx’]
  • ちゃんと表示された! django.png

折角ここまできたので、次回は何か簡単なデモアプリを作成してみたいと思う。きっと。