docker-compose_アイキャッチ

【初心者向け】docker-composeで複数コンテナをまとめて管理する方法 【前編】

はじめに

これまでDockerで仮想環境を作成して開発環境を簡単に構築する方法をまとめてきましたが、実際のサービスとしてプログラミング開発を行うとなった場合にコンテナ一つで進めるのはまれです。
例えば、このブログはWordPressを使って構築されていますが、必要なミドルウェアとしてはWebサーバー(WordPressのプログラム)、DBサーバー(記事などのデータを保存)が最低でも必要となります。
規模が小さい場合、1台のサーバーにwebサーバーとDBサーバーのミドルウェアをインストールしても問題ありませんが、仮にブログのアクセス数が増加に増加を重ねてサーバーのスペックを上げる必要があったとき、その1台のサーバーをスペックアップする必要があります。ですが、1台のスペックアップにも限界がありますし上げれたとしてもかなりコストが高くつきます。
このような場合たいてい、WEBサーバーを複数台用意してアクセスを分散させる方式をとります。
Dockerでも同様にWEBサーバーとDBサーバーでそれぞれコンテナを立ち上げて処理を行います
そうなると次に問題になってくるのが、各コンテナを構築、管理するのが手間になってきます。
そんな複数のコンテナからなるシステム構築を簡単に行うためのツールがdocker-composeです。
今回は、docker-composeを使ってまとめて環境を構築する方法についてまとめていきます。
動作環境

 Windows10

 Docker Desktop

Dockerについて

そもそものDockerについて、またインストール方法は以下の記事で紹介しています。

関連記事

はじめに プログラミングを行う際に実行環境を構築する必要がありますが、普段利用しているローカルPCに直接インストールしてしまっては、トライアンドエラーを繰り返すうちに不要なアプリケーションが積み重なり動作が不安定にな[…]

begindocker_アイキャッチ
また、DockerはWindows TerminalのPowerShellで行います。
こちらの記事でWindows Terminalのインストール方法も紹介していますので良ければ参照してください。
関連記事

はじめに Windows環境でLinuxのコマンドが利用できるWSL2についてインストールおよび利用方法を説明します。 Linuxコマンドが使えるようになると、様々なプログラミング言語や開発に利用できますので非常に[…]

beginwsl_アイキャッチ

docker-composeの簡単な例

最初にdocker-composeを用いて1コンテナを構成してみようと思います。

以前、作成したnumpyを使って簡単な数学の解を求めるpythonプログラムを実行する環境を構築します。

フォルダ構成

今回の例では以下のようなファイル構成となっています。

py_test/
|-- docker-compose.yml
|-- Dockerfile
|-- requirements.txt
`-- src/
    `-- calc.py

Dockerfileを作成する

まずはDockerfileの中身を記述していきます。まずは記述内容として以下となります。

FROM python:3.9.8

RUN apt update -y && apt upgrade -y && apt autoremove -y

RUN apt install -y vim

# タイムゾーン変更
ENV TZ=Asia/Tokyo

WORKDIR /root/src

ADD requirements.txt /root/src

RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
RUN pip install -r requirements.txt

今回はpythonのイメージから実行環境をPullしています。

pythonのソースコードを配置するためのディレクトリとして/root/srcを用意しています。

requirements.txt でnumpyをインストールしています。

numpy==1.23.4

docker-compose.ymlを作成する

docker-compose コマンドを使った時の設定ファイルである docker-compose.yml を作成します。

こちらに各コンテナの構成情報を記載していきます。

version: "3"
services:
    python3:
    restart: always
    build: .
    container_name: "python3"
    working_dir: "/root/src"
    tty: true
    volumes:
        - ./src:/root/src

versionは、docker-compose.ymlのファイルフォーマットのバージョンを表しています。とりあえず現時点では3が安定して利用できるようです。

serviceは、コンテナの単位です。次の行でpython3を指定していますが、これがserviceの名前になります。そのため、例えばWEBサーバー、DBサーバーが必要な場合は、それぞれservicesの下に名前を付けて記載します。この名前はコンテナ間で連携する際に利用することができます。

restart: alwaysはホストOSやDockerデーモンが起動したときにコンテナを自動的に起動してくれるようになります。PC起動時や再起動したときにコンテナを起動する必要がある場合は指定しましょう。

build: .はDockerfileの参照場所を指定します。今回はdocker-compose.ymlと同じ階層に配置しているので、.となります。

container_nameは起動するコンテナの名前を指定することができます。この後コンテナでコマンドを実行する際に利用します。

working_dirはDockerfileのWORKDIRと同じ階層を指定しています。コンテナでコマンドを実行した際のデフォルトのディレクトリとなります。

ttyはTrueにすることでコンテナ起動した後に継続して起動し続けることができます。docker run-itというオプションを指定したと思いますが、この-tオプションのことです。

volumesはローカルPCとコンテナ間でフォルダ共有ができるようになります。今回はローカルPCのsrcフォルダをコンテナ内の/root/srcにマウントしています。

イメージをbuildする

それでは、作成したdocker-compose.ymlからイメージをbuildして作成していきます。

PowerShellでdocker-compose.ymlが保存されている階層に移動し、以下のコマンドを実行する。

docker-compose build

Dockerのイメージが作成されたことが確認できます。

docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
python-python3        latest    1b64577149af   42 minutes ago   1.24GB

コンテナの起動

次にdocker-composeで作成したイメージからコンテナを起動します。

docker-compose up -d

docker-compose upでコンテナの起動ができます。ただしこの状態で起動するとフォアグランドで起動するため、PowerShellでの操作ができなくなってしまいます。

そこで-dオプションをつけることでバックグラウンドで起動することができます。

起動したコンテナの状態を確認するには、以下のコマンドを実行します。

docker-compose ps
NAME                COMMAND             SERVICE             STATUS              PORTS
python3             "python3"           python3             running

STATUSがrunningとなっているので、起動していることが確認できます。

コンテナ内のコマンド実行

起動したコンテナ内のコマンドを実行するには以下のように行います。

docker exec -it python3 pwd
/root/src

docker exec -itに対象のコンテナ名を指定し、最後に実行したいコマンドを入力します。

今回の場合は、pwdコマンドなので、カレントディレクトリの場所が表示されています。/root/srcはworking_dirで指定したディレクトリですので正しい結果が返ってきているのが確認できます。

最後のコマンド部分をbashコマンドに変更することで、対象コンテナのプロンプトに変わりコマンド操作が可能となります。

docker exec -it python3 bash
root@b6abc7d867f5:~/src#

pythonコマンドを実行する

pythonプログラムコードを実行します。ローカルPCの./srcフォルダに以下のpythonプログラムコードcalc.pyを配置します。

import numpy as np #numpyパッケージを利用することの宣言

print("root2 : " + str(np.sqrt(2))) #ルート2

print("e : " + str(np.e)) #自然対数e

print("pi : " + str(np.pi)) #円周率

print("log2 : " + str(np.log(2))) #log2

calc = np.roots([1,2,-8]) #2次方程式
print("X^2+2X-8 : " + str(calc))

次に、依存パッケージであるnumpyがインストールされているか確認します。

pip list
Package    Version
---------- -------
numpy      1.23.4
pip        22.3
setuptools 65.5.0
wheel      0.37.0

numpyが存在しているので、requirements.txtからインストールされていることが確認できます。

pythonプログラムコードも問題なく実行できることが確認できます。

python calc.py
root2 : 1.4142135623730951
e : 2.718281828459045
pi : 3.141592653589793
log2 : 0.6931471805599453
X^2+2X-8 : [-4.  2.]

コンテナの停止

docker-composeで起動したコンテナを停止するには以下のコマンドを実行します。

docker-compose stop

コンテナ一覧を確認すると停止していることが確認できます。

docker-compose ps
NAME                COMMAND             SERVICE             STATUS              PORTS
python3             "python3"           python3             exited (137)

イメージ・コンテナの削除

最後に作成したイメージ、コンテナの削除方法です。

以下のコマンドを実行するとコンテナを終了します。

docker-compose down

コンテナ一覧を確認すると削除されていることが確認できます。

docker-compose ps
NAME                COMMAND             SERVICE             STATUS              PORTS

しかし、イメージについては削除されません。

docker images
REPOSITORY            TAG       IMAGE ID       CREATED             SIZE
python-python3        latest    1b64577149af   About an hour ago   1.24GB

イメージも削除したい場合は、–rmi allオプションをつけると削除が可能です。

docker-compose down --rmi all

まとめ

docker-composeを使って環境構築をファイルとして保存およびイメージ作成、コンテナ作成方法についてまとめました。
今回は簡単な例として1つのコンテナを起動しましたが、次回は複数コンテナを起動する場合についてまとめたいと思います。
関連記事

はじめに 前回、docker-composeを使って、環境構築および構成情報をファイルとして作成しコンテナ起動までを行いました。 [sitecard subtitle=関連記事 url=https://mi-suk[…]

Dockerの操作についてより詳しく知りたい方は以下のような書籍を参考にしてみてください。
たった1日で基本が身に付く! Docker/Kubernetes超入門
著者:伊藤 裕一 (著)
出版社:技術評論社
本書は、次世代のアプリケーションアーキテクチャとして注目されている「マイクロサービス」の技術基盤となるコンテナ技術「Docker」とコンテナオーケストレーション技術「Kubernetes」を取り上げ、Dockerの基本的な利用法、DockerfileやComposeの設計、コンテナのデータ永続化やCI/CD、Kubernetesによる複数コンテナの自動管理までを、一気に学習します。出典:Amazon
さわって学ぶクラウドインフラ docker基礎からのコンテナ構築

著者:大澤 文孝 (著), 浅居 尚 (著) 
出版社:日経BP
本書では、Dockerのインストール方法に始まり、基本的なWebサーバーを起動させるところから、永続化、ネットワーク、コンテナイメージへと順番に学ぶことができます。さらに、複数のコンテナを使うことを想定し、「Docker Compose」や「Kubernetes」についても学習できます。Kubernetesは学習ツールとして「Minikube」を用い、最終的に「Amazon EKS」でコンテナを実行するはじめの一歩までを説明します。出典:Amazon
Docker実践ガイド 第2版 impress top gearシリーズ

著者:古賀 政純 (著)
出版社:インプレス
IT現場で役立つ、Dockerの導入、運用ノウハウを凝縮。Dockerが利用される環境や背景を説明し、導入前のシステム設計、Dockerの基本的な利用方法、Dockerfileによる自動化の手法、管理・監視ツールについて、実際に操作をしながら解説します。出典:Amazon