40
Docker ハンズオン JAWS-UG コンテナ支部 Docker入門 #02

JAWS-UG コンテナ支部 Docker入門 ハンズオン

Embed Size (px)

Citation preview

Page 1: JAWS-UG コンテナ支部 Docker入門 ハンズオン

Docker ハンズオン JAWS-UG コンテナ支部

Docker入門 #02

Page 2: JAWS-UG コンテナ支部 Docker入門 ハンズオン

@pottava (AWS Certified) SA, DevOps Engineer Pro Love: S3, CloudFront and Containers

中丸 良

Page 3: JAWS-UG コンテナ支部 Docker入門 ハンズオン

ハンズオン

1. 準備

2. docker images, ps(イメージ、コンテナの一覧取得)

3. docker run(コンテナの起動)

4. docker run -d(デーモンコンテナの起動)

5. docker logs(コンテナのログを確認する)

6. docker start, stop, restart(コンテナの開始・停止)

7. MySQLを複数立ち上げて繋いでみる

8. 後片付け

9. Appendix

Page 4: JAWS-UG コンテナ支部 Docker入門 ハンズオン

中丸 良1. 準備

Page 5: JAWS-UG コンテナ支部 Docker入門 ハンズオン

1. 準備

今日の手順はこちら

http://goo.gl/NQlUjH

1.1. EC2コンソール東京リージョンにログイン

ハンズオンで使えるキーペアがあるか

確認。なければ作りましょう!

https://goo.gl/eb1pKo

1.2. 以下リンクから、CloudFormation実行

https://goo.gl/NrTjMM

1.3. Docker ToolBoxのダウンロード

https://www.docker.com/docker-toolbox

Page 6: JAWS-UG コンテナ支部 Docker入門 ハンズオン

1. 準備

1.4. Docker Quickstart Terminalを起動します

## . ## ## ## == ## ## ## ## ## === /"""""""""""""""""\___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~ \______ o __/ \ \ __/ \____\_______/

docker is configured to use the default machine with IP 192.168.99.102For help getting started, check out the docs at https://docs.docker.com

your-host:~ $

your-host:~ $ docker version

1.5. 以下のコマンドを実行してみましょう

(dockerのAPIバージョンは1.20のはず)

Page 7: JAWS-UG コンテナ支部 Docker入門 ハンズオン

EC2インスタンスって必要?

本来、Dockerの操作には不要です。

今日は DRECOMさんの会場をお貸しいただいていますが

みんなで一斉に自分の端末に直接 docker pullで

Dockerイメージを引っ張ってくると

会場のネットワークに負荷がかかるため、

実際の Docker操作をクラウド上で実施する形式にしています。

そのため、今日のハンズオンはちょっとだけ複雑な構成ですが

あとで自宅やオフィスで Dockerで遊ぶなら、もっとずっと簡単です。

特に、先ほどインストールしていただいた Docker ToolBoxは便利!

Page 8: JAWS-UG コンテナ支部 Docker入門 ハンズオン

Docker ToolBoxってなに

道具箱というだけあって、 Docker操作に必要なツール集が入っており

大きく分けると次の 2つがインストールされます。

・ Docker Quickstart Terminal

・ Kitematic

Docker Quickstart Terminalはいわゆる黒い画面で、起動すると

・ dockerクライアント(docker psとか docker runとかに使う)

・ docker-machine

・ docker-compose

あたりが使えます。

Page 9: JAWS-UG コンテナ支部 Docker入門 ハンズオン

Docker ToolBoxってなに

今日は諸事情で使えませんが、黒い画面が 嫌な 不慣れな方、

ぜひ Kitematicというツールを起動してみてください。

Page 10: JAWS-UG コンテナ支部 Docker入門 ハンズオン

Docker ToolBoxってなに

ToolBoxは端末上の VirtualBoxという仮想環境の中にサーバーを起動し、

そこで動く Dockerデーモンと Docker Remote APIで通信しています。

(なので、 ToolBoxのツールを通して起動した Dockerコンテナは

 みなさんの Windowsや Mac直下ではなく、その中の

 仮想サーバーの中で動いています)

Docker Remote API

Page 11: JAWS-UG コンテナ支部 Docker入門 ハンズオン

今日の構成

EC2を使うため、今日はこうなります。

・ SSH接続ができる方はサーバの中で直接 Dockerを操作

・もしくは自端末の Docker Quickstart Terminalから Remote API経由で操作

SSH & docker API or

Docker Remote API

Page 12: JAWS-UG コンテナ支部 Docker入門 ハンズオン

EC2インスタンス一覧から起動した EC2インスタンスを探し、

Public IPアドレスをコピー(Ctrl+C)します。

https://goo.gl/CjfB94

1. 準備(あと一歩)

Page 13: JAWS-UG コンテナ支部 Docker入門 ハンズオン

・ 「サーバの中で直接 Dockerを操作」したい方(推奨!!)

下記コマンドを自分用に編集して SSH接続しましょう!

(ユーザ名は ec2-userではなく、coreです!)

・「Docker Quickstart Terminalから Remote API経由で操作」したい方

必要な環境変数をセットしましょう!

1. 準備(あと一歩)

your-host:~ $ export DOCKER_HOST=tcp://ec2.public.ip.address:2375your-host:~ $ export DOCKER_TLS_VERIFY=your-host:~ $ export DOCKER_CERT_PATH=your-host:~ $ your-host:~ $ docker infoContainers: 1Images: 497…Operating System: CoreOS 845.0.0

your-host:~ $ ssh -i your-keypair.pem [email protected] login: Mon Jul 27 18:00:00 2015 from your.public.ip.addressCoreOS stable (845.0.0)Update Strategy: No [email protected]$

Page 14: JAWS-UG コンテナ支部 Docker入門 ハンズオン

中丸 良2. docker images, ps(イメージ、コンテナの一覧取得)

Page 15: JAWS-UG コンテナ支部 Docker入門 ハンズオン

2. docker images, ps(イメージ、コンテナの一覧取得)

・docker images

[email protected]$ docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEnginx latest 914c82c5a678 29 hours ago 132.7 MBrails 4.2.4 8f811c47f859 5 days ago 824.9 MB…

docker pullは多少時間がかかる操作なので、今回は 3分クッキング的に

あらかじめ docker pullしておいた AMIを使っています。

すでに pull済みの Dockerイメージの一覧が表示されます。

Dockerコンテナは、このイメージをもとに起動することになります。

Page 16: JAWS-UG コンテナ支部 Docker入門 ハンズオン

2. docker images, ps(イメージ、コンテナの一覧取得)

・docker ps

[email protected]$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESe54b78e56bf7 pottava/docker-webui:latest "/go/bin/docker-webui" 2 seconds ago Up Less than a second 0.0.0.0:9000->9000/tcp monit

起動中の Dockerコンテナがひとつ確認できます。

実はこれ、 EC2起動時の UserDataで起動しておいたものです。

ブラウザで

http://ec2.public.ip.address:9000/ を開くと、この起動しているコンテナにアクセスできます。

Page 17: JAWS-UG コンテナ支部 Docker入門 ハンズオン

Dockerコンテナの IDと名前について

さきほどの psではこんな結果がでていました。

[email protected]$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESe54b78e56bf7 pottava/docker-webui:latest "/go/bin/docker-webui" 2 seconds ago Up Less than a second 0.0.0.0:9000->9000/tcp monit

CONTAINER ID列にあるのが ID、NAMES列にあるのが名前です。

Dockerコンテナを操作する場合、このどちらかを指定します。

・docker inspect monit ・docker rm e54

IDの長さは 64文字ですが、コンテナを特定するのに十分な長さがあれば

動作するので、上の例のように 3文字で動いたりもします。

Page 18: JAWS-UG コンテナ支部 Docker入門 ハンズオン

中丸 良3. docker run(コンテナの起動)

Page 19: JAWS-UG コンテナ支部 Docker入門 ハンズオン

3. docker run(コンテナの起動)

・docker run

[email protected]$ docker run java:8 java -versionopenjdk version "1.8.0_66-internal"OpenJDK Runtime Environment (build 1.8.0_66-internal-b01)OpenJDK 64-Bit Server VM (build 25.66-b01, mixed mode)

docker runに続く部分の解釈、難しい。私も未だによく間違えます。

上の例で言うと

・ java:8がコンテナのベースとなる Dockerイメージの指定

・ java -versionがコンテナの中で実行したいコマンド

です。

Page 20: JAWS-UG コンテナ支部 Docker入門 ハンズオン

docker run、感動…しました!?

さて実際に docker runしてみましたが、感動できましたか?

ついいましがた Javaのコマンドを実行しましたが

EC2インスタンスには、 Javaはインストールしていません。

ホストを汚さずに、あらゆるアプリを動かせるのが Dockerです。

例えばこんなことも。

[email protected]$ docker run java:7 java -versionjava version "1.7.0_79"OpenJDK Runtime Environment (IcedTea 2.5.6) (7u79-2.5.6-1~deb8u1)OpenJDK 64-Bit Server VM (build 24.79-b02, mixed mode)

同じ EC2インスタンス上で、簡単に Java8と Java7が使えましたね!

あとでやりますが、 MySQL 5.5と 5.6の同時起動なども簡単です。

Page 21: JAWS-UG コンテナ支部 Docker入門 ハンズオン

中丸 良4. docker run -d(デーモンコンテナの起動)

Page 22: JAWS-UG コンテナ支部 Docker入門 ハンズオン

4. docker run -d(デーモンコンテナの起動)

・docker run -d

[email protected]$ docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 3; done"9751c76b88f52a8bdd514494a13dcc9a5815fb294680f202479be871538ae07a

-d オプション をつけて起動したコンテナは、プログラムが終了しない限り

バックグラウンドプロセスとして動き続ける、デーモンになります。

上の例では、3秒おきに標準出力へ「hello world」を出し続けます。

(ubuntu:14.04 という Dockerイメージをベースに  /bin/sh -c “while true; do echo hello world; sleep 3; done” を実行しています)

1行だけ応答がありますが、これは Dockerコンテナの IDです。

この IDか名前を使えば、デーモンを開始したり停止したりできます!(後述)

Page 23: JAWS-UG コンテナ支部 Docker入門 ハンズオン

いくつか docker runしてみる

docker imagesで返ってくるリポジトリ名のどれかを

DockerHub ( https://hub.docker.com/ ) で検索してみましょう。

例えば MariaDB ( https://hub.docker.com/_/mariadb/ ) 、

チュートリアルに従って docker runしてみます。

[email protected]$ docker run -d -e MYSQL_ROOT_PASSWORD=p4ssw0rd -p 3306:3306 mariadb:10dcb9ca3cf5b364a9f110d4bc19e503d8b346cf01f4a8f3024fcc77a8dad6b9a9

EC2の Public IPアドレスと↑で解放したポートを指定したら

ローカルの Macから MariaDBにちゃんと繋がりました。

Page 24: JAWS-UG コンテナ支部 Docker入門 ハンズオン

中丸 良5. docker logs(コンテナのログを確認する)

Page 25: JAWS-UG コンテナ支部 Docker入門 ハンズオン

5. docker logs(コンテナのログを確認する)

・docker logs

[email protected]$ docker logs monitDEBUG: 2015/10/30 03:20:08 docker.go:58: Docker container ID: e54b78e56bf7620c4fec9730f3602518c90f11c8d7a3be3d4d30dcf1316a71f0DEBUG: 2015/10/30 03:20:08 main.go:19: [config] Name: docker web-ui, Port: 9000, ViewOnly: false, LogLevel: 99, LabelOverrideNames: , LabelFilters: [all], DockerEndpoints: [unix:///var/run/docker.sock], DockerCertPath: [], DockerPullBeginTimeout: 3m0s, DockerPullTimeout: 2h0m0s, DockerStatTimeout: 5s, DockerStartTimeout: 10s, DockerStopTimeout: 10s, DockerRestartTimeout: 10s, DockerKillTimeout: 10s, DockerRmTimeout: 5m0s, DockerCommitTimeout: 30s, StaticFileHost: , StaticFilePath: /go/src/github.com/pottava/docker-webui/app, PreventSelfStop: true, HiddenContainers: []INFO: 2015/10/30 03:20:08 main.go:26: [service] listening on port 9000

コンテナが標準出力(& エラー)に出したログを確認することができます。

出力される内容はコンテナ上で動かすアプリケーション次第なのですが

何か問題があったときは、ここで有益な情報が得られる・・はずです。

Page 26: JAWS-UG コンテナ支部 Docker入門 ハンズオン

中丸 良6. docker start, stop, restart(コンテナの開始・停止)

Page 27: JAWS-UG コンテナ支部 Docker入門 ハンズオン

6. docker start, stop, restart(コンテナの開始・停止)

・docker stop

[email protected]$ docker stop monitmonit

ブラウザで先ほど繋がった

http://ec2.public.ip.address:9000/ が、いまは繋がらないはずです。

docker ps -aコマンドを実行すると、monitの STATUSが exitになっています。 ( aオプションをつけると停止したコンテナもすべて表示されます)

[email protected]$ docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES2bd96a54e743 mariadb:10 "/docker-entrypoint.s" 24 seconds ago Up 24 seconds 0.0.0.0:3306->3306/tcp determined_sammetd430c980a497 java:8 "java -version" 18 minutes ago Exited (0) 1 seconds ago hungry_ardinghellie54b78e56bf7 pottava/docker-webui:latest "/go/bin/docker-webui" 2 hours ago Exited (2) 3 minutes ago monit

Page 28: JAWS-UG コンテナ支部 Docker入門 ハンズオン

6. docker start, stop, restart(コンテナの開始・停止)

・docker start

[email protected]$ docker start monitmonit

ブラウザで

http://ec2.public.ip.address:9000/ を確認すると、また繋がるようになっています。

[email protected]$ docker restart monitmonit

コンテナ内の状態を初期化したいとき、最初から処理をやり直したいときなど

コンテナを再起動したいときは docker restartを使うと便利です。

・docker restart

Page 29: JAWS-UG コンテナ支部 Docker入門 ハンズオン

中丸 良7. MySQLを複数立ち上げて繋いでみる

Page 30: JAWS-UG コンテナ支部 Docker入門 ハンズオン

その前に、掃除します

t2.microさんは非力なので、動いているコンテナをいったん破棄します。

[email protected]$ docker stop $(docker ps -aq)[email protected]$ docker rm $(docker ps -aq)2bd96a54e743d430c980a497e54b78e56bf79

Page 31: JAWS-UG コンテナ支部 Docker入門 ハンズオン

7. MySQLを複数立ち上げて繋いでみる

MySQLの 2つのバージョンを同時に立ち上げてみましょう

[email protected]$ docker run -d --name mysql56 -e MYSQL_ROOT_PASSWORD=pw mysql:5.6ae3213df03304410414bfce05c965a950a54bc338d1c5806eec759c6f249e7c5core@[email protected]$ docker run -d --name mysql57 -e MYSQL_ROOT_PASSWORD=pw mysql:5.774c1877942714f96727c1cbcee9eb2ff142b8fc323e2a887c46bc1645601b3d6

[email protected]$ docker logs -f mysql57Initializing database2015-10-30T05:44:19.594993Z 0 [Warning] InnoDB: New log files created, LSN=45790…2015-10-30T05:44:31.922457Z 0 [Note] mysqld: ready for connections.Version: '5.7.9' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL)

docker logsコマンドで、DBが起動完了するのを見守ります。

“ready for connections.” の文字が見えたら、 Ctrl+Cで

ログの監視をやめます。

Page 32: JAWS-UG コンテナ支部 Docker入門 ハンズオン

7. MySQLを複数立ち上げて繋いでみる

MySQL 5.6に接続して、様子をみてみましょう。

[email protected]$ docker run -it --rm --link mysql56:mysql mysql:5.6 sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'Warning: Using a password on the command line interface can be insecure.Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 1Server version: 5.6.27 MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

繋がりましたね!もちろんここで、 SQLも実行できます。 ( Ctrl+Dで MySQLとの接続を切断できます)

mysql> show databases; mysql> select host, user, password from mysql.user;

Page 33: JAWS-UG コンテナ支部 Docker入門 ハンズオン

7. MySQLを複数立ち上げて繋いでみる

MySQL 5.7に接続してみましょう。

[email protected]$ docker run -it --rm --link mysql57:mysql mysql:5.7 sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'Warning: Using a password on the command line interface can be insecure.Your MySQL connection id is 2Server version: 5.7.9 MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

繋がりましたね!

このコマンドにあるように、 Webアプリケーションコンテナなどから 起動した MySQLに接続するには、 linkオプション + 環境変数、 または pオプションを利用することになります。

Page 34: JAWS-UG コンテナ支部 Docker入門 ハンズオン

中丸 良8. 後片付け

Page 35: JAWS-UG コンテナ支部 Docker入門 ハンズオン

8. 後片付け

CloudFormationコンソールを開きます

https://console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks

今回ハンズオンで使ったスタックを選択し「 Delete Stack」しましょう

Page 36: JAWS-UG コンテナ支部 Docker入門 ハンズオン

・「Docker Quickstart Terminalから Remote API経由で操作」した方

環境変数をもとにもどしましょう

8. 後片付け

your-host:~ $ unset DOCKER_HOSTyour-host:~ $ unset DOCKER_TLS_VERIFYyour-host:~ $ unset DOCKER_CERT_PATHyour-host:~ $your-host:~ $ env | grep DOCKERyour-host:~ $your-host:~ $ docker infoGet http:///var/run/docker.sock/v1.20/info: dial unix /var/run/docker.sock: no such file or directory.* Are you trying to connect to a TLS-enabled daemon without TLS?* Is your docker daemon up and running?

Page 37: JAWS-UG コンテナ支部 Docker入門 ハンズオン

中丸 良9. Appendix

Page 38: JAWS-UG コンテナ支部 Docker入門 ハンズオン

CLI専門支部との合同ハンズオンを企画中です。

12月ごろ開催します!!

ECS-CLIハンズオン

Page 39: JAWS-UG コンテナ支部 Docker入門 ハンズオン

Docker社の Jérôme Petazzoniさんが re:Invent2015で行った

“From Local Docker Development to Production Deployment” というセッション

http://goo.gl/ONXuTp

とてもいい資料だったので翻訳してあります。ぜひご覧ください。

http://goo.gl/hEvscs

• 開発環境のための Docker Compose

• その環境を本番稼動させるまでの話

- Dockerクラスタのプロビジョニング

- コンテナイメージのビルドとそのデプロイ

- サービスディスカバリ

• Docker Compose, Machine, Swarm, ECS

Dockerを使ったローカルでの開発から本番環境へのデプロイまで

Page 40: JAWS-UG コンテナ支部 Docker入門 ハンズオン

Thank����������� ������������������  you����������� ������������������  !!