忙しい人のためのDockerとDocker compose

#はじめに
docker周りの説明はぐちゃぐちゃしていて分かりにくいので、最低限の概念とインストール、動作確認だけまとめました。

#用語解説
用語が色々多いので先にまとめておきます。

**Docker Engine**
Dockerを利用するための常駐プログラム。

**Image**
コンテナの設計図のようなもの。imageからコンテナが作成される

**Tag**
imageのバージョン

**コンテナ**
アプリケーションの実行環境

**Docker Hub**
docker版のgithub

**Dockerネットワーク**
コンテナ間での通信手法

**Nginx（エンジンエックス）**
ウェブサーバー用ソフトウェア

**daemon（デーモン）**
バックグラウンドで動作するプロセス

**Docker Machine**
仮想マシンのをコマンドで操作するためのツール

**docker-ce**
コミュニティエディション。無償版のdocker。

****

#Dockerの概念
具体的なコマンドやコードの前にひとまずDockerの概念をまとめます。

###dockerとは
従来の仮想化ではハイパーバイザ（仮想化ソフト）を使用してゲストOS（仮想マシン）を立ち上げ、その中でミドルウェアの構築とプログラムの実行を行っていました。

dockerはコンテナ型仮想化を行い、docker engineからコンテナと呼ばれるミドルウェアを含む実行環境を作成します。そしてコンテナ内でアプリケーションを動作することが出来るわけです。

コンテナ型仮想化ではコンテナを他人と共有することで簡単に実行環境も同様のものが準備できるわけです。**要するに従来方法と違って、簡単に同じ環境を再現出来て便利だよねってことです**。

###Dockerでのデータ管理
コンテナ内で動的なデータを扱う場合、そのままではコンテナを落としたらデータが消えてしまいます。解決策としてホストマシンでデータを管理し、コンテナにマウントします。

###Docker network
ウェブアプリケーションを作成する場合、ウェブサーバーとAPIサーバーとDBサーバーを立てるような例も少なくないと思います。当然これらのサーバーは通信しなければならないので、コンテナでこれらのサーバーを立てている場合はコンテナ間で通信する必要があります。その仕組みがDockerネットワークです。Docker networkではデフォルトで存在する３つのネットワークと独自ネットワークが存在します。

**Bridge network**
同じネットワーク内に存在するコンテナとIPアドレス指定で通信できるネットワークです。DNSは定義されていないので、コンテナ名での通信は出来ません。コンテナ作成時にデフォルトで接続されるネットワークです。

**Host network**
説明が難しいのですが、、Host　networkに接続したコンテナでnginxを実行した場合、ホストマシンのIP80番ポートに接続すれば良いことになります。これに関しては手で動かして覚えた方が早いと思います

**None network**
ネットワークインターフェースがないことを意味します

**Docker Compose**
複数コンテナのDockerアプリケーションを事前定義して実行するためのツール

**独自ネットワーク**
独自のネットワークを作成し、コンテナ名で通信が可能になります。Docker Daemonの組み込みDNSのおかげで名前解決してくれているようです。

###Docker Compose
これまで見てきたように、コンテナの起動は多くの設定が必要であり、１つ１つ実行していたら冗長です。それらを自動化するのがDocker Composeです。

ウェブアプリケーションの実行環境をDockerで構築する場合、複数のサーバーの定義を`docker-compose.yml`に記述しておくことで、複数コンテナをまとめて起動できます。

###Docker Machine
Docker Engineを搭載した仮想マシンの管理をコマンドで実行できるツール。

#インストール
dockerとdocker-composeのインストールを行っていきます。環境はUbuntu20.04LTSで行うので、macユーザーの方は適宜読み替えてください。また、GUIではなくCUIのインストールです。既にインストール済みの方は次の章まで飛ばしてください。

まずはdockerのインストールから行っていきます。単純にパッケージマネージャでインストールすることも可能ですが、最新版ではないのでこちらのサイト[[4]]を参考にやっていきたいと思います。

パッケージリストの更新

```
sudo apt update
sudo apt upgrade
```

HTTPS経由でパッケージを使用するためのパッケージをインストール

```
sudo apt install apt-transport-https ca-certificates curl software-properties-common
```

公式DockerリポジトリのGPGキーをシステムに追加

```
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```

DockerリポジトリをAPTソースに追加します。

```
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
```

パッケージデータの更新

```
sudo apt update
```

dockerリポジトリからインストールしようとしていることを確認。

```
apt-cache policy docker-ce
```

インストール。

```
sudo apt install docker-ce
```

デーモンが起動し、プロセスがブート時に起動出来るようになっていることを確認。

```
sudo systemctl status docker
```

sudoなしでdockerコマンドを実行するための設定（いらない場合もある）。パスワードの入力が求められるので入力。

```
sudo usermod -aG docker ${USER}
su - ${USER}
id -nG
```

dockerのバージョンを確認。２０２１年１１月１５日現在の最新バージョンは20.20.10であり[[5]]、最新バージョンがインストールされていることを確認できた。

```
docker -v
```

次にdocker-composeのインストール。このサイト[[7]]を参考に進めていく。まずはこちらのサイト[[8]]で最新バージョンを確認する。そのバージョンを指定してcurlコマンドでインストール。ローカルにインストールして実行権限の付与。MACの人とかはインストールするものが違うので公式ページで適切なものをインストールしてください。

```
mkdir -p ~/.docker/cli-plugins/
curl -SL https://github.com/docker/compose/releases/download/v2.1.1/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose
```

バージョンを確認して最新バージョンの確認ができればOK。2021年11月15日現在の最新バージョンは2.1.1が最新です。docker-composeの機能がdockerのCLIプラグインとしてに統合されるようで、2.0以降ははそちらを指しています。コマンド上はdocker composeに変更されているようです。おそらくM1MACへの対応も含まれているのではないでしょうか。

```
docker compose -v
```
これでdockerとdocker composeのインストールが終わりました。

#動作確認
まずはdocker単体でHello,worldを行います。こちらのサイト[[9]]を参考にしています。hello-worldコンテナを実行してみましょう。

```
docker run hello-world
```
runコマンドはイメージを用いてコンテナを実行するコマンドです。イメージがローカルに存在しないため、自動的にDocker Hubよりイメージを取得しています。コマンドをタグ指定なしで実行した場合、タグは自動的にlatestが選択されます。

次にイメージの確認をします。

```
docker images
```
hello worldイメージが確認できるはずです。

起動中のコンテナがあるかを確認します。

```
docker ps -a
```
-aは停止中のコンテナも含めて表示します。hello-worldコンテナはメッセージ出力が終わるとコンテナを停止してしまうため、もう起動していません。

以上でdockerのhello,worldは終了です。次にdocker-composeの起動確認をやっていきます。こちらのサイト[[10]]を参考にしてやっていきます。

作業ディレクトリの作成と移動

```
mkdir hello-world && cd $_
```

[[10]]の記事執筆者KENIOSさんが作成されたdocker-compose.yml をインストールして実行。

```
curl -O https://keinos.github.io/hello-docker-compose/docker-compose.yml
docker compose up
```

特にエラーが出ずに終了すればおｋです。中身はさっきのhello-worldイメージ使っているだけなのですが、起動確認が目的なのでこれで十分です。

以上でdockerとdocker composeの動作確認は終了です。

#おわりに
超大雑把なdockerの概念の理解とdocker、docker-composeのインストール、動作確認は出来たはずです。あとは作りたい環境を検索して、コマンドを調べながらやれば構築出来ると思うので頑張ってください。次はlaravelのdocker環境構築をやろうと思います。

#参考文献
[1]:https://qiita.com/etaroid/items/b1024c7d200a75b992fc#image%E3%81%AE%E6%A7%8B%E9%80%A0
[2]:https://qiita.com/etaroid/items/88ec3a0e2d80d7cdf87a#%E7%8B%AC%E8%87%AA%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF
[3]:https://qiita.com/etaroid/items/40106f13d47bfcbc2572
[4]:https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-20-04-ja
[5]:https://openstandia.jp/oss_info/docker/version/
[6]:https://docs.docker.com/compose/release-notes/#1250
[7]:https://docs.docker.com/compose/cli-command/#install-on-linux
[8]:https://github.com/docker/compose/releases/
[9]:https://qiita.com/sonishimura/items/86609dc46e7e8835f7de
[10]:https://qiita.com/KEINOS/items/43d9415e351d80f78c8b

[[1]]:【図解】Dockerの全体像を理解する -前編-
[[2]]:【図解】Dockerの全体像を理解する -中編-
[[3]]:【図解】Dockerの全体像を理解する -後編-
[[4]]:Ubuntu 20.04へのDockerのインストールおよび使用方法
[[5]]:Docker バージョン情報
[[6]]:Docker Compose release notes
[[7]]:Compose V2
[[8]]:docker-compose github releases
[[9]]:Docker入門 ~Hello World~
[[10]]:最もシンプルな docker-compose.yml の hello-world