🔥

Docker編 1/3:コンテナをとにかく動かしてみる ~HelmやEKSへの道~

2023/07/22に公開

今までインフラとは縁のないエンジニア人生だったが、社内でAWS EKS(Kubernetesをいい感じに動かせるAWSマネージドサービス)を使用するプロジェクトに参画。EKSに必須のDocker, Kubernetes, Helmについて学習したことをまとめていきます。

はじめに

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

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

ゴール

Dockerをとにかく触ってみる。

やること

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

  • nodejsのインストールもお願いします。

https://qiita.com/sefoo0104/items/0653c935ea4a4db9dc2b

Docker imageをローカルにもってくる

まずはDocker hubというなDocker imegeを置いてあるところからDocker imageをローカルにもってきます。
(mongoと検索すると上部に今回使用するmongoとmongo-expressが出てきますね。)

それぞれクリックすると右の方に docker pull <ダウンロードしたいimage>というコマンドがあるのでそれを実行します。
(docker pullは動かしたいdockerのイメージをローカルにダウンロードしてくるとの認識で良いかと思います。)

下記実行例です。(私は既にdocker pullをしているので出力は違う可能性があります。)

docker pull mongo
mameta ~ %docker pull mongo
Using default tag: latest
latest: Pulling from library/mongo
Digest: sha256:20f3adcaffe2193e49dd502c8299b770d49a1e0643e0e9db250d5c127b1e9ed8
Status: Image is up to date for mongo:latest
docker.io/library/mongo:latest
docker pull mongo-express
mameta ~ %docker pull mongo-express
Using default tag: latest
latest: Pulling from library/mongo-express
Digest: sha256:dcfcf89bf91238ff129469a5a94523b3025913dcc41597d72d4d5f4a0339cc7d
Status: Image is up to date for mongo-express:latest
docker.io/library/mongo-express:latest

Docker Networkをつくる

Docker Networkとは何かについては他の記事を参照してください。私はコンテナの管理をしやすくなるといった簡単に理解しています。
https://knowledge.sakura.ad.jp/23899/

これからこの図のようにmongo-networkという任意の名前のネットワークを作成し、Mongo DBコンテナとMongo Expressコンテナを同じネットワーク上で動かしそれらを接続します。

下記のように実行することでmongo-networkというDocker Networkを作成できます。
(私の環境では既に作成済みなのでエラーになっています。)

docker network create mongo-network
mameta ~ %docker network create mongo-network
Error response from daemon: network with name mongo-network already exists

docker network lsコマンドで現在のdocker networkの一覧を確認できます。

docker network ls
mameta ~ %docker network ls
NETWORK ID     NAME            DRIVER    SCOPE
1a835325e418   bridge          bridge    local
d31e5393582f   host            host      local
0f4ba47c9e4c   mongo-network   bridge    local
8c788ef34333   none            null      local

Docker runでコンテナを実行

まずは mongo を実行

docker run mongo
mameta ~ %docker run -d \
	-p 27017:27017 \
        -e MONGO_INITDB_ROOT_USERNAME=admin \
        -e MONGO_INITDB_ROOT_PASSWORD=secret \
	--name mongodb \
	--network mongo-network \
        mongo

コマンドの詳細な説明は省きますが、簡単に解説します。

  • -d : デタッチモードでコンテナがバックグラウンドで実行される
  • -p 27017:27017 : ホストのポート27017をコンテナのポート27017にマッピング(ちなみにDocker hubのmongoのページにもありますが、mongoは27017がデフォルトみたいです。)
  • -e : は変数の値を設定。どのような変数名で何を設定する必要があるかはDocker hubに記載があります。
  • -name : コンテナ名
  • --network : docker networkを指定
  • 最後にダウンロードしてきたどのimageを実行するのか(mongo)を指定しています。

次にmongo-expressを実行

docker run mongo-express
mameta ~ %docker run -d \
	-p 8081:8081 \
        -e ME_CONFIG_MONGODB_ADMINUSERNAME=admin \
        -e ME_CONFIG_MONGODB_ADMINPASSWORD=secret \
	--name mongo-express \
	--network mongo-network \
	-e ME_CONFIG_MONGODB_SERVER=mongodb \
        mongo-express

コマンドでやっていることは mongo の時とあまり変わりませんが
-eで設定している変数の値は、上記で実行しているmongodbのものと接続するために大切なものです。詳しくはDocler hubで確認してください。

実際に実行すると私は既にコンテナを実行しているので下記のエラーが出ますが、このようなコンテナIDが取得できると思います。

このmongo-expressのコンテナIDを docker logs <コンテナID>のコマンドで確認するとポート8081でリッスンしていることが確認できます。

それではブラウザで http://localhost:8081/ を開いて確認しましょう!

下記のイメージのようにmongo expressのUIが表示されていれば、mongoコンテナとmongo-expressコンテナをローカルで動かし、それぞれを接続できたことになります。

テーブルを作成する

実際にmongo-express UIをいじってテーブルを作成しましょう。
下記イメージのようにDBを作成します。

その後下記のようにテーブルを作成します。

アプリケーションを動かしてみる

それではDockerコンテナを動かしローカルで動かせるようになったDBをアプリケーションに接続していきましょう!

まずは下記リポジトリをクローンしてください。
git clone https://github.com/Mameta29/docker-demo-app.git
https://github.com/Mameta29/docker-demo-app

クローンしたらその中にあるappディレクトリに入ります。
cd app

appディレクトリ配下で node server.jsを実行してアプリケーションをローカルで起動します。すると下記のイメージのように簡単にプロフィールが編集できるアプリケーションが立ち上がります。

実際にEdit Profileボタンを押して適当に変更してアップロードしてみてください。
その後にリロードしても値がもとに戻らないと思います。それはきちんとDBと接続できて変更を加えた値がDBに保存されているからです。

ちなみに変更えを加えたあとmongo express UIでも変更が確認できます。

アプリケーションとDBの接続

それでは具体的にDockerからローカルで立ち上げたMongoDBとアプリケーションがどのように接続できているかみてみます。

appディレクトリ配下のserver.jsをみます。

  • まずMongoDBに接続するために必要なMongoClientオブジェクトを作成します。

https://github.com/Mameta29/docker-demo-app/blob/main/app/server.js#L4-L4

  • 立ち上げたMongoDBと接続するためにURLを設定します。

adminpassword、ポート番号の27017docler runコマンドでコンテナを実行した際に設定した値です。
https://github.com/Mameta29/docker-demo-app/blob/main/app/server.js#L25-L26

  • このdatabaseNameに先ほど mongo expressで設定した user-accountをセットします。

https://github.com/Mameta29/docker-demo-app/blob/main/app/server.js#L34-L35

  • あとは上記で定めた値を使ってDBに接続しています。mongo express UIで作成したテーブルusersの値も設定しているのがわかりますね。

https://github.com/Mameta29/docker-demo-app/blob/main/app/server.js#L37-L62

採用強化中

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

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

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

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

以上です!

Discussion