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

New Docker Compose

New Docker Compose

DockerCon 2021

skanehira

May 28, 2021
Tweet

More Decks by skanehira

Other Decks in Programming

Transcript

  1. 自己紹介 { " 名前": " ゴリラ", " 好物": [ "Go",

    "Vim", "Docker", "Deno" ], " 趣味": [ "Vim プラグイン開発", "Go を使ったCLI 開発", " 興味ある技術の勉強", " 技術記事の執筆", " 筋トレ" ], "GitHub": "https://github.com/skanehira", "Twitter": "https://twitter.com/gorilla0513" }
  2. 本日の話 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 ...
  3. docker compose とは? Docker CLIに同梱された新しい docker-compose docker-compose はメンテ継続 雑に言うと docker-compose

    のGo実装 正式名称はDocker Compose CLI docker-compose と互換性を持っている(一部のフラグを除く) docker-compose に置き変わることを目標としている compose-specの仕様に準拠している
  4. 現時点利用できるコマンド一覧 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
  5. クラウド対応 マルチコンテナを ECS と ACI(Azure Cloud Instance) に簡単にデプロ イできる AWSのECSの例

    docker compose up でFargetのクラスタ、サービス、タスクやLBな どを作成 docker compose down で作成したリソースを削除
  6. CLI本体 docker-compose.yaml のパースライブラリcompose-goが公開されてい る Docker Compose CLI もそれを利用している compose 関連のツールの作成が楽になる

    buildkitがデフォルト有効になっている Goによる実装なので、goroutineを使った並行処理を活かせる 既存のエコシステム( Docker CLI のSDKなど)を利用できる
  7. 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
  8. 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:
  9. コンテナ作成 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...
  10. コンテナ一覧と停止 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%
  11. コンテナにアタッチする 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>
  12. プロセス一覧 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
  13. 既存の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
  14. コンテナを作成 $ 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
  15. サービスを確認 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" } ] } ]
  16. アクセスしてみる MacbookPro13% curl -L demo-LoadBa-187KUDJD32QRX-2082745493.ap-northeast-1.elb.amazonaws.com <!DOCTYPE html> <html> <head> <title>Welcome

    to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> ...
  17. リソースを削除 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%
  18. 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で吸収している
  19. 現時点で以下の backend が実 装されている ECS ACI Docker Engine API は

    gRPC のサーバーで、 言語に縛られず docker compose の機能を使用可能
  20. 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
  21. 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" }
  22. 実際プラグインを作ってみる #!/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
  23. ディレクトリと 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
  24. 動かしてみる ヘルプに出ていることを確認 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
  25. まとめ Docker Compose CLI は次世代 docker-compose docker-compose の機能は基本的に網羅している Goで実装されている Dockerのエコシステムを利用しているので、拡張しやすい

    docker-compose のメンテは継続 プラットフォームに依存しない 現時点は ECS と ACI のみ Docker CLI のプラグインとして同梱されている ECS へのデプロイと削除はちょっと時間が掛かる( ACI は未測定)
  26. 参考資料 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