fbpx

[和訳] デスクトップ向けDockerでのDocker ComposeとKubernetes #docker #kubernetes #k8s

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

本稿は Docker Compose and Kubernetes with Docker for Desktop (2018/02/15) の和訳です。

デスクトップ上でEdgeバージョンのDocker ( Docker for Mac または Docker for Windows Desktop )をご利用の方は、ボタンを1つクリックするだけで単一ノードのKubernetesクラスタを立てることが可能になりました。私自身は開発者ではないのですが、このことは、MacbookやWindowsのノートパソコンでDockerを使っている多くの開発者にとって朗報だと思います。今ならDockerに完全に適合したKubernetesクラスタを、他のツールをインストールすることなく簡単な操作で手に入れることができるからです。

コンテナ化したアプリケーションの構築にDockerを利用している開発者は、それらのアプリをデプロイするためにしばしばDocker Composeファイルを作成します。Dockerの製品ラインへのKubernetes統合によって、既存のDocker Composeファイルを活用し、Kubernetesでそれらのアプリケーションを実行したいと考える開発者もいることでしょう。それにはもちろん Kompose を使用すればいいのですが、これでは2つの異なる中間生成物を管理しなければならなくなります。ネイティブなDockerに基づいたワークフローを維持する方法はないのでしょうか?

デスクトップ版Docker (および Docker Enterprise Edition )では、アプリケーションをKubernetesクラスタ上で直接デプロイするためにDocker Composeをご利用いただけます。

手順は次の通りです:

次のような3つの段階のアプリ(ウェブフロントエンド、ワーカープロセス( words )、データベース)を記述する1つのDocker Composeファイルを持っていると仮定します。

私たちのウェブフロントエンドは、ホストの80番ポートからサービス(そしてそれに続く下層のコンテナ)にトラフィックを転送することになっています。またwordsサービスは5つのレプリカで起動します。


services:
web:
build: web
image: dockerdemos/lab-web
volumes:
- "./web/static:/static:
ports:
- "80:80"
 
words:
build: words
image: dockerdemos/lab-words
deploy:
replicas: 5
endpoint_mode: dnsrr
resources:
limits:
memory: 16M
reservations:
memory: 16M
 
db:
build: db
image: dockerdemos/lab-db

私はDocker for Macを使用しており、Kubernetesをデフォルトのオーケストレーターとして設定しています。このアプリケーションをデプロイするためには、Docker Composeファイル名(words.yaml)とスタックの名前(words)を、docker stack deployコマンドに与えるだけです。非常に優れている点は、Docker Swarmでもまったく同じコマンドを使える点です:


$ docker stack deploy --compose-file words.yaml words
Stack words was created
Waiting for the stack to be stable and running...
- Service db has one container running
- Service words has one container running
- Service web has one container running
Stack words is stable and running

kubectlを使うと、Deployment、Pod、Serviceが閲覧できます。これらはDocker Composeファイルによって作成されています:


$ kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
db 1 1 1 1 2m
web 1 1 1 1 2m
words 5 5 5 5 2m


$ kubectl get pods
NAME READY STATUS RESTARTS AGE
db-5489494997-2krr2 1/1 Running 0 2m
web-dd5755876-dhnkh 1/1 Running 0 2m
words-86645d96b7-8whpw 1/1 Running 0 2m
words-86645d96b7-dqwxp 1/1 Running 0 2m
words-86645d96b7-nxgbb 1/1 Running 0 2m
words-86645d96b7-p5qxh 1/1 Running 0 2m
words-86645d96b7-vs8x5 1/1 Running 0 2m


$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
db ClusterIP None 55555/TCP 2m
web ClusterIP None 55555/TCP 2m
web-published LoadBalancer 10.104.198.84 80:32315/TCP 2m
words ClusterIP None 55555/TCP 2m

servicesのリストでは、一見しておかしいと感じる点があるかもしれません。webとweb-publishedの2つのサービスがある点です。webサービスはアプリケーション間の通信を可能にすることに対し、(Docker for Macのvpnkitによるロードバランサである)web-publishedサービスはウェブフロントエンドを全世界に公開するためのものです。

よって、私たちが http://localhost:80 を訪問すれば、実行中のアプリを確認できるのです。このプロセスのすべては Elton Stoneman 氏が録画した こちらの動画 でご覧いただけます。

そして、こちらのサービスを削除したい場合、皆さまはkubectlを使って削除しようとするかもしれません (私はそうしました)。しかし実際には、docker stackのrmを利用すれば、スタックを起動したときに作成されたコンポーネントはすべて削除されます。


$ docker stack rm words
Removing stack: words


$ kubectl get deployment
No resources found

さらにうれしいことは、同じプロセスがDocker EEにおいても使えることです。Docker Composeファイルを利用するだけでDocker EEのUI上でデプロイすることが可能です。これについては別の記事でご紹介します。

ご自身で試すには、 Docker for Mac または Docker for Windows を入手してください。詳細についてはドキュメント( MacWindows )をご参照ください。

もっと学びたい方は:

新規CTA