docker ~tips~

#dockerで学んだこと



```
docker run <image>// ドッカーでコンテナを起動（指定したコンテナが作られていなければ作って起動する
docker create <image> // コンテナを作る（起動はされない）
docker start <image> //作ったコンテナを起動する
docker ps //　ドッカーで起動中のコンテナを確認できる。
docker ps -a // 起動していないコンテナも含めて確認できる。
docker images // ホストにあるimagesを確認できる
docker images -f dangling=true //dangling imageのみを確認できる。
docker build <directory> //dockerfileのあるディレクトリ内で使用。対象ディレクトリ内のdockerfileからdockerimageを作成する。
docker build -t <name> <directory>
docker run -it <image> bash // コンテナに入るためのおまじない
exit // ドッカーから退出
docker restart // exited状態のコンテナを起動する
docker exec -it<container> bash //コンテナに入る
docker commit<container> <image> //　コンテナから新たに作ったコンテナにimage名をつける
docker tag<source(古いimage名）><target(新しいimage名）> 
docker push<image> // 他の人も使えるようになる
docker rmi<image> //不要なimageを削除出来る
docker rm コンテナ名 //不要なコンテナを削除（アクティブなものは消せない）
docker stop コンテナ名 //コンテナを止める
docker system prune // コンテナ全削除（アクティブな物は消せない）
```

##
dockerを止める際
![スクリーンショット 2020-12-04 14.58.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/5fb3be3a-6543-fd4a-831e-c9f733eb4ddf.png)
![スクリーンショット 2020-12-04 14.59.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/d3b1d51a-40bb-ed00-547b-16edf46a82bd.png)
STATUSがUPになっているものが複数あった場合は

```
docker stop 84aafb23ffd4 f4a4902cbfd0 84aafb23ffd4
```
上記のようにスペース区切りでIDを指定すると指定したIDのコンテナが止まる（Exitedになる）
このスペース区切りで指定して複数に実行する方法は削除の時も同様に使用可能

```
docker rm 84aafb23ffd4 f4a4902cbfd0 84aafb23ffd4
```

##コンテナを名前をつけて作る
参考画像
![スクリーンショット 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について

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の作り方
![スクリーンショット 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)
**上記図について以下で詳細を説明していく**
____
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```で記述した内容から生成されたもの。





続く