クラウド技術Ⅱ


## 今回の授業（クラウド技術II）で学んだことをまとめておく。
Dockerについて学習したので、まとめておきます。
初回ですのでレイアウトなどはご了承ください。
## Docker
Dockerはコンテナと呼ばれる仮想化技術を扱えるものであり、簡単に言うと、仮想サーバーを構築できるツールです。仮想サーバーには、ホストＯＳ上にある既存の環境を壊さずに別の環境を構築できる、ホストＯＳとは違うＯＳでサーバー構築が可能、といったメリットがあるので、近頃のアプリ開発でよく使われています。（以下公式リンク）

https://www.docker.com/

## コンテナ
コンテナとは、一言で言うと、「**アプリとファイルシステムを隔離する特殊なプロセス**」です。（プロセスとはＯＳ上で動作している１つ１つの処理のこと）
アプリとファイルシステムを隔離するということは、１つの物理マシン内で動いているにもかかわらず、そのプロセスの中だけが別マシンで動いているような状態になるということです。これが、従来の仮想化技術と異なるコンテナの仕組みです。
コンテナを使うには、コンテナを作成・実行するためのソフトウェアが必要です。このジャンルで有名なソフトウェアが「**Docker**」です。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3418132/6c0f7224-d282-0a73-4171-28fb507f1371.png)

## コンテナのメリット・デメリット
コンテナには**軽量**であること以外にも様々なメリットがあります。
### メリット
#### ホストOSを汚さずに環境構築できる
コンテナは隔離されたプロセスなので、ホストOSを汚しません。ホストOSにソフトウェアを直接インストールしてしまうと、OSの設定変更が必要だったり、同じソフトウェアのバージョン違いを共存できなかったりする場合があります。また、ホストOS上にある既存の環境を壊したくないけど、もう１つ環境を作りたい、といったケースもあるでしょう。コンテナなら、ホストOSを汚さずに互いに干渉しない環境を複数作ることが可能です。
#### Iacを実現する
  **Iac**(**Infrastructure as Code**)とは、アプリのインフラ構築を、コードを用いて行うことです。環境構築には、ソフトウェアをインストールして設定を変更して、という手順がいくつもあるので、ほかの人が同じ環境を作る場合に手間がかかります。Dockerではどんなコンテナを作るか、といった手順をまとめたテキストファイルをもとにコンテナを作れるので、そのテキストファイルさえあれば、ほかの人が別のマシンでコンテナを作るのは容易です。
#### 可搬性がある
 コンテナには、異なるOSやマシンでも同じ環境を再現できる、**可搬性**（**ポータビリティ**）が高いという性質があります。例えば、開発環境で動いていたアプリが本番環境だと動かないといったケースはよくあります。これは、アプリの動作に必要なライブラリが足りていなかったり、異なるバージョンのライブラリが入っていたりといった、環境差異ががあるためです。
### デメリット
コンテナのデメリットは、まず学習コストが必要なことです。コンテナを作成、実行するだけなら学習コストはそこまでかかりません。ただし、複数のコンテナを組み合わせたい場合や、本番環境で使いたい場合は、コンテナについての深い知識が必要です。
また、Linuxの知識も欠かせません。

## コンテナイメージ
コンテナは、**コンテナイメージ**（以降、**イメージ**）から作られます。イメージは、**コンテナを作成するためのテンプレートのようなもの**です。イメージには、基本的なアプリやソフトウェアに加えて、コンテナを動かすのに必要なファイルシステムや、実行コマンド、メタ情報などが含まれています。コンテナに必要なファイルの集合体だと考えてください。例えば、WebサーバーであるApacheのコンテナを作成するなら、Apacheのイメージ、データベースであるMariaDBのコンテナを作成するならMariaDBのイメージを使います。
※なお、コンテナ自体を配布することはできませんが、イメージはファイルの集合体なので配布が可能です。

## イメージの保管場所　レジストリ
イメージは自分で作ることもできますが、インターネット上にイメージが集められた場所があります。この場所を**レジストリ**と呼び、Dockerでは**Docker Hub**（**ドッカーハブ**）と呼ばれる公式レジストリが提供されています。Docker Hubには、**Apache**や**WordPress**、**PostgreSQL**など、様々なソフトウェアの公式イメージが保管されています。これらのイメージを使うことで、それらのソフトウェアが動作するコンテナを簡単に作成できます。レジストリからイメージを取得することを、**プル**(**Pull**)と呼びます。
また、元のイメージに対してソフトウェアをインストールしたり、プログラムを配置したりして、独自のイメージを構築することもできます。Dockerでは、イメージを構築するのに、**Dockerfile**（**ドッカ―ファイル**）と呼ばれるテキストファイルを使います。Dockerfileを使ってイメージを構築することを、**ビルド**(**build**)と呼ぶこともあります。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3418132/10102cdc-0cdc-30c6-729e-8e3f2167f1bd.png)

## コンテナライフサイクル
イメージから作成したコンテナは「実行」することで、コンテナ上のソフトウェアやアプリを動作させることができます。そして、不要になったら、コンテナの「停止」と「削除」を行います。このように、コンテナには、いくつかの状態があります。このコンテナの状態の移り変わりを、**コンテナのライフサイクル**と呼びます。
以下のような状態があります。

##### 「作成」
イメージからコンテナを作成した状態です。あくまで作成しただけなので、アプリは動作していません。
##### 「実行」
コンテナを動作させた状態です。
##### 「停止」
実行していたコンテナを停止させた状態です。再度実行することも可能です。
##### 「削除」
コンテナを削除した状態です。コンテナを再び実行するには、コンテナの再作成が必要です。
#### なぜコンテナは「作っては削除」するのか？
「**コンテナは作っては削除**」が基本です。あまり効率的ではないと思うかもしれませんが、コンテナの大きな特徴でもあります。**コンテナは作成・削除のコストが非常に低い**ため、作成したコンテナを変更して使い続けるより、削除して作り直すほうが手間がかからないということです。なお、コンテナを削除するとコンテナ内のデータを合わせて削除されるため、**データの永続化**をしておく必要があります。
永続化については以下参照

https://zenn.dev/eitches/articles/2021-0320-docker-volumes

#### 以下よく使用するコマンド
Dockerは基本的にLinuxのコマンドを使用して実行します。なので、コマンドを覚えておくと利便性が向上します。ここに自分用に残しておきたいと思います。
##### Dockerコマンド
Dockerコマンドは基本的に以下のような書式になります。
docker 対象　操作
###### 使用例
Apacheサーバーを立ち上げられます。

~~~
docker container run --name apache01 -p 8080:80 -d httpd
~~~
Apacheサーバーをストップします。
~~~
docker container stop apache01
~~~
Apacheコンテナを削除します。
~~~
docker container rm apache01
~~~

#####  Docker Compose
YAML形式のファイルを使用することでDocker composeコマンドを実行できます。docker composeコマンドでは一度に複数のコンテナを同時に作成・実行することができ非常に便利なコマンドです。
###### 使用例
~~~compose.yaml
services:
  web:
    image: httpd:2.4
    ports:
     - "8080:80"
~~~
作成したいディレクトリ内で
~~~
docker compose up -d
~~~
を行うことで、起動、作成できます。