Docker　初心者がまとめてみた


#プログラミング初心者がDocekrについてまとめてみた


###どこまでのまとめ？
Dockerについて〜コンテナの作成


#コンテナ・イメージについて

##Dockerの便利なところ

- コマンド一発でコンテナを何度でも生成できる
    - 一度Dockerfileを作成してしまえば、簡単に用意できる。
 
- コンテナを共有できる
    - Dockerfile（環境構築のレシピ）の中身はソースコードだから他の人たちと共有できる。Dockerfileを共有するためのDockerhubというサービスがあり、他の人が生成したコンテナをいつでも使える。


##コンテナとは
コンテナとはDockerによって作成されるゲストOSのことで、 **Dockerイメージ**を元に作成される仮想環境の実行部分。


##イメージとは
通常パソコンに**OS**をインストールする時に使用されるものが**イメージ**と呼ばれる。
アプリケーション開発にはUbuntu、RubyやPHPなど、実行するためには**OS**が必ず必要になってくる。 **『 OS が必要 = イメージが必要 』**となり、結果 Docker の使用にあたって「**Dockerイメージ**」が必要となってくる。


イメージはコンテナを作成するためのテンプレートとなってくれる。
つまりDockerコンテはDockerイメージから生成される。




##ビルドをするとは
DockerfileからDockerコンテナの元となるイメージをつくることを、**Dockerイメージをビルドする**と呼ばれている。



##Dockfileとは
環境構築のレシピのこと。どうやって環境を作成していくかを記したファイル。
DockerfileはベースとなるDockerイメージ（OS）をFROMで定義できる。
Dockerfileはあくまでもイメージを構築するための手順を記述したファイルで、Dockerfile自身がDockerイメージになるわけではない！！！



```ruby:qiita.rb
FROM ruby:2.6
```

Dockerfileでイメージをビルドする際、まず最初にFROMで指定されたイメージをDockerHubというレジストリからダウンロードしてから実行される。


###Dockerhub
Dockerfile（環境構築のレシピ）の中身はソースコードだから他の人たちと共有できる。Dockerfileを共有するための**Dockerhub**というサービスがあり、他の人が生成したコンテナをいつでも使える。


##ここまでの流れ
Dockerイメージを構築するためのDockerfileを作成し、ビルドをすることによってイメージが作成されて、Dockerコンテナを実行していく。



#コマンド/Dockerfileの中身

```ruby:Dockerfile
FROM ruby:2.6

# install package to docker container
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev \
    && apt-get install apt-transport-https \
    && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
    && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
    && apt-get update && apt-get install -y yarn \
    && curl -sL https://deb.nodesource.com/setup_10.x | bash - \
    && apt-get install -y nodejs \
    && mkdir /アプリ名

WORKDIR /FANTRA
COPY Gemfile /アプリ名/Gemfile
COPY Gemfile.lock /アプリ名/Gemfile.lock

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
```


###[FROM] 
使用するイメージとバージョンを指定。
Dockerfileでイメージをビルドする際、まず最初にFROMで指定されたイメージをダウンロードしてから実行される。

###[RUN] 
Dockerイメージビルド時に、Dockerコンテナ内で実行するコマンドを定義
ここではrails6に必要なツールをインストール。

###[WORKDIR]
 作業ディレクトリを設定

###[COPY]　
Dockerを動作させているホストマシン上のファイルやディレクトリをDockerコンテナ内にコピーする
左側がローカルで、右側がコンテナ内。

###[ENTRYPOINT] 
一番最初に実行するコマンド。
ENTRYPOINTはCMDと同じくコンテナ内で実行するプロセスを指定する。



###[EXPOSE] 
コンテナがlistenするport番号


###[CMD]
CMDはコンテナ起動時に1度実行される。RUNでアプリケーションの更新や配置、**CMDはアプリケーションそのものを動作させる**


##Dockerfileやその他必要なファイルができればビルドをする
rails6で開発したかったら、以下のURLを参考にして必要フィルを作成していける。
https://qiita.com/nsy_13/items/9fbc929f173984c30b5d




##docker image buildコマンドでDockerイメージを作成

```ruby:qiita.rb
docker image build -t イメージ名　Dockerfile配置ディレクトリのパス
```
-tオプションでイメージ名を指定する。
ここでイメージ名を指定しないと、ハッシュ値で管理することになって手間が増えてしまう。
カレントディレクトリがDockerfile配置ディレクトリであれば、最後の引数は「.」（カレントディレクトリ）

docker image buildでは必ずDockerfileを与える必要があるから、ディレクトリにDockerfileが存在しないとちゃんと実行できない。




##イメージがbuildで作成されたら
作成したイメージをdocker container runコマンドを利用してコンテナを実行できる。
注意なのがrunコマンドは実行とコンテナを作成するから、作る必要のないコンテナを実行する時は --rmをつけてやる。






##コンテナのライフサイクル
Dockerコンテナは**実行中・停止・破棄**という3つの状態のいずれかに分類される。これを**Dockerコンテナのライフサイクル**と呼びます。docker container runで起動された直後は**実行中**に当てはまる。


###実行中
docker container runで指定されたDockerイメージをもとにコンテナが作成され、DockerfileのCMDやENTRYPOINTで定義されているアプリケーションの実行を開始する。このアプリケーションが実行中なら、Dockerコンテナは**実行中にある**ということ。

###停止
実行中のコンテナはユーザーが明示的にコンテナを停止するか、コンテナで実行されているアプリケーションが正常・異常を問わず終了した場合に自動的に停止。



###破棄
頻繁にコンテナの実行・停止を繰り返すような環境ではディスクの要領を専有していくことになるため、不要なコンテナは破棄した方がいい。
コンテナは明示的に破棄しない限り残り続けてしまう。


###Dockerで一番使うらしいコマンド

```ruby:qiita.rb
$ docker container ls
```

####表示される内容

- CONTAINER ID
    - コンテナに付与されるID
- IMAGE
    - コンテナ生成に使用されたDockerイメージ
- COMMAND
    - コンテナで実行されてるプロセス
- CREATED
    - コンテナが作成されてから経過した時間
- STATUS
    - コンテナの状態
        - Up（実行中）・Exited（終了）などコンテナの状態
- PORTS
    - ホストのポートとコンテナのポートの紐付け
- NAMES
    - コンテナの名前