dockerimageの作成方法について　〜コンテナからcommit・dockerfileからbuild〜

#全体像
![スクリーンショット 2020-12-08 22.41.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/ee9db80e-2a32-7dfb-92df-8601b1a8eb6e.png)
**上記図について以下で詳細を説明していく**
____



##コンテナに名前をつけて作る（コンテナからcommit）
参考画像
![スクリーンショット 2020-12-04 15.20.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/14200b1c-2514-5482-9f2b-441bff2543b5.png)


通常コンテナを作る時は

```
docker run コンテナ名（ここには既にあるコンテナから引っ張ってきたいコンテナの名前を入れる）
```
この方法だと作成されたコンテナの名前はランダムになる

```
 docker run --name sample ubuntu
//上記のsampleが自分でつけるコンテナの名前　ubuntuは既に誰かかが作成済みの持ってきたいコンテナの名前　
```
上記のように--nameとコンテナ名を指定することでコンテナ名をつけられる。

**※同じ名前のコンテナを作ることは出来ないので注意する※**


##docker run のオプション

**detached mode**
```docker run -d <image>```
コンテナ起動後にdetachする（バックグラウンドで動かす「STATUSがUpになった状態でrun出来る」）


**(short-term)foreground mode**
```docker run --rm <image>```
コンテナをExit後に削除する（一回きりのコンテナ）
```docker run hello-world```
のようにコンテナを一回起動して内容を確認→もう使わない
といった時に便利

#dockerfileからの作成方法
##dockerfileについて

docker hubでみたいdockerfileのあるdocker imageを検索（今回はubuntu)
![スクリーンショット 2020-12-04 16.32.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/fbc966a8-95a0-7303-8ad5-5faa360fa201.png)

対象imageを選択
![スクリーンショット 2020-12-04 16.29.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/6f25306b-a88c-e62b-2979-14944c4e612e.png)
![スクリーンショット 2020-12-04 16.35.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/183035e2-fd4f-0388-2c0e-fbca1c13027e.png)

ページのに**Supported tags~ Dockerfile links**がある

そこの見たいバージョンを選択（今回は18.04にする）
![スクリーンショット 2020-12-04 16.29.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/c28d52c8-418d-814a-6961-2f6df288f8bc.png)
そうするとdockerfileの記載のあるGithubへ移動出来る。
**ここに記載されている今回であればFROM scratchからの記載内容がdockerfile**
ここにその対象imageについての記述をしていくことでdockerfileを作っていく

##dockerfileの作り方

dockerfileを作る時はファイル名は命名規則により**「Dockerfile」**とする
**INSTRUCTION argumentsの形で書いていく**
（例：「FROM ubuntu:latest」や「RUN touch test」）
基本最初はFROMから書いていくルール

###fileの具体的な作り方（今回はデスクトップに作ることを想定）
![スクリーンショット 2020-12-04 16.46.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/2d73dddf-c29f-19ee-9d46-453bd697b279.png)

ターミナルを開き

```
PC ~ % cd desktop// デスクトップへ移動
PC desktop % mkdir docker// ドッカーフォルダ作成
PC desktop % cd docker // ドッカーフォルダへ移動
PC docker % code Dockerfile　// Dockerfileというファイルを作成しvscodeを起動
//(codeはvscodeを開くターミナルのコマンド）この時点ではDockerのファイルは開いているだけで保存されていないので注意。vscodeのエディタ上でセーブしましょう（⌘＋s）

```
以下の様にdockerfileを記述していく

```dockerfile

 #ubuntuは元となるdocker image(:latestと書くことは必須ではない)
FROM ubuntu:latest  
 #ubuntu imageに対しtestファイルを作成している
RUN touch test

```

##dockerfileをbuildする（buildによってdockerfileからdocerimageが作成される）

dockerfileのあるディレクトリへ移動する（仮にdockerfileがあるディレクトリを「Docker」とする）
```cd Docker```を使用し対象ディレクトリへ移動。
対象のdockerfileのあるディレクトリへ移動したら

```
docker build .
//ここで使用している「.」はカレントディレクトリを指している（この部分に書くのはbuildをするディレクトリ）。
//現在いるディレクトリのdockerfileをbuildするという指定をする役割をしている
//基本はカレントディレクトリにbuildするので「.」で覚えればOK
```
これでbuild完了。

![スクリーンショット 2020-12-08 21.49.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/1da14c2f-5016-cd83-64cf-a81f7ba5ff64.png)

docker build後に```docker images```コマンドをすると
![スクリーンショット 2020-12-08 21.59.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/e4468a10-8dcc-ce7c-cb6d-f3f2fa686786.png)
一番上に```<none>```と書かれたdockerimageが作成されたことが確認できる。
```docker build .```をした際に名前をつけないと名前が```<none>```となる。
この名前のないimageを```dangling image```と呼ぶ。
```docker images -f dangling=true```とすることでdocker imagesの中からdangling imageのみを検索できる

名前をつける際は

```
docker build -t new-ubuntu:latest .
//new-ubuntu部分が名前になる。tag名：latestは指定しなくてもbuile可能。「.」は上述と同様可憐とディレクトリを指定。
```

###docker buildによってdockerfileの内容が反映されているか確認
![スクリーンショット 2020-12-08 22.26.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/95ee52eb-651e-d8ec-8661-f455b73e22a0.png)

```
docker run -it new-ubuntu bash
ls
```
上記コマンドでコンテナに入り確認するとtestというファイルが作成されていることが確認できる。
この「test」がdockerfileにて```RUN touch test```で記述した内容から生成されたもの。