Dockerの使い方　2日でDocker習得編 (udemy 米国AI開発者がゼロから教えるDocker講座）

![660_bit202003301411424272.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/adb2bb4f-0fa5-98cf-19c3-fa02b0c401ba.jpeg)


Docker マスコットのmobyくん

#目標　
祝日丸一日　8/10　　　半日勤務日　8/11の合計２日（実質１.5日）でDockerを叩き込む

以下、学習のログ (1日目）


##前提

Q　仮想化とは？
　仮想化は、PCの中に仮想的なコンピューターを作る技術です。一台のPC内に、MAC、Windowsなど別のPCが入っているイメージです。（そう見せかける技術）

Q　仮想化とコンテナの違い
　コンテナは仮想OSを立ち上げる必要がありません！ホスト（自分のPC）のOSのカーネルを共有することによって、
　独立した環境設定を作る技術です。


クラウドとのつながりが深いので、クラウドの勉強もするとより解像度が上がりそうです。（今度、深めます）

Qクラウドとは？
　サーバーの一部を貸し出すことです。
　ex)AWS 
  AWSの用意したマシンのリソース（容量）のうち、<b>ある部分だけを仮想マシンを作ってもらい、使わせてもらうことです。








##概念基本

![bft_container_ojisan_03_08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/5f20d910-f593-888c-5dc7-c260f56e1ae9.jpeg)




##基本操作

###LINUXコマンド  内容

```
cd <path>|        pathに移動　(cd = change the directory)
pwd|              現在のディレクトリを表示
mkdir|             <new folder> 新しいフォルダを作成
touch <new file>|　新しいファイルを作成
ls |              cd のフォルダ一覧を表示
rm　<file> |      fileを削除
rm-r　<folder> |  folderを削除 
```


###kernerlとShell
![shell2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/df3f8b29-eb8b-5cc3-6c79-6ed0020ecd00.png)



shellを起動するためのアプリが<b>ターミナル<b>



### 1 Docker image 作成(hubを使う）
1 Docker hub　へログイン
```$docker login```

2 hubからimageをpullする
```$docker pull ```

3 docker image を起動(run) （コンテナを作る）
```$docker run -it <image> bash ```

4 コンテナから出る　
```$exit```

5 ホストにあるコンテナ一覧表示
```$docker ps -a```

6ホストにあるイメージを表示
```$docker images ```

7exit状態のコンテナに入る
```$docker restart```

8指定したプログラムを実行
```$docker exec -it<container> bash```

9コンテナから新しいimageを作る
```$docker commit images```

10新しい名前にをタグづけする
```$docker tage <oldname><newname>```

11 docker hub　にあげる
```$docker push```


docker layer のイメージ　
(point) 新しく層(layer)を追加するだけで、コンテナに機能（プログラムex pythonなど）を追加できる。


![sharing-layers (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/14fe3eef-d309-d050-8f2d-6054819e1cae.jpeg)





### 3 Docker コンテナ

Q runとは？　
A run = create+ start

コンテナの削除

```
$ docker rm  削除（１〜）　　（※複数指定したい場合は、スペースあける）
$ docker system prune　全削除
```

コンテナの名前をつける
```$docker run --name<name> image```

コンテナの使い方　２つ
１　常に起動　　　　
２　時々使い、すぐ捨てる


detatch mode (コンテナを起動後、deatchする)
```$docker run -d <image>```

foregraound mode (一回きりの起動で捨てる)
```$docker run --rm <image>```


### 4 Docker file
Docker file→Docker image を作る（ビルド）

dockerfileの作り方
INSTRUCTION　（命令コマンド）　 argument(引数）　で作る
主な４つ
FROM
ADD
RUN
CMD


FROM image　　　元となるイメージ
```FROM ubuntu:latest```

RUN Linux コマンドの実行
```RUN　touch test``` (ファイルを作成）

（重要）Docker image layerの数は最小限にする
　（理由）runするたびにコンテナが作られ、開発現場において、容量が圧迫される
(layer を作るのはrun,copy,addの３つ)

CMD コンテナのデフォルトのコマンドを指定
```CMD[executable(コマンド）]```
最後に記述する
・１つのDockerfileに一つだけ



####docker context　と　docker deamonの仕組み
![architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/8bbdb37c-04e3-e1f3-e7ba-58955514c2c4.png)

Docker Context(状況・環境）　＝Docker fileのあるFolder のこと
Docker Context（★フォルダまるごと）をデーモンに渡し、デーモンが処理を行うことでコンテナが作られる。


####COPYとADD
基本COPYでよい
ADDはホストに圧縮したファイルがあって、それを解凍してコンテナ落としたいときに使う。


ENV 環境変数を設定 （↓よくある書き方２選）
ENV　1 <key> <values>
     ２<key> = <vakue>


WORKDIR 
デフォルトだとdcokerfileからdockerimageを作る際、コンテナ側のroot直下にフォルダを作成する。
それを避けるために、WORKDIRで作りたいフォルダを指定する。


####ホストのファイルシステムをコンテナにマウントする

![docker-v01-300x144.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/e64b0f8e-e991-bbf2-f91d-9cef8f1b5cf0.png)



目的
・コンテナを軽くするため（共有するものであるため）
コンテナは解析をするための場所（実行環境）として使い、ホストにコードを置く。

＜マウントのやり方＞
```docker run (-it) -v <hostのパス> <containerのパス> (bash)```
　★-vをつけてコンテナを実行する
　★かなりの頻度で使う
　★コンテナ操作側がroot権限で実行するため、セキュリティ上問題


#####root権限問題の解消　（ユーザーIDとグループIDを指定して、コンテナをRUNする）

```
run -u <ユーザーID>:<グループID>
        $(id -u):$(id -g) 

#Linuxコマンド
ユーザーIDの指定　
id -u
グループIDの指定
id -g
```

パーミッション（アクセス権限）見方

```
d   rwx　　  rwx 　　   　　rwx       （実際　drwxrwxw-xwなどと書かれる）
　(所有者)  (所有グループ)  (その他)
```

"d"ディレクトリ　　"-"ファイル　　　"l"シムリンク


####ホストのポートをコンテナのポートにつなげる

※ポート・・アクセスできる入り口
ネットワーク通信で必要な「プロトコル」 「IPアドレス」と「ポート番号」が必要
ex)マンション　、「どのような方法」で「どこのマンション（コンピュータ）」の「何号室（何番ポート）」を使うか

![20181118153602.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/db2e79de-3f6c-b544-8b0e-3399a4f8c6d1.png)




<b>重要<b>   　　　 ホスト→コンテナへポートを繋げるやり方

```-p <host-port>:<container-port>```

コンテナをWEBサービスとして立てる


####CPU・メモリの上限を設定する
＊共同開発だと１台のホストサーバー（クラウド上など）に負荷がかかりすぎて、ダウンすることもある・・。

＜やり方＞

```
$docker run -it --rm --cpus 4　--memory 2g ubuntu bash
                      （CPU上限）　（メモリ上限）
```

コンテナの情報を一覧表示
```
dockler inspect <container>
docker inspect <container> | grep -i cpu #特定の情報のみ表示　ここではCPU
```







補足　
・コンテナを実行するとroot権限(管理者権限＝何でもできる権限）になる。
・環境変数
・OSが持っている変数（全てのプログラムに適用される）　変更可能
 ex)HOME,PATH,USER
・プロンプト（$) 意味　ここから入力しなさい
・CLI　コマンドでのマシンとの対話
・Registory ソフトの情報が書いてあるところ