ペイの技術MEMO

文系大学生の技術メモ

Docker/Kubernetes 実践コンテナ開発入門

はじめに

現在使用したことある仮想化ソフトウェアとしてはVirtualboxがありますが、Mac(ホスト)側でデスクトップアプリをパッケージ化し、そのパッケージをwindows(ゲスト)に送り... のように作業も多く、なおかつ環境を作るのにとても時間がかかり大変です。そこらへんと比べてDockerとは何か?を理解できたらと思います。

何回か記事を分けてDocker/Kubernetes 実践コンテナ開発入門を進めていきます。 gihyo.jp

Dockerとは?

  • コンテナ型仮想化技術を実現するために実行される常駐アプリケーション
  • 上記を操作する為のCLIから成るプロダクト
  • アプリケーションをデプロイすることに特化した箱

前回書いた記事ではFlaskをDockerで動かし、APIを作成しています。 アプリケーションをデプロイすることに特化した箱なのでローカルで検証するだけでなく、実際のアプリケーションとして機能します。

Dockerの苦手なこと

  • Dockerのコンテナ内部はLinux系OSのような構成をしている為、OSとしての振る舞いを完全に再現しているわけではない

あくまでもアプリケーションをデプロイすることに特化した箱です。

コンテナ型仮想化技術

  • 仮想化ソフトウェアなしでOSのリソースを隔離して仮想OSにすることをコンテナと呼ぶ
  • 他の仮想化ソフトウェアと比べると呼び出す負荷(オーバーヘッド)が少なくすむ
  • 高速に起動・終了できる

他の仮想化技術は?

  • OSの上のインストールした仮想化ソフトウェアを利用して、ゲストOSを作り出すホストOS型(例 VMware Player, VirtualBox)
  • サーバーへ直接インストールし仮想マシンを稼働させるハイパーバイザ型(例 Hyper-V Server)

Dockerの利用方法

Dockerは前述の通りアプリケーションをデプロイすることに特化した箱です。

具体的にはアプリケーションと、実行環境を同梱してデプロイします。

実際に以下のスクリプトを使ってDockerの流れを追ってみたいと思います。

#! /bin/sh

echo "Hello, World"

上記にhelloworldと名前をつけて保存します。

まずは普通にこのシェルスクリプトを実行させてみます。

sh helloworld

結果

Hello, World

当然ですね。

使ってるPCがmacならmacの環境で動かしたことになりますし、windowsならwindowsで動いたことになります。

ではDockerを使ってUbuntuを同梱させて実行させてみます。

上記のhelloworldスクリプトがあるディレクトリにDockerfileという名前でファイルを作り下記の内容を書きます。

FROM ubuntu:16.04

COPY helloworld /user/local/bin
RUN chmod +x /user/local/bin/helloworld

CMD ["helloworld"]

今回はDockerをつかった流れの説明なのでDockerfileの詳しい説明は次回以降します。

  • FROMではイメージになるOSを指定
  • COPYではホスト(helloworldを作ったパソコン)のhelloworldファイルをDockerコンテナ内の/user/local/binにコピー
  • RUNでは上述でコピーしたスクリプトに実行権限を与えてます
  • CMDではアプリケーションを実行するコマンドを指定

*Dockerのインストールに関しては割愛

Dockerfileがあるディレクトリでビルドします。

docker image build -t helloworld:latest .

ビルドができたらコンテナを実行します。

docker container run helloworld:latest

結果

Hello, World

以上でシェルスクリプトUbuntuに同梱してコンテナとして実行することができました。

上記でやった流れをまとめてみます。

Dockerfileとシェルスクリプト(アプリと考えて)を用意する
↓
ビルドする
↓
コンテナを起動する

これだけです。

では一連の流れをもう少し詳しくみてみます。

Dockerイメージとは

上記で述べてるビルドするというのはDockerコンテナの元になるイメージを作っています。

このことをDockerイメージをビルドすると言います。

f:id:PeeI:20190508225614j:plain

Dockerfileではイメージを構築するための手順を書いています。

DockerfileがDockerイメージになっているわけではありません。

Dockerイメージは次に説明するDockerコンテナを作成する為のテンプレートになります。

Dockerコンテナとは

一連の流れで説明したコンテナを起動するではDockerイメージを元に実際にアプリを実行させることを示しています。

f:id:PeeI:20190508231420j:plain

前述の通りDockerイメージをを元にコンテナが作成されます。

DockerfileのCMD,ENTRYPOINTで定義されているアプリケーションの実行を開始します。

Dockerイメージからは複数のコンテナを作成することができます。

最後に

複雑に見えますが、Dockerの基本操作はイメージに関する操作とコンテナに関する操作です。

今回は概念とDockerを使った一連の流れをまとめたので次回以降は具体的にイメージとコンテナのそれぞれの操作についてまとめていきます。