狐好きぷろぐらまー

狐好きプログラマーのブログです。

Dockerチュートリアルをやってみた

お久しぶりです。 pregum_foxです。

今回は、あまり触れてこなかったDockerを勉強するためチュートリアルを一通り行った記録と躓いた箇所を記載していきたいと思います。

今回の記事はMac用なので、ところどころコマンドはWindows用に対応していない箇所があるため、実際にチュートリアルを見ていただいて読み替えてください。

動作環境

まずはhomebrew経由でdockerをインストールする

下記コマンドを実行し、dockerをインストールする。

brew cask install docker

私の場合は、上記だとbrewでエラーが出たため、caskをオプションにすると正常にインストールできた。

brew install docker --cask

見本のチュートリアル

下記のREADME.mdに沿ってgetting-startedを一通り進めていった。

github.com

細かくコマンドの使い方などが載っていた為、細かく覚えながら進めると意外と時間がかかった。

まずはgitからcloneするコマンドを叩いた。

ターミナル上で自分の作業用フォルダに移動して、下記コマンドを叩いた。

git clone https://github.com/docker/getting-started.git

そしてREADME.mdに書いている起動するコマンドを叩いた。

docker run -d -p 80:80 docker/getting-started

その後ブラウザで、http://localhost:80 へアクセスするとチュートリアル用のページが開いた。

下記はチュートリアルの各章ごとに概要と詰まったところを記載していく。


入門

概要

実行したコマンドの説明、Dockerのダッシュボードの使い方、コンテナとは何か?という説明が記載されていた。

簡単に説明すると

  • コマンド
    • -dは、コンテナをデタッチモード(バックグラウンド)で実行する。
    • -p 80:80 ホストのポート80をコンテナのポート80に紐付ける。
    • docker/getting-started 使用するイメージ
  • Dockerダッシュボード
    • 実行されているコンテナをGUI上で確認することができる。
    • 合わせて起動・停止もできる。
  • コンテナとは、ホストマシン上のプロセスから分離されたマシン上の別のプロセス。
    • それらのカスタム情報が詰まったものがコンテナイメージ

詰まったところ

  • docker runでエラーが出る。
    • 最初Docker自体が起動しなくググると、GUI上で同意する必要があったため、ターミナル上ではなくアプリケーションとしてDockerを実行し、項目に同意してからdocker runした。

私たちのアプリケーション

概要

この章では、nodeで動いているtodoアプリをdockerで起動するという章だった。 ただ、nodeについて知らなくても実行できるように細かく説明されている。

大まかな手順は

  1. todoアプリが入ったzipを落とす。(チュートリアル内にリンクがあった。)
  2. 起動するためのDockerfileを作成する。
  3. dockerからコンテナ(todoアプリ)を起動する。
  4. 最後にDockerダッシュボードに表示されていることを確認する。

詰まったところ

チュートリアル内に記載されているDockerfileでは動かなかったのでググると似た記事が出てきたのでそれと同じ対応を行った。

executor failed running [/bin/sh -c apk add --no-cache python g++ make] · Issue #214 · docker/getting-started · GitHub

具体的にはpythonのメジャーバージョン指定を入れるとうまくいった 修正後のDockerfileは下記の通り

 FROM node:12-alpine
 RUN apk add --no-cache python2 g++ make
 WORKDIR /app
 COPY . .
 RUN yarn install --production
 CMD ["node", "src/index.js"]

アプリを更新する

概要

実際にアプリ上のコードを変更してコンテナ(todoアプリ)を更新する方法を順を追って説明していた。

ここでは

  1. コードの修正
  2. コンテナの再生成
  3. 古いコンテナの削除
  4. 新しいコンテナの起動

の順に説明されていた

詰まったところ

この章では特に詰まったところはなかった。 docker runでエラーが出ることを事前に知らなかったためその次の説明でエラーが出ることを知らず少し時間を浪費したぐらい。


私たちのアプリを共有する

概要

この章では、自分が作成したコンテナをGitHubのDocker版ようなコンテナを共有するサイトにコンテナイメージをpushする作業を行います。

詰まったところ

この章では、Docker Hubにアカウントを作成する必要があり、自分はブラウザ上でDocker Hubに登録を行った。

また、チュートリアルにはユーザー名を含むコマンドを記載する必要があるため、逐一細かい説明はなかった。

そのため下記実行時にエラーが出た。

docker push docker/getting-started

下記記事と同じ対応を行うとうまく行った!

【備忘録】docker pushしたら拒否された - Qiita


DBを永続化する

概要

現状のtodoアプリでは、DBの永続化をしていないため、DBを永続化をする方法について学んだ。

ここでは、

  • ボリュームの使い方
  • コンテナから他コンテナへのアクセス方法

について学んだ。

詰まったところ

特に詰まったところはなかった。


バインドマウントの使用

概要

バインドマウントを使用してコードをコンテナにマウントし、コードの変更に応じてすぐ反映されるようにする。 チュートリアルではnodemonというライブラリを使用して対応した。

詰まったところ

特になかった。


マルチコンテナアプリ

概要

MySQLなどのDBを追加したときによく出る疑問である、DBはどこで実行されるのか? という疑問に答える章。

結論から話すと基本的にはDBで1つのコンテナを立ててDBコンテナ ー アプリコンテナで動かすのが良いという説明だった。 イメージは下記の通り。

チュートリアルから引用

この章では

  • ネットワークの作成方法
    • ここではなすネットワークはwwwの話ではなくローカル内で完結している話である。
  • ネットワーク経由でMySQLとtodoアプリを通信する方法

を学んだ。

詰まったところ

特になし


DockerComposeの使用

概要

Docker Composeと呼ばれるマルチコンテナアプリケーションの定義と共有を支援するために開発されたツール

Macの場合はすでにdocker install時に入っているため、チュートリアル通りにことが進められる。

この章では

  • Docker Composeとは?
  • Docker Composeで使用する docker-commpose.ymlファイルの作成方法
  • Docker Composeで実際に前章のMySQLとtodoアプリを起動する方法
  • DockerダッシュボードでのDocker Composeで起動したコンテナの見え方

について学んだ。

詰まったところ

特になし


イメージ構築のベストプラクティス

概要

この章では、イメージの脆弱性を調べる方法やコンテナ単位のログを出す方法、キャッシュを使用してビルドの時間を削減する方法について記載されていた

またReactや、JavaでのDockerfileのサンプルが載っていた。

詰まったところ

特になかった。


次は何?

概要

この章では、次に学ぶべき道標を示す章だった。

というキーワードについて掘り下げていくと良いと記載されていた。

詰まったところ

特になし


所感

チュートリアルが充実していてほとんど詰まることもなかった為、よかった。

一通り試すと完璧ではないものの得体の知れないDockerというもの、から複数のサービスがまとめて管理できるDockerという認識ができたので

知らないことを調べるのは大切だと思った。

参考サイト

Dockerを体系的に学べる公式チュートリアル和訳 - Qiita