最もシンプルな docker-compose.yml の hello-world

<h2>Looking for the simplest "Hello-World" docker-compose YAML file?</h2>

> `docker compose` コマンドの単純な動作確認をしたい。

つまり `docker run hello-world` と同じレベルの **`docker compose` の `hello world` が欲しい**のです。

[「`docker-compose` `hello-world` `simple`」とググって](https://www.google.com/search?q=docker-compose+hello-world+simple)も Ubuntu ベースのサンプルしかありませんでした。単純に `docker-compose up` で起動するかのテストであるため、そこまで大きなイメージは必要ありません。

## TL; DR <sub><sup>（今北産業）</sup></sub>

```yaml:docker-compose.yml
services:
  hello:
    image: hello-world:latest
```

- Alpine（5.57 MB）より軽い `hello-world:latest` イメージ（13.3 kB）を使うのがオススメ
- Download: https://keinos.github.io/hello-docker-compose/docker-compose.yml @ GitHub
- Source: https://github.com/KEINOS/hello-docker-compose/blob/master/docker-compose.yml @ GitHub

```shell-session:usage
$ # ダウンロード
$ curl -sSL -O https://keinos.github.io/hello-docker-compose/docker-compose.yml

$ # Docker compose v2 を利用している場合
$ docker compose run --rm hello
*** snip ***
Hello from Docker!
*** snip ***

$ # 古い docker-compose （v1）　を利用している場合
$ docker-compose run --rm hello
*** snip ***
Hello from Docker!
*** snip ***
```

:::note info
`Top-level object must be a mapping` エラーが出た場合は、ダウンロードしたファイルが壊れています（YAML 形式ではありません）。`docker-compose.yml` の中身を確認してみてください。
:::

## TS; DR

> あれ？もしかして `docker-compose` 動いてなくなくない？
> でも `docker-compose --version` は動くのに？

`docker-compose` のバージョン情報は返すものの、それ以外のコマンド・オプションが動かないことがありました。特に CircleCI 実行時や Vagrantfile 内のスクリプトで、Docker や Docker-Compose を自動インストールした場合などです。

原因は、単純な設定ミスで Docker デーモンの起動に失敗していたことでした。

そこで[ポカヨケ](https://ja.wikipedia.org/wiki/%E3%83%9D%E3%82%AB%E3%83%A8%E3%82%B1)として、CI を回す時や `vagrant up` 時に<strong>`docker run hello-world` と同じくらい至極簡単な動作テストを `docker-compose` でしたかった</strong>のです。

しかし[「`docker-compose` `hello-world` `simple`」とググって](https://www.google.com/search?q=docker-compose+hello-world+simple)も Ubuntu ベースのサンプルしかありませんでした。単純に `docker-compose run` で起動するかのテストであるため、そこまで大きなイメージは必要ありません。

「それなら、普通に docker の `hello-wolrd` イメージを使えば良いじゃん」と聞こえてきたので、自分のググラビリティとして。

```shell-session:実行例
$ # 作業ディレクトリの作成
$ mkdir hello-world && cd $_

$ # ダウンロード（ソースをコピペして作成しても OK）
$ curl -O https://keinos.github.io/hello-docker-compose/docker-compose.yml
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    62  100    62    0     0    227      0 --:--:-- --:--:-- --:--:--   226

$ # 確認
$ ls
docker-compose.yml

$ cat docker-compose.yml
version: "3"
services:
  hello:
    image: hello-world:latest
 
$ # 実行
$ docker-compose run hello
Creating network "core_default" with the default driver
Creating core_hello_1 ... done
Attaching to core_hello_1
hello_1  | 
hello_1  | Hello from Docker!
hello_1  | This message shows that your installation appears to be working correctly.
hello_1  | 
hello_1  | To generate this message, Docker took the following steps:
hello_1  |  1. The Docker client contacted the Docker daemon.
hello_1  |  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
hello_1  |     (amd64)
hello_1  |  3. The Docker daemon created a new container from that image which runs the
hello_1  |     executable that produces the output you are currently reading.
hello_1  |  4. The Docker daemon streamed that output to the Docker client, which sent it
hello_1  |     to your terminal.
hello_1  | 
hello_1  | To try something more ambitious, you can run an Ubuntu container with:
hello_1  |  $ docker run -it ubuntu bash
hello_1  | 
hello_1  | Share images, automate workflows, and more with a free Docker ID:
hello_1  |  https://hub.docker.com/
hello_1  | 
hello_1  | For more examples and ideas, visit:
hello_1  |  https://docs.docker.com/get-started/
hello_1  | 
core_hello_1 exited with code 0

$ # 終了結果
$ echo $?
0
```
```shell-session:動作確認済み環境
$ docker version
Client:
 Version:           18.06.1-ce
 API version:       1.38
 Go version:        go1.10.8
 Git commit:        e68fc7a
 Built:             Tue Aug 21 17:16:31 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.1-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.8
  Git commit:       e68fc7a
  Built:            Tue Aug 21 17:16:31 2018
  OS/Arch:          linux/amd64
  Experimental:     false

$ docker-compose version
docker-compose version 1.24.0, build 0aa59064
docker-py version: 3.7.2
CPython version: 3.6.8
OpenSSL version: OpenSSL 1.1.0j  20 Nov 2018

$ cat /etc/os-release
NAME="Container Linux by CoreOS"
ID=coreos
VERSION=2023.5.0
VERSION_ID=2023.5.0
BUILD_ID=2019-03-09-0138
PRETTY_NAME="Container Linux by CoreOS 2023.5.0 (Rhyolite)"
ANSI_COLOR="38;5;75"
HOME_URL="https://coreos.com/"
BUG_REPORT_URL="https://issues.coreos.com"
COREOS_BOARD="amd64-usr"
```