SlideShare a Scribd company logo
Docker/ Arukas入門
ハンズオン資料
2016年10月31日(月)
さくらインターネット株式会社
Technology Evangelist 前佛雅人
@zembutsu
第 1 回 さ く ら と コ ン テ ナ の 夕 べ ( さ く ら の 夕 べ 番 外 編 )
今日の内容
Docker とコンテナの基礎知識
Docker って何だ?
コンテナとイメージの基本概念
ハンズオン編 ~Nginxを動かす~
さくらのクラウドでサーバのセットアップ
Docker のインストール
コンテナの実行とイメージの構築
Docker Hub にアップロード
Arukas にデプロイ
質疑応答
2
3
Dockerと
コンテナの基礎知識
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
ソ ロ モ ン ・ ハ イ ク
ド ッ カ ー
ド ッ ト ク ラ ウ ド ア パ ッ チ ラ イ セ ン ス
5
Introducing InfraKit, an open source toolkit for creating and managing declarative, self-healing infrastructure - Docker Blog
https://blog.docker.com/2016/10/introducing-infrakit-an-open-source-toolkit-for-declarative-infrastructure/
6
Build Run開 発 ・ 構 築 移 動 実 行
Ship
“Build, Ship, Run, Any App Anywhere”
Docker Engine for Linux / Commercial Support
Docker for Mac, Windows, Windows Server
Docker Trusted Registry
Docker Hub
Universal Control Plane
Toolbox
Kitematic
Dev
(開発)
Ops
(運用)
ツ ー ル ボ ッ ク ス
ド ッ カ ー マ シ ン
カ イ ト マ テ ィ ッ ク
レ ジ ス ト リ
ド ッ カ ー ハ ブ
コ ン ポ ー ズ
ス ゥ ォ ー ム
ク ラ ウ ド
デ ー タ セ ン タド ッ カ ー ・ ト ラ ス テ ッ ド ・ レ ジ ス ト リ ユ ニ バ ー サ ル ・ コ ン ト ロ ー ル ・ プ レ ー
ン
ド ッ カ ー エ ン ジ ン コ マ ー シ ャ ル ・ サ ポ ー ト ( 商 用 サ ポ ー ト ) 版
あ ら ゆ る ア プ リ ケ ー シ ョ ン を 、 ど こ で も 構 築 ・ 移 動 ・ 実 行
7
Docker Engine
Linux Kernel
・namespaces
・cgroups
LXC libcontainer runC
containerd
v0.9~
v1.11~
Version 7 Unix
chroot
jail
dockerd
v1.12~
デーモン
ライブラリ
ランタイム
docker daemon
・SELinux
・capabilities
… etc
Docker: the container engine
v1.11~
カ ー ネ ル
ネ ー ム ス ペ ー ス
シ ー グ ル ー プ
エ ス イ ー リ ナ ッ ク ス
ケ ー パ ビ リ テ ィ
エルエックスシー リ ブ コ ン テ ナ ラ ン シ ー
ド ッ カ ー デ ー モ ン
コ ン テ ナ デ ィ ー
ド ッ カ ー デ ィ ー
ド ッ カ ー エ ン ジ ン
オ ー プ ン コ ン テ ナ
イ ニ シ ア テ ィ ブ
Docker イメージとレイヤの理解
Docker イメージは、レイヤを積み上げて参照
各レイヤが層(スタック)として積み上がり、1つに統合されたファイルシステムとして見える
Docker 内部のストレージ・ドライバが、レイヤを積み重ねる役割を担う
イメージは読み込み専用(ReadOnly)
各イメージ・レイヤは親子関係を持っている
イメージ・レイヤは読み込み専用のため、変更を加えられない
レイヤに対する変更情報(ファイルの追加・削除)は、子レイヤ側に記録
レイヤの利点は移動・共有しやすさ
各レイヤをファイルやコードの差分のように扱えるため、ネットワークを
通して共有する時、余分なトラフィックを使用せず、時間も節約できる
8
Docker イメージとコンテナの関係
コンテナはイメージに新しいレイヤを追加
薄い読み書き可能レイヤ(Thin R/W layer)は、コンテナ
実行時に自動的に割り当てられる
イメージに対する変更情報(ファイルの追加・削除)は
すべてこのコンテナ用レイヤ上に記録
このレイヤをコミット(commit)すると、新しいイメージを
作成できる
ディスク領域の有効活用
コンテナの起動時には、追加のディスク容量がほぼ不要
なため、仮想化システムのように起動のたびにディスク
容量を確保する必要がない
9
Docker コンテナの操作
10
OS ( Linux )
物理/仮想サーバ
Docker エンジン
( dockerd デーモン )
Linux kernel
コンテナ コンテナ コンテナ
リモート
API
docker
クライアント TCP あるいは
Unix ソケットドメイン
containerd
Runtime: runC (OCI規格準拠)
・docker コマンド
Linux, Mac OS X, Windows
・Kitematic (GUI)
Mac OS X, Windows
・Docker Compose
・Docker Swarm
11
コンテナの実行
コンテナAの
ファイルシステム
… …
コンテナBの
ファイルシステム
/etc
(/data/ubuntu/etc)
/bin
(/data/ubuntu/bin)
/etc
(/data/centos/etc)
/bin
(/data/centos/bin)
/ /
httpd
PID 1
プロセスA プロセスB
ruby
PID 1
chris.rb
PID 2
コンテナA コンテナB
名前空間の isolate
・プロセス
・ファイルシステム
・ネットワーク
・ホスト名
・UID・GID
リソース制限
・CPU
・メモリ
・I/O
・ディスク・クォータ
アイソレート
Docker コンテナのライフサイクル
12
コンテナを動かすには?
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 コンテナの実行
イメージを作るには?
14
$ docker commit [コンテナID] [イメージ名:タグ]
docker commit コマンド
$ docker build –t [イメージ名:タグ] .
docker bulid コマンド
$ docker build –t [イメージ名:タグ] .
Dockerfile ファイル
ここまでのポイント
• Docker はアプリケーションを開発・移動・実行するためのプラットフォーム
• アプリケーションのコンテナ化には、Linux カーネルの技術を使う
• Docker コンテナを動かすには、Docker イメージが必要
15
16
ハンズオン
17
$ docker
Docker Hub
Nginx
Build RunShip開 発 ・ 構 築 移 動 実 行
基本操作とコンテナ作成・デプロイ方法を習得
ハンズオンの流れ
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 Hub
Nginx
1. さくらのクラウドにログイン
1.1. コントロールパネルの表示
さくらのクラウド http://cloud.sakura.ad.jp/ から を選び、
https://secure.sakura.ad.jp/cloud/ を開きます。
1.2. 接続情報の確認
配布資料のログイン情報を入力します。
入力後は をクリックします。
19
2. 仮想サーバの起動と接続
2.1. さくらのクラウドで仮想サーバを起動
1. 【 さくらのクラウド(IaaS) 】をクリックします。
20
2. メニュー【 サーバ 】から【 追加 】をクリックします。
3. ディスクイメージは【 CentOS 7.2 64bit 】を使います。
21
4. 「サーバプラン」と「ディスクプラン」を選択します(※今回は変更しません)。
22
5. 【 管理ユーザのパスワード 】で root パスワードを設定します。
※ 8文字以上の「アルファベット」「数字」「記号」の組み合わせが必要
6. ホスト名を【 docker 】、作成数【 1 】として【 作成 】ボタンをクリックします。
23
7. 確認画面では【 作成 】をクリックします。
8. サーバ追加作業が完了するまで待ちます。起動後は【 閉じる 】をクリックします。
9. メニューの【 サーバ 】をクリックし、作成したサーバ「 docker 」を確認します。
24
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.220
The 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)? yes
Warning: Permanently added '59.106.209.220' (ECDSA) to the list of known hosts.
root@59.106.209.220's password:
[root@docker ~]#
実行例
ssh コマンドで仮想サーバに接続
接続を許可するので yes
パスワードを入力(画面に表示されません)
ここまでのポイント
• さくらのクラウドで仮想サーバを作るには、ログイン後に【 IaaS 】を選択。
26
以降のコマンド入力テキスト配布 URL
http://qiita.com/zembutsu/items/cc69f98bd2344c8b3317
or
http://bit.ly/sakura20161031
27
3. Docker Engine のセットアップ
28
エ ン ジ ンド ッ カ ー
$ docker
Docker Hub
Nginx
仮想サーバの準備が整いました
Docker コンテナを動かすためには、Docker Engine が必要です
3.1 安定版(stable)の最新バイナリを入れる
1. パッケージを最新に更新します。
2. Docker の yum リポジトリを利用可能にします。
3. docker-engine パッケージをセットアップします。
29
# tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
docker.repo の作成
「EOF」文字列が出てくるまでの標準出力を docker.repo に書き出す
ここまで
# yum –y install docker-engine
# yum -y update
ヤ ム ワ イ ア ッ プ デ ー ト
テ ィ ー
ス テ ー ブ ル
ド ッ カ ー ・ レ ポ
イ ン ス ト ー ル
3.2. docker サービスの有効化とデーモン起動
1. サービスを有効化(サーバのブート時に自動実行)します。
2. docker デーモンを起動します。
3. バージョン番号を確認します。
30
# systemctl enable docker.service
Created 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.3
API version: 1.24
Go version: go1.6.3
Git commit: 6b644ec
Built:
OS/Arch: linux/amd64
docker コマンドで、クライアントとサーバ両方のバージョン表示
docker デーモンが起動していないと、
サーバ側のバージョンを表示できない
システムシーティーエ
ル
イ ネ ー ブ ル
ス タ ー ト
バ ー ジ ョ ン
補足情報: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
リ ム ー ブ
アールエム
カ ー ル カ ー ル
4. docker コマンドの基本操作
32
$ docker
Docker Hub
hello-world
Docker コンテナを実行するには Docker イメージが必要です
Docker(公式)イメージは Docker Hub から取得します
mynginx:1.1
4.1. hello-world コンテナの実行とイメージ確認
1. 【 docker run 】コマンドでコンテナを実行します。
33
# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c04b14da8d14: Pull complete
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Status: 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 の出力
ド ッ カ ー ラ ン
ド ッ カ ー ラ ン ハ ロ ー ワ ー ル ド
ハ ロ ー ワ ー ル ド
プ ル
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 -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6d47af69a31b hello-world "/hello" 9 minutes ago Exited (0) 9 minutes ago awesome_varahamihira
オプション「-a」は全て(all)のコンテナを表示
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest c54a2cc56cbb 3 months ago 1.848 kB
ピーエス
イ メ ー ジ ズ
4.2. Ubuntu コンテナの実行
hello-world イメージを使ったコンテナ実行は、画面にメッセージを表示するシンプルなもの
でした。次は、サーバのように操作可能な Linux ディストリビューションのコンテナを実行します。
1. 【 docker pull 】コマンドで ubuntu 公式イメージを取得します。
2. ダウンロードしたイメージを【 docker images 】で確認します。
35
# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
6bbedd9b76a4: Pull complete
fc19d60a83f1: Pull complete
de413bb911fd: Pull complete
2879a7ad3144: Pull complete
668604fde02e: Pull complete
Digest: sha256:2d44ae143feeb36f4c898d32ed2ab2dffeb3a573d2d8928646dfc9cb7deb1315
Status: Downloaded newer image for ubuntu:lates
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest f753707788c5 2 weeks ago 127.1 MB
hello-world latest c54a2cc56cbb 3 months ago 1.848 kB
プ ル
3. ubuntu:latest コンテナを実行します(コロン「:」記号の後ろはタグ)。
4. Ubuntu のバージョンを確認します。
5. ps コマンドを実行します。コンテナ実行時の「/bin/bash」のPIDが「1」なのを確認します。
6. コンテナを終了します。
36
# docker run -i -t ubuntu:latest /bin/bash
root@27e3c865bd61:/#
# cat /etc/issue
Ubuntu 16.04.1 LTS ¥n ¥l
# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 08:09 ? 00:00:00 /bin/bash
root 12 1 0 08:14 ? 00:00:00 ps -efl
root@27e3c865bd61:/# exit
exit
[root@docker ~]#
レ イ テ ス ト
プロンプトのホスト名はコンテナID
5. Nginx イメージを作成
37
$ docker
Docker Hub
nginx
Nginx の Docker イメージは Docker Hub からダウンロードします
ダウンロードしたイメージを元に、新しいイメージを作成(構築)可能です
mynginx:1.1
mynginx:1.1
5.1. Nginx コンテナの実行
これまではコンテナを実行後、プロセスを終了する例をみてきました。次は、サーバ上でサービスを
継続する Nginx イメージの実行方法を学びます。
1. nginx:latest コンテナを起動します。
38
# docker run -itd -p 80:80 nginx:latest
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
43c265008fae: Pull complete
e4c030a565b1: Pull complete
685b7631c1ce: Pull complete
Digest: sha256:dedbce721065b2bcfae35d2b0690857bb6c3b4b7dd48bfe7fc7b53693731beff
Status: Downloaded newer image for nginx:latest
5f343d53473b2b5147abb7d547cd67263beff68eb02c581bd75266d26308991a
-p で「ホスト側ポート:コンテナ側ポート」を割り当て(マッピング)
2. ブラウザの URL に仮想サーバの IP アドレスを入力します。
39
Nginx の初期画面が表示されます
5.2. Nginx コンテナにページを作成
1. 【 docker ps 】 または【 docker ps -ql 】で、Nginx コンテナのコンテナ ID を確認。
※ コンテナ ID とは、コンテナを識別するもので、各種操作で必要です。
2. 【 docker exec 】コマンドで、bash の追加プロセスを実行。
3. 【 ps –ef 】コマンドで、nginx コンテナの中での操作を確認。
40
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
5f343d53473b 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 -ql
5f343d53473b
# docker exec -it $(docker ps -ql) /bin/bash
root@5f343d53473b:/#
# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 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 process
root 6 0 0 06:48 ? 00:00:00 /bin/bash
root 11 6 0 06:49 ? 00:00:00 ps -ef
直近に操作したコンテナIDのみ表示
-q (quiet=静かな)、-l (last=直近の)
エ ク ゼ ク
PID 1 が nginx のコンテナ内と分かる
$(コマンド) はコマンド結果を変数展開=直近に操作したコンテナID
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.html
hello world
# exit
exit
echo コマンドは文字列出力であり、index.html を上書き
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.0
sha256:16504967dac47fc54bd85f2c2e57363f5cd7f9a0a8687d427d2504ab88578db7
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mynginx 1.0 16504967dac4 About a minute ago 181.4 MB
nginx latest e43d811ce2f4 9 days ago 181.4 MB
# docker run -d -p 8080:80 mynginx:1.0
eb78012f01d0e3222713c405d652ca78258726696a4f39445cc87a15fa9f8863
# curl http://localhost:8080
hello world
コ ミ ッ ト マ イ エ ン ジ ン エ ッ ク ス
新しい mynginx イメージは、始めから「hello world」を表示
5.4 Dockerfile でイメージの自動構築
1. 作業用ディレクトリ「mynginx」を作成し、移動します。
2. 次のコマンドを実行し、「Dockerfile」を作成します。
3. 【 docker build 】コマンドで、「mynginx:1.1」イメージを自動作成します。
43
# mkdir mynginx
# cd mynginx
# tee ./Dockerfile <<-'EOF'
FROM nginx:latest
RUN echo "hello world<br />$(date)" > /usr/share/nginx/html/index.html
EOF
# docker build -t mynginx:1.1 .
Sending build context to Docker daemon 20.99 kB
Step 1 : FROM nginx:latest
---> e43d811ce2f4
Step 2 : RUN echo "hello world<br />$date" > /usr/share/nginx/html/index.html
---> Running in ec6bf44715e2
---> 91ba2d666ae1
Removing intermediate container
最後の「.」記号も必要。Dockerfileをはじめとした”コンテクスト”のパスを指定
自動コミット
自動コミット
ド ッ カ ー フ ァ イ ル
ビ ル ド
4. 【 docker images 】コマンドで、イメージが作成されたのを確認します。
5. 作成した「mynginx:1.1」イメージを使って、新しいコンテナを実行します。
6. 【 curl 】コマンドで、コマンドライン上でポート 8888 を開きます。
44
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mynginx 1.1 91ba2d666ae1 About a minute ago 181.4 MB
mynginx 1.0 16504967dac4 12 minutes ago 181.4 MB
# docker run -d -p 8888:80 mynginx:1.1
1dcc320a2ecdc5448f87686f735e9f759ab0bf0107f32e035850e30a1757e83f
# curl http://localhost:8888
hello world<br />Mon Oct 31 07:16:48 UTC 2016 $(date) の変数展開、すなわちビルド時の時刻を表示
5.3 コンテナの停止と削除
1. 【 docker ps 】でコンテナの状態を確認します。
2. コンテナを停止するため【 docker kill 】コマンドを実行します。
45
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
1dcc320a2ecd 91ba2d666ae1 "nginx -g 'daemon off" 3 minutes ago Up 3 minutes 443/tcp, 0.0.0.0:8888->80/tcp
condescending_morse
eb78012f01d0 mynginx:1.0 "nginx -g 'daemon off" 14 minutes ago Up 14 minutes 443/tcp, 0.0.0.0:8080->80/tcp
angry_jepsen
5f343d53473b 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)
1dcc320a2ecd
eb78012f01d0
5f343d53473b
キ ル
実行中のコンテナ ID を変数展開
3. 【 docker ps 】では実行中のプロセスはありませんが、【 docker ps -a 】でコンテナが停止中
なのを確認します。
4. 【 docker rm 】コマンドでコンテナ(コンテナ用のイメージ・レイヤとメタ情報)を削除します。
46
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
1dcc320a2ecd 91ba2d666ae1 "nginx -g 'daemon off" 6 minutes ago Exited (137) About a minute ago
condescending_morse
eb78012f01d0 mynginx:1.0 "nginx -g 'daemon off" 17 minutes ago Exited (137) About a minute ago
angry_jepsen
5f343d53473b nginx:latest "nginx -g 'daemon off" 51 minutes ago Exited (137) About a minute ago
adoring_hoover
27e3c865bd61 ubuntu:latest "/bin/bash" 47 hours ago Exited (0) 47 hours ago
distracted_stonebraker
6d47af69a31b hello-world "/hello" 4 days ago Exited (0) 4 days ago
awesome_varahamihira
# docker rm $(docker ps -aq)
1dcc320a2ecd
eb78012f01d0
5f343d53473b
27e3c865bd61
6d47af69a31b
アールエム
実行中のコンテナがないのを確認
全て終了(exited)状態
全てのコンテナ ID を変数展開
5. 全てのコンテナ(コンテナ用のイメージレイヤとメタ情報)が削除されたのを確認します。
47
# docker ps –a
# コンテナを全て削除したので、何も表示しされない
補足:
• Docker コンテナ実行時、イメージは読み込み専
用であり、変更できません。
• ファイルやディレクトリに対する追加・変更・削除
の情報は、コンテナ用の新しいイメージ・レイヤに
記録されます。
• メタ情報とは、コンテナ実行時に指定するコマンド、
ポートの割り当て、各種のオプション情報等です。
• これらの情報はコンテナを docker rm で削除す
るまで保持します。
6. Docker Hub にログイン
48
Docker Hub
Docker イメージを Docker Hub に公開します
事前にアカウント ID の登録と、サーバからログイン(認証)する必要があります
ハ ブ
Nginx$ docker
mynginx:1.1 mynginx:1.1
6.1 Docker Hub に ID を作成
1. https://hub.docker.com/ にアクセスし、アカウントを作成し、ログインします。
ユーザ名は任意の名前を登録できますが、一般公開されますのでご注意ください。
49
• ID
• メールアドレス
• パスワード
これらを入力後【 Sign Up 】
サ イ ン ア ッ プ
6.2. サーバから Docker Hub にログイン
1. 【 docker login 】コマンドを実行します。
※ 認証に失敗する場合は、パスワードの入力が正しいかどうかご確認ください。
※ 認証情報は「~/.docker/config.json」ファイルに記録されています。作業後は【docker logout】
コマンドの実行で、認証に関する情報を削除します。
50
# docker login
Login 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 logout
Remove login credentials for https://index.docker.io/v1/
ロ グ イ ン
ロ グ ア ウ ト
7. Docker イメージの登録と公開
51
イメージを送信(push)する前に、ログインが必要です
イメージ名とタグに、Docker Hub 上のユーザ名を追加します
Docker Hub
Nginx
Docker Hub
Nginx$ docker$ docker
mynginx:1.1 mynginx:1.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 images
REPOSITORY TAG IMAGE ID CREATED SIZE
zembutsu/mynginx 1.1 df1bb2784361 21 minutes ago 181.4 MB
mynginx 1.1 df1bb2784361 21 minutes ago 181.4 MB
タ グ
7.2. docker push でイメージを送信
1. 【 docker push 】コマンドでイメージを送信します。
2. Docker Hub 上にある自分のページを表示し、リポジトリが作られているのを確認します。
53
# docker push <自分の名前>/mynginx:1.1
The push refers to a repository [docker.io/<name>/mynginx]
e8076080e8ef: Pushed
bc1394447d64: Mounted from library/nginx
6591c6f92a7b: Mounted from library/nginx
f96222d75c55: Mounted from library/nginx
1.1: digest: sha256:a1928c62d64fb7582f8bd38d90c8e2d57d7c2515c54f5d6c109cb37238047031 size: 1155
プ ッ シ ュ
※ docker push を実行すると、自動的にパブリック・
リポジトリを作成します。
※ プライベート・リポジトリを作成したい場合は、
Docker Hub 上で予め作成するか、作成後に変更
します。
7.3. 不要なイメージの削除
使わない Docker イメージは削除できます。
1. 【 docker images –q 】を実行すると、ローカルにあるイメージ ID を表示します。
2. 【 docker rmi 】で全てのイメージを削除します。
54
# docker images -q
df1bb2784361
df1bb2784361
91ba2d666ae1
16504967dac4
e43d811ce2f4
f753707788c5
c54a2cc56cbb
# docker rmi -f $(docker images -aq)
Untagged: mynginx:1.1
Untagged: zembutsu/mynginx:1.1
Untagged: zembutsu/mynginx@sha256:a1928c62d64fb7582f8bd38d90c8e2d57d7c2515c54f5d6c109cb37238047031
Deleted: sha256:df1bb27843614031316161f1479435106a551c14ffb2174ece618b6e84846382
Deleted: sha256:a098379d41319f1ef3058257be4b17272dddf3dbbdb144ba670afbab60dae98c
Untagged: nginx:latest
(以下省略)
ア ー ル エ ム ア イ
ここまでのポイント
• Docker イメージを実行するには、Docker Hub からダウンロードします。
• docker commit や docker build で任意のイメージを作成できます。
• イメージは docker push で Docker Hub に登録できます。
55
https://arukas.io/
56
Arukas
アプリケーションをDocker最適化インフラで実行
57
Arukasのビジョン
インフラサービス抽象化
開発者が自分自身で自由にサービス開発できる、専念できる環境を提供したい
Arukasが中心
Arukasが、PaaS/SaaS/BaaS等の高レベルなサービスを提供する基盤に
インテグレーション機能
サードパーティ製のクラウドサービスを、プラグインのように簡単に連携
ポータビリティを実現
世界標準のDockerコンテナ対応
データを保持せず、Arukasにロックインされない自由度の高い環境を提供
58
Arukasの特長
複数コンテナを管理
Dockerコンテナを直感的に操作できるコントロールパネル
CLI (arukas コマンド)で、複数コンテナを簡単に管理
機動的なスケール機能
簡単・高速なスケールイン・アウト機能
必要なリソースに応じてオンデマンドにスケール
高品質な国産サービス
Docker コンテナ用に独自設計した Arukas のサーバ設備と、
高品質なネットワーク回線を通し、自由度の高い Docker コンテナをすぐに運用開始
59
Arukasの利点
手軽、シンプル、簡単
DockerコンテナをArukasのホスティング環境上で簡単に実行
直感的なコントロールパネルの操作だけで、マネージドされた
環境上にプロビジョニング
コンテナ実行にサーバ不要
アプリケーションとしてコンテナを実行すると、HTTPSに対応した
エンドポイントを自動付与
サービスを実行するためにサーバやDocker環境は要りません
60
Arukasの機能
最速15秒デプロイ
デプロイにかかる時間を短縮化
エンドポイント
アプリ作成時、外部からコンテナにアクセス可能
な
エンドポイントを自動発行
例:https://focused-golick-8853.arukascloud.io
スケールアウト
サービス規模にあわせ、オンデマンドにインスタ
ンス数(アプリ数)を調整するだけでなく、負荷分
散を自動適用
コントロールパネル
シンプルで直感的にアプリの作成・管理が可能
CLI でも操作
dockerコマンド風のarukasコマンドを使えば
コントロールパネルにログインせずに操作可
例:arukas ps, arukas run, arukas rm …
61
8. Arukas にログイン
62
$ docker
Docker Hub
Nginx$ docker
Docker Hub
Nginx
Arukas のサービスを使うには、アカウント登録・ログインが必要です
ベータテスト中は無償で登録やご利用いただけます
mynginx:1.1 mynginx:1.1
アカウント作成の流れ
オンライン登録
1. サインアップ用ページを開く
https://app.arukas.io/sign_up/
2. ユーザ名、メールアドレス、パスワードを指定
3. 約款や個人情報の取り扱い同意にチェック
4. 【新規登録】をクリック
※GitHubアカウント連携も可
63
ログイン方法
メールアドレス認証
1. メールアドレスとパスワードを入力
2. 【ログイン】をクリック
GitHub認証
1. 【GitHubでログイン】をクリック
64
Arukasのダッシュボード
APIキー管理
ログアウト・ボタン
アプリ操作パネル
(起動、設定変更、編集、削除)
新規アプリ追加
アプリの状態表示
65
9. Arukas で実行
66
$ docker
Docker Hub
Nginx$ docker$ docker
Arukas で Docker Hub にあるイメージをデプロイ(実行)できます
mynginx:1.1 mynginx:1.1
新しいアプリの実行例
イメージ「dockercloud/hello-world」を起動
1. 【アプリ作成】ボタンをクリック
67
2. アプリ作成に必要な各種情報を入力
“APP Name” はアプリ名です。
【 myapp 】と入力します。
“Image” は Docker イメージ名
を入力します。ここでは、
【 dockercloud/hello-world】
を指定します。
“Endpoint” はブラウザ等でアク
セス可能なエンド・ポイントです。
“任意名称.arukascloud.io”
を指定するか、空白時はランダムな
名称が自動で割り当てられます。
“Port” はアプリが使用するポート
番号です。ここでは【 80 】を指定
します。
68
3. 【アプリケーションを作成】ボタンをクリック
4. 画面が切り替わり、アプリ一覧に「myapp」が表示されるが停止状態
69
5. アプリの【起動】ボタンをクリック
6. 起動確認で【OK】をクリック
7. アプリが起動するまで待つ
約1分でアイコンがオレンジ色(デプロイ中)から緑色(実行中)に変化
70
8. アプリ名【myapp】のリンクをクリックし、設定情報の確認
9. 詳細画面で、アプリの登録情報や、エンドポイントURLを確認
71
課題:自分の【mynginx:1.1】コンテナを起動しよう!
アプリ追加で「images」に【ユーザ名/mynginx:1.1】を追加
ブラウザからエンドポイントを表示し、自分で作成したコンテンツをブラウザで表示
72
$ docker
Docker Hub
Nginx
mynginx:1.1 mynginx:1.1
73
ふりかえり
まとめ
74
• 開発、移動、実行しやすい環境
Docker は Linux の各種技術をコンテナ化
Dockdr イメージを使えば、どこでも移動・実行できる
• Arukas はコンテナを動かす環境
サーバを用意しなくても、すぐに使える
Docker Hub のイメージを実行可能
エンドポイントの割り当て機能を持つ
Dockerの情報を追うには?
75
• Docker blog
https://blog.docker.com/
• SNS
https://twitter.com/docker
http://www.slideshare.net/docker
• ドキュメント
https://docs.docker.com/
何か気になるところはありますか?
76
• Docker 日本語訳作ってます
http://docs.docker.jp/
• 過去の発表スライド
http://slideshare.net/zembutsu
twitter: @zembutsu

More Related Content

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