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が再度吐かれたのみです。しかし、ダッシュボードを確認してみると、確かに止まっていることが分かります。 止まっているのを確認できたので、削除してみます。
PS C:\Users\530lo\Documents\docker\tutorial\app\app> docker rm 6d38cec454f4 6d38cec454f4
これまたコンテナIDを吐かれるのみ。ダッシュボードを見ると、ちゃんと消えていますね。
これで古いコンテナの削除が完了。ちなみに、予めコンテナを止めないでも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/を開くと、文言の更新を確認できました。
ソース更新後のコンテナリビルドとコンテナの削除方法が分かったところで、このチャプターは終わりです。 リビルド起因でToDoリストのデータが消えてしまったことへの対応方法や、ちょっとした更新の際にコンテナを新しく作り直さなくてよい方法などは今後紹介されるようです。
DevOps時代の入り口に近づいている気がします。