jaws-ug コンテナ支部 docker入門 ハンズオン
TRANSCRIPT
Docker ハンズオン JAWS-UG コンテナ支部
Docker入門 #02
@pottava (AWS Certified) SA, DevOps Engineer Pro Love: S3, CloudFront and Containers
中丸 良
ハンズオン
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
中丸 良1. 準備
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
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のはず)
EC2インスタンスって必要?
本来、Dockerの操作には不要です。
今日は DRECOMさんの会場をお貸しいただいていますが
みんなで一斉に自分の端末に直接 docker pullで
Dockerイメージを引っ張ってくると
会場のネットワークに負荷がかかるため、
実際の Docker操作をクラウド上で実施する形式にしています。
そのため、今日のハンズオンはちょっとだけ複雑な構成ですが
あとで自宅やオフィスで Dockerで遊ぶなら、もっとずっと簡単です。
特に、先ほどインストールしていただいた Docker ToolBoxは便利!
Docker ToolBoxってなに
道具箱というだけあって、 Docker操作に必要なツール集が入っており
大きく分けると次の 2つがインストールされます。
・ Docker Quickstart Terminal
・ Kitematic
Docker Quickstart Terminalはいわゆる黒い画面で、起動すると
・ dockerクライアント(docker psとか docker runとかに使う)
・ docker-machine
・ docker-compose
あたりが使えます。
Docker ToolBoxってなに
今日は諸事情で使えませんが、黒い画面が 嫌な 不慣れな方、
ぜひ Kitematicというツールを起動してみてください。
Docker ToolBoxってなに
ToolBoxは端末上の VirtualBoxという仮想環境の中にサーバーを起動し、
そこで動く Dockerデーモンと Docker Remote APIで通信しています。
(なので、 ToolBoxのツールを通して起動した Dockerコンテナは
みなさんの Windowsや Mac直下ではなく、その中の
仮想サーバーの中で動いています)
Docker Remote API
今日の構成
EC2を使うため、今日はこうなります。
・ SSH接続ができる方はサーバの中で直接 Dockerを操作
・もしくは自端末の Docker Quickstart Terminalから Remote API経由で操作
SSH & docker API or
Docker Remote API
EC2インスタンス一覧から起動した EC2インスタンスを探し、
Public IPアドレスをコピー(Ctrl+C)します。
https://goo.gl/CjfB94
1. 準備(あと一歩)
・ 「サーバの中で直接 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]$
中丸 良2. docker images, ps(イメージ、コンテナの一覧取得)
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コンテナは、このイメージをもとに起動することになります。
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/ を開くと、この起動しているコンテナにアクセスできます。
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文字で動いたりもします。
中丸 良3. docker run(コンテナの起動)
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がコンテナの中で実行したいコマンド
です。
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の同時起動なども簡単です。
中丸 良4. docker run -d(デーモンコンテナの起動)
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か名前を使えば、デーモンを開始したり停止したりできます!(後述)
いくつか 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にちゃんと繋がりました。
中丸 良5. docker logs(コンテナのログを確認する)
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
コンテナが標準出力(& エラー)に出したログを確認することができます。
出力される内容はコンテナ上で動かすアプリケーション次第なのですが
何か問題があったときは、ここで有益な情報が得られる・・はずです。
中丸 良6. docker start, stop, restart(コンテナの開始・停止)
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
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
中丸 良7. MySQLを複数立ち上げて繋いでみる
その前に、掃除します
t2.microさんは非力なので、動いているコンテナをいったん破棄します。
[email protected]$ docker stop $(docker ps -aq)[email protected]$ docker rm $(docker ps -aq)2bd96a54e743d430c980a497e54b78e56bf79
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で
ログの監視をやめます。
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;
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オプションを利用することになります。
中丸 良8. 後片付け
8. 後片付け
CloudFormationコンソールを開きます
https://console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks
今回ハンズオンで使ったスタックを選択し「 Delete Stack」しましょう
・「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?
中丸 良9. Appendix
CLI専門支部との合同ハンズオンを企画中です。
12月ごろ開催します!!
ECS-CLIハンズオン
✖
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を使ったローカルでの開発から本番環境へのデプロイまで
Thank����������� ������������������ you����������� ������������������ !!