Dockerチュートリアル - Get Started

# Docker is 何？
コンテナ型の仮想マシンで、その中にイメージを保存する仕組み・・・らしいけどそもそもそれがわからんので調べる。
## チュートリアルの流れ
Dockerを使ってアプリケーションを作り始めましょう。コンテナを用いたアプリケーション階層を学ぶために、Part2で底部を、Part3でサービスそうをPart4でSwarm、Part5でStack(サービスの挙動を定義)をします。
# part 1 説明とセットアップ
## 概要
ホストマシンのカーネル上で、コンテナのアプリケーションをネイティブ実行させることができる。VMではホスト上のリソースにハイパーバイザーを通してでしかアクセスができない。そのため、コンテナはVMよりもスペックが良くなる、さらにこんてなじたいは　ネイティブからのアクセスも可能であり、各々のプロセスは分離して実行しメモリは実行に必要な分確保します。
### [1]イメージ
イメージとは、実行可能なパッケージであり軽量かつ単独動作できるものです。パッケージにはコードからランタイム,ライブラリ,環境変数,設定ファイルなどの、ソフトウェアを実行に必要な部品を全て含みます。
### [2] コンテナ
コンテナはイメージのランタイム・インスタンス(実行可能状態のもの)
### つまるところ
- vm
VMはハイパーバイザー上で各々のゲストOSがあり、OSそうでリソース集中をします。その為、ディスクイメージとアプリケーションの状態は、OSの状態やシステムのインストールされた依存関係やOSのセキュリティパッチなどに依存します。さらにアプリケーションの状態はすぐに失われ短時間での複製は難しいです。
- Docker
コンテナは一つのカーネルを複数コンテナで共有ができ、コンテナイメージも実行可能なものと依存するパッケージに関する情報のみを持っていれば実行可能になります。これらはホストシステム上へのインストールは必要なく、これらのプロセスはネイティブなプロセスのように実行可能。
## Dockerプロセス
実行されているDockerプロセスは```docker ps```で確認できます。

# part 2 コンテナ
##新たな開発環境
本来開発環境は同じものを用意しなければなりません。そのため仕事をする際の初めの作業が開発環境の整備になってしまいます。
しかし、Docker環境では　移動可能な開発環境をイメージないに収容しているため、自分の環境へのインストールは不要でアプリのコードも一緒に入っているので依存関係などの解決にも便利です。
その際Dockerでは移動可能なイメージを定義したものとして```DockerFile```というものがあります。
##DockerFileでコンテナを定義
DockerFileでは、コンテナ内の環境がどのようなことをすればいいか定義します。
ネットワーク・インターフェースやディスク・ドライバのようなリソースは、システム上の他の環境から隔離された環境内に仮装化されます。このようなリソースに接続するには、ポートの割当が必要で、どのファイルを環境に複製するかを指定しなければいけませっん。
ですが、これらはDockerFileにかけるので、これを制作した時点で定義を済ませておけば問題ないと言えます。
## Dockerfile
Dockerfile内にはこのような記述ができます。

``` dockerfile
#読み込む親イメージ
FROM　ImageName:varsion
#作業ディレクトリの指定
WORKDIR /app
#どのファイルをDocker内に入れるか
ADD . /app
#必須なパッケージを全て取得
RUN インストールするもの
# ポート
EXPOSE 8080
# 環境変数
ENV NAME world
# コンテナ起動時の振る舞い (コマンド) `,`で区切り
CMD ["ping", "8.8.8.8"]
```
# アプリの構築
アプリの実装は任意でやってもらってまずはイメージを作りましょう。
どっかーイメージを作る際は、

```
docker build -t [tagName] .
```
のようにして制作を行います。
その際にオプションで ``` -t```をつけることでタグを指定できます。
その際に制作したイメージを確認する方法として。

```
docker images 
```
で確認できます。

# アプリの実行 
アプリの実行には```docker run```

```
docker run -p [ポート移転先]:[元ポート] [Docker image]
```

止めるときは

```
docker stop [psID]
```
#image
## タグ付
ローカルのイメージとレジストリ上にあるリポジトリとの紐付けとしてイメージタグというものがあります。このたくはオプションではあるが継承されています。このタグの意味として紐付けの他にレジストリにおける Docker イメージのバージョン指定の仕組みに使うためにあります。

```
docker tag image [username]/[リポジトリ]:[タグ]
```
## 送信
アップロードには 

```
docker push [username]/[リポジトリ]:[タグ]
```

## 取得と実行
 ```docker run ```はあらゆるマシン上でアプリを実行できます。
なかったら勝手に取得してきます。
#チートシート
```
docker build -t friendlyname .               # このディレクトリ内にある DockerCile でイメージ作成
docker run -p 4000:80 friendlyname  # "friendlyname" の実行にあたり、ポート 4000 を 80 に割り当て
docker run -d -p 4000:80 friendlyname                            # 同じですが、デタッチド・モード
docker container ls                                                  # 全ての実行中コンテナを表示
docker container ls -a                                       # 停止中も含めて全てのコンテナを表示
docker container stop <hash>                                       # 指定したコンテナを丁寧に停止
docker container kill <hash>                               # 指定したコンテナを強制シャットダウン
docker container rm <hash>                                   # マシン上から指定したコンテナを削除
docker container rm $(docker container ls -a -q)                           # 全てのコンテナを削除
docker image ls -a                                               # マシン上の全てのイメージを表示
docker image rm <image id>                                       # マシン上の特定のイメージを削除
docker image rm $(docker image ls -a -q)                         # マシン上の全てのイメージを削除
docker login                                       # CLI セッションで Docker の認証を行いログイン
docker tag <image> username/repository:tag      # レジストリにアップロードする <image> にタグ付け
docker push username/repository:tag                                  # タグ付けしたイメージを送信
docker run username/repository:tag                               # レジストリにあるイメージを実行
```