dockerを初めて勉強した際にやったこと

# 概要
* 会社で必要に迫られて今更初めてdockerを触った
* 同じような境遇で、勉強しなきゃなーと思ってる人の役に立つかもと思いメモを置いておきます。（自分の備忘録としても...

# dockerが使える環境を作る
## 前提
* 前提：なんらかの方法でubuntu16.04を用意する
* 私はvagrantでvm用意してやった

## dockerのインストール
* https://soralab.space-ichikawa.com/2017/04/docker-ce-install/
* ↑を参考にdockerをインストール
* dockerには有償(EnterpriseEdition)と無償(ConsumerEdition)がある
* それぞれEE、CEと略す
* ここで入れるのはCEの安定版(stable)

```
sudo apt-get update

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository \
       "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
       $(lsb_release -cs) \
       stable"
sudo apt-get update
sudo apt-get install docker-ce
```

* `sudo docker version`してバージョンが出れば入ってる

* この後、docker～ってコマンドを使うが、sudoが毎回必要になってうざいので不要になる設定をする
* dockerグループに属したユーザならsudo不要になるので使うユーザをdockerグループに入れる
* `sudo groupadd docker` (たぶんもうあるけどdockerグループを作る
* `sudo usermod -aG docker $USER` (今使ってるアカウント名$USERをdockerグループに追加する
* 一度、EXITしてログインしなおして反映させる
* `docker run --rm hello-world` を実行する。
* dockerのhello-worldイメージを取ってきて、コンテナとして実行(run)させる
* --rmは実行が終わったらコンテナを削除するオプション

```
$ docker run --rm hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/
```

* こんなんでればOK

## dockerの用語
* イメージ：dockerで実行するコンテナの元になるもの(例えるならOSインストールするディスクとか)
* コンテナ：イメージから生成されるもの。動いてる。

* `docker images`で今持っているイメージ一覧が表示される
* 上でhello-worldをしたので、こんな風に見えるはず

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
`hello-world         latest              48b5124b2768        4 months ago        1.84 kB`
```

* 消すときは`docker rmi <image名>`
* つまり`docker rmi hello-world`すると消える。またイメージ取ればいいので試しに打ってみる。

## docker hubからイメージを持ってきてみる
* dockerのイメージが集まるサイトがある
* 例えば、[docker hub](https://hub.docker.com/)など
* こういうところからイメージを引っ張ってくるといろいろできる
* 試しにubuntu16.04のイメージをもらい、コンテナとして起動してみる
* docker hubでubuntuで検索すると、ubuntuのページがある。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185123/8ab1ea46-566f-59aa-787b-b57b1e139425.png)

* このとき、dockerでイメージを取るには
* ページ名(ubuntu)に:で下のバージョン(16.04とかxenialとか)を付けたものを使う
* `ubuntu:16.04` とか
* さっきはいきなりdocker runしてイメージも起動時に取ってきたが、イメージを取ってくるコマンドは`docker pull <image名>`である
* こんな感じ

```
$ docker pull ubuntu:16.04
16.04: Pulling from library/ubuntu
bd97b43c27e3: Pull complete
6960dc1aba18: Pull complete
2b61829b0db5: Pull complete
1f88dc826b14: Pull complete
73b3859b1e43: Pull complete
Digest: sha256:ea1d854d38be82f54d39efe2c67000bed1b03348bcc2f3dc094f260855dff368
Status: Downloaded newer image for ubuntu:16.04

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              16.04               7b9b13f7b9c0        22 hours ago        118 MB
```

* じゃあ、実行してみよう
* docker runして、ubuntuのbash(シェル)を触れるようにする
* コンテナに入って操作する予定のある場合には`-it`をつける(コンテナに入るttyをつけたりするオプション)

```
ubuntu@smith-vm01:~$ docker run -i -t ubuntu:16.04 /bin/bash
root@280986dc0204:/#
```

* 入れた
* exitするとコンテナ起動時に呼んだbashが終了するので、コンテナも終了する
* 今動いているコンテナ一覧は`docker ps`で見ることができる
* 停止したコンテナも見るときは`docker ps -a`で見る

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

ubuntu@smith-vm01:~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                      PORTS               NAMES
280986dc0204        ubuntu:16.04        "/bin/bash"         32 seconds ago      Exited (0) 23 seconds ago                       pensive_joliot
```

* もう一回、ubuntuコンテナを作ってEXITしてみる

```
$ docker run -i -t ubuntu:16.04 /bin/bash
root@6b33f4d5f825:/#exit

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                      PORTS               NAMES
6b33f4d5f825        ubuntu:16.04        "/bin/bash"         5 seconds ago        Exited (0) 1 second ago                         stoic_wescoff
280986dc0204        ubuntu:16.04        "/bin/bash"         About a minute ago   Exited (0) 53 seconds ago                       pensive_joliot
```

* 同じイメージから2つ目のコンテナができてることが見える。
* このままだと停止コンテナがかさばってしまうので、消してみる
* 停止コンテナを消すコマンドは`docker rm <コンテナID>`である

```
$ docker rm 280986dc0204
280986dc0204
$ docker rm 6b33f4d5f825
6b33f4d5f825
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

* きれいになった
* コンテナをバックグラウンド実行するには、 `-d`をつけて実行する
* この場合は自動でコンテナに入らないので、attachコマンドでコンテナに入る

```
$ docker run -i -t -d ubuntu:16.04 /bin/bash
1d2bf4c63d636b0493ffe9d5c6477d41c763ceaae8a3fb45ccb8a0ef10229f12

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
1d2bf4c63d63        ubuntu:16.04        "/bin/bash"         54 seconds ago      Up 53 seconds                           determined_payne

$ docker attach 1d2bf4c63d63
root@1d2bf4c63d63:/# exit
exit

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

* この場合もexitするとbashが終了するのでコンテナも停止する(run時に指定したコマンドが終わるとコンテナは停止)
* 停止させずに抜け出す(dettach)するにはコンテナ内で`CTRL+P → CTRL+Q`する

```
$ docker run -i -t -d ubuntu:16.04 /bin/bash
04f1dc8f7d0bac691c9111e8d1b3c334c7c007141815cf4843de34a1ef076056

$ docker attach 04f1dc8f7d0bac691c9111e8d1b3c334c7c007141815cf4843de34a1ef076056

root@04f1dc8f7d0b:/# <元のubuntuのプロンプト>$
$

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
04f1dc8f7d0b        ubuntu:16.04        "/bin/bash"         24 seconds ago      Up 23 seconds                           vigilant_babbage
```

* 抜け出すこともできるようになった。
* コンテナ外からコンテナを停止させるには`docker stop <コンテナID>`
* これでコンテナを作って止めて消すことができるようになった。
* まずはここまで。次、勉強したらまた書く。