【Python】MacでDockerをインストールしてからDjangoのロケットを出すまでの備忘録
最近やっとDockerの勉強をしようと思い立ちました。
勉強する中で何をしようかと考えた時にPythonのDjangoを使ってwebサービスを作りたいと思い立ったのでDockerで開発環境を作ることを思い立ちました。
勉強を進める中で自分が行ったことを備忘録として残しておこうと思います。
- 1. 環境
- 2. Docker-Desktopをインストールする
- 3. Docker-Desktopでの規約について
- 4. Docker-Desktopを立ち上げてログインをする
- 5. Dockerfileからbuildする
- 6. Dockerfileの微修正とサービスの立ち上げ[docker-compose build]
- 7. Dockerイメージからコンテナを作成する[docker-compose up]
- 8. コンテナが動いているかどうか確認する[docker-compose ps]
- 9. appコンテナにdjangoをインストールする
- 10. コンテナを再起動する[docker-compose restart]
- 11. 立ち上げた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」だと思っていただければ結構です。
ダウンロードできたらインストーラーを起動します。
インストールのために権限を与えます。
ユーザー名とパスワードを入力してインストールを開始します。
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コンテナを指定して停止することが可能です。