LoginSignup
13
13

More than 3 years have passed since last update.

Docker Engine API について

Last updated at Posted at 2020-04-17

普通に Docker を使っている分にはあまり気にしなくてもいい領域だが、Docker in Docker などの使い方をすると、ここらへんの知識がないと理解できない。ので、そこらへんをまとめた記事。

Docker Engine は、主に以下の 3 つのコンポーネントからなるクライアントサーバー型アプリケーションです。

1. サーバー。長時間稼動する種類のプログラムでありデーモンプロセスと呼ばれる( dockerd コマンド)。
2. REST API。プログラムとデーモンとの間での通信方法を定義し、何をなすべきかを指示する。
3. コマンドラインインターフェース(command line interface; CLI)クライアント( docker コマンド)。

server_client.png

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:2376tcp://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。

参考

13
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
13