---
# System prepended metadata

title: Docker学習 1st
tags: [Docker学習]

---

###### tags: `Docker学習`

# Docker学習 1st

初期状態

```dockerfile:Dockerfile
FROM ruby:2.1
```

## どのように Dockerfile を作成していくか

`docker build . -t nginx-server` とすると、 `nginx-server` という名前でコンテナイメージを作成される。

`docker run -it nginx-server bash` とすると、コンテナの中に入ることができる。
コンテナの中に入って`apt install` 等を実行して少しずつイメージを作成するためのコマンドを貯めていく。

`docker run`で打ってみて実験できたコードを少しずつ、`Dockerfile`に書き加えていく。

`RUN`を実行するたびに、イメージとして保存される。もしも、`RUN`の内容を書き換えるとまたそこから実行される。

そのため、実験しているうちは、`RUN`を複数書いていっても良い。Gitにpushする時には、複数の`RUN`をまとめると良い。

なぜ、`RUN`するかというと、`RUN`ごとにイメージが作成されるので、`apt update`するとキャッシュがコンテナの中に保存される。それだと、`docker push`するときに不要な領域を使ってしまって無駄である。

`apt update` と `apt clear` を同じ`RUN`で行うことによって、イメージの容量を減らすことができる。

複数のコマンドをつなげるには`¥`を用いる。

```dockerfile
RUN set -x ¥
    apt update
```

`docker images` で `docker build`で作成したイメージの一覧を確認できる。
`<none>` となるっているイメージはビルドに失敗したビルドイメージです。適宜削除してください。


## 裏技
`set -x` をコマンドの前に`RUN` の先頭に書くことで、どの部分でエラーになったかがわかりやすくなります。

## 設問

### 問1 `build -t`

`build -t` の `-t` は何を表していますか。
`docker images` で見比べてみましょう。

### 問2 `run -it`

`docker run -it` の `-it` はそれぞれ何を表していますか。

### 問3 `nginx`インストール

`ruby:2.1`のイメージに追加で `nginx`をインストールしてください。

### 問4 複数の`RUN`をまとめる

複数の`RUN`をまとめて見ましょう。

### 問5 `RUN`をまとめた状態で書き換え

複数の`RUN`をまとめた上で、`vim`をインストールしたDockerfileを作成してみよう。
`docker build`するとどうなりますか?

### 問6 `apt update` で作成されるキャッシュを削除しましょう

`/var/lib/apt/lists` を消してください。
イメージサイズが変わっているはずです。
削除前と後の容量を比較して見ましょう。

### 問7 複数のDockerfile

Nginx のコンテナ、ruby のコンテナそれぞれで、別のイメージにしたいのですが、同じフォルダに複数のDockerfileを配置したい場合、どのようなオプションを`docker build`に指定しますか。
