Docker編 1/3:コンテナをとにかく動かしてみる ~HelmやEKSへの道~
今までインフラとは縁のないエンジニア人生だったが、社内でAWS EKS(Kubernetesをいい感じに動かせるAWSマネージドサービス)を使用するプロジェクトに参画。EKSに必須のDocker, Kubernetes, Helmについて学習したことをまとめていきます。
はじめに
Dockerとはなんぞやというとこからキャッチアップし、Kubernetes -> Helm -> EKSと段階を踏んでようやくEKSのすごさが理解ができるようになってきました。
いきなりEKSを触らなければならなくなった人(ほぼいないと思うが)のために
Docker -> Kubernetes -> Helm -> EKS
と順を追ってキャッチアップできるように記事を書いてみます。概念は他の記事に任せるとして実際に手を動かしたり、設定ファイルの見方などを中心にお伝えしていきます。また詳しい用語解説はしないので都度気になれば調べて私にも教えてください(笑)
ゴール
Dockerをとにかく触ってみる。
- 参考教材
https://www.youtube.com/watch?v=3c-iBn73dDE&t=9082s
英語で3時間ですがおすすめです!
やること
JSとNodejsのアプリをMongoDBのDocker Containerに接続する。
- フロント(html, css, js)
- バックエンド(nodejs, express)
- DB(mongodb) -> Dockerイメージ使用
- Mongo ExpressはMongo DBをUIでいじれる便利なもの
イメージは下記の図の通り。詳細は動かしながら説明します。
事前準備
- Docker Desktopというものを使用してローカルで
docker
コマンドを使用するのでインストールしてください。
- nodejsのインストールもお願いします。
Docker imageをローカルにもってくる
まずはDocker hubというなDocker imegeを置いてあるところからDocker imageをローカルにもってきます。
(mongoと検索すると上部に今回使用するmongoとmongo-expressが出てきますね。)
それぞれクリックすると右の方に docker pull <ダウンロードしたいimage>
というコマンドがあるのでそれを実行します。
(docker pull
は動かしたいdockerのイメージをローカルにダウンロードしてくるとの認識で良いかと思います。)
下記実行例です。(私は既にdocker pull
をしているので出力は違う可能性があります。)
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
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とは何かについては他の記事を参照してください。私はコンテナの管理をしやすくなるといった簡単に理解しています。
これからこの図のようにmongo-networkという任意の名前のネットワークを作成し、Mongo DBコンテナとMongo Expressコンテナを同じネットワーク上で動かしそれらを接続します。
下記のように実行することでmongo-network
というDocker Networkを作成できます。
(私の環境では既に作成済みなのでエラーになっています。)
mameta ~ %docker network create mongo-network
Error response from daemon: network with name mongo-network already exists
docker network ls
コマンドで現在のdocker networkの一覧を確認できます。
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 を実行
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を実行
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
クローンしたらその中にあるappディレクトリに入ります。
cd app
appディレクトリ配下で node server.js
を実行してアプリケーションをローカルで起動します。すると下記のイメージのように簡単にプロフィールが編集できるアプリケーションが立ち上がります。
実際にEdit Profile
ボタンを押して適当に変更してアップロードしてみてください。
その後にリロードしても値がもとに戻らないと思います。それはきちんとDBと接続できて変更を加えた値がDBに保存されているからです。
ちなみに変更えを加えたあとmongo express UIでも変更が確認できます。
アプリケーションとDBの接続
それでは具体的にDockerからローカルで立ち上げたMongoDBとアプリケーションがどのように接続できているかみてみます。
appディレクトリ配下のserver.jsをみます。
- まずMongoDBに接続するために必要なMongoClientオブジェクトを作成します。
- 立ち上げたMongoDBと接続するためにURLを設定します。
admin
やpassword
、ポート番号の27017
はdocler run
コマンドでコンテナを実行した際に設定した値です。
- この
databaseName
に先ほど mongo expressで設定したuser-account
をセットします。
- あとは上記で定めた値を使ってDBに接続しています。mongo express UIで作成したテーブル
users
の値も設定しているのがわかりますね。
採用強化中
Onplanetz株式会社では「物を作れる人」が中心の会社を目指しています。
AI(機械学習)技術、Blockchain技術をコア事業として、テクノロジーを用いた課題解決、社会実装に日々取り組んでいます。
新しい技術に触れることができるので難しい分やりがいもあります!少しでも興味を持っている方はまずはお話ししましょう!
以上です!
Discussion