さくらとコンテナの夕べ(第1回) Docker/Arukas入門ハンズオン資料

# 概要

Nginx コンテナの作成・実行と、Docker Hub へのアップロード、Arukas へのデプロイを通し、Dockerコンテナのライフサイクルを理解します。

* イベント情報　https://sakura-kanto.doorkeeper.jp/events/52770

* ハンズオン用の解説スライド http://www.slideshare.net/zembutsu/docker-hands-on-training-sakura-container-evening


以下ハンズオンでは「さくらのクラウド」を利用していますが、CentOS 7 をご利用可能な環境であれば、どこでもお試しいただけます。

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

## 1.1. ブラウザでコントロールパネルを表示

https://secure.sakura.ad.jp/cloud/  


## 1.2  接続情報を確認

配付資料に含まれるログイン情報を入力し、ログインします。

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

## 2.1 さくらのクラウドで仮想サーバを起動

　1. 【 さくらのクラウド(IaaS 】をクリックします。
　2. メニュー【 サーバ 】から【 追加 】をクリックします。
　3. ディスクイメージは【 CentOS 7.2 64bit 】を使います。
　4. 「サーバプラン」と「ディスクプラン」を選択します（※今回は変更しません）。
　5. 【 管理ユーザのパスワード 】で root パスワードを設定します。８文字以上の「アルファベット」「数字」「記号」の組み合わせが必要です。
　6. ホスト名を【 docker 】、作成数【 1 】として【 作成 】ボタンをクリックします。
　7. 確認画面では【 作成 】をクリックします。
　8. サーバ追加作業が完了するまで待ちます。起動後は【 閉じる 】をクリックします。
　9. メニューの【 サーバ 】をクリックし、作成したサーバ「 docker 」を確認します。

## 2.2. 仮想サーバへ接続

　1. IP アドレスを確認します。インターフェースを右クリックし【 IP アドレスをコピー 】します。
　2. Tera Term やターミナルなどを開き、対象サーバに SSH でログインします。
 - ログイン時のIDは「root」、パスワードは作成時に入力したもの
 - ターミナルでは「ssh -l root <IPアドレス>」か「ssh root@<IPアドレス>」
```
ssh -l root <IP_addr>
```

# 3. Docker Engine のセットアップ

## 3.1 安定版(stable)の最新バイナリをセットアップ

　1. パッケージ情報を最新に更新します。

```
yum -y update
```

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

```
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
```

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

```
yum -y install docker-engine
```


## 3.2. docker サービスの有効化とデーモン起動。

　1. サービスを有効化します。

```
systemctl enable docker.service
```

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

```
systemctl start docker.service
```

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

```
docker version
```

### 補足情報

もっと簡単なセットアップ用コマンド

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

Docker の削除

```
yum -y remove docker-engine
rm -rf /var/lib/docker
```

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

## 4.1. hello-world コンテナの実行とイメージ確認

　1. `docker run` コマンドでコンテナを実行します。

```
docker run hello-world
```

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

```
docker ps -a
```

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

```
docker images
```

## 4.2. Ubuntu コンテナの実行

　1. `docker pull` コマンドで ubuntu 公式イメージを取得します。
　2. ダウンロードしたイメージを `docker images` で確認します。

```
docker images
```

　3. `ubuntu` コンテナを実行します。

```
docker run -i -t ubuntu:latest /bin/bash
```

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

```
cat /etc/issue
```

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

```
ps -ef
```

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

```
exit
```

# 5. Nginx イメージを作成

## 5.1 Nginx コンテナを実行

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

```
docker run -itd -p 80:80 nginx:latest
```

　2. ブラウザの URL に仮想サーバの IP アドレスを入力します。nginx の初期ページが表示されます。

## 5.2 nginx コンテナ上にページを作成

　1. `docker ps` で Nginx コンテナのコンテナ ID（CONTAINER ID）を確認します。

```
docker ps
```

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

```
docker exec -it $(docker ps -ql) /bin/bash
```

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

```
ps -ef
```

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

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

　5. ブラウザで表示を確認します。「Shift」キーを押しながら再読み込みボタンを押すと、画面に `hello world` が表示されます。
　6. bash を終了します。

```
exit
```

## 5.3. Nginx イメージの作成

　1. `docker commit` コマンドで `mynginx:1.0` イメージを作成します。

```
docker commit $(docker ps -ql) mynginx:1.0
```

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

```
docker images
```

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

```
docker run -d -p 8080:80 mynginx:1.0
```

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

```
curl http://localhost:8080
```

## 5.4 Dockerfile でイメージの自動構築

　1. 作業用ディレクトリ `mynginx` を作成し、移動します。

```
mkdir mynginx
cd mynginx
```

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

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

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

```
docker build -t mynginx:1.1 .
```

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

```
docker images
```

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

```
docker run -d -p 8888:80 mynginx:1.1
```

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

```
curl http://localhost:8888
```

## 5.3 コンテナの停止と削除

　1. `docker ps` でコンテナの状態を確認します。

```
docker ps
```

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

```
docker kill $(docker ps -q)
```

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

```
docker ps
docker ps -a
```

　4. `docker rm` こコマンドでコンテナ（コンテナ用のイメージ・レイヤとメタ情報）を削除します。

```
docker rm $(docker ps -aq)
docker ps -a
```

# 6. Docker Hub にログイン

## 6.1 アカウント作成

https://hub.docker.com/ から登録し、ログインします。

## 6.2 サーバから Docker Hub にログイン

`docker login` コマンドを実行します。

```
# 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
```

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

## 7.1. イメージをタグ付け

　1. `docker tags` コマンドで `mynginx:1.1` イメージに Docker Hub ID の情報を付けます。

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

　2. `docker images` で確認します。

```
docker images
```

## 7.2. docker push でイメージ送信。

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

```
docker push <自分のID名/mynginx:1.1>
```

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

## 7.3. 不要なイメージの削除

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

```
docker images -q
```

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

```
docker rmi -f $(docker images -aq)
```


# 8. Arukas にログイン

https://app.arukas.io/

# 9. Arukas で実行

1. `アプリ作成` ボタンをクリック。
2. アプリ作成に必要な各種情報を入力。
* App Name … `myapp`
* Image … `<DockerHubId>/mynginx:1.1` ← `1.1` のタグを忘れずに
* Port … `80`
3. `アプリケーションを作成` ボタンをクリック。
4. 画面が切り替わり、一覧に `myapp` が表示されます。
5. アプリの `起動` ボタンをクリック
6. 起動確認で `OK` をクリックし、 アプリが起動するまで待ちます。
7. 起動（緑色に変化）したら、 `Endpoint`  の URL を開きます。


以上です。おつかれさまでした！