見出し画像

Dockerチュートリアル

自己紹介

プログラミング講師の飼鳥晴康(@hathle)です。

エンジニア歴は10年以上で海外(カナダ)就労も経験しています。

カナダでは、映画を作っていました。

現在は、独立して、Python、Djangoをメインにオンラインでマンツーマンレッスンをしています。

お問い合わせなどは、Twitter(@hathle)からお願いいたします。

プログラミングは人生を変えることができます。

目標に向かって、一緒に頑張っていきましょう!!

はじめに

Dockerとは?

Dockerは、コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンソースソフトウェアです。

Dockerはコンテナ仮想化を用いたOSレベルの仮想化により、アプリケーションを開発・実行環境から隔離し、アプリケーションの素早い提供を可能にすることができます。

画像3

もし本番環境で不具合が見つかった時に、開発環境でも本番環境と同じ環境であれば、不具合が見つけやすくなります。

どのステージでも同じ環境が使えるのがDockerの強みになります。

目標

下記を学習していきます。

・Dockerのインストール
・Dockerの動作方法
・docker-composeの使用方法
・DjangoとMySQLを動作させる

前提知識

Dockerを始める前に、下記は学習しておいて下さい。

・Linuxコマンド

ブログ構成チュートリアルでDjangoを詳しく説明していますので、まだ実施していない方は、実施して下さい。

では、始めて行きましょう!!

Dockerインストール

DockerとDocker Composeをインストールします。

MacとLinuxで手順が異なりますので、環境に合う方法を実行してください。

Mac

Docker for Macをインストール

Dockerインストール確認

$ docker ---version

Docker for Macをインストールすると、Docker Composeも同時にインストールされます。

Docker Composeインストール確認

$ docker-compose --version

バージョンが表示されたらインストール成功です。

Linux(Ubuntu)

UbuntuはWindowsマシンでWSLを想定しています。

古いバージョンのアンインストール

$ sudo apt-get remove docker docker-engine docker.io containerd runc

パッケージアップデート

$ sudo apt-get update

HTTPS経由でリポジトリを使用できるようにパッケージをインストール

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

Docker公式のGPGキーの追加

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88

リポジトリを設定

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

Dockerのインストール

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
$ apt-cache madison docker-ce
$ sudo apt-get install docker-ce=5:18.09.5~3-0~ubuntu-bionic  docker-ce-cli=5:18.09.5~3-0~ubuntu-bionic containerd.io

Dockerが正常にインストールしたか確認

$ sudo docker run hello-world

このコマンドは、テストイメージをダウンロードしてコンテナを実行します。

コンテナが実行されると、Hello Worldとメッセージが出力されます。

Dockerを自動起動させる

$ sudo systemctl enable docker

Docker Composeインストール

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

実行権限適用

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

インストール確認

$ docker-compose --version

バージョンが表示されたらインストール成功です。

コンテナ削除方法

Docker コンテナの全削除

$ docker rm -f $(docker ps -aq)

Docker イメージの全削除

$ docker rmi -f $(docker images -a -q)

Docker + Django + MySQL

DjangoをDocker上で動作するようにセットアップします。

Dockerを使用すると、仮想環境を作る必要がなくなります。

本番環境と開発環境を揃えることができるのがメリットです。

セットアップ

$ mkdir sql
$ touch Dockerfile docker-compose.yml command.sh requirements.txt sql/init.sql

Dockerfile

FROM python:3.7
ENV PYTHONUNBUFFERED 1

RUN mkdir /code
WORKDIR /code

ADD requirements.txt /code/
RUN pip3 install -r requirements.txt

ADD . /code/
EXPOSE 8000

COPY ./command.sh /command.sh
CMD ["/command.sh"]

docker-compose.yml

version: '3'
services:

  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    working_dir: /code
    ports:
      - '8000:8000'
    volumes:
      - .:/code
    depends_on:
      - db

  db:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: django_docker
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    volumes:
      - web-db-data:/var/lib/mysql
      - ./sql:/docker-entrypoint-initdb.d
    ports:
      - '3306:3306'

volumes:
  web-db-data:

command.sh

#!/usr/bin/env bash
set -e

cd /code

wait_count=0
while ! python3 manage.py shell -c "
from django.db import connection
with connection.cursor() as cursor:
    cursor.execute('select 1')
    cursor.fetchall()
" 2> /dev/null
do
  echo Wait until DB is ready... $((wait_count += 1))
  sleep 5
done

python3 manage.py migrate --noinput
python3 manage.py collectstatic --noinput

requirements.txt

Django==3.2.7
mysqlclient==2.0.3

sql/init.sql

GRANT ALL PRIVILEGES ON test_django_docker TO 'user'@'%';
FLUSH PRIVILEGES;

データベース起動

Docker上でMySQLを起動します。

$ docker-compose up db

下記が表示されたら、MySQLが起動しています。

django-docker-db | Version: '5.6.47'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)

プロジェクト作成

新しいターミナルで下記コマンドを実行して、Djangoプロジェクトを作成します。

$ docker-compose build web
$ docker-compose run web django-admin startproject mysite .

設定変更

デフォルトではSQLiteを使用しているので、MySQLに変更します。

SQLiteのメリット

・データファイルがひとつ
・高速に動作
・設定が簡単

SQLiteのデメリット

・パスワード設定がない
・複数の書き込みができない
・バージョンによる互換性がない
・管理ツールが微妙

同時に書き込みができないのは致命的です。

なので、Webアプリを作成するときは、MySQLや他のデータベースを選びましょう。

権限がrootになっているので、ユーザー権限に変更します。

sudo chown -R $USER:$USER .

mysite/settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_docker',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': 'db',
        'POST': '3306'
    }
}

docker-compose.ymlで設定した情報に書き換えます。

マイグレーション実行

設定が変更できたら、マイグレーションをしましょう。

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

起動

起動します。

$ docker-compose up web

起動2

最初なので、動作していることを確認するため、別々に起動しましたが、下記コマンドでMySQLとDjango両方起動することができます。

$ docker-compose up

オプションで-dをつけるとバックグランドで起動します。

$ docker-compose up -d

Dockerを使用すると、すべての人が同じ環境を構築することができます。

ぜひDockerを活用していきましょう。

データベース操作

ローカルからDocker上のデータベースを操作するコマンドを紹介します。

Dockerコンテナ名確認

$ docker ps

Docker上のデータベースに接続

dockerでデータベースが動作していること

$ docker exec -it CONTAINER_NAME mysql -u USER_NAME -p

Docker上のデータベースを操作

-eオプションをつけることにより、データベースの操作をすることができます。

$ docker exec -it CONTAINER_NAME  mysql -u USER_NAME -p -e 'CREATE DATABASE IF NOT EXISTS DATABASE_NAME;'

Docker上のデータベースをバックアップ

バックアップすることをダンプといいます。

$ docker exec -it CONTAINER_NAME mysqldump -u USER_NAME -p PASSWORD DATABASE_NAME > dump.sql

Docker上のデータベースを復元

復元することをリストアといいます。

$ docker exec -it CONTAINER_NAME mysql -u USER_NAME -p DATABASE_NAME -e '$(cat dump.sql)'

おわりに

チュートリアルを最後まで読んでいただき、誠にありがとうございました。

Dockerのチュートリアルはここまでで終わりとなります。

Dockerの使い方

Docker上でDjangoを動作させる方法が理解できましたでしょうか!?

Djangoは奥の深いフレームワークで、多くの機能を搭載することができます。

公式ドキュメントを参考にして、さらに理解を深めていきましょう。

ぜひオリジナルのアプリケーションを開発してみてください。

フィードバック

チュートリアルのフィードバックは、Twitter(@hathle)までお願いいたします。

どんどんDjangoチュートリアルを作成していきますので、楽しみにしていてください。

ではまた!!

最後まで読んでいただきありがとうございました😃 サポートは、プログラミングチュートリアル開発の手助けとなります。 シェアもして頂くと嬉しいです。 Twitterのフォローもお願いします。 https://twitter.com/hathle