Dockerチュートリアル
自己紹介
プログラミング講師の飼鳥晴康(@hathle)です。
エンジニア歴は10年以上で海外(カナダ)就労も経験しています。
カナダでは、映画を作っていました。
現在は、独立して、Python、Djangoをメインにオンラインでマンツーマンレッスンをしています。
お問い合わせなどは、Twitter(@hathle)からお願いいたします。
プログラミングは人生を変えることができます。
目標に向かって、一緒に頑張っていきましょう!!
はじめに
Dockerとは?
Dockerは、コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンソースソフトウェアです。
Dockerはコンテナ仮想化を用いたOSレベルの仮想化により、アプリケーションを開発・実行環境から隔離し、アプリケーションの素早い提供を可能にすることができます。
もし本番環境で不具合が見つかった時に、開発環境でも本番環境と同じ環境であれば、不具合が見つけやすくなります。
どのステージでも同じ環境が使えるのが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