76
Docker / Arukas 入門 ハンズオン資料 2016 10 31 ( ) さくらインターネット株式会社 Technology Evangelist 前佛雅人 @ zembutsu 第1回さくらとコンテナの夕べ(さくらの夕べ番外編)

Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

Embed Size (px)

Citation preview

Page 1: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

Docker / Arukas 入門ハンズオン資料

2016年10月31日(月)

さくらインターネット株式会社

Technology Evangelist 前佛雅人

@zembutsu

第 1 回 さ く ら と コ ン テ ナ の 夕 べ ( さ く ら の 夕 べ 番 外 編 )

Page 2: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

今日の内容

Docker とコンテナの基礎知識Docker って何だ?

コンテナとイメージの基本概念

ハンズオン編 ~Nginxを動かす~さくらのクラウドでサーバのセットアップ

Docker のインストール

コンテナの実行とイメージの構築

Docker Hub にアップロード

Arukas にデプロイ

質疑応答

2

Page 3: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

3

Dockerと

コンテナの基礎知識

Page 4: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

Docker

アプリ開発・移動・実行のプラットフォーム設計思想は「開発者が簡単にアプリケーションを動かす環境を作る」こと

Docker プロジェクトPyCon 2013 (PythonカンファレンスUS) 3月13日、 LT でオープンソース・プロジェクトを発表 [1]

Solomon Hykes … dotcloud 創業者が、 Docker プロジェクトを開始 (Apache License v2)

32,000以上の GitHub Stars、60億 Docker コンテナのダウンロード、2,900人以上の貢献者

Docker Inc.ミッションは、膨大な革新を生み出すツールを作る [2]

Docker プロジェクトのオリジナル開発者、かつ、プロジェクトのスポンサー、商業サポート

[1] “The future of Linux Containers” https://www.youtube.com/watch?v=wW9CAH9nSLs[2] “Our mission at Docker to create tools of mass innovation” http://www.docker.com/company/ 4

ソ ロ モ ン ・ ハ イ ク

ド ッ カ ー

ド ッ ト ク ラ ウ ド ア パ ッ チ ラ イ セ ン ス

Page 5: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

5

Introducing InfraKit, an open source toolkit for creating and managing declarative, self-healing infrastructure - Docker Bloghttps://blog.docker.com/2016/10/introducing-infrakit-an-open-source-toolkit-for-declarative-infrastructure/

Page 6: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

6

Build Run開 発 ・ 構 築 移 動 実 行

Ship“Build, Ship, Run, Any App Anywhere”

Docker Engine for Linux / Commercial SupportDocker for Mac, Windows, Windows Server

Docker Trusted Registry

Docker Hub

Universal Control Plane

Toolbox

Kitematic

Dev(開発)

Ops(運用)

ツ ー ル ボ ッ ク ス

ド ッ カ ー マ シ ン

カ イ ト マ テ ィ ッ ク

レ ジ ス ト リド ッ カ ー ハ ブ

コ ン ポ ー ズ

ス ゥ ォ ー ム

ク ラ ウ ド

デ ー タ セ ン タド ッ カ ー ・ ト ラ ス テ ッ ド ・ レ ジ ス ト リ ユ ニ バ ー サ ル ・ コ ン ト ロ ー ル ・ プ レ ーン

ド ッ カ ー エ ン ジ ン コ マ ー シ ャ ル ・ サ ポ ー ト ( 商 用 サ ポ ー ト ) 版

あ ら ゆ る ア プ リ ケ ー シ ョ ン を 、 ど こ で も 構 築 ・ 移 動 ・ 実 行

Page 7: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

7

Docker Engine

Linux Kernel・namespaces

・cgroups

LXC libcontainer runC

containerd

v0.9~

v1.11~

Version 7 Unixchrootjail

dockerd

v1.12~

デーモン

ライブラリランタイム

docker daemon

・SELinux

・capabilities… etc

Docker: the container engine

v1.11~

カ ー ネ ル

ネ ー ム ス ペ ー ス

シ ー グ ル ー プ

エ ス イ ー リ ナ ッ ク ス

ケ ー パ ビ リ テ ィ

エルエックスシー リ ブ コ ン テ ナ ラ ン シ ー

ド ッ カ ー デ ー モ ン

コ ン テ ナ デ ィ ー

ド ッ カ ー デ ィ ー

ド ッ カ ー エ ン ジ ン

オ ー プ ン コ ン テ ナイ ニ シ ア テ ィ ブ

Page 8: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

Docker イメージとレイヤの理解

Docker イメージは、レイヤを積み上げて参照各レイヤが層(スタック)として積み上がり、1つに統合されたファイルシステムとして見える

Docker 内部のストレージ・ドライバが、レイヤを積み重ねる役割を担う

イメージは読み込み専用(ReadOnly)各イメージ・レイヤは親子関係を持っている

イメージ・レイヤは読み込み専用のため、変更を加えられない

レイヤに対する変更情報(ファイルの追加・削除)は、子レイヤ側に記録

レイヤの利点は移動・共有しやすさ各レイヤをファイルやコードの差分のように扱えるため、ネットワークを通して共有する時、余分なトラフィックを使用せず、時間も節約できる

8

Page 9: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

Docker イメージとコンテナの関係

コンテナはイメージに新しいレイヤを追加薄い読み書き可能レイヤ(Thin R/W layer)は、コンテナ実行時に自動的に割り当てられる

イメージに対する変更情報(ファイルの追加・削除)はすべてこのコンテナ用レイヤ上に記録

このレイヤをコミット(commit)すると、新しいイメージを作成できる

ディスク領域の有効活用コンテナの起動時には、追加のディスク容量がほぼ不要なため、仮想化システムのように起動のたびにディスク容量を確保する必要がない

9

Page 10: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

Docker コンテナの操作

10

OS ( Linux )

物理/仮想サーバ

Docker エンジン( dockerd デーモン )

Linux kernel

コンテナ コンテナ コンテナ

リモートAPI

dockerクライアント TCP あるいは

Unix ソケットドメイン

containerdRuntime: runC (OCI規格準拠)

・docker コマンドLinux, Mac OS X, Windows

・Kitematic (GUI)Mac OS X, Windows

・Docker Compose

・Docker Swarm

Page 11: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

11

コンテナの実行

コンテナAのファイルシステム

… …

コンテナBのファイルシステム

/etc(/data/ubuntu/etc)

/bin(/data/ubuntu/bin)

/etc(/data/centos/etc)

/bin(/data/centos/bin)

/ /

httpdPID 1

プロセスA プロセスB

rubyPID 1

chris.rbPID 2

コンテナA コンテナB

名前空間の isolate・プロセス・ファイルシステム・ネットワーク・ホスト名・UID・GID

リソース制限・CPU・メモリ・I/O・ディスク・クォータ

アイソレート

Page 12: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

Docker コンテナのライフサイクル

12

Page 13: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

コンテナを動かすには?

13

$ docker run hello-world

hello-world コンテナの実行

$ docker run –i –t ubuntu bash

ubuntu コンテナの実行

$ docker run –d –p 80:80 –v /data/:/usr/share/nginx/html nginx:latest

nginx コンテナの実行

Page 14: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

イメージを作るには?

14

$ docker commit [コンテナID] [イメージ名:タグ]

docker commit コマンド

$ docker build –t [イメージ名:タグ] .

docker bulid コマンド

$ docker build –t [イメージ名:タグ] .

Dockerfile ファイル

Page 15: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

ここまでのポイント• Docker はアプリケーションを開発・移動・実行するためのプラットフォーム

• アプリケーションのコンテナ化には、Linux カーネルの技術を使う

• Docker コンテナを動かすには、Docker イメージが必要

15

Page 16: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

16

ハンズオン

Page 17: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

17

$ docker

Docker Hub

Nginx

Build RunShip開 発 ・ 構 築 移 動 実 行

Page 18: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

基本操作とコンテナ作成・デプロイ方法を習得

ハンズオンの流れ

18

1. さくらのクラウド にログイン

2. 仮想サーバ(CentOS 7.2)の起動

3. Docker Engine のセットアップ

4. docker コマンドの基本操作を学ぶ

5. Nginx イメージを作成

6. Docker Hub にログイン

7. Docker Hub に push

8. Arukas に Nginx をデプロイ

$ docker

Docker HubNginx

Page 19: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

1. さくらのクラウドにログイン

1.1. コントロールパネルの表示さくらのクラウド http://cloud.sakura.ad.jp/ から を選び、

https://secure.sakura.ad.jp/cloud/ を開きます。

1.2. 接続情報の確認配布資料のログイン情報を入力します。

入力後は をクリックします。

19

Page 20: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

2. 仮想サーバの起動と接続

2.1. さくらのクラウドで仮想サーバを起動1. 【 さくらのクラウド(IaaS) 】をクリックします。

20

Page 21: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

2. メニュー【 サーバ 】から【 追加 】をクリックします。

3. ディスクイメージは【 CentOS 7.2 64bit 】を使います。

21

Page 22: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

4. 「サーバプラン」と「ディスクプラン」を選択します(※今回は変更しません)。

22

Page 23: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

5. 【 管理ユーザのパスワード 】で root パスワードを設定します。※ 8文字以上の「アルファベット」「数字」「記号」の組み合わせが必要

6. ホスト名を【 docker 】、作成数【 1 】として【 作成 】ボタンをクリックします。

23

Page 24: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

7. 確認画面では【 作成 】をクリックします。

8. サーバ追加作業が完了するまで待ちます。起動後は【 閉じる 】をクリックします。

9. メニューの【 サーバ 】をクリックし、作成したサーバ「 docker 」を確認します。

24

Page 25: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

2.2. 仮想サーバへ接続1. IP アドレスを確認します。インターフェースを右クリックし【 IP アドレスをコピー 】します。

2. Tera Term やターミナルなどを開き、対象サーバに SSH でログインします。

• ログイン時のIDは「root」、パスワードは作成時に入力したもの

• ターミナルでは「ssh -l root <IPアドレス>」か「ssh root@<IPアドレス>」

25

$ ssh -l root 59.106.209.220The authenticity of host '59.106.209.220 (59.106.209.220)' can't be established.ECDSA key fingerprint is SHA256:MHsAGGJvASP/yj3JuhwuEH1BfbuJ8FebYyu7eWrjerI.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added '59.106.209.220' (ECDSA) to the list of known [email protected]'s password:[root@docker ~]#

実行例

ssh コマンドで仮想サーバに接続

接続を許可するので yes

パスワードを入力(画面に表示されません)

Page 26: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

ここまでのポイント• さくらのクラウドで仮想サーバを作るには、ログイン後に【 IaaS 】を選択。

26

Page 27: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

以降のコマンド入力テキスト配布 URL

http://qiita.com/zembutsu/items/cc69f98bd2344c8b3317

or

http://bit.ly/sakura20161031

27

Page 28: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

3. Docker Engine のセットアップ

28

エ ン ジ ンド ッ カ ー

$ docker

Docker Hub

Nginx

仮想サーバの準備が整いましたDocker コンテナを動かすためには、Docker Engine が必要です

Page 29: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

3.1 安定版(stable)の最新バイナリを入れる1. パッケージを最新に更新します。

2. Docker の yum リポジトリを利用可能にします。

3. docker-engine パッケージをセットアップします。

29

# tee /etc/yum.repos.d/docker.repo <<-'EOF'[dockerrepo]name=Docker Repositorybaseurl=https://yum.dockerproject.org/repo/main/centos/7/enabled=1gpgcheck=1gpgkey=https://yum.dockerproject.org/gpgEOF

docker.repo の作成

「EOF」文字列が出てくるまでの標準出力を docker.repo に書き出す

ここまで

# yum –y install docker-engine

# yum -y updateヤ ム ワ イ ア ッ プ デ ー ト

テ ィ ー

ス テ ー ブ ル

ド ッ カ ー ・ レ ポ

イ ン ス ト ー ル

Page 30: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

3.2. docker サービスの有効化とデーモン起動1. サービスを有効化(サーバのブート時に自動実行)します。

2. docker デーモンを起動します。

3. バージョン番号を確認します。

30

# systemctl enable docker.serviceCreated symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

systemctl を実行

# systemctl start docker.service

# docker version(省略)Server:Version: 1.12.3API version: 1.24Go version: go1.6.3Git commit: 6b644ecBuilt:OS/Arch: linux/amd64

docker コマンドで、クライアントとサーバ両方のバージョン表示

docker デーモンが起動していないと、サーバ側のバージョンを表示できない

システムシーティーエル

イ ネ ー ブ ル

ス タ ー ト

バ ー ジ ョ ン

Page 31: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

補足情報:CentOS 7 の場合

もっと簡単なセットアップ1. curl コマンドを使い、OS の自動判別後、必要なパッケージを自動セットアップします。

削除するには1. パッケージ情報を削除します。

2. データ用ディレクトリを削除します。

3. その他、設定ファイル等を置いた場合は、手作業で削除します。 31

# curl -fsSL https://get.docker.com/ | sh# systemctl enable docker.service# systemctl start docker

実行例

セットアップ用コマンドの自動実行

docker サービスの有効化

docker デーモンの起動

# yum –y remove docker-engine

# rm –rf /var/lib/docker

リ ム ー ブ

アールエム

カ ー ル カ ー ル

Page 32: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

4. docker コマンドの基本操作

32

$ docker

Docker Hub

hello-world

Docker コンテナを実行するには Docker イメージが必要ですDocker(公式)イメージは Docker Hub から取得します

mynginx:1.1

Page 33: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

4.1. hello-world コンテナの実行とイメージ確認1. 【 docker run 】コマンドでコンテナを実行します。

33

# docker run hello-worldUnable to find image 'hello-world:latest' locallylatest: Pulling from library/hello-worldc04b14da8d14: Pull completeDigest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9Status: Downloaded newer image for hello-world:latest

Hello from Docker!This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:1. The Docker client contacted the Docker daemon.2. The Docker daemon pulled the "hello-world" image from the Docker Hub.3. The Docker daemon created a new container from that image which runs the

executable that produces the output you are currently reading.4. The Docker daemon streamed that output to the Docker client, which sent it

to your terminal.

To try something more ambitious, you can run an Ubuntu container with:$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:https://hub.docker.com

For more examples and ideas, visit:https://docs.docker.com/engine/userguide/.

hello-world:latest イメージ を実行

ローカルにイメージがないため、Docker Hubからダウンロード

ダウンロード(pull)完了

hello-world の出力

ド ッ カ ー ラ ン

ド ッ カ ー ラ ン ハ ロ ー ワ ー ル ド

ハ ロ ー ワ ー ル ド

プ ル

Page 34: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

2. 【 docker ps 】コマンドで、コンテナの状態を確認します。

• CONTAINER ID … コンテナごとのユニークな ID• IMAGE … コンテナの元になったイメージ名• CREATED … コンテナの作成時間• STATUS … 現在の状態(ステータス)。「Exited (0)」は正常終了• PORTS … ポートをホスト側に割り当て(マッピング時)は情報を表示• NAMES … コンテナ名。実行時に指定しなければ、「形容詞_人名」を自動組み合わせ

3. 【 docker images 】で、ローカル上のイメージを一覧表示します。

• REPOSITORY … リポジトリ名• TAG … タグ名• IMAGE ID … イメージ ID• CREATED … 作成時• SIZE … イメージの使用容量

34

# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES6d47af69a31b hello-world "/hello" 9 minutes ago Exited (0) 9 minutes ago awesome_varahamihira

オプション「-a」は全て(all)のコンテナを表示

# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEhello-world latest c54a2cc56cbb 3 months ago 1.848 kB

ピーエス

イ メ ー ジ ズ

Page 35: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

4.2. Ubuntu コンテナの実行hello-world イメージを使ったコンテナ実行は、画面にメッセージを表示するシンプルなものでした。次は、サーバのように操作可能な Linux ディストリビューションのコンテナを実行します。

1. 【 docker pull 】コマンドで ubuntu 公式イメージを取得します。

2. ダウンロードしたイメージを【 docker images 】で確認します。

35

# docker pull ubuntuUsing default tag: latestlatest: Pulling from library/ubuntu

6bbedd9b76a4: Pull completefc19d60a83f1: Pull completede413bb911fd: Pull complete2879a7ad3144: Pull complete668604fde02e: Pull completeDigest: sha256:2d44ae143feeb36f4c898d32ed2ab2dffeb3a573d2d8928646dfc9cb7deb1315Status: Downloaded newer image for ubuntu:lates

# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEubuntu latest f753707788c5 2 weeks ago 127.1 MBhello-world latest c54a2cc56cbb 3 months ago 1.848 kB

プ ル

Page 36: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

3. ubuntu:latest コンテナを実行します(コロン「:」記号の後ろはタグ)。

4. Ubuntu のバージョンを確認します。

5. ps コマンドを実行します。コンテナ実行時の「/bin/bash」のPIDが「1」なのを確認します。

6. コンテナを終了します。

36

# docker run -i -t ubuntu:latest /bin/bashroot@27e3c865bd61:/#

# cat /etc/issueUbuntu 16.04.1 LTS ¥n ¥l

# ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 08:09 ? 00:00:00 /bin/bashroot 12 1 0 08:14 ? 00:00:00 ps -efl

root@27e3c865bd61:/# exitexit[root@docker ~]#

レ イ テ ス ト

プロンプトのホスト名はコンテナID

Page 37: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

5. Nginx イメージを作成

37

$ docker

Docker Hub

nginx

Nginx の Docker イメージは Docker Hub からダウンロードしますダウンロードしたイメージを元に、新しいイメージを作成(構築)可能です

mynginx:1.1

mynginx:1.1

Page 38: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

5.1. Nginx コンテナの実行これまではコンテナを実行後、プロセスを終了する例をみてきました。次は、サーバ上でサービスを継続する Nginx イメージの実行方法を学びます。

1. nginx:latest コンテナを起動します。

38

# docker run -itd -p 80:80 nginx:latestUnable to find image 'nginx:latest' locallylatest: Pulling from library/nginx

43c265008fae: Pull completee4c030a565b1: Pull complete685b7631c1ce: Pull completeDigest: sha256:dedbce721065b2bcfae35d2b0690857bb6c3b4b7dd48bfe7fc7b53693731beffStatus: Downloaded newer image for nginx:latest5f343d53473b2b5147abb7d547cd67263beff68eb02c581bd75266d26308991a

-p で「ホスト側ポート:コンテナ側ポート」を割り当て(マッピング)

Page 39: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

2. ブラウザの URL に仮想サーバの IP アドレスを入力します。

39

Nginx の初期画面が表示されます

Page 40: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

5.2. Nginx コンテナにページを作成1. 【 docker ps 】 または【 docker ps -ql 】で、Nginx コンテナのコンテナ ID を確認。

※ コンテナ ID とは、コンテナを識別するもので、各種操作で必要です。

2. 【 docker exec 】コマンドで、bash の追加プロセスを実行。

3. 【 ps –ef 】コマンドで、nginx コンテナの中での操作を確認。

40

# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES5f343d53473b nginx:latest "nginx -g 'daemon off" 16 minutes ago Up 16 minutes 0.0.0.0:80->80/tcp, 443/tcp adoring_hoover

# docker ps -ql5f343d53473b

# docker exec -it $(docker ps -ql) /bin/bashroot@5f343d53473b:/#

# ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 06:29 ? 00:00:00 nginx: master process nginx -g daemon off;nginx 5 1 0 06:29 ? 00:00:00 nginx: worker processroot 6 0 0 06:48 ? 00:00:00 /bin/bashroot 11 6 0 06:49 ? 00:00:00 ps -ef

直近に操作したコンテナIDのみ表示

-q (quiet=静かな)、-l (last=直近の)

エ ク ゼ ク

PID 1 が nginx のコンテナ内と分かる

$(コマンド) はコマンド結果を変数展開=直近に操作したコンテナID

Page 41: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

4. Nginx のドキュメント・ルートの index.html を書き換えます。

5. ブラウザで表示を確認します。「Shift」キーを押しながら、再起動ボタンを押します。

6. 【 exit 】を実行し、bash を終了します。

41

# echo 'hello world' > /usr/share/nginx/html/index.html# cat /usr/share/nginx/html/index.htmlhello world

# exitexit

echo コマンドは文字列出力であり、index.html を上書き

Page 42: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

5.3. Nginx イメージの作成1. 【 docker commit 】 コマンドで、【 mynginx:1.0 】イメージを作成します。

2. 【 docker images 】コマンドで、イメージが作成されたのを確認します。

3. 作成した「mynginx:1.0」イメージを使って、新しいコンテナを実行します。

4. 【 curl 】コマンドで、コマンドライン上でポート 8080 を開きます。

42

# docker commit $(docker ps -ql) mynginx:1.0sha256:16504967dac47fc54bd85f2c2e57363f5cd7f9a0a8687d427d2504ab88578db7

# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmynginx 1.0 16504967dac4 About a minute ago 181.4 MBnginx latest e43d811ce2f4 9 days ago 181.4 MB

# docker run -d -p 8080:80 mynginx:1.0eb78012f01d0e3222713c405d652ca78258726696a4f39445cc87a15fa9f8863

# curl http://localhost:8080hello world

コ ミ ッ ト マ イ エ ン ジ ン エ ッ ク ス

新しい mynginx イメージは、始めから「hello world」を表示

Page 43: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

5.4 Dockerfile でイメージの自動構築1. 作業用ディレクトリ「mynginx」を作成し、移動します。

2. 次のコマンドを実行し、「Dockerfile」を作成します。

3. 【 docker build 】コマンドで、「mynginx:1.1」イメージを自動作成します。

43

# mkdir mynginx# cd mynginx

# tee ./Dockerfile <<-'EOF'FROM nginx:latestRUN echo "hello world<br />$(date)" > /usr/share/nginx/html/index.htmlEOF

# docker build -t mynginx:1.1 .Sending build context to Docker daemon 20.99 kBStep 1 : FROM nginx:latest---> e43d811ce2f4Step 2 : RUN echo "hello world<br />$date" > /usr/share/nginx/html/index.html---> Running in ec6bf44715e2---> 91ba2d666ae1Removing intermediate container

最後の「.」記号も必要。Dockerfileをはじめとした”コンテクスト”のパスを指定

自動コミット

自動コミット

ド ッ カ ー フ ァ イ ル

ビ ル ド

Page 44: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

4. 【 docker images 】コマンドで、イメージが作成されたのを確認します。

5. 作成した「mynginx:1.1」イメージを使って、新しいコンテナを実行します。

6. 【 curl 】コマンドで、コマンドライン上でポート 8888 を開きます。

44

# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmynginx 1.1 91ba2d666ae1 About a minute ago 181.4 MBmynginx 1.0 16504967dac4 12 minutes ago 181.4 MB

# docker run -d -p 8888:80 mynginx:1.11dcc320a2ecdc5448f87686f735e9f759ab0bf0107f32e035850e30a1757e83f

# curl http://localhost:8888hello world<br />Mon Oct 31 07:16:48 UTC 2016 $(date) の変数展開、すなわちビルド時の時刻を表示

Page 45: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

5.3 コンテナの停止と削除1. 【 docker ps 】でコンテナの状態を確認します。

2. コンテナを停止するため【 docker kill 】コマンドを実行します。

45

# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1dcc320a2ecd 91ba2d666ae1 "nginx -g 'daemon off" 3 minutes ago Up 3 minutes 443/tcp, 0.0.0.0:8888->80/tcp condescending_morseeb78012f01d0 mynginx:1.0 "nginx -g 'daemon off" 14 minutes ago Up 14 minutes 443/tcp, 0.0.0.0:8080->80/tcp angry_jepsen5f343d53473b nginx:latest "nginx -g 'daemon off" 48 minutes ago Up 48 minutes 0.0.0.0:80->80/tcp, 443/tcp adoring_hoover

# docker kill $(docker ps -q)1dcc320a2ecdeb78012f01d05f343d53473b

キ ル

実行中のコンテナ ID を変数展開

Page 46: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

3. 【 docker ps 】では実行中のプロセスはありませんが、【 docker ps -a 】でコンテナが停止中なのを確認します。

4. 【 docker rm 】コマンドでコンテナ(コンテナ用のイメージ・レイヤとメタ情報)を削除します。

46

# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1dcc320a2ecd 91ba2d666ae1 "nginx -g 'daemon off" 6 minutes ago Exited (137) About a minute ago condescending_morseeb78012f01d0 mynginx:1.0 "nginx -g 'daemon off" 17 minutes ago Exited (137) About a minute ago angry_jepsen5f343d53473b nginx:latest "nginx -g 'daemon off" 51 minutes ago Exited (137) About a minute ago adoring_hoover27e3c865bd61 ubuntu:latest "/bin/bash" 47 hours ago Exited (0) 47 hours ago distracted_stonebraker6d47af69a31b hello-world "/hello" 4 days ago Exited (0) 4 days ago awesome_varahamihira

# docker rm $(docker ps -aq)1dcc320a2ecdeb78012f01d05f343d53473b27e3c865bd616d47af69a31b

アールエム

実行中のコンテナがないのを確認

全て終了(exited)状態

全てのコンテナ ID を変数展開

Page 47: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

5. 全てのコンテナ(コンテナ用のイメージレイヤとメタ情報)が削除されたのを確認します。

47

# docker ps –a# コンテナを全て削除したので、何も表示しされない

補足:

• Docker コンテナ実行時、イメージは読み込み専

用であり、変更できません。

• ファイルやディレクトリに対する追加・変更・削除

の情報は、コンテナ用の新しいイメージ・レイヤに

記録されます。

• メタ情報とは、コンテナ実行時に指定するコマンド、

ポートの割り当て、各種のオプション情報等です。

• これらの情報はコンテナを docker rm で削除す

るまで保持します。

Page 48: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

6. Docker Hub にログイン

48

Docker Hub

Docker イメージを Docker Hub に公開します事前にアカウント ID の登録と、サーバからログイン(認証)する必要があります

ハ ブ

Nginx$ docker

mynginx:1.1 mynginx:1.1

Page 49: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

6.1 Docker Hub に ID を作成1. https://hub.docker.com/ にアクセスし、アカウントを作成し、ログインします。

ユーザ名は任意の名前を登録できますが、一般公開されますのでご注意ください。

49

• ID• メールアドレス• パスワード

これらを入力後【 Sign Up 】サ イ ン ア ッ プ

Page 50: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

6.2. サーバから Docker Hub にログイン1. 【 docker login 】コマンドを実行します。

※ 認証に失敗する場合は、パスワードの入力が正しいかどうかご確認ください。

※ 認証情報は「~/.docker/config.json」ファイルに記録されています。作業後は【docker logout】コマンドの実行で、認証に関する情報を削除します。

50

# docker loginLogin with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.Username: <自分のDockerHubID>Password:Login Succeeded

パスワードを入力(画面に表示されません)

# docker logoutRemove login credentials for https://index.docker.io/v1/

ロ グ イ ン

ロ グ ア ウ ト

Page 51: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

7. Docker イメージの登録と公開

51

イメージを送信(push)する前に、ログインが必要ですイメージ名とタグに、Docker Hub 上のユーザ名を追加します

Docker Hub

Nginx

Docker Hub

Nginx$ docker$ docker

mynginx:1.1 mynginx:1.1

Page 52: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

Docker Hub にイメージを登録するためには、あらかじめイメージ名に「DockerHubのID名」を付ける必要があります。

例:「mynginx:1.1」を公開するには「<ユーザ名>/mynginx:1.1」のイメージが必要です。

タグは構築時だけでなく、構築後も【 docker tag 】コマンドで変更できます。

7.1. イメージをタグ付け1. 【 docker tags 】コマンドで「mynginx:1.1」イメージに Docker Hub ID の情報を付けます。

2. 【 docker images 】で確認します。

52

# docker tag mynginx:1.1 <自分のID名>/mynginx:1.1

# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEzembutsu/mynginx 1.1 df1bb2784361 21 minutes ago 181.4 MBmynginx 1.1 df1bb2784361 21 minutes ago 181.4 MB

タ グ

Page 53: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

7.2. docker push でイメージを送信1. 【 docker push 】コマンドでイメージを送信します。

2. Docker Hub 上にある自分のページを表示し、リポジトリが作られているのを確認します。

53

# docker push <自分の名前>/mynginx:1.1The push refers to a repository [docker.io/<name>/mynginx]e8076080e8ef: Pushedbc1394447d64: Mounted from library/nginx6591c6f92a7b: Mounted from library/nginxf96222d75c55: Mounted from library/nginx1.1: digest: sha256:a1928c62d64fb7582f8bd38d90c8e2d57d7c2515c54f5d6c109cb37238047031 size: 1155

プ ッ シ ュ

※ docker push を実行すると、自動的にパブリック・リポジトリを作成します。

※ プライベート・リポジトリを作成したい場合は、Docker Hub 上で予め作成するか、作成後に変更します。

Page 54: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

7.3. 不要なイメージの削除使わない Docker イメージは削除できます。

1. 【 docker images –q 】を実行すると、ローカルにあるイメージ ID を表示します。

2. 【 docker rmi 】で全てのイメージを削除します。

54

# docker images -qdf1bb2784361df1bb278436191ba2d666ae116504967dac4e43d811ce2f4f753707788c5c54a2cc56cbb

# docker rmi -f $(docker images -aq)Untagged: mynginx:1.1Untagged: zembutsu/mynginx:1.1Untagged: zembutsu/mynginx@sha256:a1928c62d64fb7582f8bd38d90c8e2d57d7c2515c54f5d6c109cb37238047031Deleted: sha256:df1bb27843614031316161f1479435106a551c14ffb2174ece618b6e84846382Deleted: sha256:a098379d41319f1ef3058257be4b17272dddf3dbbdb144ba670afbab60dae98cUntagged: nginx:latest(以下省略)

ア ー ル エ ム ア イ

Page 55: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

ここまでのポイント• Docker イメージを実行するには、Docker Hub からダウンロードします。

• docker commit や docker build で任意のイメージを作成できます。

• イメージは docker push で Docker Hub に登録できます。

55

Page 56: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

https://arukas.io/

56

Page 57: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

Arukas

アプリケーションをDocker最適化インフラで実行

57

Page 58: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

Arukasのビジョン

インフラサービス抽象化開発者が自分自身で自由にサービス開発できる、専念できる環境を提供したい

Arukasが中心Arukasが、PaaS/SaaS/BaaS等の高レベルなサービスを提供する基盤に

インテグレーション機能サードパーティ製のクラウドサービスを、プラグインのように簡単に連携

ポータビリティを実現世界標準のDockerコンテナ対応

データを保持せず、Arukasにロックインされない自由度の高い環境を提供

58

Page 59: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

Arukasの特長

複数コンテナを管理Dockerコンテナを直感的に操作できるコントロールパネル

CLI (arukas コマンド)で、複数コンテナを簡単に管理

機動的なスケール機能簡単・高速なスケールイン・アウト機能

必要なリソースに応じてオンデマンドにスケール

高品質な国産サービスDocker コンテナ用に独自設計した Arukas のサーバ設備と、

高品質なネットワーク回線を通し、自由度の高い Docker コンテナをすぐに運用開始

59

Page 60: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

Arukasの利点

手軽、シンプル、簡単DockerコンテナをArukasのホスティング環境上で簡単に実行

直感的なコントロールパネルの操作だけで、マネージドされた環境上にプロビジョニング

コンテナ実行にサーバ不要アプリケーションとしてコンテナを実行すると、HTTPSに対応したエンドポイントを自動付与

サービスを実行するためにサーバやDocker環境は要りません

60

Page 61: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

Arukasの機能

最速15秒デプロイデプロイにかかる時間を短縮化

エンドポイントアプリ作成時、外部からコンテナにアクセス可能なエンドポイントを自動発行

例:https://focused-golick-8853.arukascloud.io

スケールアウトサービス規模にあわせ、オンデマンドにインスタンス数(アプリ数)を調整するだけでなく、負荷分散を自動適用

コントロールパネルシンプルで直感的にアプリの作成・管理が可能

CLI でも操作dockerコマンド風のarukasコマンドを使えばコントロールパネルにログインせずに操作可

例:arukas ps, arukas run, arukas rm …

61

Page 62: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

8. Arukas にログイン

62

$ docker

Docker Hub

Nginx$ docker

Docker Hub

Nginx

Arukas のサービスを使うには、アカウント登録・ログインが必要ですベータテスト中は無償で登録やご利用いただけます

mynginx:1.1 mynginx:1.1

Page 63: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

アカウント作成の流れ

オンライン登録1. サインアップ用ページを開く

https://app.arukas.io/sign_up/

2. ユーザ名、メールアドレス、パスワードを指定

3. 約款や個人情報の取り扱い同意にチェック

4. 【新規登録】をクリック

※GitHubアカウント連携も可

63

Page 64: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

ログイン方法

メールアドレス認証1. メールアドレスとパスワードを入力

2. 【ログイン】をクリック

GitHub認証1. 【GitHubでログイン】をクリック

64

Page 65: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

Arukasのダッシュボード

APIキー管理

ログアウト・ボタン

アプリ操作パネル(起動、設定変更、編集、削除)

新規アプリ追加アプリの状態表示 65

Page 66: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

9. Arukas で実行

66

$ docker

Docker Hub

Nginx$ docker$ docker

Arukas で Docker Hub にあるイメージをデプロイ(実行)できます

mynginx:1.1 mynginx:1.1

Page 67: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

新しいアプリの実行例

イメージ「dockercloud/hello-world」を起動1. 【アプリ作成】ボタンをクリック

67

Page 68: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

2. アプリ作成に必要な各種情報を入力

“APP Name” はアプリ名です。【 myapp 】と入力します。

“Image” は Docker イメージ名を入力します。ここでは、【 dockercloud/hello-world】を指定します。

“Endpoint” はブラウザ等でアクセス可能なエンド・ポイントです。“任意名称.arukascloud.io”を指定するか、空白時はランダムな名称が自動で割り当てられます。

“Port” はアプリが使用するポート番号です。ここでは【 80 】を指定します。

68

Page 69: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

3. 【アプリケーションを作成】ボタンをクリック

4. 画面が切り替わり、アプリ一覧に「myapp」が表示されるが停止状態

69

Page 70: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

5. アプリの【起動】ボタンをクリック

6. 起動確認で【OK】をクリック

7. アプリが起動するまで待つ約1分でアイコンがオレンジ色(デプロイ中)から緑色(実行中)に変化

70

Page 71: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

8. アプリ名【myapp】のリンクをクリックし、設定情報の確認

9. 詳細画面で、アプリの登録情報や、エンドポイントURLを確認

71

Page 72: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

課題:自分の【mynginx:1.1】コンテナを起動しよう!アプリ追加で「images」に【ユーザ名/mynginx:1.1】を追加

ブラウザからエンドポイントを表示し、自分で作成したコンテンツをブラウザで表示

72

$ docker

Docker Hub

Nginx

mynginx:1.1 mynginx:1.1

Page 73: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

73

ふりかえり

Page 74: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

まとめ

74

•開発、移動、実行しやすい環境Docker は Linux の各種技術をコンテナ化Dockdr イメージを使えば、どこでも移動・実行できる

• Arukas はコンテナを動かす環境サーバを用意しなくても、すぐに使える

Docker Hub のイメージを実行可能

エンドポイントの割り当て機能を持つ

Page 75: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

Dockerの情報を追うには?

75

• Docker bloghttps://blog.docker.com/

• SNShttps://twitter.com/docker

http://www.slideshare.net/docker

•ドキュメントhttps://docs.docker.com/

Page 76: Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編

何か気になるところはありますか?

76

• Docker 日本語訳作ってますhttp://docs.docker.jp/

• 過去の発表スライドhttp://slideshare.net/zembutsu

twitter: @zembutsu