普通に Docker を使っている分にはあまり気にしなくてもいい領域だが、Docker in Docker などの使い方をすると、ここらへんの知識がないと理解できない。ので、そこらへんをまとめた記事。
Docker Engine は、主に以下の 3 つのコンポーネントからなるクライアントサーバー型アプリケーションです。
- サーバー。長時間稼動する種類のプログラムでありデーモンプロセスと呼ばれる( dockerd コマンド)。
- REST API。プログラムとデーモンとの間での通信方法を定義し、何をなすべきかを指示する。
- コマンドラインインターフェース(command line interface; CLI)クライアント( docker コマンド)。
1が右の Docker で、3が左の Docker で、2は真ん中の矢印。
いつもdocker run
とかdocker build
とか色々としているが、あれはただの Docker デーモンプロセスへの命令である。docker
コマンドが実行された後は、Docker のデーモンプロセスを探しに行くのだが、Docker デーモンプロセスへの橋渡しは REST API によって行われる。REST API なのでエンドポイントがあるわけだが、たいていは/var/run/docker.sock
にある。クライアントとサーバーが別のホストにいる場合(Docker in Docker など)、tcp://docker:2376
やtcp://docker:2375
にエンドポイントがある。
REST API を curl で叩く
docker run
は、いうなれば REST API を叩いているだけなので、curl
でも叩ける。ので、叩いてみる。
REST API のバージョンを確認する。
REST API のバージョンは、DockerデーモンとDockerクライアントのバージョンによって異なる。クライアントとサーバーが同一のホスト内ではないとき、使用しているDocker Engine のバージョンが違う、ということはよくある。
$ sudo docker version
Client:
Version: 19.03.6-ce
API version: 1.40
Go version: go1.13.4
Git commit: 369ce74
Built: Fri Mar 6 23:25:53 2020
OS/Arch: linux/amd64
Experimental: false
Server:
Engine:
Version: 19.03.6-ce
API version: 1.40 (minimum version 1.12)
Go version: go1.13.4
Git commit: 369ce74
Built: Fri Mar 6 23:26:25 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.3.2
GitCommit: ff48f57fc83a8c44cf4ad5d672424a98ba37ded6
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
docker container ls
の REST API を叩こうと思うが、Docker コンテナが何もないとレスポンスが空になるので、適当に Docker コンテナを作成する。
sudo docker run -itd --name tmp ubuntu /bin/bash
/var/run/docker.sock
にあるエンドポイントを使っていく。
container ls
をしたいため、http:/v1.40/containers/json
を叩く。
$ sudo curl --unix-socket /var/run/docker.sock http:/v1.40/containers/json
[{"Id":"9e36dbee56dbf11883143529799fa7e978109529e1094984d586828a4df9e8c8","Names":["/tmp"],"Image":"ubuntu","ImageID":"sha256:4e5021d210f65ebe915670c7089120120bc0a303b90208592851708c1b8c04bd","Command":"/bin/bash","Created":1586681448,"Ports":[],"Labels":{},"State":"running","Status":"Up 23 seconds","HostConfig":{"NetworkMode":"default"},"NetworkSettings":{"Networks":{"bridge":{"IPAMConfig":null,"Links":null,"Aliases":null,"NetworkID":"3e33a3326ed11a3ba0c20e1beabc2b968e5d75502c2a5c5f950aba07da1dbe9f","EndpointID":"f3b5ec738d21c9a0f7c52ba970cffd90773e0947a87965dee1b2fef6d2511770","Gateway":"172.17.0.1","IPAddress":"172.17.0.2","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:11:00:02","DriverOpts":null}}},"Mounts":[]}]
先ほど、作った Docker コンテナがレスポンスとして返ってきたのでOK。
参考