手帳

  • 2022-07-02
  • IT系

前回の記事で無事DockerをWindowsにインストールができたので早速使ってみます。

とは言うものの、全くわからないので先人たちの様子をたくさんググってみます。

0. イメージ、ボリューム、コンテナとは?

ググってまずわかりづらかった用語は、「イメージ」「ボリューム」「コンテナ」です。

1. イメージとコンテナについて

イメージとコンテナの話で一番わかりやすかったのが、こちらのサイトでした。

Dockerのイメージとコンテナの違い | CodeCampus

例えばOSをインストールするときにはOSのイメージディスク(DVDによく焼かれているやつ)を使うのと同じで、Dockerでは目的とする実行環境を作るためのサービス(Web Server, Dabase Serverから、PHPなどの言語、WordPressなどのCMSなども含めて)をそれぞれ「イメージ」と作成しておきます。

そしてこれらを組み合わせて一つの実行環境である「コンテナ」を作り上げるというわけです。

実行環境ごとにイメージをすべて新しく作る必要はなく、「使いまわせる」というのがポイントのようです。

Dockerのイメージとコンテナの違い | CodeCampus https://blog.codecamp.jp/programming-docker-image-container より。

こんなわかりやすい絵があるので、ぜひ上記サイトを一度読んでみてください。

2. ボリュームについて

イメージを使ってコンテナを作るときに一連のデータやファイルを「どこに」保存するのかというのがボリュームという理解です。

自分の現状の知識で分かりやすかった絵は、こちらにありました。

Docker、ボリューム(Volume)について真面目に調べた – Qiita

Docker、ボリューム(Volume)について真面目に調べた – Qiita https://qiita.com/gounx2/items/23b0dc8b8b95cc629f32 参照

左側のHostや、右側のVolumeが実データを保存する場所になり、コンテナを作成するときにこの保存場所を「コンテナ自身のディスク」としてマウントすることで、コンテナそれぞれの持つサービスが開始できるようになります。

3. Dockerでコンテナ立ち上げて色々なサービスを動かすには?Dockerfileとdocker-compose.yml

Dockerでコンテナ立ち上げて色々なサービスを動かすには、コンテナ内にボリュームにそれぞれイメージを設定ファイルを元にインストールしてちゃんと動くように連携させてあげる必要があります。

これらを簡単に行うためのものがDockerfileとdocker-compose.ymlです。わかりやすい説明は以下のサイトにありました。

Dockerfile と docker-compose を利用すると何がうれしいのか? – Qiita

まずはdocker-compose.ymlファイルから見てみます。

4. docker-compose.yml

書き方で分かりやすかったのはこちらです。

Compose specification | Docker Documentation

docker-compose.ymlの書き方について解説してみた – Qiita

Docker Compose – docker-compose.yml リファレンス – Qiita

nginx, MySQL, PHP, CakePHPを利用するためのdocker-compose.ymlファイル

第一レベルには、version, volumes, servicesと3項目が定義されています。

a) version

docker-composeで使用する書き方バージョン。バージョンによって書き方が異なるようです。

b) volumes

これは、Dockerで作成するvolumeの名称を定義しています。ボリュームの作成先には、Host側とDocker側の2種類あると書きましたが、この書き方はDcoker側にdb-storeというボリュームを作ります。

実際にこの定義によってDocker Desktop > Volumesを見てみると、db-storeというボリュームが作られていることがわかります。

Docker側に保存先を準備しないならば特に必要ないかと思います。(Docker側に準備するのと、Host側に準備するのとで何が違うのか知りません)

c) service

ここではイメージを使ってどんなサービスをどこに実際に保存してそれをContainerとしてどこにマウントするか~などなどそれぞれのサービスの設定について定義します。

各サービスの内容は以下のように定義します。

  • サービスの名称: サービスごとに名称を決めておきます。ウェブサーバーならweb、データベースなら、dbなどですが、これはわかりやすいように自分の好きに決めてください。
  • image: これは、各サービスのインストールするための参照imageを指定してあげます。この世で先人たちがimageを作ってくれているのでそれを利用すると便利です。「{タグや image ID}:{バージョン}」という形で指定してあげることが多いようです。
  • build: imageではなく、後述のDockerfileを使ってサービスをインストールする際に使います。Dockerfileがどこに存在するか指定します。
  • volumes: マウントする設定ファイルやデータを保存する場所などを指定します。
  • links: , depends_on: version1では、linksはdepends_onのラッパー的な意味合いでしたが、version2以降は違いがなくなりました。depends_onに記述するだけで、サービス名・エイリアス名で接続できるようになります。(つまりlinksは不要) depends_on先に書かれたサービスが先に立ち上がった後で、該当サービスが立ち上がるようになります。
    (参考)
    docker-compose depends_onとlinksの違い – Qiita
    Docker Compose の depends_on の使い方まとめ | gotohayato.com
  • ports: 各サービスに接続するためのポートを公開します。{ホスト側}:{コンテナ側}あるいは、{コンテナ側}だけで指定します(その場合はホスト側のポートはランダムに)。
    expose: でもポートを設定できますが、これはContainer内部でリンクされたサービス間でのやり取りの内部ポートだけの指定となります。
  • platform: イメージを作成する際に「どのプラットフォームに対応したイメージを作るか」を指定できます。指定がない場合には、環境にあったアーキテクチャを自動的に選択してくれますが、環境を統一するという指定が必要な時にはここで指定します。
  • environment: サービス内で利用する環境変数をここで指定することができます。MySQLやWordPressのユーザー名・パスワードなどです。

5. Dockerfileについて

やはりわかりやすかったのはこちらのサイトの解説でした。

Dockerfile
これができると(Dockerfile を書けるようになると)自分の好きなようにカスタマイズした Docker Image をコマンド1行で作成できるようになります。

Dockerfile と docker-compose を利用すると何がうれしいのか? – Qiita

つまり、すでに公開されているimageではなく、もう少し細かくカスタマイズしたサービスを利用したいとき、例えば~PHPをインストールした際にいくつかの追加のライブラリもインストールしたい~などのコマンドを書いておけるインストール用のファイルを作っておくというわけです。

php7.4-fpm-alpineをベースにcomposerやzip関連、mariadb、vim、などなどをインストールするように指定したDockerfile

細かい書き方については、こちらのサイトを参考にしてください。

Dockerfileの書き方, 利用する命令, 作成手順 – わくわくBank

本当はこの後でコンテナを作る記事も書きたいのですがちょっと時間に余裕が無いので、その記事はまたそのうちに書きたいと思います。