ホームやさしいIT研究室

Docker入門|コンテナ・Compos...

Docker入門|コンテナ・Compose・データ永続化の基本をざっくり整理

はじめに


仕事でWordPressサイトを運用しており、自分のパソコン上でサイトの表示や動作を確認する際は、これまで「Local」を使って開発環境を用意していました。

しかし、パソコンを買い替えたことをきっかけに、もう少し汎用的で便利な環境構築の方法がないか調べてみたところ、「Docker」という仕組みに出会いました。Dockerを使うと、多様な開発環境を比較的簡単に用意できるらしく、これは便利そうだと思い、学習してみることにしました。

今回は、2022年にインプレスから発行された『Docker&仮想サーバー完全入門』を読み、Dockerの基本的な仕組みや使い方について学んだことをまとめます。

コンテナとは


コンテナとは、アプリケーションと、その実行に必要なライブラリや設定ファイルなどを、他の環境から隔離して動かす仕組みです。

「コンテナ」という名前は、貨物船やトラックで使われる輸送用コンテナに由来します。荷物を箱ごとに分けて運ぶように、アプリケーションの実行環境をひとまとまりにして管理するイメージです。

コンテナとは

例えばWebシステムを構築する場合、Webサーバーとデータベースを、それぞれ別のコンテナとして動かせます。必要なソフトウェアや設定をコンテナごとにまとめられるため、開発環境を別のパソコンやサーバーへ移すときも、同じ環境を再現しやすくなります。移行先にソフトウェアを1つずつインストールし、細かな設定を手作業で合わせる負担を減らせるのは、大きなメリットです。

コンテナを設計する際は、原則として、1つのコンテナに1つの役割を持たせます。Webサーバー、データベース、メール送信処理などをそれぞれ別コンテナに分ける考え方です。
1つのコンテナに多くの役割を詰め込むと、コンテナ単位での再利用や入れ替えが難しくなり、構成も複雑になります。その結果、柔軟性やメンテナンス性といった、コンテナ本来のメリットを損なうかもしれません。

このコンテナ技術を手軽に利用するための代表的なソフトウェアが「Docker」です。

Docker Composeとは


Docker Composeとは、複数のコンテナで構成されるアプリケーションを、まとめて定義・作成・起動するためのツールです。

例えばWebアプリケーションでは、Webサーバー、PHPの実行環境、データベースなど、複数の機能を組み合わせて使うことがあります。Docker Composeを使えば、それらを1つずつ操作するのではなく、まとめて起動・停止できます。

Dockerでは、「イメージ」をもとにコンテナを作成します。イメージとは、コンテナ内に用意するソフトウェアやファイルをまとめた、いわばコンテナのテンプレートです。
Dockerが提供するコンテナレジストリ「Docker Hub」では、MySQL、WordPress、Nginx、PHPなど、一般的なソフトウェアのイメージが公開されています。そのため、必要な実行環境を比較的手軽に用意できます。

Docker Composeとは

Docker Composeでコンテナの構成を定義する際は、YAML形式のcompose.yamlというファイルを使いますcompose.yamlには、使用するイメージ、作成するコンテナ、ポート番号、環境変数、ボリューム、コンテナ同士の関係などを記述します。

また、独自のイメージを作成したい場合は、Dockerfileというテキストファイルを使用します。Dockerfileには、ベースとなるイメージ、追加するファイル、インストールするソフトウェア、コンテナ起動時に実行する処理などを記述します。

compose.yamlの書き方


compose.yamlには、使用するイメージやポート、フォルダの割り当てなど、コンテナを動かすための設定をYAML形式で記述します。

services:
  web:
    image: httpd:2.4
    ports:
      - "8080:80"
    volumes:
      - ./:/usr/local/apache2/htdocs/

services

使用するサービスを定義する項目です。
「web」はサービス名で、ここではWebサーバーを表しています。

image

使用するイメージを指定します。
この例では、Apache HTTP Serverの公式イメージであるhttpdのバージョン2.4を使用しています。

ports

ホスト側とコンテナ側のポートを紐づける設定です。
8080:80は、ホスト側の8080番ポートを、コンテナ側の80番ポートへ接続することを意味します。

volumes

ホスト側のフォルダを、コンテナ内のフォルダへ割り当てる設定です。
./compose.yamlと同じディレクトリを表し、それをApacheの公開ディレクトリである/usr/local/apache2/htdocs/へ割り当てています。

また、MySQLやWordPressなどを使う場合は、データベース名やユーザー名、パスワードなどをenvironmentで設定することもあります。

基本的なDockerコマンド


Dockerには多くのコマンドがありますが、ここではDocker Composeを使った開発で、特によく使うものを紹介します。

コンテナを作成する

docker compose up -d

compose.yamlの設定に従って、必要なコンテナを作成します。-dを付けると、バックグラウンドで実行されます。
compose.yamlを変更した場合も、このコマンドを実行すれば、変更があったコンテナだけを再作成して起動できます。

コンテナを削除する

docker compose down

Docker Composeで作成したコンテナやネットワークを削除します。通常、名前付きボリュームは残るため、指定していればデータまで削除されるわけではありません。

起動状況を確認する

docker compose ps

Docker Composeで管理しているコンテナの状態や、使用しているポートを確認できます。

ログを確認する

docker compose logs サービス名

コンテナのログを表示します。
末尾にサービス名を付けると、特定のサービスのログだけを確認できます。さらに、リアルタイムで確認したい場合は-fを付けます。

コンテナ内でコマンドを実行する

docker compose exec サービス名 コマンド

起動中のコンテナ内でコマンドを実行します。設定やファイルの確認、PHPやMySQLの操作などで使います。例えば、サービス名にweb、コマンドにhttpd -vを指定すると、webコンテナ内でApacheのバージョンを確認できます。

データの永続化


コンテナ内に保存したデータは、原則としてコンテナを削除すると一緒に失われます。そのため、データベースなど継続して使いたいデータは、コンテナの外部へ保存しておく必要があります。

Dockerでデータを永続化する主な方法には、「ボリューム」と「バインドマウント」があります

ボリューム

ボリュームは、Dockerが管理する保存領域へデータを保存する仕組みです。コンテナを削除してもボリュームは残るため、新しく作成したコンテナから同じデータを引き続き利用できます。

保存場所はDockerが管理するので、通常のフォルダのようにホストOSから直接編集する用途にはあまり向きません。基本的には、コンテナへマウントしてデータを操作します。

バインドマウント

バインドマウントは、ホストOS上のファイルやフォルダを、コンテナ内へ直接割り当てる仕組みです。ホスト側でファイルを変更するとコンテナ側にも反映されるため、HTMLやPHPなど、開発中に直接編集したいソースコードの共有に向いています

ただしDocker Desktopでは、ホスト側とのファイル共有を挟むため、大量のファイルを扱うと動作が遅くなることがあります。特にWordPressのように多くのファイルを読み書きする環境では、保存場所や構成に少し注意が必要です。

さいごに


コンテナは、想像していた以上に便利な仕組みだと感じました。

これまで使ってこなかったのが、少し惜しく思えるほどです。もっと早く知っていれば、これまでの環境構築でも活用できる場面があったかもしれません。

Dockerはローカルの開発環境だけでなく、本番環境で使われることも珍しくないようです。運用面やセキュリティなど、まだ学ぶことは多くありますが、現在運用しているサイトも、いつかDockerを使った構成で動かしてみたいと思います。

参考サイト


arrow_upward