k8s環境ハンズオン docker学習編

### k8s環境ハンズオン docker学習編

## もくじ
- Dockerの概念を理解する。
- Dockerの基本操作を覚える。


## Dockerの概念を理解する

#### dockerコンテナ実行してdockerの理解を深める

hello-worldというdockerコンテナを実行：
docker run hello-world
![10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99495/a9acc03f-1d8b-86cc-bab4-b87673057774.jpeg)

ちなみにrunには（コンテナの起動・プロセスの確認・停止）の３つを連続で行う意味がある。

コンテナ実行後はゴミがたまるので不要なキャッシュを削除する：
docker container prune
[y]


#### コンテナと仮想マシン

 コンテナと仮想マシンの違いはカーネルを共有しているかどうか。
 カーネルを共有していれば、スピードが速く、バグも少なくできる。
 
#### イメージとコンテナ

DOCKERイメージ：
・実行環境を定義したもの
・docker hubなどのリポジトリに保管
（dockerイメージ＝実行環境のテンプレート）

DOCKERコンテナ：
・dockerイメージをじっこうして出来る実行環境
（dockerコンテナ＝dockerイメージを実行した実際の実行環境）

※プログラムだとイメージはクラス、コンテナはインスタンス


#### おさらい


## Dockerの基本操作を覚える。

#### イメージ検索（DockerHub）


イメージ検索

ドッカーイメージの検索方法について学習する。
ドッカーイメージはイメージレジストリにある。
ドッカーイメージ保存先は「amazon」「google」「azure」「dockerhub」などが提供している。

今回はdockerhubを検索する。
https://hub.docker.com/

dockerhubはドッカーがイメージレジストリを探すデフォルトに設定されている。


ドッカーイメージにはtag とimageidがある。

tagにはOSとそのver情報が記載されている。

nodeでtagを検索するとalpineというosが見つかる。
これはdocker向けの軽量なosです。

「

イメージが軽量でないとダウンロードできないので軽量であることは必須条件。


検索イメージに書いてあるタグをクリックするとgithubに飛ぶ。
そこにはdockerfileがある。
dockerfileはそのイメージがどのように構成されているか定義しているファイル。

「


#### イメージ取得/一覧/削除

- イメージ取得には下記のコマンドを使います。

```
docker image pull NAME[:TAG]
指定されたイメージを取得します。

#引数 
#NAME　Dockerイメージ名
#TAG　タグ名。省略した場合はlatest。
```

- イメージ一覧の取得には下記のコマンドを使います。

```
docker image ls
#取得済みdockerイメージ一覧を表示します。

#引数 なし
```


- イメージ削除には下記のコマンドを使います。

```
docker image rm IMAGE
指定されたイメージを削除します。

引数 
IMAGE DockerイメージID
```

```
docker image prune
使われていないイメージを一括削除します。

引数 なし
```

演習としてdockerイメージ取得・一覧・削除の操作を行う。
- ①centosをdockerhubでイメージ取得
- ②取得したイメージ一覧でイメージID確認
- ③イメージ削除

①centosをdockerhubでイメージ取得
- centosのイメージ検索してタグを取得。
- タグを元にcentosのイメージをダウンロードしてみる。



docker image pull centos:7


- ②取得したイメージ一覧確認してイメージ削除

IMAGE Docker 5e35e350aded



#### コンテナ実行/停止/一覧/削除

- コンテナ実行には下記のコマンドを使います。

```
docker container run [OPTION] NAME[:TAG] [COMMAND]
#指定されたイメージを実行します。

#引数
OPTION オプション
NAME dockerイメージ名
TAG タグ名。省略した場合はlatest
COMMAND 実行時にdockerコンテナに与えるコマンド
```

|オプション|説明|
|:--:|:--|
|-d|バックググランド実行させる|
|-it| Shell実行する際に合わせて指定|
|-e KEY=VALUE環境変数を与える|
|--name NAME実行時のコンテナ名|
|-p container:host|コンテナポートのホストにマッピング|


- コンテナ停止には下記のコマンドを使います。

```
docker container stop CONTAINER
#指定したコンテナを停止します。

#引数 
CONTAINER コンテナID
```

- コンテナ停止には下記のコマンドを使います。

```
docker container ls [OPTION]
#コンテナを一覧表示します。

#引数 
OPTION
```

-a 指定せば全て

- コンテナ削除には下記のコマンドを使います。

```
docker container rm CONTAINER
#指定されたコンテナを削除します。

#引数 
CONTAINER Dockerコンテナ名
```

- コンテナ削除とイメージ削除するには下記のコマンドを使います。

```
docker system prune
#使用されていないデータを削除します。

#引数 なし
```

演習としてコンテナ実行一覧停止削除の操作を行う。
- ①nginxイメージ実行
- ②実行中コンテナ一覧の確認
- ③コンテナ指定して停止
- ④停止中コンテナ含めた一覧確認
- ⑤不要なコンテナ削除


①nginxイメージ実行
- nginxイメージを探し、タグを取得。

- 取得した[]タグを使ってnginxイメージ実行

```
docker container run -d nginx:1.17.2-alpine
```
↓
イメージが手元にないと自動でダウンロードして起動します。

②実行中コンテナ一覧の確認
docker container ls -a でnginx起動しているか確認
↓
動いてるのを確認できる。

③コンテナ指定して停止
nginxを停止する

docker container stop agitated_satoshi
#オプションにはdocker container lsで確認したNAMESを指定する。

docker system prune
#使用されていないデータを削除します。


#### イメージ作成
dockerイメージ作成方法について学ぶ
-イメージ作成の基本
-dockerfile
-ビルド


イメージ作成の基本はプログラムと同じ

「


- dockerfile
Doker特有のコマンドを利用してイメージ構築手順を定義。

- dockerfileサンプル

```dockerfile
FROM centos:7
COPY docker-entrypoint.sh /var/tmp

RUN mv /var/tmp/docker-entrypoint.sh /usr/local/bin/; \
    chmod +x /usr/local/bin/docker-entrypoint.sh;

ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["echo", "Hello World"]
```


```dockerfile
FROM <IMAGE>[<:TAG>]　←元となるイメージ名を指定

COPY <SRC>...<DEST>　←ホストからファイルにイメージ転送

RUN <COMMAND>　←イメージ内でコマンド実行

ENTRYPOINT [<COMMAND>,....] ←デフォルト実行、初期化処理などのコマンド
CMD [<COMMAND>,....]　←メインとなるコマンド
```

|オプション|説明|
|:--:|:--|
|-t|イメージ名を指定する|
|-f|Dockerfileの名前を指定する|


-ビルド

```
docker build [OPTION] PATH
#指定されたDockerfileを利用してdockerイメージを作成します。

引数
OPTION オプション
PATH Dockerfileが保存されているパス。
```


演習としてDockerイメージの作成、実行を行う
- ①Dockerfileの作成（ベースはCentos7）
- ②環境変数を表示するシェルを作成、コピー
- ③echoコマンドを実行させる
- ④ビルド
- ⑤実行・動作確認


①Dockerfileの作成（ベースはCentos7）
構築したVMの/root/study直下にDockerfile作成。

vi dockerfile

```dockerfile
FROM centos:7
COPY docker-entrypoint.sh /var/tmp

RUN mv /var/tmp/docker-entrypoint.sh /usr/local/bin/; \
    chmod +x /usr/local/bin/docker-entrypoint.sh;

ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["echo", "Hello World"]
```

上記シェルの処理：
RUNにまとめることで複数のコマンドを実行できる。
chmod +x：実行権限を付与
ENTRYPOINTで ["docker-entrypoint.sh"]を起動

②環境変数を表示するシェルを作成、コピー
構築したVMの/root/study直下にシェルを作成。

vi docker-entrypoint.sh

```sh:docker-entrypoint.sh
#! /bin/sh

env

exec "$@"
```

上記シェル解説：
env←環境変数表示するコマンド
exec "$@"←cmdで引数に渡されたものを無条件に実行する、


④ビルドする。

```
docker build -t test .
```


docker image ls を使用するとtestというイメージが作成出来ている。
testコンテナを実行してみる。

```
docker run test
```

シェルに指定された環境変数・ハローワルドが表示される。
続いて、コンテナイメージを削除する。

```
docker container prune
```



#### イメージ公開（DockerHub）

作成したDockerイメージを（DockerHub）に公開する。
- ①Dockerfileの作成（ベースはCentos7）
- ②環境変数を表示するシェルを作成、コピー
- ③echoコマンドを実行させる
- ④ビルド
- ⑤実行・動作確認


DockerHubへ公開する手順

- Dockerイメージへ付与するタグ名
- Dockerイメージのタグ追加
- DockerHubへログイン
- DockerHubへ公開


Dockerイメージへ付与するタグ名のルールは以下の通り

基本構成：ユーザ名/イメージ名：タグ

全角と記号は文字列として使用できない

ユーザ名はdockerアカウント公開するためには必須

- Dockerイメージのタグ追加

```
docker tag SRC_NAME[:TAG] TRG_NAME[:TAG]

引数
 SRC_NAME　タグ付けしたいdockerイメージ名
 TRG_NAME　追加したいタグ名

```


- DockerHubへログイン

```
docker login [-u USER] [-p PASSWORD]

引数
 -u USER　ユーザ名
 -p PASSWORD　パスワード

```


- DockerHubへ公開

```
docker push IMAGE_NAME[:TAG]

引数
 IMAGE_NAME 公開したいdockerイメージ名
```

続いて演習で作成したイメージのビルド・公開・確認を行う。

前提条件：
先ほど作ったdockerfileとdocker-entrypoint.shがある

dockerfileをユーザーネーム付きでビルドする。

```
docker build -t <username>/test:v.1.0.0 .
```

ビルドが完了したので、出来ているか、確認する。

```
docker image ls
```

出来ているので、試しにビルドしたイメージを実行させる。

```
docker run <username>/test:v.1.0.0
```

公開するためログインする

```
docker login
```

ユーザ名、パスワードを入力する。


ログインが出来たらdocker pushで公開する。

```
docker push <username>/test:v.1.0.0
```

成功したので、実際にサインインして公開されているかどうか見てみる。


testイメージがアップロードされているのが解る。