dockerに入門してみる(その3)

次にリリースする機能要件の検証を丸ごと渡されていて、日夜調べ学習の日々。色んなところでDockerのイメージが云々って書かれていて、今やってる勉強は確実にQAエンジニアリングの活かせるのだなと実感しています。

前回の記事はこちら↓ ren-opdev.hatenablog.com

ソースを修正し、再度buildする。

今回は、Todo Appに何もアイテムが無いときの文言を変える、というタスクに取り組んでみます。
といっても、既にsrc/static/js/app.jsの中に「アイテム数がゼロのときにxxxxと表示する」みたいな実装があるので、その中の文言を変えるだけです。

ソースを修正して、再度docker buildを実行します。

PS C:\Users\530lo\Documents\docker\tutorial\app\app> docker build -t getting-started .
[+] Building 14.9s (9/9) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                                                                                                      0.0s
 => => transferring dockerfile: 31B                                                                                                                                                                                                                                       0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                                                         0.0s
 => => transferring context: 2B                                                                                                                                                                                                                                           0.0s
 => [internal] load metadata for docker.io/library/node:12-alpine                                                                                                                                                                                                         1.2s
 => [internal] load build context                                                                                                                                                                                                                                         0.0s
 => => transferring context: 7.89kB                                                                                                                                                                                                                                       0.0s
 => [1/4] FROM docker.io/library/node:12-alpine@sha256:f41254711c6490fc7d97ade245a853ff31cb25f1f86171359845b71d2ccec2aa                                                                                                                                                   0.0s
 => => resolve docker.io/library/node:12-alpine@sha256:f41254711c6490fc7d97ade245a853ff31cb25f1f86171359845b71d2ccec2aa                                                                                                                                                   0.0s
 => CACHED [2/4] WORKDIR /app                                                                                                                                                                                                                                             0.0s
 => [3/4] COPY . .                                                                                                                                                                                                                                                        0.1s
 => [4/4] RUN yarn install --production                                                                                                                                                                                                                                  12.2s
 => exporting to image                                                                                                                                                                                                                                                    1.3s
 => => exporting layers                                                                                                                                                                                                                                                   1.3s
 => => writing image sha256:7d2a760d3274c0143fb7170e3557402e7ec28bdf2c57ad278c8dcce14e66febb                                                                                                                                                                              0.0s
 => => naming to docker.io/library/getting-started

無事終了したので、アプリケーションを実行します。

PS C:\Users\530lo\Documents\docker\tutorial\app\app> docker run -dp 3000:3000 getting-started
55133de279476fa02960ede850b8eea735f8feb3eb7772b38bb7abe0b9929598
docker: Error response from daemon: driver failed programming external connectivity on endpoint great_snyder (3fd1513661c0db7debe800160b8af62aaddad3b0975353416b42363cc2753b7a): Bind for 0.0.0.0:3000 failed: port is already allocated.

失敗しましたね。
と思ったら、Tutorialの方でも失敗を想定しているみたいでした。
どうやら、古いコンテナがいまだにホストPCの3000番を使っていたことが原因のようです。古いコンテナを何とかしましょう。

古いコンテナを取り除く。

古いコンテナを取り除くには、まずコンテナを止めないといけません。止めた後だと、削除することが出来ます。そして、コンテナの削除方法には2つの方法があるようです。

1. コマンドプロンプトから削除する。

まず、docker psでコンテナIDを取得します。

PS C:\Users\530lo\Documents\docker\tutorial\app\app> docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED       STATUS        PORTS                    NAMES
6d38cec454f4   df95916b5a55             "docker-entrypoint.s…"   4 hours ago   Up 4 hours    0.0.0.0:3000->3000/tcp   quirky_bardeen
8252f51c483b   docker/getting-started   "/docker-entrypoint.…"   2 days ago    Up 38 hours   0.0.0.0:80->80/tcp       elastic_blackburn

取得できました。ポート3000番に対応するIDは6d38cec454f4ですね。 では、これを用いてコンテナを止めます。

PS C:\Users\530lo\Documents\docker\tutorial\app\app> docker stop 6d38cec454f4
6d38cec454f4

これといったログは出ず、コンテナIDが再度吐かれたのみです。しかし、ダッシュボードを確認してみると、確かに止まっていることが分かります。 f:id:renkataoka:20201217224437p:plain 止まっているのを確認できたので、削除してみます。

PS C:\Users\530lo\Documents\docker\tutorial\app\app> docker rm 6d38cec454f4
6d38cec454f4

これまたコンテナIDを吐かれるのみ。ダッシュボードを見ると、ちゃんと消えていますね。 f:id:renkataoka:20201217225507p:plain

これで古いコンテナの削除が完了。ちなみに、予めコンテナを止めないでもdocker rm -f <the-container-id>で強制削除することはできるみたいです。

2. ダッシュボードから削除する。

ダッシュボードからは、コンテナアイテムをホバーすると出てくる削除ボタンを押せば削除できるみたいです。超簡単!

更新したコンテナを実行する。

3000番を開放できたので、今一度コンテナを実行します。

PS C:\Users\530lo\Documents\docker\tutorial\app\app> docker run -dp 3000:3000 getting-started
9750bd953d92bc8c92c2ed3342098d44b86348edabdb786af57272c78acd027c

実行できたみたいです。
改めてhttp://localhost:3000/を開くと、文言の更新を確認できました。 f:id:renkataoka:20201217230441p:plain

ソース更新後のコンテナリビルドとコンテナの削除方法が分かったところで、このチャプターは終わりです。
リビルド起因でToDoリストのデータが消えてしまったことへの対応方法や、ちょっとした更新の際にコンテナを新しく作り直さなくてよい方法などは今後紹介されるようです。

DevOps時代の入り口に近づいている気がします。