サーバー、データベース、インフラに関するトピックス
■第6話:Dockerを使おう
(最終更新日:2022.07.28)

(絵が小さい場合はスマホを横に)
前回はDockerの概要、全体像について話した。 今回は実際Docker環境を作るためのDockerfileの書き方、docker-compose.ymlファイルの書き方について説明したいと思う。 今までオンプレミス環境でLinux操作に慣れている人であれば、そんなに難しくないと感じるだろう。ちょっとした作法があるだけだ。 Dockerを用いてサーバー環境をコード化していくことを体験してみよう。
Docker構築のためのファイル構成
Dockerファイルの構成は下図の通りになる。 あるフォルダ(今回はdjango)の中に全体の設計図となるdocker-compose.ymlと pythonのインストールに関する記述をDockerfileに、pipでインストールするライブラリ群はrequirements.txtに記載する。 pythonとpipのインストールに関しては1つのコンテナで行うので、appというフォルダにまとめておく。 各ファイルの具体的な記載内容に関しては、次の項目で説明する。
Docker構築のためのファイル構成
docker-compose.ymlとDockerfileの書き方
docker-compose.ymlは複数コンテナの連携を含めた全体構成を示す。
各項目の細かい書き方についてはここでは説明しない。参考図書を見てほしい。一部だけ抜粋して説明する。
8行目でappフォルダ以下にsourceフォルダを作り、ここにdjangoに関するファイルを配置することを決めている。
また、13,14行目でdepends_on: -dbとすることで、dbコンテナと連携することを指定している。
db部分に関しては、19行目でdatabaseフォルダ以下にdataフォルダを作成し、
ここにmariadbの中のファイルを配置することを決めている。
また、21,22行目でportsを3307:3306と記述しているが、
コンテナの中では3306番ポート、コンテナの外では3307番ポートでつなげられるように指定している。
コンテナの外を3307番ポートにしているのは、
既にwindows上でmysqlをインストールしていた場合に3306番同士portがバッティングすることを防ぐためだ。
Dockerfileの書き方についてはそこまで説明するまでもないだろう。
1点だけ説明すると、2行目の環境変数設定で標準出力と標準エラー出力のバッファーを無効にしている。
あとはrequirements.txtファイルでインストールするライブラリを指定している。
docker-compose.ymlとDockerfileの書き方
Dockerで構築されたdjangoとMariaDBの起動確認
さて、Dockerコンテナを構築する準備はできた。 上記のように記述したファイルを配置し、djangoフォルダ内で以下のコマンドを実行すれば、dockerを動かすことができる。 各コマンドとその意味は以下の通りだ。
- 「docker-compose build」(各dockerイメージを構築する)
- 「docker-compose run app django-admin startproject config . 」 (コンテナ化、コンテナを起動する)
- 「docker-compose up -d」(2だけではdjangoコンテナが起動しない時があるので、このコマンドで起動する)
そして「docker ps」でdjangoとmariadb、2つのコンテナが起動していることが確認できたら setting.pyの中身を変更し(sqlite→mariadbへDB接続を切り替える)、djangoコンテナに入り以下のコマンドを実行する。
- 「setting.pyの書き換え」(Editorを使ってDATABASE部分の記述を下記のコードに変更)
- 「docker exec -it (コンテナID) bash」(djangoコンテナに入る)
- 「python manage.py migrate」 (データベースの初期migration)
- 「python manage.py createsuperuser」(管理画面に入れるよう、スーパーユーザーを作る)
setting.pyの書き換え(mariadb接続に)
コマンド実行が成功すれば、ブラウザで「localhost:8000」にアクセスしてdjangoの初期画面、 「localhost:8000/admin/」で管理のログイン画面が表示されるはずだ。
Dockerで構築したdjangoの初期画面(左)と管理画面(右)
ちなみに、mariadbの起動がうまくいっていれば、MySQL Workbenchでもdocker内のMariadbに接続できる。 その際、Standard TCP/IP、3307番ポートを指定、docker構築時に設定したユーザ名とパスワードで接続できる。
MySQL Workbenchも接続できる。TCP/IPで接続設定(左)、接続後にTable情報を見る(右)
最後に、お気づきの方もいると思うが、今回のDockerコンテナは本番環境では使えない。 「python manage.py runserver」で動かしているからだ。 apacheやnginxを動かしwsgiと連携させるのが本来の方法だが、初めて構築するには非常に難しい。 webサーバーとの連携だけでなく、静的フォルダの指定をしたりと結構記述が大変になる。 ここでの環境構築はあくまでDockerを理解するため用、もしくはメンバー間で開発環境を統一する用と考えてほしい。 統一された開発環境を簡単に共有できるようになるだけでも、Dockerのメリットを充分体感できるだろう。 新しいメンバーに直ぐに開発に入ってもらうことができる。
▼参考図書、サイト
「AWSでDockerを本番運用!AmazonECSを使って低コストでコンテナを運用する実践コース」 Udemy(打田裕馬)
「仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん」 小笠原 種高 マイナビ
【django】Dockerで簡単に開発環境を構築【MySQL】
self-methods
Dockerで起動したMySQLにWorkbenchで接続する方法
みちのくBASE