Docker で Django アプリを動かす

記事
IT・テクノロジー

Docker で Django アプリを動かす

前回までに、仮想マシーンの Web サーバー上で Django のアプリを稼働させる方法を紹介してきました。実はここまでは「前置き」です。これから何回かに分けて Docker を利用して Django のアプリを動かす方法を紹介していきます。

何故 Docker を使うか?

これまで紹介した仮想マシーンはとても便利です。実際に使用している PC とは別にパッケージをインストールしたり、異なった環境を簡単に作って試すことができます。

現在主流のシステムの仮想技術には、大きく2つの方法が使われています。

* ハイパーバイザー(Hypervisor)を利用した仮想マシーン
* コンテナ(container)技術を利用した仮想環境
です。これから紹介する Docker はコンテナ(container)を利用した仮想化技術です。これに対して、これまで紹介してきた、VMWare や VirtualBox、Parallels などは、ハイパーバイザー(Hypervisor)を利用した仮想化技術です。

何が違うかというと、本格的に説明すると長くなるので簡単に言うと、ハイパーバイザー(hypervisor)は、利用している OS(ホスト OS:Host OS)の中で動く、別の OS(ゲスト OS:Guest OS)を動かす技術です。これに対して、コンテナ(container)は、利用している OS の機能を使って、別のシステムのように見せかける技術です。つまり、動いている OS の数が違います。

簡単に言うと、ハイパーバイザー(Hypervisor)の場合は、利用している OS 以外に必要なシステム分の OS をインストールする必要があります。さらに、各 OS で使えるリソース(メモリやディスク容量)は、予め仮想マシンに割り当てる必要があるので、リソースが完全に分割されてしまい、効率的な利用が難しくなります。

Docker のようなコンテナ(container)は、ホスト OS(HostOS)のリソースをコンテナに必要に応じて割り当てることができるので、複数のシステム(コンテナ)を作って動かしても比較的効率的にリソースを活用できます。その上で、各コンテナは別のシステムのように独立して動かすことができるのが大きな魅力です。

今回は、Django のアプリを Docker のコンテナで動かす方法を紹介します。

Docker の簡単な仕組み

初回のこの記事では、Docker について簡単に説明します。

最初に説明した通り、Docker は利用している PC の OS(ホスト OS:Host OS)を利用して動作しています。Docker は、Windows、MacOS、Linux で動作しますが、各 OS で微妙に違います。理由は、それぞれ PC の OS(ホスト OS:Host OS)が違うからです。

Linux 系 OS の場合
Linux 系の OS の場合は、Docker のコンテナ(container)で利用できる OS は、Linux と言う事になります。理由は、簡単で PC の OS が Linux でこの OS の機能を基本的に利用するためです。

Windows の場合
Windows の場合は、基本的にコンテナで Windows が使えるという事になります。しかし、実は Linux も使うことができます。これは、Windows は数年前から、Windows 上で仮想化技術を使って、Linux を動作させることができるようになっています。WLS(Windows Subsystem for Linux)と呼ばれている仕組みがサポートされているので、これを利用して Linux 上のプログラムも動かす事が可能です。便利ですね!

Mac の場合
MacOS の場合は、MacOS と言う事になりそうですが、実は、MacOS をコンテナ(container)で使うことはできません。Mac で Docker を使う場合、実は、MacOS 上で動作する Linux の仮想マシーンを動かしてその Linux カーネルを利用して Docker のコンテナ(container)をサポートしています。このため、Mac 上の Docker で利用できるのは Linux のアプリという事になります。

ちょとわかりにくいですね。実はこの仮想マシーンを利用している関係で、最近(2021 年 4 月)までは、公式に M1 Mac 上で Docker は利用できませんでした。2021 年 4 月になって、M1 Mac 上でもようやく仮想マシーンのサポートが公式にサポートされるようになって、M1 Mac でも仮想マシーンや Docker を利用できるようになりました。

Docker を使ってみよう!

いろいろ難しそうな感じがしますが、まずは使ってみる事にします。仮想マシーンとかコンテナなど、言葉は難しそうですが、使うのはそれほど難しくありません。

Docker のインストール
Windows や MacOS の場合は、Docker Desktop をダウンロードして指示に従ってインストールするだけです。

Linux の場合は、Docker Engineをインストールします。

Ubuntu の場合を例にすると、

$ sudo apt-get update
$ sudo apt-get install apt-transport-https
$ sudo apt-get install ca-certificates
$ sudo apt-get install curl
$ sudo apt-get install gnupg
$ sudo apt-get install lsb-release
Docker の GPG キーを入手します

$ curl -fsSL h t t p s://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
リポジトリーの設定を行います。

echo "deb [arch=amd64 signed-by=/usr/share/keyringsdocker-archive-keyring.gpg]  h t t p s://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Docker をインストールします

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
インストールが完了したら、利用しているユーザで Docker を利用できるようにします。

$ sudo groupadd docker
$ sudo usermod -aG docker $USER
一旦ログアウトして再ログインします。

$ newgrp docker
で、「sudo」を使わなくても、Docker のコマンドが利用できるようになります。

インストールの確認のため、「hello-world」を実行してみます。

何をやるかというと、利用している PC(ローカル)に「hello-world」のイメージがない場合、オンライン(Docker   Hub)にある、hello-world のイメージをだううロードして実行します。このメッセージが表示されれば、設定は完了です。

Windows や Mac の場合は、Docker Desktop をインストールした後に、PowerShell やターミナルから同じようにコマンドを実行します。

user@ubuntu-linux-20-04-desktop:~$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
256ab8fe8778: Pull complete
Digest: sha256:f2266cbfc127c960fd30e76b7c792dc23b588c0db76233517e1891a4e357d519
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (arm64v8)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 h t t p s://hub.docker.com/

For more examples and ideas, visit:
 h t t p s://docs.docker.com/get-started/

user@ubuntu-linux-20-04-desktop:~$

Docker で遊んでみる

Docker は自分で必要な機能を開発してイメージを作成するという使い方が一般的ですが、Docker Hub には便利な Docker のイメージが公開されています。このイメージを利用すると、自分の PC 上に簡単にいろいろな機能を取り込む事ができます。しかも必要がなくられば消すこともできるので気軽にいろいろな機能を試す事が可能です。

まずは、Docker Hubにアカウントを作って、どんなイメージがあるかを見てみると様子がわかります。Docker Hub は Docker 版の GigHub のような感じのもので便利なイメージがたくさんあります。

例えば、Ubuntu のイメージもあります。

user@ubuntu-linux-20-04-desktop:~$ docker run -it ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
80bc30679ac1: Pull complete
9bf18fab4cfb: Pull complete
5979309c983a: Pull complete
Digest: sha256:cf31af331f38d1d7158470e095b132acd126a7180a54f263d386da88eb681d93
Status: Downloaded newer image for ubuntu:latest
root@20581e3333f6:/#
「-it」(対話モード)オプションをつけて Docker のイメージを起動すると、Ubuntu のイメージをダウンロードして実行できます。Ubuntu のプロンプトが表示されて、Ubuntu を利用することができます。

いろいろなコマンドを実行できますし、パッケージをインストールすることができます。ただし、「-it」で実行した場合は、Docker から抜けると新たに変更した設定は保存されていません。実際に利用する際は、設定ファイル(Dockerfile など)で必要な設定をする必要があります。

実際には、Docker で Web サーバーを立てて、Django のアプリを動かすような目的で利用します。一旦、イメージを作成してしまえば、Docker をサポートしているホスティングサービスを利用すると、簡単に Django のアプリを公開できるようになります。 実際の稼働環境とほぼ同じ条件でテストも可能になるので開発効率が上がります。

まとめ

この記事では、Docker の基本的な仕組みの紹介をまとめて見ました。 Windows の PC では、Windows ベースのコンテナ(container)も作成できますが、基本的には Linux ベースのアプリのコンテナ(container)に利用する場合が多くなります。

自分でコンテナ(container)を作成するのは当然一つの利用方法ですが、役に立つイメージが Docker Hub に多数共有されているので、そうしたイメージも利用できるので利用価値が非常に高い仕組みです。

まずは、Docker を利用して、Django アプリを実装する手順を紹介していく予定です。お楽しみに!
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す