【Python】MacでDockerをインストールしてからDjangoのロケットを出すまでの備忘録

プログラミング,webサービス開発記

最近やっとDockerの勉強をしようと思い立ちました。

勉強する中で何をしようかと考えた時にPythonのDjangoを使ってwebサービスを作りたいと思い立ったのでDockerで開発環境を作ることを思い立ちました。

勉強を進める中で自分が行ったことを備忘録として残しておこうと思います。

環境

  • MacBook Air (M1, 2020)
  • Docker Desktop 4.2.0 (70708)
  • Docker version 20.10.10
  • Django
  • MySQL 8.0
  • Nginx nginx:1.18-alpine

Docker-Desktopをインストールする

https://www.docker.com/products/docker-desktop

まずDocker-Desktopをインストールします。

Docker-Desktop?Dockerと何が違うの?と思われると思います。

簡単に説明すると、Dockerはlinuxでしか動きません。

それをWindowsやmacでも動くようにしたのが「Docker-Desktop」だと思っていただければ結構です。

参考:Windows版Docker|3種類の違い

ダウンロードできたらインストーラーを起動します。

インストールのために権限を与えます。

ユーザー名とパスワードを入力してインストールを開始します。

Docker-Desktopでの規約について

インストールを進めると上記のような規約確認画面が出てきます。

簡単に要約するとDocker-Desktopが有料になることが書かれています。

ただし中小企業、個人使用、教育機関、非営利のプロジェクトでは無料のままです。

以下翻訳を置いておきます。

Dockerサブスクリプションサービス契約を更新しました。 Docker Desktopを使用している企業がどのように影響を受ける可能性があるかについては、ブログとFAQをお読みください。 「利用規約に同意します」にチェックを入れると、サブスクリプションサービス契約、データ処理契約、およびデータプライバシーポリシーに同意したことになります。

主な変更点の概要は次のとおりです。

Dockerサブスクリプションサービス契約には、Dockerデスクトップの利用規約の変更が含まれています。
中小企業(従業員数250人未満、年間収益1,000万ドル未満)、個人使用、教育、および非営利のオープンソースプロジェクトでは無料のままです。
大企業で専門的に使用するには、有料のサブスクリプションが必要です。
これらの条件の発効日は2021年8月31日です。Dockerデスクトップを使用するために有料サブスクリプションが必要な場合は、2022年1月31日までの猶予期間があります。
既存のDockerFreeサブスクリプションはDockerPersonalに名前が変更され、DockerBusinessサブスクリプションが導入されました。
Docker Pro、Team、およびBusinessのサブスクリプションには、DockerDesktopの商用利用が含まれます。
レジストリ制限、SSO、安全なソフトウェアサプライチェーン管理などの機能を必要とする大企業向けに、新製品のサブスクリプションであるDockerBusinessを導入します。

DockerEngineなどのDockerおよびMobyオープンソースプロジェクトのライセンスおよび配布条件は変更されていないことに注意することも重要です。

Dockerを勉強する目的の個人利用であれば無料で使えますので、このまま承諾してください。

Docker-Desktopを立ち上げてログインをする

Docker-DesktopをインストールするとDockerが使えるようになっています。

ターミナルを立ち上げ「docker version」でインストールされているか確認します。

$ docker version
Client:
 Cloud integration: v1.0.20
 Version:           20.10.10
 API version:       1.41
 Go version:        go1.16.9
 Git commit:        b485636
 Built:             Mon Oct 25 07:43:15 2021
 OS/Arch:           darwin/arm64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.10
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.9
  Git commit:       e2f740d
  Built:            Mon Oct 25 07:41:10 2021
  OS/Arch:          linux/arm64
  Experimental:     false
 containerd:
  Version:          1.4.11
  GitCommit:        5b46e404f6b9f661a205e28d59c982d3634148f8
 runc:
  Version:          1.0.2
  GitCommit:        v1.0.2-0-g52b36a2
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

インストールされていることが確認できたらDocker-Desktopに戻り、右上の「Sign in」からサインインしましょう。

アカウントはhttps://hub.docker.com/から「Sign up」で作成しておきます。

Dockerfileからbuildする

Dockerは[Dockerfileの作成]→[Dockerイメージの組み立て]をして始める必要があります。

初学者(私含めて)だとこの時点でよくわからないかもしれませんが、とにかく自分が組み立てたい環境構築をDockerfileとして作成する必要があるようです。

Dockerfileは自分で書いて用意する必要がありますが、有志の方がすでにgitにあげられているのを使用させていただきました。

cloneして、あとはbuildコマンドを使うだけでDockerイメージを作成することができます。

よくわからないかもしれませんが、とにかく以下のgitをcloneしてbuildコマンドを走らせてみましょう。

ターミナルを開いて以下のコマンドを実行させます。

$ git clone https://github.com/E-handson/docker-django.git

cloneが終わったらディレクトリを移動します。

cd docker-django

https://niwakatech.info/django-docker-compose/ の記事を参考にさせていただきました。

Dockerfileの微修正とサービスの立ち上げ[docker-compose build]

クローンしたものをtreeコマンドで見てみると以下のようなファイル構成になっています。

├── README.md
├── docker
│   ├── mysql
│   │   ├── Dockerfile
│   │   └── my.cnf
│   ├── nginx
│   │   ├── default.conf
│   │   └── uwsgi_params
│   └── python
│       ├── Dockerfile
│       └── requirements.txt
├── docker-compose.yml

buildコマンドを走らせる前にmysqlのDockerfileを修正する必要があります。

├── docker
│   ├── mysql
│   │   ├── Dockerfile

最初の行の以下の部分を修正してください。

FROM mysql:8.0

修正後

FROM --platform=linux/x86_64 mysql:8.0

修正できたらbuildコマンドを実行しましょう。

$ docker-compose build

mysqlのDockerfileを修正せずに実行した場合は以下のようなエラーが出ます。

$ docker-compose build
[+] Building 2.6s (8/8) FINISHED                                                                                                                   
 => [docker-django_db internal] load build definition from Dockerfile                                                                         0.0s
 => => transferring dockerfile: 267B                                                                                                          0.0s
 => [docker-django_app internal] load build definition from Dockerfile                                                                        0.0s
 => => transferring dockerfile: 238B                                                                                                          0.0s
 => [docker-django_db internal] load .dockerignore                                                                                            0.0s
 => => transferring context: 2B                                                                                                               0.0s
 => [docker-django_app internal] load .dockerignore                                                                                           0.0s
 => => transferring context: 2B                                                                                                               0.0s
 => ERROR [docker-django_db internal] load metadata for docker.io/library/mysql:8.0                                                           2.5s
 => CANCELED [docker-django_app internal] load metadata for docker.io/library/python:3.8.5                                                    2.5s
 => [auth] library/mysql:pull token for registry-1.docker.io                                                                                  0.0s
 => [auth] library/python:pull token for registry-1.docker.io                                                                                 0.0s
------
 > [docker-django_db internal] load metadata for docker.io/library/mysql:8.0:
------
failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0: failed to create LLB definition: no match for platform in manifest sha256:6d7d4524463fe6e2b893ffc2b89543c81dec7ef82fb2020a1b27606666464d87: not found

Dockerイメージからコンテナを作成する[docker-compose up]

[$ docker-compose build]が完了したら早速dockerを起動してみましょう。

dockerの起動はupコマンドを使います。

$ docker-compose up

docker-compose upコマンドを実行するとそのターミナルは使用不可になります。

実行が終わらないというわけではないので注意しましょう。

別のターミナルを開きましょう。

コンテナが動いているかどうか確認する[docker-compose ps]

upコマンドを実行したら別のターミナルを開きます。

ターミナルに[docker-compose ps]でコンテナの稼働状況が分かります。

STATUSがrunningになっていたらOKです。

$ docker-compose ps
NAME                  COMMAND                  SERVICE             STATUS              PORTS
docker-django-app-1   "uwsgi --socket :800…"   app                 running             8001/tcp
docker-django-db-1    "docker-entrypoint.s…"   db                  running             33060/tcp
docker-django-web-1   "/docker-entrypoint.…"   web                 running             0.0.0.0:8000->8000/tcp

appコンテナにdjangoをインストールする

コンテナの起動に成功したのでdjangoを入れていきます。

以下のコマンドを実行しましょう。

$ docker-compose exec app django-admin.py startproject app .

何をしているかというとexecコマンドを使って指定のコンテナに対してコマンドを実行しています。

ここでいうとappコンテナに[django-admin.py strtproject app .]というコマンドを実行しています。

$ docker-compose exec #{container} ${command}

コマンド実行後に再度treeコマンドを実行すると以下のようになっています。

$ tree
.
├── README.md
├── docker
│   ├── mysql
│   │   ├── Dockerfile
│   │   └── my.cnf
│   ├── nginx
│   │   ├── default.conf
│   │   └── uwsgi_params
│   └── python
│       ├── Dockerfile
│       └── requirements.txt
├── docker-compose.yml
└── src
    ├── app
    │   ├── __init__.py
    │   ├── asgi.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    └── manage.py

srcフォルダができてそこにdjangoが入っていることがわかると思います。

コンテナを再起動する[docker-compose restart]

djangoのフォルダが作成されていることを確認できたらrestartコマンドを実行します。

$ docker-compose restart
[+] Running 3/3
 ⠿ Container docker-django-db-1   Started                                                                                                                                                              2.9s
 ⠿ Container docker-django-app-1  Started                                                                                                                                                             10.4s
 ⠿ Container docker-django-web-1  Started

全てのコンテナが再起動されたら、http://localhost:8000/ へアクセスしてみましょう。

無事djangoのロケット打ち上げの画面が起動できていると思います。

お疲れ様でした。

立ち上げたdockerを停止する

起動させたdockerを全停止させるには以下のコマンドを実行します。

$ docker stop $(docker ps -q)

本来docker stopは以下のようにコンテナのIDなどを指定して一つ一つ停止します。

$docker stop e2d41562fb71

[$(docker ps -q)]を使えば1行で全てのdockerコンテナを指定して停止することが可能です。