初心者のDocker事始め（docker-compose編その1

# やること

* [初心者のDocker事始め](https://qiita.com/s-yoshida/items/928fc0ad7282ed62def2)と同じようなことをdocker-composeを使って行う。

# docker-compose is 何

Dockerfileがイメージを作るものに対してdocker-composeはコンテナを立ち上げるものになります。セットで使うことが多いイメージですね。

# ディレクトリ構成

```txt
[Dir] test
 ├ [file] Dockerfile
 ├ [file] docker-compose.yml
 └ [Dir] html

```

docker-composeはymlって形式で記述。rubyやってる人には馴染みがあるのかもしれない。

# docker-composeインストール

Homebrewでインストールしていきます。

```
$ brew install docker-compose
```

# Dockerfile

```txt
FROM nginx
RUN echo "Hello, World" > /usr/share/nginx/html/hello.html
RUN apt-get update -y
RUN apt-get install -y vim
EXPOSE 80
```

# docker-compose.yml

```yml
version: "3"
services:
  webserver:
    build: "."
    # Dockerfileを使わない場合、以下のように指定可能
    # image: nginx:latest
    ports:
      - 8080:80
    volumes:
      - ~/test/html:/usr/share/nginx/html
```

# docker-compose up

imagesもpsも無い状態で`dockercompose up`します。

```sh
$ ls -la
drwxr-xr-x   5 s-yoshida  staff   160  4 30 14:31 .
drwxr-xr-x+ 63 s-yoshida  staff  2016  4 30 14:31 ..
-rw-r--r--@  1 s-yoshida  staff   109  4 30 02:22 Dockerfile
-rw-r--r--   1 s-yoshida  staff   235  4 30 14:31 docker-compose.yml
drwxr-xr-x   2 s-yoshida  staff    64  4 30 14:27 html

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

$ docker-compose up -d
Creating network "test_default" with the default driver
Building webserver
Step 1/4 : FROM nginx
latest: Pulling from library/nginx
27833a3ba0a5: Pull complete
ea005e36e544: Pull complete
d172c7f0578d: Pull complete
Digest: sha256:e71b1bf4281f25533cf15e6e5f9be4dac74d2328152edf7ecde23abc54e16c1c
Status: Downloaded newer image for nginx:latest
 ---> 27a188018e18
Step 2/4 : RUN echo "Hello, World" > /usr/share/nginx/html/hello.html
 ---> Running in b4c0e8fd34bd
Removing intermediate container b4c0e8fd34bd
 ---> 6c17bc928e8b
Step 3/4 : EXPOSE 80
 ---> Running in 1555683a7211
Removing intermediate container 1555683a7211
 ---> 760d8f840aba
Step 4/4 : VOLUME /usr/share/nginx/html
 ---> Running in 33e80d675c67
Removing intermediate container 33e80d675c67
 ---> 9eb64ba636fe
Successfully built 9eb64ba636fe
Successfully tagged test_webserver:latest
WARNING: Image for service webserver was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating test_webserver_1 ... done

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
fd4f2b98bcd2        test_webserver      "nginx -g 'daemon of…"   35 seconds ago      Up 34 seconds       0.0.0.0:8080->80/tcp   test_webserver_1

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test_webserver      latest              9eb64ba636fe        49 seconds ago      109MB
nginx               latest              27a188018e18        13 days ago         109MB

$ echo 'hoge' > ./html/index.html
$ curl localhost:8080
hoge
```

見事に立ち上がってディレクトリ共有もできましたー。やったね。

# docker-compose down

立ち上げたコンテナを停止する時は`up`の逆で`down`を使います。

```sh
$ docker-compose down
Stopping test_webserver_1 ... done
Removing test_webserver_1 ... done
Removing network test_default

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test_webserver      latest              9eb64ba636fe        7 minutes ago       109MB
nginx               latest              27a188018e18        13 days ago         109MB
```

コンテナの停止と共に削除もされましたね。

# おわり

次回はNginx+PHPの環境を作ります。