$30 off During Our Annual Pro Sale. View Details »

New Docker Compose

New Docker Compose

DockerCon 2021

skanehira

May 28, 2021
Tweet

More Decks by skanehira

Other Decks in Programming

Transcript

  1. New Docker
    Compose

    View Slide

  2. 自己紹介
    {
    "
    名前": "
    ゴリラ",
    "
    好物": [
    "Go", "Vim",
    "Docker", "Deno"
    ],
    "
    趣味": [
    "Vim
    プラグイン開発",
    "Go
    を使ったCLI
    開発",
    "
    興味ある技術の勉強",
    "
    技術記事の執筆",
    "
    筋トレ"
    ],
    "GitHub": "https://github.com/skanehira",
    "Twitter": "https://twitter.com/gorilla0513"
    }

    View Slide

  3. 本日の話
    docker compose が使えるようになったので、それについて色々
    環境は次の通り
    $ docker version
    Client:
    Cloud integration: 1.0.14
    Version: 20.10.6
    API version: 1.41
    Go version: go1.16.3
    Git commit: 370c289
    Built: Fri Apr 9 22:46:57 2021
    OS/Arch: darwin/arm64
    Context: default
    Experimental: true
    ...

    View Slide

  4. docker compose とは?
    Docker CLIに同梱された新しい docker-compose
    docker-compose はメンテ継続
    雑に言うと docker-compose のGo実装
    正式名称はDocker Compose CLI
    docker-compose と互換性を持っている(一部のフラグを除く)
    docker-compose に置き変わることを目標としている
    compose-specの仕様に準拠している

    View Slide

  5. 現時点利用できるコマンド一覧
    Commands:
    build Build or rebuild services
    convert Converts the compose file to platform's canonical format
    create Creates containers for a service.
    down Stop and remove containers, networks
    events Receive real time events from containers.
    exec Execute a command in a running container.
    images List images used by the created containers
    kill Force stop service containers.
    logs View output from containers
    ls List running compose projects
    pause pause services
    port Print the public port for a port binding.
    ps List containers
    pull Pull service images
    push Push service images
    restart Restart containers
    rm Removes stopped service containers
    run Run a one-off command on a service.
    start Start services
    stop Stop services
    top Display the running processes
    unpause unpause services
    up Create and start containers

    View Slide

  6. compose-spec とは?
    プラットフォームに依存しない、マルチコンテナなアプリケーションを定
    義するための標準仕様
    docker-compose が提供していた機能を標準な仕様として査定
    公式サイトは https://compose-spec.io

    View Slide

  7. Docker Compose CLI の特徴

    View Slide

  8. クラウド対応
    マルチコンテナを ECS と ACI(Azure Cloud Instance) に簡単にデプロ
    イできる
    AWSのECSの例
    docker compose up でFargetのクラスタ、サービス、タスクやLBな
    どを作成
    docker compose down で作成したリソースを削除

    View Slide

  9. CLI本体
    docker-compose.yaml のパースライブラリcompose-goが公開されてい

    Docker Compose CLI もそれを利用している
    compose 関連のツールの作成が楽になる
    buildkitがデフォルト有効になっている
    Goによる実装なので、goroutineを使った並行処理を活かせる
    既存のエコシステム( Docker CLI のSDKなど)を利用できる

    View Slide

  10. docker-compose との差分
    docker-compose build --memory 未対応
    一部 docker-compose で非推奨になったフラグは非対応
    docker-compose rm --all など
    詳細は以下のリンクを参照
    https://docs.docker.com/compose/cli-command-compatibility
    https://github.com/docker/compose-cli/issues/1283

    View Slide

  11. docker-compose からの移行について
    個人、開発での利用は移行しても良さそう
    理由
    docker-compose の機能をほぼ互換している
    一部のフラグは対応していないが、基本的に問題ない
    パフォーマンス向上を期待できる
    便利な新機能が追加される可能性が高い
    docker compose ls のような機能など

    View Slide

  12. docker compose を使ってみる
    https://docs.docker.jp/compose/wordpress.html のyamlを使用
    version: '3'
    services:
    db:
    ...
    wordpress:
    depends_on:
    - db
    image: wordpress:latest
    ports:
    - "8000:80"
    restart: always
    environment:
    WORDPRESS_DB_HOST: db:3306
    WORDPRESS_DB_USER: wordpress
    WORDPRESS_DB_PASSWORD: wordpress
    volumes:
    db_data:

    View Slide

  13. コンテナ作成
    MacbookPro13% docker compose up
    [+] Building 12.3s (3/4)
    [+] Building 12.4s (3/4)
    [+] Building 12.5s (3/4)
    [+] Building 24.3s (5/5) FINISHED
    => [internal] load build definition from Dockerfile 0.0s
    => => transferring dockerfile: 58B 0.0s
    ...
    [+] Running 4/1
    ⠿ Network demo_default Created 3.5s
    ⠿ Volume "demo_db_data" Created 0.0s
    ⠿ Container demo_db_1 Created 0.1s
    ⠿ Container demo_wordpress_1 Created 0.0s
    Attaching to db_1, wordpress_1
    ...
    wordpress_1 | [Sun May 23 12:28:34.735398 2021] [mpm_prefork:n...
    wordpress_1 | [Sun May 23 12:28:34.735591 2021] [core:notice] ...
    ...
    db_1 | 2021-05-23T12:28:46.521520Z 0 [Note] /usr/sbin/m...
    db_1 | Version: '5.7.33' socket: '/var/run/mysqld/mysq...

    View Slide

  14. 初期画面

    View Slide

  15. コンテナ一覧と停止
    MacbookPro13% docker compose ps
    NAME SERVICE STATUS PORTS
    demo_db_1 db running 3306/tcp, 33060/tcp
    demo_wordpress_1 wordpress running 0.0.0.0:8000->80/tcp, :::8000->80/tcp
    MacbookPro13% docker compose down
    [+] Running 3/3
    ⠿ Container demo_wordpress_1 Removed 2.1s
    ⠿ Container demo_db_1 Removed 1.2s
    ⠿ Network demo_default Removed 2.5s
    MacbookPro13%

    View Slide

  16. コンテナにアタッチする
    MacbookPro13% docker compose exec db mysql -uwordpress -pwordpress -Dwordpress
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor. Commands end with ; or \g.
    Your MySQL connection id is 2
    Server version: 5.7.33 MySQL Community Server (GPL)
    Copyright (c) 2000, 2021, Oracle and/or its affiliates.
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    mysql>

    View Slide

  17. プロセス一覧
    MacbookPro13% docker compose top
    demo_db_1
    UID PID PPID C STIME TTY TIME CMD
    999 388 358 0 13:22 ? 00:00:01 /usr/bin/qemu-x86_64 /u...
    demo_wordpress_1
    UID PID PPID C STIME TTY TIME CMD
    root 809 778 0 13:22 ? 00:00:00 apache2 -DFOREGROUND
    www-data 1175 809 0 13:22 ? 00:00:00 apache2 -DFOREGROUND
    www-data 1176 809 0 13:22 ? 00:00:00 apache2 -DFOREGROUND
    www-data 1177 809 0 13:22 ? 00:00:00 apache2 -DFOREGROUND
    www-data 1178 809 0 13:22 ? 00:00:00 apache2 -DFOREGROUND
    www-data 1179 809 0 13:22 ? 00:00:00 apache2 -DFOREGROUND

    View Slide

  18. docker compose を使ってECSにコン
    テナをデプロイしてみる

    View Slide

  19. 利用する docker-compose.yaml
    MacbookPro13% cat docker-compose.yaml
    version: "3"
    services:
    nginx:
    image: nginx:1.19.10-alpine
    ports:
    - "80:80"
    MacbookPro13%

    View Slide

  20. 既存のAWSのプロファイルを利用
    MacbookPro13% docker context create ecs myecs
    ? Create a Docker context using: An existing AWS profile
    ? Select AWS Profile xxxxxxx
    Successfully created ecs context "myecs"
    MacbookPro13% docker context use myecs
    myecs
    MacbookPro13% docker context ls
    NAME TYPE DESCRIPTION...
    default moby Current DOC...
    myecs * ecs

    View Slide

  21. コンテナを作成
    $ docker compose up
    [+] Running 12/14
    ⠙ demo CreateInProgress User Initiated 177.2s
    ⠿ NginxTCP80TargetGroup CreateComplete 1.0s
    ⠿ CloudMap CreateComplete 47.1s
    ⠿ NginxTaskExecutionRole CreateComplete 19.9s
    ⠿ LogGroup CreateComplete 3.1s
    ⠿ DefaultNetwork CreateComplete 5.9s
    ⠿ Cluster CreateComplete 5.8s
    ⠿ DefaultNetworkIngress CreateComplete 1.0s
    ⠿ Default80Ingress CreateComplete 1.0s
    ⠿ LoadBalancer CreateComplete 92.3s
    ⠿ NginxTaskDefinition CreateComplete 3.1s
    ⠿ NginxServiceDiscoveryEntry CreateComplete 2.0s
    ⠿ NginxTCP80Listener CreateComplete 3.0s
    ⠋ NginxService CreateInProgress Resource creation Initiated 65.0s

    View Slide

  22. サービスを確認
    MacbookPro13% docker compose ps --format=json | jq
    [
    {
    "ID": "arn:aws:ecs:ap-northeast-1:xxxxxxxxxxxx:task/demo/4af498c8586849c691063b7f4d202cec",
    "Name": "task/demo/4af498c8586849c691063b7f4d202cec",
    "Project": "demo",
    "Service": "nginx",
    "State": "Running",
    "Health": "",
    "Publishers": [
    {
    "URL": "demo-LoadBa-187KUDJD32QRX-2082745493.ap-northeast-1.elb.amazonaws.com:80",
    "TargetPort": 80,
    "PublishedPort": 80,
    "Protocol": "http"
    }
    ]
    }
    ]

    View Slide

  23. アクセスしてみる
    MacbookPro13% curl -L demo-LoadBa-187KUDJD32QRX-2082745493.ap-northeast-1.elb.amazonaws.com



    Welcome to nginx!
    <br/>body {<br/>width: 35em;<br/>margin: 0 auto;<br/>font-family: Tahoma, Verdana, Arial, sans-serif;<br/>}<br/>


    Welcome to nginx!
    ...

    View Slide

  24. リソースを削除
    MacbookPro13% docker compose down
    [+] Running 14/14
    ⠿ demo DeleteComplete 466.1s
    ⠿ Default80Ingress DeleteComplete 1.1s
    ⠿ NginxService DeleteComplete 414.2s
    ⠿ DefaultNetworkIngress DeleteComplete 1.1s
    ⠿ NginxTCP80Listener DeleteComplete 1.7s
    ⠿ Cluster DeleteComplete 0.7s
    ⠿ NginxServiceDiscoveryEntry DeleteComplete 1.7s
    ⠿ NginxTaskDefinition DeleteComplete 1.7s
    ⠿ CloudMap DeleteComplete 47.1s
    ⠿ LogGroup DeleteComplete 2.0s
    ⠿ NginxTaskExecutionRole DeleteComplete 1.0s
    ⠿ LoadBalancer DeleteComplete 0.0s
    ⠿ NginxTCP80TargetGroup DeleteComplete 0.0s
    ⠿ DefaultNetwork DeleteComplete 24.1s
    MacbookPro13%

    View Slide

  25. Docker Compsoe CLI のアーキテクチ

    View Slide

  26. backend interface のIF定

    // Service aggregates the service interfaces
    type Service interface {
    ContainerService() containers.Service
    ComposeService() compose.Service
    ResourceService() resources.Service
    SecretsService() secrets.Service
    VolumeService() volumes.Service
    }
    プラットフォームの差異をこ
    のIFで吸収している

    View Slide

  27. 現時点で以下の backend が実
    装されている
    ECS
    ACI
    Docker Engine
    API は gRPC のサーバーで、
    言語に縛られず docker
    compose の機能を使用可能

    View Slide

  28. おまけ
    Docker CLI Pluginについて

    View Slide

  29. docker compose は Docker に同梱されているプラグイン
    MacbookPro13% ls /usr/local/lib/docker/cli-plugins/*
    /usr/local/lib/docker/cli-plugins/docker-app
    /usr/local/lib/docker/cli-plugins/docker-buildx
    /usr/local/lib/docker/cli-plugins/docker-compose <--
    これ
    /usr/local/lib/docker/cli-plugins/docker-scan
    ちなみに、 buildkit や scan もプラグインになっている
    このプラグインの仕組みを Docker CLI Plugin

    View Slide

  30. Docker CLI Plugin はv19.03.0で導入された
    $HOME/.docker/cli-plugins 配下に実行ファイルを配置
    プラグインのファイル名は docker-*
    docker-hello なら docker hello として実行できる
    docker_cli_plugin_metadata コマンドを実装する必要がある
    コマンドの出力は次のようなJSON構造が必要
    {
    "SchemaVersion": "0.1.0",
    "Vendor": "Gorilla",
    "Version": "v0.0.1",
    "ShortDescription": "Hello Gorilla"
    }

    View Slide

  31. 実際プラグインを作ってみる
    #!/usr/bin/env bash
    docker_cli_plugin_metadata() {
    local vendor="Gorilla"
    local url="https://github.com/skanehira"
    local description="Hello Docker CLI Plugin"
    local version="0.0.1"
    cat <<-EOF
    {"SchemaVersion":"0.1.0","Vendor":"${vendor}","Version":"${version}","ShortDescription":"${description}","URL":"${url
    }"}
    EOF
    }
    case "$1" in
    docker-cli-plugin-metadata)
    docker_cli_plugin_metadata
    ;;
    *)
    echo $@
    ;;
    esac

    View Slide

  32. ディレクトリと docker-hello を用意
    MacbookPro13% mkdir -p ~/.docker/cli-plugins
    MacbookPro13% cd ~/.docker/cli-plugins
    MacbookPro13% curl -LO \
    https://gist.githubusercontent.com/skanehira/2907d10669d8d7e9e75a39cd97dce9bc/raw/a52e77595fcc29dcba395303ddb405f34ea1e7e1/docker-hello
    MacbookPro13% chmod +x docker-hello

    View Slide

  33. 動かしてみる
    ヘルプに出ていることを確認
    MacbookPro13% docker 2>&1 | grep hello
    hello* Hello Docker CLI Plugin (Gorilla, 0.0.1)
    MacbookPro13%
    実際に実行してみる
    MacbookPro13% docker hello gorilla
    hello gorilla
    MacbookPro13% docker hello moby
    hello moby

    View Slide

  34. まとめ
    Docker Compose CLI は次世代 docker-compose
    docker-compose の機能は基本的に網羅している
    Goで実装されている
    Dockerのエコシステムを利用しているので、拡張しやすい
    docker-compose のメンテは継続
    プラットフォームに依存しない
    現時点は ECS と ACI のみ
    Docker CLI のプラグインとして同梱されている
    ECS へのデプロイと削除はちょっと時間が掛かる( ACI は未測定)

    View Slide

  35. 参考資料
    Docker Compsoe CLI の公式ドキュメント
    https://docs.docker.com/compose/cli-command/
    クラウドサービスへのデプロイのドキュメント
    https://docs.docker.com/cloud/aci-integration/
    https://docs.docker.com/cloud/ecs-integration/
    docker-composeを Docker CLI Plugin として登録する方法
    https://gist.github.com/thaJeztah/b7950186212a49e91a806689e66b317d
    docker expose プラグイン便利そうなので試す
    https://qiita.com/tksarah/items/9e46d131107d3e15f7bc

    View Slide