Kubernetesの前にDockerだ!
仕事でコンテナオーケストレーションシステムのKubernetesに触れる機会が多い.
しかし, その中で使われるDockerコンテナについてそもそもよくわかっておらず,
いつもなんとなくで済ましているので公式のクイックスタートガイドを読んでみる.
はじめに
この記事は悲しみを乗り越えて書いている.
元々読んでいたGet Startedは主にdocker-compose
を用いたアプリのデプロイ手順を記述していたが,
それを意訳している最中でドキュメントがアップデートされ,
こんぽーずってなんだっけ?レベルで内容が削られてしまった.
その代わりにKuberetes
を用いてアプリをデプロイする内容が増えているので,
もう一度意訳してみる.
読むもの
- Docker公式のQuickstartガイド
超意訳する上でのルール
以下のルールを守って訳していく.
- できるだけ元記事の流れに従って訳していく
- 超意訳なので翻訳の精度は保証しない
- 元記事に無い内容には[追加]をつける
- ライセンスとかよくわかんなくて怖いので画像などは自前で用意する
- 突然記憶喪失になっても思い出せるくらいわかりやすくする
動作環境
- masOS Mojave 10.14
- Docker Desktop 2.1.0.3
それでは早速Part 1からはじめる.
Get Started, Part 1: Orientation and setup
https://docs.docker.com/get-started/
もくじ
- Docker concepts
- Images and containers
- Containers and virtual machines
- Install Docker Desktop
- Enable Kubernetes
- Enable Docker Swarm
- Conclusion
Docker concepts
https://docs.docker.com/get-started/#docker-conceptsDocker
とはコンテナでアプリをビルド, シェア, 実行するためのプラットフォームである.
コンテナを使ってアプリをデプロイすることをコンテナ化と言う.
コンテナ自体は前からある技術だが, Docker
はアプリを簡単にデプロイするための新しいコンテナの活用の形である.
コンテナ化は以下の特徴のため, 広く使われるようになった.
- Flexible(柔軟)
- どんなに複雑なアプリでもコンテナにできる.
- Lightweight(軽量)
- コンテナはホストのカーネルを共有/活用するため,
リソース面で仮想マシンより効率的である.
- コンテナはホストのカーネルを共有/活用するため,
- Portable(移植が容易)
- コンテナはローカルでビルド, クラウドでデプロイ, どこでも実行が可能である.
- Loosely coupled(疎結合)
- それぞれのコンテナは自己完結/カプセル化されており,
他のコンテナに影響を与えずに交換/更新が可能である.
- それぞれのコンテナは自己完結/カプセル化されており,
- Scalable(スケーリングしやすい)
- コンピューティング環境をまたいだコンテナの増大/分散が可能である.
- Secure(安全)
- ユーザーが特に設定しなくてもコンテナ内の各プロセスは分離され,
厳格に管理される.
- ユーザーが特に設定しなくてもコンテナ内の各プロセスは分離され,
Images and containers
https://docs.docker.com/get-started/#images-and-containers
コンテナといっても基本的にはホストや他のコンテナから独立し, 必要なものをすべて内包した1つのプロセスに他ならない.
ここで言う独立とは各コンテナが自身のプライベートなファイルシステムを使用することを指し, そのファイルシステムはDocker image
によって提供される.
1つのimage
にはコードやバイナリ, ランタイムなどのアプリを実行するために必要な全ての要素が内包される.
Containers and virtual machines
https://docs.docker.com/get-started/#containers-and-virtual-machines
コンテナはLinux上で動作し, ホストマシンのカーネルを他のコンテナと共有している.
コンテナはそれぞれが独立したプロセスを実行し, ホストマシンのメモリをアプリの実行に必要なぶんだけ使用するため軽量である.
[追加]コンテナはアプリとそれを実行するのに必要な依存関係しか含まないので軽い.
対称的に, ホストマシン上で動作するVM(仮想マシン)は内部で普通のOSとほぼ変わらないゲストOSを動かし, 制御プログラム(スーパーバイザー)を介してマシンのリソースを使用する.
簡単に比較すると, VMはアプリの実行に必要な分より多くのリソースを使用するため重い.
[追加]VMはアプリと依存関係に加えてOSを含んでいるので重い. ここではハイパーバイザー型のVMについて説明されているが, ホスト型もほぼ同じ(というかホスト型のほうが重い).
Install Docker Desktop
https://docs.docker.com/get-started/#install-docker-desktop
コンテナの開発を始めるにはDocker Desktop
を使うのが手っ取り早い.
ローカルの開発マシンにKubernetes
とSwarm
を簡単にセットアップしてくれて, クラスタの構築をせずにコンテナオーケストレーションの機能を使用できるので非常に便利である.
OSX用Docker Desktop
は以下よりインストールできる.
https://docs.docker.com/docker-for-mac/install/
[追加]Kubernetes
, Swarm
に関してはそれぞれPart3, 4で解説される.
Enable Kubernetes
https://docs.docker.com/get-started/#enable-kubernetesDocker Desktop
はKubernetes
を簡単にセットアップしてくれる.
以下の手順で実際にセットアップと動作確認を行う.
1: メニューバーにあるDocker
のアイコンをクリックし, Preferences -> Kubernetes
と進む.
2: Enable Kubernetes のチェックボックスを選択し, Apply を押す.Docker Desktop
がKubernetes
のセットアップを行い, 準備が完了すると Kubernetes is running の緑色のランプが光る.
3: Kubernetes
の動作を確認するため, pod.yaml
というファイルを次の内容で作成する.
apiVersion: v1
kind: Pod
metadata:
name: demo
spec:
containers:
- name: testpod
image: alpine:3.5
command: ["ping", "8.8.8.8"]
このpod.yaml
は8.8.8.8
にping
を飛ばすだけのコンテナtestpodを1つ持つdemoという名前のPod
を定義している.
[追加]Pod
についてはPart3で説明.
4: pod.yaml
があるディレクトリに移動し, Pod
を作成する.
# マニフェストファイル(pod.yaml)があるディレクトリで操作
$ ls
pod.yaml
# pod.yamlで定義されたPodを起動
$ kubectl apply -f pod.yaml
pod/demo created
5: Pod
(demo)が起動しているか確認する.
# Podの一覧を表示
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 0 15s
6: Pod
(demo)のログを表示し, ping
のログが表示されることを確認する.
# Pod(demo)のログを確認
$ kubectl logs demo
PING 8.8.8.8 (8.8.8.8): 56 data bytes
[追加]自分の場合はping
が正しく返ってきていないが, とりあえずping
コマンドを実行したときのログが正しく表示されているのでここでは問題ない.
7: 作成したPod
を削除する.
# pod.yamlで定義されたPodを削除
$ kubectl delete -f pod.yaml
pod "demo" deleted
[追加]kubectl delete pod demo
でも同様にPod
を削除できる.
Enable Docker Swarm
https://docs.docker.com/get-started/#enable-docker-swarmDocker Desktop
はDocker Engine
上で動作していて, このDocker Engine
にはSwarm
の動作に必要なものが最初から入っている.
以下の手順でセットアップと動作確認を行う.
1: Docker
をSwarm
モードにする.
# Swarmクラスタを初期化
$ docker swarm init
Swarm initialized: current node (gezwfuy4mutsw8sbfoqnctkez) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-6232qe43fjsexb2wt8j0pqdo44rqt5tapg9zedin4ywt7nk4s9-evu0arm6l2e95rdn18i524mt5 192.168.65.3:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
2: 8.8.8.8
にping
を送るService
(demo)を起動する.
[追加]Service
についてはPart3,4で説明.
# alpine(image)を使用して8.8.8.8にpingを送るService(demo)を起動
$ docker service create --name demo alpine:3.5 ping 8.8.8.8
5rko6rb8oe86uhadrk0ruwahb
overall progress: 1 out of 1 tasks
1/1: running
verify: Service converged
3: Service
(demo)がコンテナを起動していることを確認する.
# Service(demo)が起動しているコンテナの一覧を表示
$ docker service ps demo
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
ngoves00al7u demo.1 alpine:3.5 docker-desktop Running Running 18 minutes ago
4: Service
(demo)のログを確認する.
# Service(demo)のログを確認
$ docker service logs demo
demo.1.ngoves00al7u@docker-desktop | PING 8.8.8.8 (8.8.8.8): 56 data bytes
[追加]自分の場合はping
が正しく返ってきていないが, とりあえずping
コマンドを実行したときのログが正しく表示されているのでここでは問題ない.
5: 作成したService
(demo)を削除する.
# Service(demo)を削除
$ docker service rm demo
demo
Conclusion
https://docs.docker.com/get-started/#conclusion
このパートではDocker Desktop
をインストールし, Kubernetes
とSwarm
で簡単なコンテナを起動できることを確認した.
次のパートでは実際にコンテナ型アプリを開発する.