公式Dockerチュートリアルをやってみた（Dockerの概念・進め方などの備忘録）

# はじめに
プログラミング初学者が公式Dockerチュートリアルをやってみてわかったこと、チュートリアルの進め方についてまとめました。同じような初心者へのシェア・自分自身の備忘録として残してみます。

自分自身はWordPressをDockerで環境構築したことがありますが、コピペも多く深く理解できていなかったので、公式Dockerチュートリアルに挑戦しました。

注）まだ学習中なので、不確かな部分には「〜らしい」「〜のようだ」といった口調にしています。

# Dockerって？
Dockerを使えば、アプリなどの環境構築を簡単にできます。また、それをそのまま本番環境では流用できるらしいです（私自身はローカルでのみ使用）。

![docker-compose-01-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275224/adccb6ea-9357-56b7-d79a-2659ec81cc15.png)
引用：https://knowledge.sakura.ad.jp/21387/

Dockerの利点↓
- コード化されたファイルを共有することで、どこでも誰でも同じ環境が作れる。
- 作成した環境を配布しやすい。
- スクラップ＆ビルドが容易にできる。
引用：https://knowledge.sakura.ad.jp/13265/

## ローカルで環境構築
phpとDBも組み合わせた初歩的なアプリを開発しようと思ったら、それらが動作するように環境構築します。

その場合、MAMPやXAMPPなどの外部アプリで一瞬で環境構築された状態を整えることができます。ただ、もっと複雑になってきたりすると、そういったアプリがない場合がほとんどかと思います。

そのときに、Dockerを使うと簡単に環境構築をできるようです。

![VM_Container-768x437.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275224/18f82a30-08fd-6ac3-982d-74de03643eb3.jpeg)
引用：https://knowledge.sakura.ad.jp/13265/

上の図のように、Dockerは仮想マシン（VW）と比較されることがあります。

左の仮想マシンを見ると「ゲストOS」がありますが、右のDockerではありません。Dockerは自身のPCなどのOS上で動作します。

したがって、Dockerは仮想マシンと異なり「ゲストOS」が搭載されていないので、軽くて済むという利点もあります。

# 公式Dockerチュートリアル

URLはこちら↓

https://docs.docker.jp/get-started/toc.html

比較的簡単なので、早くて3日や、1partを1日で10日で終わらせると思います。

## このチュートリアルでわかること

- Dockerfileでのコンテナを構築
- コマンド操作でコンテナを構築
- Docker ComposeというツールとComposeファイルを使って、複数コンテナを構築
- Docker Hubでのイメージ共有方法

## Dockerの用語

チュートリアルでは以下の用語がサラッと説明されているので、今自分が何をしているのか立ち返るときに以下を見ると頭の整理になるかと思います。

- Dockerfile：このファイルを`$ docker build`でビルドすることでDockerイメージを生成することができる
- (Docker)イメージ：Dockerイメージを`$ docker run`で起動することでコンテナが実行ができる
- (Docker)コンテナ：アプリケーションの実行環境

![スクリーンショット 2023-04-13 19.28.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275224/9d145b1e-0195-ba9f-a54c-54d85e900997.png)

引用：https://www.kagoya.jp/howto/cloud/container/dockerimage/

----

- docker-compose：複数のDockerコンテナを組み合わせてアプリケーションを実行するためのツール
- docker-composeファイル：「docker-compose.yml」ファイルはDocker Composeを使用するための設定ファイル

![docker-compose-01-04-fix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275224/1eadf94c-2b02-e637-369e-5c2c6eb847b2.png)
引用：https://knowledge.sakura.ad.jp/21387/

## チュートリアルの目次
<ul>
<li class="toctree-l1"><a class="reference internal" href="index.html">Part 1:始めましょう</a><ul>
<li class="toctree-l2"><a class="reference internal" href="index.html#download-and-install-docker">Docker のダウンロードとインストール</a></li>
<li class="toctree-l2"><a class="reference internal" href="index.html#start-the-tutorial">チュートリアルの開始</a></li>
<li class="toctree-l2"><a class="reference internal" href="index.html#the-docker-dashboard">Docker ダッシュボード</a></li>
<li class="toctree-l2"><a class="reference internal" href="index.html#what-is-a-container">コンテナとは何？</a></li>
<li class="toctree-l2"><a class="reference internal" href="index.html#what-is-a-container-image">コンテナ・イメージとは何でしょうか？</a></li>
<li class="toctree-l2"><a class="reference internal" href="index.html#cli">CLI リファレンス</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="02_our_app.html">Part 2:サンプル アプリケーション</a><ul>
<li class="toctree-l2"><a class="reference internal" href="02_our_app.html#get-the-app">アプリの入手</a></li>
<li class="toctree-l2"><a class="reference internal" href="02_our_app.html#build-the-apps-container-image">アプリのコンテナ イメージを <ruby><rb>構築</rb><rp>(</rp><rt>build</rt><rp>)</rp></ruby></a></li>
<li class="toctree-l2"><a class="reference internal" href="02_our_app.html#start-an-app-container">アプリ コンテナの起動</a></li>
<li class="toctree-l2"><a class="reference internal" href="02_our_app.html#part2-recap">まとめ</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="03_updating_app.html">Part 3:アプリケーションの更新</a><ul>
<li class="toctree-l2"><a class="reference internal" href="03_updating_app.html#update-the-source-code">ソースコードの変更</a></li>
<li class="toctree-l2"><a class="reference internal" href="03_updating_app.html#replace-the-old-container">古いコンテナを置き換える</a></li>
<li class="toctree-l2"><a class="reference internal" href="03_updating_app.html#part3-recap">まとめ</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="04_sharing_app.html">Part 4:アプリケーションの共有</a><ul>
<li class="toctree-l2"><a class="reference internal" href="04_sharing_app.html#create-a-repo">リポジトリ作成</a></li>
<li class="toctree-l2"><a class="reference internal" href="04_sharing_app.html#push-the-image">イメージを <ruby><rb>送信</rb><rp>(</rp><rt>push</rt><rp>)</rp></ruby></a></li>
<li class="toctree-l2"><a class="reference internal" href="04_sharing_app.html#run-the-image-on-a-new-instance">新しいインスタンスでイメージを実行</a></li>
<li class="toctree-l2"><a class="reference internal" href="04_sharing_app.html#part-4-recap">まとめ</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="05_persisting_data.html">Part 5:DBの保持</a><ul>
<li class="toctree-l2"><a class="reference internal" href="05_persisting_data.html#the-containers-filesystem">コンテナのファイルシステム</a></li>
<li class="toctree-l2"><a class="reference internal" href="05_persisting_data.html#container-volumes">コンテナの <ruby><rb>ボリューム</rb><rp>(</rp><rt>volume</rt><rp>)</rp></ruby></a></li>
<li class="toctree-l2"><a class="reference internal" href="05_persisting_data.html#todo">todo データの保持</a></li>
<li class="toctree-l2"><a class="reference internal" href="05_persisting_data.html#dive-into-the-volume">ボリュームを深掘り</a></li>
<li class="toctree-l2"><a class="reference internal" href="05_persisting_data.html#part5-recap">まとめ</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="06_bind_mounts.html">Part 6:バインド マウントを使う</a><ul>
<li class="toctree-l2"><a class="reference internal" href="06_bind_mounts.html#quick-violume-type-comparisons">ボリューム型の素早い比較</a></li>
<li class="toctree-l2"><a class="reference internal" href="06_bind_mounts.html#start-a-dev-mode-container">開発モードのコンテナを起動</a></li>
<li class="toctree-l2"><a class="reference internal" href="06_bind_mounts.html#part6-recap">まとめ</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="07_multi_container.html">Part 7:複数コンテナのアプリ</a><ul>
<li class="toctree-l2"><a class="reference internal" href="07_multi_container.html#container-networking">コンテナのネットワーク機能</a></li>
<li class="toctree-l2"><a class="reference internal" href="07_multi_container.html#mysql">MySQL の起動</a></li>
<li class="toctree-l2"><a class="reference internal" href="07_multi_container.html#connet-to-mysql">MySQL に接続</a></li>
<li class="toctree-l2"><a class="reference internal" href="07_multi_container.html#id5">MySQL とアプリを動かす</a></li>
<li class="toctree-l2"><a class="reference internal" href="07_multi_container.html#part7-recap">まとめ</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="08_using_compose.html">Part 8:Docker Composeを使う</a><ul>
<li class="toctree-l2"><a class="reference internal" href="08_using_compose.html#install-docker-compose">Docker Compose のインストール</a></li>
<li class="toctree-l2"><a class="reference internal" href="08_using_compose.html#compose">Compose ファイルの作成</a></li>
<li class="toctree-l2"><a class="reference internal" href="08_using_compose.html#define-the-app-service">アプリのサービス定義</a></li>
<li class="toctree-l2"><a class="reference internal" href="08_using_compose.html#mysql">MySQL サービスの定義</a></li>
<li class="toctree-l2"><a class="reference internal" href="08_using_compose.html#run-the-application-stack">アプリケーション スタックの実行</a></li>
<li class="toctree-l2"><a class="reference internal" href="08_using_compose.html#docker">Docker ダッシュボードでアプリのスタックを表示</a></li>
<li class="toctree-l2"><a class="reference internal" href="08_using_compose.html#tear-it-all-down">全てを削除</a></li>
<li class="toctree-l2"><a class="reference internal" href="08_using_compose.html#part8-recap">まとめ</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="09_image_best.html">Part 9:イメージ構築のベストプラクティス</a><ul>
<li class="toctree-l2"><a class="reference internal" href="09_image_best.html#security-scanning"><ruby><rb>安全性の検査</rb><rp>(</rp><rt>security scanning</rt><rp>)</rp></ruby></a></li>
<li class="toctree-l2"><a class="reference internal" href="09_image_best.html#image-layering">イメージの <ruby><rb>階層化</rb><rp>(</rp><rt>layering</rt><rp>)</rp></ruby></a></li>
<li class="toctree-l2"><a class="reference internal" href="09_image_best.html#layer-caching">レイヤーのキャッシュ</a></li>
<li class="toctree-l2"><a class="reference internal" href="09_image_best.html#get-started-multi-stage-build"><ruby><rb>マルチステージ ビルド</rb><rp>(</rp><rt>multi-stage build</rt><rp>)</rp></ruby></a></li>
<li class="toctree-l2"><a class="reference internal" href="09_image_best.html#part9-recap">まとめ</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="11_what_next.html">Part 10:次は何を？</a><ul>
<li class="toctree-l2"><a class="reference internal" href="11_what_next.html#get-started-container-orchestration">コンテナ オーケストレーション</a></li>
<li class="toctree-l2"><a class="reference internal" href="11_what_next.html#cloud-native-computing-foundation">Cloud Native Computing Foundation のプロジェクト</a></li>
</ul>
</li>
</ul>

実際に私がやったことは以下のツイッターのツリーから見ることもできます↓

https://twitter.com/ask_nugey/status/1644736095236804610?s=20

## コマンド操作について

このチュートリアルを進めるにあたって、まず大前提ですがターミナルでのコマンドの基本的な概念・操作を知っていく必要があります。

簡単なコマンド操作は、progateの「[Command Lineコース](https://prog-8.com/courses/commandline)」を見ると良いでしょう。

![スクリーンショット 2023-04-13 19.46.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275224/4c988002-6a0a-31b3-e56b-fb33e1cc1084.png)

例えば、チュートリアルを進めていく上で、コマンド打つ時のディレクトリの位置を注意しないと動きませんでした。

[ここ](https://docs.docker.jp/get-started/02_our_app.html#:~:text=%E5%B1%95%E9%96%8B%E5%BE%8C%E3%81%AF%E3%80%81%E5%A5%BD%E3%81%8D%E3%81%AA%E3%82%B3%E3%83%BC%E3%83%88%E3%82%99%E3%82%A8%E3%83%86%E3%82%99%E3%82%A3%E3%82%BF%E3%81%A6%E3%82%99%E3%83%95%E3%82%9A%E3%83%AD%E3%82%B7%E3%82%99%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E9%96%8B%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82)をクリックすると、該当のDockerチュートリアルの箇所へ飛びますが、vscodeで開いた場所は「〜〜/getting-started/」とあります。

しかし、dockerのコマンドを打ちたい場所はその1つ下の「〜〜/getting-started/app/」になります。

したがって、```$ cd app``` コマンドで移動する必要があります。詳しくは以下のツイートにも記載しました。

https://twitter.com/ask_nugey/status/1644749972670386177?s=20

# 最後に
何か誤りや補足があれば、こちらにコメントするか、ツイッター上に気軽にご連絡ください。