Slide 1

Slide 1 text

New Docker Compose

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

本日の話 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 ...

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

現時点利用できるコマンド一覧 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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

Docker Compose CLI の特徴

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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:

Slide 13

Slide 13 text

コンテナ作成 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...

Slide 14

Slide 14 text

初期画面

Slide 15

Slide 15 text

コンテナ一覧と停止 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%

Slide 16

Slide 16 text

コンテナにアタッチする 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>

Slide 17

Slide 17 text

プロセス一覧 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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

既存の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

Slide 21

Slide 21 text

コンテナを作成 $ 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

Slide 22

Slide 22 text

サービスを確認 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" } ] } ]

Slide 23

Slide 23 text

アクセスしてみる MacbookPro13% curl -L demo-LoadBa-187KUDJD32QRX-2082745493.ap-northeast-1.elb.amazonaws.com Welcome to nginx! body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; }

Welcome to nginx!

...

Slide 24

Slide 24 text

リソースを削除 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%

Slide 25

Slide 25 text

Docker Compsoe CLI のアーキテクチ ャ

Slide 26

Slide 26 text

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で吸収している

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

おまけ Docker CLI Pluginについて

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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" }

Slide 31

Slide 31 text

実際プラグインを作ってみる #!/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

Slide 32

Slide 32 text

ディレクトリと 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

Slide 33

Slide 33 text

動かしてみる ヘルプに出ていることを確認 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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

参考資料 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