Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Docker Inside -- Client-Server Architecture --

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →
Avatar for skatsuta skatsuta
September 28, 2015

Docker Inside -- Client-Server Architecture --

株式会社 CA リワードの社内で開催している Go 勉強会の資料です。

Docker の採用しているクライアントサーバアーキテクチャについて、 Docker daemon 側と Docker client 側の実装をそれぞれ解説した資料です。

Avatar for skatsuta

skatsuta

September 28, 2015

Other Decks in Programming

Transcript

  1. Docker Remote API を直接使ってみる $ docker images REPOSITORY TAG IMAGE

    ID CREATED VIRTUAL SIZE golang latest e7bca7669626 10 days ago 709.5 MB $ export DOCKER_IP=$(docker-machine ip demo) $ wget --server-response --no-check-certificate --certificate $DOCKER_CERT_PATH/cert. pem --private-key $DOCKER_CERT_PATH/key.pem "https://$DOCKER_IP:2376/images/json" -O - -q | jq . HTTP/1.1 200 OK Content-Type: application/json Server: Docker/1.8.2 (linux) Date: Sun, 27 Sep 2015 15:33:47 GMT Content-Length: 568 [ { "Id": "e7bca7669626deae3a1d4bdf66bae5ee8d02f5f5130f090a4895a8cd9fce4921", "ParentId": "62df3617331c53ec328a2ae479b275f2ed1aa6fe4a0eacf5f5967e090b666a42", "RepoTags": [ "golang:latest" ], "RepoDigests": [], "Created": 1442507466, "Size": 2481, "VirtualSize": 709470237, "Labels": {} } ]
  2. DOCKER_* 環境変数は Docker デーモンへの接続情報 $ docker-machine env demo export DOCKER_TLS_VERIFY="1"

    export DOCKER_HOST="tcp://192.168.99.101:2376" export DOCKER_CERT_PATH="/Users/soshi/.docker/machine/machines/demo" export DOCKER_MACHINE_NAME="demo" # Run this command to configure your shell: # eval "$(docker-machine env demo)" $ docker-machine config demo --tlsverify --tlscacert="/Users/soshi/.docker/machine/machines/demo/ca.pem" -- tlscert="/Users/soshi/.docker/machine/machines/demo/cert.pem" --tlskey=" /Users/soshi/.docker/machine/machines/demo/key.pem" -H=tcp://192.168.99.101:2376 $ docker $(docker-machine config demo) images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE golang latest e7bca7669626 10 days ago 709.5 MB
  3. ルーティング定義: docker/docker/api/server/server.go#L321-L414 func createRouter(s *Server) *mux.Router { r := mux.NewRouter()

    if os.Getenv("DEBUG") != "" { profilerSetup(r, "/debug/") } m := map[string]map[string]HTTPAPIFunc{ ... "GET": { ... "/info": s.getInfo, "/version": s.getVersion, "/images/json": s.getImagesJSON, ... }, "POST": { ... "/build": s.postBuild, "/images/create": s.postImagesCreate, ... "/containers/create": s.postContainersCreate, ... "/containers/{name:.*}/restart": s.postContainersRestart, "/containers/{name:.*}/start": s.postContainersStart, "/containers/{name:.*}/stop": s.postContainersStop, ... ...
  4. イメージ情報一覧を返す: docker/docker/api/server/image.go#L361- L373 func (s *Server) getImagesJSON(ctx context.Context, w http.ResponseWriter,

    r *http. Request, vars map[string]string) error { if err := parseForm(r); err != nil { return err } // FIXME: The filter parameter could just be a match filter images, err := s.daemon.Repositories().Images( r.Form.Get("filters"), r.Form.Get("filter"), boolValue(r, "all")) if err != nil { return err } return writeJSON(w, http.StatusOK, images) }
  5. OS X 版のバイナリには daemon コマンドがない $ uname -a Darwin MacBookPro.local

    14.5.0 Darwin Kernel Version 14.5.0: Wed Jul 29 02:26:53 PDT 2015; root: xnu-2782.40.9~1/RELEASE_X86_64 x86_64 $ docker daemon --help docker: 'daemon' is not a docker command. See 'docker --help'. $ docker-machine ssh demo docker@demo:~$ uname -a Linux demo 4.0.9-boot2docker #1 SMP Thu Sep 10 20:39:20 UTC 2015 x86_64 GNU/Linux docker@demo:~$ docker daemon --help Usage: docker daemon [OPTIONS] Enable daemon mode --api-cors-header= Set CORS headers in the remote API -b, --bridge= Attach containers to a network bridge ... docker@dome:~$ ps aux | grep docker root 2385 0.1 3.5 432244 35980 ? Sl 08:22 1:07 /usr/local/bin/docker daemon -D -g /var/lib/docker -H unix:// -H tcp://0.0.0.0:2376 --label provider=virtualbox --tlsverify -- tlscacert=/var/lib/boot2docker/ca.pem --tlscert=/var/lib/boot2docker/server.pem -- tlskey=/var/lib/boot2docker/server-key.pem -s aufs Linux 版には当然ある
  6. daemon コマンドをサポートしていないアーキテクチャ用: docker/docker/daemon/daemon_unsupported.go // +build !linux,!freebsd,!windows package daemon const platformSupported

    = false // +build linux freebsd package daemon import ... const ( // See https://git.kernel.org/cgit/linux/kernel/git/tip/tip.git/tree/kernel/sched/sched.h? id=8cd9234c64c584432f6992fe944ca9e46ca8ea76#n269 linuxMinCPUShares = 2 linuxMaxCPUShares = 262144 platformSupported = true ) ... daemon コマンドをサポートしているアーキテクチャ用: (Unix) docker/docker/daemon/daemon_unix.go
  7. docker images # イメージ一覧を表示する $ docker images REPOSITORY TAG IMAGE

    ID CREATED VIRTUAL SIZE golang latest e7bca7669626 10 days ago 709.5 MB # 中間イメージも表示する $ docker images -a REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE golang latest e7bca7669626 10 days ago 709.5 MB <none> <none> 62df3617331c 10 days ago 709.5 MB <none> <none> a2e423ce2323 10 days ago 709.5 MB <none> <none> 3947c44d1a74 10 days ago 709.5 MB <none> <none> 0719eb1f7878 10 days ago 709.5 MB <none> <none> d5d9aea02377 10 days ago 709.5 MB <none> <none> c24b809cc565 10 days ago 425.8 MB <none> <none> a35079f01662 10 days ago 425.8 MB <none> <none> a3b158f2d1df 10 days ago 425.8 MB <none> <none> aba657f6bfe7 10 days ago 425.8 MB <none> <none> 20b348f4d568 2 weeks ago 291.8 MB <none> <none> 8b49fe88b40b 2 weeks ago 169.5 MB <none> <none> 8c00acfb0175 2 weeks ago 125.2 MB <none> <none> 843e2bded498 2 weeks ago 125.2 MB
  8. docker/docker/api/client/images.go // CmdImages lists the images in a specified repository,

    or all top-level images if no repository is specified. func (cli *DockerCli) CmdImages(args ...string) error { cmd := Cli.Subcmd("images", []string{"[REPOSITORY[:TAG]]"}, "List images", true) ... all := cmd.Bool([]string{"a", "-all"}, false, "Show all images (default hides intermediate images)") ... v := url.Values{} ... if *all { v.Set("all", "1") } serverResp, err := cli.call("GET", "/images/json?"+v.Encode(), nil, nil) if err != nil { return err } defer serverResp.body.Close() images := []types.Image{} if err := json.NewDecoder(serverResp.body).Decode(&images); err != nil { return err } w := tabwriter.NewWriter(cli.out, 20, 1, 3, ' ', 0) ... fmt.Fprintln(w, "REPOSITORY\tTAG\tIMAGE ID\tCREATED\tVIRTUAL SIZE") ... for _, image := range images { ... fmt.Fprintf(w, "%s\t%s\t%s\t%s ago\t%s\n", repo, tag, ID, units.HumanDuration(time.Now().UTC().Sub (time.Unix(int64(image.Created), 0))), units.HumanSize(float64(image.VirtualSize))) ... } if !*quiet { w.Flush() } return nil }
  9. Misc container names https://github.com/docker/docker/blob/master/pkg/namesgenerator/names-generator.go https://github.com/docker/docker/pull/4902 internal container files $ docker

    info ... Storage Driver: aufs Root Dir: /mnt/sda1/var/lib/docker/aufs ... $ docker-machine ssh demo docker@demo:~$ sudo ls -al /mnt/sda1/var/lib/docker/aufs/diff/**