Docker勉強チャート

Dockerを学びたい！

でも何から学んだらいいんだろう？



そんな時期が私にもありましたので、勉強チャートを書いておきます


- [1.環境を構築](#1環境を構築)
  - [まずはLinuxのコマンドに馴れておこう！](#まずはlinuxのコマンドに馴れておこう)
  - [Dockerをインストール](#dockerをインストール)
- [2.Dockerって？](#2dockerって)
  - [なぜ仮想環境ではなくDockerを使うのか再確認](#なぜ仮想環境ではなくdockerを使うのか再確認)
  - [コンテナ型を使うメリット](#コンテナ型を使うメリット)
- [3.コマンドに馴れよう](#3コマンドに馴れよう)
  - [Dockerイメージの操作](#dockerイメージの操作)
    - [sarchコマンドを使ってイメージを取得してみる](#sarchコマンドを使ってイメージを取得してみる)
    - [pullコマンドでイメージを取得する](#pullコマンドでイメージを取得する)
    - [imageコマンドで所持しているイメージを確認してあげること](#imageコマンドで所持しているイメージを確認してあげること)
  - [実際にコンテナを作ってあげられるようにする](#実際にコンテナを作ってあげられるようにする)
    - [runコマンドを使って生成と起動を同時に行う](#runコマンドを使って生成と起動を同時に行う)
    - [execコマンドを使ってコンテナ内で作業する](#execコマンドを使ってコンテナ内で作業する)
    - [stopコマンドでコンテナを停止させる感覚を身に着ける](#stopコマンドでコンテナを停止させる感覚を身に着ける)
    - [rmコマンドで不要になったコンテナ削除するようにしよう](#rmコマンドで不要になったコンテナ削除するようにしよう)
- [4.Dockerfileを使ってイメージの作成](#4dockerfileを使ってイメージの作成)
  - [レイヤーとは](#レイヤーとは)
  - [Docker規約](#docker規約)
  - [Docker networkとは](#docker-networkとは)
    - [bridge](#bridge)
    - [none](#none)
    - [host](#host)
  - [Docker Volumeとは](#docker-volumeとは)
    - [bind mount](#bind-mount)
    - [volume](#volume)
    - [tmpfs mount](#tmpfs-mount)
  - [Dockerfileを作ってみよう](#dockerfileを作ってみよう)
    - [各レイヤーに記述してコンテナをカスタマイズ](#各レイヤーに記述してコンテナをカスタマイズ)
  - [Dockerのお掃除](#dockerのお掃除)
- [5.複数のコンテナを扱うということ](#5複数のコンテナを扱うということ)
  - [Docker Composeとは](#docker-composeとは)
    - [docker-compose.ymlの記述の仕方](#docker-composeymlの記述の仕方)
    - [docker-composeはコマンドでビルドできる](#docker-composeはコマンドでビルドできる)
- [6.拡張機能を使って便利に開発](#6拡張機能を使って便利に開発)
  - [Docker Desktop](#docker-desktop)
  - [.devcontainer](#devcontainer)
- [まとめ](#まとめ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983904/66b2c3c2-ac7b-7921-3ff9-6996b0fb0558.png)


# 1.環境を構築

## まずはLinuxのコマンドに馴れておこう！

DockerではLinuxのコマンドを扱うことが多い。

そのため、Dockerのコンテナ操作を一通りできるようにするためにはLinuxcのコマンドである程度ファイル操作やディレクトリ操作をマスターしておこう。

- 参考サイト
    - 【初心者向け】 基本のLinuxコマンド一覧！操作別紹介
        - https://udemy.benesse.co.jp/development/system/linux-command.html

## Dockerをインストール

Linuxの操作に馴れているならばDockerをインストールしてあげよう。

- Dockerを扱うためには以下の環境が必要になってくる
  - WSL2
  - Dockerをインストールできる環境
  - そこそこメモリがあるパソコン

- 参考サイト
    - Windows に Docker Desktop をインストール
        - https://docs.docker.jp/docker-for-windows/install.html
    - 【簡単な4つの方法】UbuntuにDockerをインストールするには
       - https://kinsta.com/jp/blog/install-docker-ubuntu/

# 2.Dockerって？

## なぜ仮想環境ではなくDockerを使うのか再確認

Dockerの環境を用意できた、しかしこれって何に使うの？

そのためにまずはDockerとは何かを知っておくこと(仮想マシンとは何が違うのか、明確なメリット等)

- 参考サイト
    - Docker入門（第一回）～Dockerとは何か、何が良いのか～
        - https://knowledge.sakura.ad.jp/13265/
    - 【初心者向け・図解】Dockerとは？現役エンジニアがわかりやすく解説
        - https://o2mamiblog.com/docker-beginner-1/
    - Dockerとは何か？初心者にもわかりやすく仕組みやメリットを解説
        - https://kitsune.blog/docker-summary

## コンテナ型を使うメリット

仮想環境では様々な技術が使われているが、コンテナを使う意味を改めて知っておくこと。

- 参考サイト
    - Docker（ドッカー）とは？4つの要素や導入すべき理由、環境構築の流れを紹介
        - https://hnavi.co.jp/knowledge/blog/docker/
    - いまさらだけどDockerに入門したので分かりやすくまとめてみた
        - https://qiita.com/gold-kou/items/44860fbda1a34a001fc1

***

~~Docker完全に理解した~~ならば次のステップに移行しよう

# 3.コマンドに馴れよう

Dockerについて理解ができてきたら、実際にDocker触ってみよう

いきなりDockerで好きな環境を作るのはハードルが高いので、まずは公開されているイメージからコンテナを立ててみること！

今あるイメージやコンテナを扱う感覚に馴れてきたら次に自分でイメージを作ってみよう

- 参考サイト
    - **(超オススメ！)実践 Docker - ソフトウェアエンジニアの「Docker よくわからない」を終わりにする本**　
        - https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59
    - ゼロから始めるDocker体験記
        - https://qiita.com/yuki-fukui/items/b6cfbadcf87344c8e9a2

## Dockerイメージの操作

### sarchコマンドを使ってイメージを取得してみる

まずは完成されているコンテナイメージから、実際のコンテナを作ってみること

公式サイトのコンテナ(Docker hub)からイメージ検索(`docker container sarch`)を使ってコンテナを検索してあげよう

- 参考サイト
    - docker searchコマンドの使い方（実例で解説）
        - http://www.memotansu.jp/docker/771/

### pullコマンドでイメージを取得する

探しているコンテナがあればイメージ取得(`docker container pull`)を使って取得しよう

### imageコマンドで所持しているイメージを確認してあげること

イメージを取得できたならば、イメージリスト(`docker container image`)を利用し、イメージリストを確認したり、削除できるようにする

## 実際にコンテナを作ってあげられるようにする

### runコマンドを使って生成と起動を同時に行う

`Docker run`を使えばイメージからコンテナの生成と起動ができる。が、生成と起動にはちゃんと使い分けがあるので知っておくこと。

また、それに付随するオプションについても知っておくこと

### execコマンドを使ってコンテナ内で作業する

データベースなどを含めてコンテナ内でコマンドを実行できるようにする

この時にオプションが増えてくるためしっかり手に馴染ませておくこと

### stopコマンドでコンテナを停止させる感覚を身に着ける

不要になったコンテナは停止させて無駄なプロセスを省いていこう

### rmコマンドで不要になったコンテナ削除するようにしよう

コンテナは停止しただけでは残り続ける。

なので、不要なコンテナは削除するということを覚えておこう

# 4.Dockerfileを使ってイメージの作成

自分でイメージを作成するためにはDockerfileを記入する必要がある。

なので好きなアプリケーション、サーバーを立てるためにはDockerfileを必ず書く必要があるため絶対に覚えておこう！

- 参考サイト
    - Docker ドキュメント日本語化プロジェクト
        - https://docs.docker.jp/index.html

## レイヤーとは

コンテナを作っていくうえで欠かせない知識はレイヤーを積み重ねていくという感覚。

必ず、コンテナレイヤーというものを知っておこう

- 参考サイト
    - Dockerイメージのレイヤの考え方とイメージの軽量化について
        - https://www.itbook.info/network/docker02.html

## Docker規約

Dockerにも規約は存在する。

規約違反にならないよう、ルールを知っておこう

- 参考サイト
    - Dockerの"分からない"を簡単にメモ
        - https://qiita.com/yuki-fukui/items/f8539e562352c046f39c

## Docker networkとは

Dockerでコンテナを扱う上で意識しなければならないことにコンテナ間の通信が含まれる。

コンテナがどうやって動いているかを知るために絶対にnetworkの仕組みについて知っておこう

- 参考サイト
    - dockerコンテナのネットワーク
        - https://zenn.dev/suiudou/articles/14249a918ec93b
    - network
        - https://y-ohgi.com/introduction-docker/2_component/network/

### bridge

### none

### host

## Docker Volumeとは

コンテナを生成と削除を行っているとどうしても、データのやり取りが無駄

Docker Volume機能を使えばコンテナ外のストレージが利用可能となる

- 参考サイト
    - Docker-docs-ja ボリュームの使用
        - https://docs.docker.jp/storage/volumes.html
    - Dockerでvolumesを設定する
        - https://zenn.dev/ajapa/articles/fc1205d4bcbfe7
    - Docker の Volume がよくわからないから調べた
        - https://qiita.com/aki_55p/items/63c47214cab7bcb027e0

### bind mount

### volume

### tmpfs mount

## Dockerfileを作ってみよう

Dockerfileを書く上での知識は十分あるはずなので、ここからは多機能なコンテナを作ってみよう。

- 参考サイト
   - Dockerfileの基本的な書き方
        - https://alterbo.jp/blog/ryu2-2106/
   - Dockerfileの書き方, 利用する命令, 作成手順
       - https://www.wakuwakubank.com/posts/270-docker-build-image/

### 各レイヤーに記述してコンテナをカスタマイズ

Dockerfileに記述することで様々なカスタマイズが可能となる。

書き方を理解しておこう。

## Dockerのお掃除

pruneコマンドを利用することでDockerのお掃除が可能となる。

キャッシュ削除について知ること。

- 参考サイト
    - Dockerで未使用オブジェクトを消す「prune」オプションの整理
        - https://qiita.com/zembutsu/items/f577ea8dad6dc64d70b6

# 5.複数のコンテナを扱うということ

自分でコンテナを立てられるようになったら複数のコンテナ扱ったアプリケーション制作にチャレンジしてみること

Dockerでは1コンテナ1機能という決まりがあるため、データベースなどを取り扱う場合は確実に複数のコンテナを立てる必要がある。

複数のコンテナを立てる際に`docker-compose`が使われていることが多いため、併せて学んでおくこと。

## Docker Composeとは

Docker Composeを使えば複数のコンテナ操作も楽に行える。

ほとんどのコンテナで使われているため、しっかりマスターしておくこと。

- 参考サイト
    - 【入門】Docker Composeとは？インストールと使い方
        - https://www.kagoya.jp/howto/cloud/container/dockercompose/
    - 【初心者向け・図解】Docker Composeとは？Dockerとの違いを現役エンジニアがわかりやすく解説
        - https://o2mamiblog.com/docker-beginner-2/
    - Docker Compose入門 (3) ～ネットワークの理解を深める～
        - https://knowledge.sakura.ad.jp/23899/#Docker3
    - 複数の Docker Compose 環境でネットワークを共有する
        - https://www.timedia.co.jp/tech/20220628-tech/

### docker-compose.ymlの記述の仕方

### docker-composeはコマンドでビルドできる

# 6.拡張機能を使って便利に開発

Dockerについて勉強してきたら、GUIを使ったDockerの取り扱いやコンテナを立ててみよう

## Docker Desktop

GUIを使ったコンテナ操作ができる。

めちゃくちゃ簡単に導入できるから知っておこう

※ただし、利用規約によってはライセンス料が発生するため注意！

- 参考サイト
    - 【入門】Docker Desktopとは何ができるの？インストールと使い方
        - https://www.kagoya.jp/howto/cloud/container/dockerdesktop/
    - 【Docker Desktop】Windowsにインストール（WSL2）
        - https://chigusa-web.com/blog/windows%E3%81%ABdocker%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6python%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89/

## .devcontainer

VSCodeの拡張機能にはDockerを楽に操作できるものがある。

使ってみて、自分にあった操作方法を学んでみよう

- 参考サイト
    - VSCode Devcontainer 放浪記
        - https://zenn.dev/streamwest1629/articles/vscode_wanderer-in-devcontainer
    - Devcontainer(Remote Container) いいぞという話 ~開発環境を整える~
        - https://qiita.com/yoshii0110/items/c480e98cfe981e36dd56

# まとめ

Dockerは環境構築のため、プログラミングとは違った混乱が多々あります

しっかりと学んでいきたい