[Dev101]#1 Play with Docker

# AGENDA
0. はじめに
1. Docker Hub
2. hello-world
3. ubuntu
4. nginx


# 0. はじめに
本記事は以下の記事を社内勉強会で使うための手順です。
[Docker 入門にはインストールなしで使える「Play with Docker」がいいと思う](https://qiita.com/tag1216/items/ec7228440f6eaf849cd6)

元記事作者の方に感謝します！

そもそも「コンテナって何？Dockerって何？」という方は適当にググって以下記事などを参照しましょう。
[コレ1枚で分かる「仮想マシンとコンテナの違い」](http://www.itmedia.co.jp/enterprise/articles/1612/19/news041.html)
![10.jpg](https://qiita-image-store.s3.amazonaws.com/0/79389/ef02b5ac-74d5-7119-ea31-9ad3bf5c3fe4.jpeg)

[超入門Docker：第1回　Dockerとは](http://www.atmarkit.co.jp/ait/articles/1701/30/news037.html)
![008.png](https://qiita-image-store.s3.amazonaws.com/0/79389/c0efc510-a6d8-fb79-0394-3e522bbc2e85.png)

[DockerとDocker Hubの操作と概念](https://www.slideshare.net/zembutsu/docker-container-image-command-introduction-2017-03)
![009.png](https://qiita-image-store.s3.amazonaws.com/0/79389/b769670f-7c17-0007-96d5-8a2b021e79c0.png)

# 1. Docker Hub

##(1) まずはDocker ID(Docker Hub Account)取得
Docker ID持ってない方は、以下から登録してください。持っている方は自分のIDでOKです。
https://hub.docker.com/

##(2) Docker Hubって何？

Docker IDでDocker Hubにサインインして眺めてみましょう。

Private Repository１ケは無償で使えますがしっかり使う場合は有償です
https://hub.docker.com/account/billing-plans/

最初は各種Official Imageを取ってくるのに使いましょう(左上のSearchから検索)。
https://hub.docker.com/explore/

ちなみに、大手Public CloudにもDocker Hubと同じようなレポジトリサービスが用意されています。
[AWS、Azure、GCPのコンテナレジストリを比較　Docker Hubとの違いは？](http://techtarget.itmedia.co.jp/tt/news/1812/11/news08.html)

# 2. hello-world

##(1)Play with Docker

まずはDocker IDでログインしてインスタンス起動してください。
https://labs.play-with-docker.com/

黒い画面が出てきましたか？

1回4Hまでですが、何度でも自分専用のDocker環境を使用できます。
我が家はADSLなので、自前PCのDocker環境使うよりブラウザでPlay with Docker環境使った方が、Image fetchがよっぽど高速で快適です。ただ4時間で消えちゃいますが:sweat:

・ちょっと環境を確認しておきましょう。

```shell:環境確認
cat /etc/os-release
uname -r
```
![000.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/dd77e682-53c7-fa62-72d7-02dfad617dbd.png)


Play with Dockerは、Linux Kernel 4.4.0-96-generic上のAlpine LinuxというLinux Distribution画面を提供してくれていることが分かります。

##(2) Hello World!
新しいプログラム言語を勉強する際、最初に "Hello World!"って表示する簡単なプログラムを書くことが多いです。

ちょっと横道にそれますが、プログラム経験のない方はここでプログラマーデビューしちゃいましょう！
以下の画面を見ながら写経してみて下さい(コピペしたい方は、Play with Dockerの黒い画面へのPasteはマウス右クリックで）。

```shell:test.sh作成
cat << EOF > test.sh
echo "Hello World!"
EOF
chmod +x test.sh
```

![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/e4d17cc4-5c9e-2afd-c0bc-86ea3f9ee842.png)

test.shは"Hello World!"を表示するシェルプログラムです:smile:

##(3)hello-world

さて、プログラム言語ではないですが、Docker Hubにも"hello-world"が用意されています。Dockerの最初の一歩としてこれを実行してみましょう。
https://hub.docker.com/_/hello-world/

・最初の確認
まずは以下を入力して何もないことを確認しましょう（表示は一部のみ）。

```shell:確認コマンド
docker images
docker ps
docker ps -a
```
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/4e513adc-eb54-a6c5-f7a6-5e98c4f3e9a9.png)

・hello-world実行

```shell:実行コマンド
docker run hello-world
```
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/b92060e7-8ed2-1f35-f21c-54aa29135ada.png)

hello-worldコンテナは実行すると"Hello from Docker!"で始まるメッセージを出力して終了するコンテナです。

・ローカルにコンテナイメージがあること、終了したコンテナがあることの確認
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/83a49be1-a629-3c04-a252-21d11334958f.png)

・もう一度hello-world実行（今回はimage pullしないことの確認)
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/b12203c0-cf5d-42ef-a96b-5ec03164ca6a.png)


・もう一度確認（終了したコンテナが２つあることの確認）
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/3a060a0c-5644-a235-13b2-f700af8d281a.png)

・終了したコンテナ表示がウザイのでコンテナを消しておきましょう。

```shell:コンテナ削除
docker rm コンテナID
```


# 3. ubuntu

##(1)ubuntuって何？

Redhat Linux(RHEL)やCentOSなどと同様のLinux Distributionです。
[Linuxディストリビューション - Wikipedia](https://ja.wikipedia.org/wiki/Linux%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)
[Download Ubuntu Server](https://www.ubuntu.com/download/server)

##(2)ubuntu

Docker HubにもメジャーなLinux DistributionがOfficial Imageとして用意されています。
https://hub.docker.com/_/ubuntu/

・今回は行きなり`docker run`ではなく、Docker image取得 → 実行と分けて実行してみましょう。

```shell:image取得
docker pull ubuntu
```
![010.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/aba1601c-1d1d-87db-a0c4-cbef044ba272.png)


・また確認してみましょう（コンテナは作成されずimageだけ追加されてます）。

```shell:確認コマンド
docker images
docker ps
docker ps -a
```

![011.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/2cd660b6-02a9-71ce-66ef-9f3bc0cc7bee.png)


・hello-worldコンテナは実行するとメッセージを出力して終了するコンテナでしたが、今回はLinux Distributionのコンテナなので、起動後に対話型でshellを動作させてみます。

```shell:実行コマンド
docker run -it ubuntu bash
```
![012.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/72ffcdc2-f980-bfa3-15f2-1a6f10604774.png)

カーソルの前の「コマンドプロンプト」表示が変わった事に気づきましたか？
元々のコマンドプロンプトは`[node1]local root@192.168.0.52 ~`でしたが、これが`root@d2f4d97df0d0:/#`に変わっています。
元々のAlpine Linux環境から、Ubuntuコンテナ環境に入っていますね（コンテナの中ですよ）！


・Ubuntuコンテナの環境を確認してみましょう。

```shell:環境確認
cat /etc/os-release
uname -r
```
![013.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/7c202c58-fe26-a958-4ae0-8477c9b52b05.png)

ubuntuイメージを実行しているので当然Linux DistributionはUbuntuですが、何か気付きませんか？
はい、Linux Kernel Version(4.4.0-96-generic)がHOSTと一致しています。コンテナなので当然ですが:sweat:

・Ubuntuコンテナ上でも"Hello Ubuntu!"を表示するシェルプログラムを作成して実行してみましょう。

```shell:test.sh作成
cat << EOF > test.sh
echo "Hello Ubuntu!"
EOF
chmod +x test.sh
ls
./test.sh
```
![014.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/d9651e6c-c01d-e6d1-bcd2-35dacdfe8193.png)


・いったんexitでubuntuコンテナを抜けて、もう一度起動してみましょう。

```shell:実行コマンド
docker run -it ubuntu bash
ls
```
![015.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/ed4379fe-4808-2ca9-5beb-f8d0c2f05bdf.png)


あれっ？さっき作成したtest.shがありませんね。

・いったんexitでubuntuコンテナを抜けて確認コマンドで状況を見ましょう。

```shell:確認コマンド
docker images
docker ps
docker ps -a
```
![016.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/764cfec8-dfe0-009e-9c5e-2b3b81e6cb76.png)

2つのExit状態のコンテナがあります。そう、最初にtest.shを作成したコンテナと、次に起動したコンテナは同じimageを使っていますが、別コンテナなんです。

・最初にtest.shを作成したコンテナを再起動してみましょう。

```shell:実行コマンド
docker start -ia コンテナID
ls
./test.sh
```
![017.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/4d05cbe2-d593-9189-3319-22bc381b14a6.png)

以前作成したtest.shがありましたか？

・exitして`docker ps -a`で確認（コンテナは増えていない && Exitした時間確認）
![018.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/2e5e2adf-edfd-499a-697b-95ff8c2c6bb9.png)


# 4. nginx

##(1)Nginxってなんだ？

エンジンエックスって読みます:smile:

Apache httpdと同様なWebサーバの１つですが、機能豊富な（＝「重い」）Apache httpdに比べ、シンプルな機能で同時リクエストを高速処理できるよう設計されていて「軽い」のが特徴です。設定でLoad Balancerに使ったりすることもできます。
[Nginx - ウィキペディア](https://ja.wikipedia.org/wiki/Nginx)

英語が得意な人はこっちの方が分かりやすいかも。

*What is nginx?
Nginx (pronounced "engine-x") is an open source reverse proxy server for HTTP, HTTPS, SMTP, POP3, and IMAP protocols, as well as a load balancer, HTTP cache, and a web server (origin server). The nginx project started with a strong focus on high concurrency, high performance and low memory usage. It is licensed under the 2-clause BSD-like license and it runs on Linux, BSD variants, Mac OS X, Solaris, AIX, HP-UX, as well as on other *nix flavors. It also has a proof of concept port for Microsoft Windows.*

##(2)nginx

Docker HubにもnginxがOfficial Imageとして用意されています。
https://hub.docker.com/_/nginx/

・[元記事](https://qiita.com/tag1216/items/ec7228440f6eaf849cd6)に書いてあるコマンドを実行して、ブラウザで確認してみましょう。

```shell:実行コマンド
docker run -p 80:80 nginx
```
・実行前
![019.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/5f625c07-40d5-ed4e-3800-d2f35cad79a0.png)

・実行後
![020.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/89a68beb-6726-a5a2-fc12-a4267192c482.png)

・IPアドレス横の"80"をクリックしてブラウザ表示
![021.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/2a6a559e-f727-549a-bd59-94b3a4e88b55.png)


・"^C" (Control + C)を入力して nginxを停止して、状態確認します(nginxがExitしています)。

```shell:実行コマンド
docker ps -a
```

![022.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/7c02dd2f-df2f-4108-e824-ec23e0a523b9.png)

・今度はコンソール対話表示なしで停止中のnginxコンテナを再開します

```shell:実行コマンド
docker start コンテナID
```

![023.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/b7d741e2-4b61-36dd-80f5-53bc0502563e.png)

・このコンテナに接続してbashを実行してもらいます

```shell:実行コマンド
docker exec -it コンテナID bash
```

![024.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/59e0d7b7-fedd-5053-a71c-99abd5bcd702.png)

・このbash環境をつかってNginxの初期画面を書き換えてみましょう。

```shell:実行コマンド
cd /usr/share/nginx/html
ls
head index.html
```

![025.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/0ead3ca0-d3da-eeb5-3712-c51235ad1949.png)

ここに初期画面のindex.htmlがありました。

・元ファイルをrenameして、新しいindex.htmlを作ります

```shell:実行コマンド
mv index.html index.html.orig
cat << EOF > index.html
<H2>Hello from my nginx container!</H2>
EOF
ls
cat index.html
```

![026.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/f65bb828-5a1d-fb8f-c540-1c4b66d80149.png)

・nginxを再起動します

```shell:実行コマンド
nginx -s reload
```

![027.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/3b67143d-91a2-d7b2-766b-6d4a3d948ce9.png)

・Play with Dockerの"80"をクリックしてブラウザ表示します（キャッシュが聞いている場合があるので、その場合はページをリロードしてください）。
![028.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/bc1d9010-db38-1a84-a6c6-b246b5390b2f.png)

##(3)nginxのおまけ

開発時などはベースとなるコンテナイメージに色々修正を加えて自分のコンテナイメージを作る、という使い方をします。
以下説明は省略しますが、dockerコマンドの引数など調べて色々トライしてみて下さい。

![029.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/b513d25a-1a7a-44cb-c61b-817e3de74317.png)

![030.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/f785ef9a-ae71-e766-1d28-2be189ddd1d1.png)

![031.PNG](https://qiita-image-store.s3.amazonaws.com/0/79389/18d11a59-b90c-8f4f-303a-fd3f75d238c6.png)

Enjoy:metal: