Docker Quickstartを超意訳する Part 1

Kubernetesの前にDockerだ!

仕事でコンテナオーケストレーションシステムのKubernetesに触れる機会が多い.
しかし, その中で使われるDockerコンテナについてそもそもよくわかっておらず,
いつもなんとなくで済ましているので公式のクイックスタートガイドを読んでみる.


はじめに

この記事は悲しみを乗り越えて書いている.

元々読んでいたGet Startedは主にdocker-composeを用いたアプリのデプロイ手順を記述していたが,

それを意訳している最中でドキュメントがアップデートされ,
こんぽーずってなんだっけ?レベルで内容が削られてしまった.

その代わりにKuberetesを用いてアプリをデプロイする内容が増えているので,
もう一度意訳してみる.

読むもの

  • Docker公式のQuickstartガイド
    • https://docs.docker.com/get-started/
    • Dockerでアプリを作る手順がまとめられている
    • 5つのパートで構成
      • Part 1 : Dockerの環境構築
      • Part 2 : イメージの作成, コンテナの実行
      • Part 3 : Kubernetesの環境構築とアプリのデプロイ
      • Part 4 : Swarmの環境構築とアプリのデプロイ
      • Part 5 : Docker Hubでのコンテナの共有

超意訳する上でのルール

以下のルールを守って訳していく.

  • できるだけ元記事の流れに従って訳していく
  • 超意訳なので翻訳の精度は保証しない
  • 元記事に無い内容には[追加]をつける
  • ライセンスとかよくわかんなくて怖いので画像などは自前で用意する
  • 突然記憶喪失になっても思い出せるくらいわかりやすくする

動作環境

  • 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-concepts
Dockerとはコンテナでアプリをビルド, シェア, 実行するためのプラットフォームである.
コンテナを使ってアプリをデプロイすることをコンテナ化と言う.
コンテナ自体は前からある技術だが, 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について説明されているが, ホスト型もほぼ同じ(というかホスト型のほうが重い).

コンテナとVMの比較

Install Docker Desktop

https://docs.docker.com/get-started/#install-docker-desktop
コンテナの開発を始めるにはDocker Desktopを使うのが手っ取り早い.
ローカルの開発マシンにKubernetesSwarmを簡単にセットアップしてくれて, クラスタの構築をせずにコンテナオーケストレーションの機能を使用できるので非常に便利である.
OSX用Docker Desktopは以下よりインストールできる.
https://docs.docker.com/docker-for-mac/install/
[追加]Kubernetes, Swarmに関してはそれぞれPart3, 4で解説される.

Enable Kubernetes

https://docs.docker.com/get-started/#enable-kubernetes
Docker DesktopKubernetesを簡単にセットアップしてくれる.
以下の手順で実際にセットアップと動作確認を行う.

1: メニューバーにあるDockerのアイコンをクリックし, Preferences -> Kubernetesと進む.

2: Enable Kubernetes のチェックボックスを選択し, Apply を押す.
Docker DesktopKubernetesのセットアップを行い, 準備が完了すると 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.yaml8.8.8.8pingを飛ばすだけのコンテナ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-swarm
Docker DesktopDocker Engine上で動作していて, このDocker EngineにはSwarmの動作に必要なものが最初から入っている.
以下の手順でセットアップと動作確認を行う.

1: DockerSwarmモードにする.

# 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.8pingを送る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をインストールし, KubernetesSwarmで簡単なコンテナを起動できることを確認した.
次のパートでは実際にコンテナ型アプリを開発する.