Web制作、Web開発の歩き方

サーバー、データベース、インフラに関するトピックス

■第6話:Dockerを使おう

(最終更新日:2022.07.28)

Dockerのイメージ
この記事は5分で読めます!
(絵が小さい場合はスマホを横に)

前回は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構築のためのファイル構成

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-compose.ymlとDockerfileの書き方

Dockerで構築されたdjangoとMariaDBの起動確認

さて、Dockerコンテナを構築する準備はできた。 上記のように記述したファイルを配置し、djangoフォルダ内で以下のコマンドを実行すれば、dockerを動かすことができる。 各コマンドとその意味は以下の通りだ。

  1. 「docker-compose build」(各dockerイメージを構築する)
  2. 「docker-compose run app django-admin startproject config . 」 (コンテナ化、コンテナを起動する)
  3. 「docker-compose up -d」(2だけではdjangoコンテナが起動しない時があるので、このコマンドで起動する)

そして「docker ps」でdjangoとmariadb、2つのコンテナが起動していることが確認できたら setting.pyの中身を変更し(sqlite→mariadbへDB接続を切り替える)、djangoコンテナに入り以下のコマンドを実行する。

  1. 「setting.pyの書き換え」(Editorを使ってDATABASE部分の記述を下記のコードに変更)
  2. 「docker exec -it (コンテナID) bash」(djangoコンテナに入る)
  3. 「python manage.py migrate」 (データベースの初期migration)
  4. 「python manage.py createsuperuser」(管理画面に入れるよう、スーパーユーザーを作る)
setting.py

setting.pyの書き換え(mariadb接続に)

コマンド実行が成功すれば、ブラウザで「localhost:8000」にアクセスしてdjangoの初期画面、 「localhost:8000/admin/」で管理のログイン画面が表示されるはずだ。

djangoのトップ画面と管理画面

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