🐮

Docker編 2/3:docker composeを理解する ~HelmやEKSへの道~

2023/07/27に公開

社内でAWS EKS(Kubernetesをいい感じに動かせるAWSマネージドサービス)を使用するプロジェクトに参画したので、EKSに必須のDocker, Kubernetes, Helmについて学習したことをまとめていきます。
今回はDocker Composeについてです。

はじめに

Dockerとはなんぞやというとこからキャッチアップし、Kubernetes -> Helm -> EKSと段階を踏んでようやくEKSのすごさが理解ができるようになってきました。

いきなりEKSを触らなければならなくなった人(ほぼいないと思うが)のために
Docker -> Kubernetes -> Helm -> EKS
と順を追ってキャッチアップできるように記事を書いてみます。概念は他の記事に任せるとして実際に手を動かしたり、設定ファイルの見方などを中心にお伝えしていきます。また詳しい用語解説はしないので都度気になれば調べて、私にも教えてください(笑)

ゴール

Docker Composeを理解して設定ファイルの作成ができる。

やること

前回の記事でMongoDBのDockerコンテナを起動しアプリケーションと連携しました。dockerコマンドでDockerネットワーク作成してDockerコンテナを立ち上げるということをしてきました。なんかいろいろ設定してコマンド打って... って少し大変だったと思います。

なんとそれをDocker Composeで簡単にできてしまうということなんです!実際に手を動かしながら理解していきましょう!

JSとNodejsのアプリをMongoDBのDocker Containerに接続する。

  • フロント(html, css, js)
  • バックエンド(nodejs, express)
  • DB(mongodb) -> Dockerイメージ使用
  • Mongo ExpressはMongo DBをUIでいじれる便利なもの

イメージは下記の図の通り。詳細は動かしながら説明します。
altテキスト

事前準備

  • Docker Desktopというものを使用してローカルで dockerコマンドを使用するのでインストールしてください。

https://qiita.com/R_R/items/a09fab09ce9fa9e905c5

Docker Composeとは?

前回の記事では下記の手順でコンテナを立ち上げました。

  1. Docker ネットワーク作成
  2. MongoDB dockerコンテナ起動
docker run mongo
docker run -d \
  -p 27017:27017 \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=password \
  --name mongodb \
  --network mongo-network \
  mongo
  1. MongoDB Expressコンテナ起動
docker run mongo-express
docker run -d \
  -p 8081:8081 \
  -e ME_CONFIG_MONGODB_ADMINUSERNAME=admin \
  -e ME_CONFIG_MONGODB_ADMINPASSWORD=password \
  --name mongo-express \
  --network mongo-network \
  -e ME_CONFIG_MONGODB_SERVER=mongodb \
  mongo-express

小規模アプリなのでまだこの程度で済んでいますが、もっと多くのDockerを管理していこうとすると大変なのは想像に難くないですよね。これをyamlファイル作ってコマンド一つで立ち上げてしまえるというのがDocker composeです!

次から実際に触っていきましょう!

Docker Composeファイルの構成の理解

設定ファイルをコマンドと比較しながら見ていきましょう!

  1. コマンド(左)ではそれぞれのコンテナごとに実行しましたが、docker-composeファイル(右)ではservice配下に複数書くことができます。

  2. service配下に来るのがコンテナ名になります。コマンドでは--nameオプションで設定した部分ですね。さらにその配下にDocker hubなどから取得してくるDocker imageimage。コマンドでは最後に書いていた部分ですね。続けて -pオプションで設定した ports, -eで設定した environmentを書いていきます。
    docker networkはdocker composeの方でいい感じにまとめてくれるので特に記載する必要はありません!

  • コンテナ名

  • 起動するdocker image

  • ポート

  • 変数

実際にdocker composeでコンテナを起動する

上記の設定で docker-compose.yml ファイルを作成したら実際に起動してみます。
起動コマンドは docker-compose -f docker-compose.yaml up です。dockerをインストールした時点でdocker-composeコマンドも使用できるようになっています。

docker-compose.yaml
version: '3'
services:
  mongodb:
    image: mongo
    ports:
      - 27017:27017
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=password
    volumes:
      - mongo-data:/data/db
  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8080:8081
    environment:
      - ME_CONFIG_MONGODB_ADMINUSERNAME=admin
      - ME_CONFIG_MONGODB_ADMINPASSWORD=password
      - ME_CONFIG_MONGODB_SERVER=mongodb
volumes:
  mongo-data:
    driver: local

実行するとまずnetworkが docker-demo-app_default として立ち上がってるのがわかります。

あとは docker network lsで実際に docker-demo-app_defaultがあるのを確認したり、mongo express UI をいじったり、アプリケーションを立ち上げてアプリとDBの接続を確認してみたりしてください。
https://zenn.dev/mameta29/articles/909978b9274afc#それではブラウザで-http%3A%2F%2Flocalhost%3A8081%2F-を開いて確認しましょう!

コンテナを終了する

それでは立ち上げたコンテナを終了しましょう。
これもいたって簡単で docker-compose -f docker-compose.yaml down でコンテナを落とすことができます。先ほど upだったところをdownに書き直しただけですね。
このコマンドを実行することでmondgodbmongo-expressだけでなくDocker networkもremoveされていることがわかりますね。

以上です!
次回は実際にdocker imageをつくっていくためにDockerfileを理解してきます。

採用強化中

Onplanetz株式会社では「物を作れる人」が中心の会社を目指しています。

https://www.wantedly.com/companies/onplanetz

AI(機械学習)技術、Blockchain技術をコア事業として、テクノロジーを用いた課題解決、社会実装に日々取り組んでいます。

新しい技術に触れることができるので難しい分やりがいもあります!少しでも興味を持っている方はまずはお話ししましょう!

Discussion