Dockerを触ってみよう ～初心者向けDockerハンズオン～　Ver20170118

これは2017年1月18日での「Dockerを触ってみよう ～初心者向けDockerハンズオン～」の補助資料です。

# 1.「さくらのクラウド」上でサーバを立てる。
- 「さくらのクラウド」のサーバを作成する。
- CentOS 7を利用する。
- Windowsの人はPuttyやTeratermを利用する。
    - Macの人は、ターミナルを利用する
    - ssh root@IPアドレスでログイン可能。

# 2. CentOS7でDockerをインストールする。
 パッケージ情報を最新にする。
    `yum -y update`

docker-engine パッケージをセットアップします。
    `curl -fsSL https://get.docker.com/ | sh`

サービスを有効します。
    `systemctl enable docker.service`

docker デーモンを起動します
    `systemctl start docker`

インストールしたらバージョンの確認
    `docker version`

#3. コンテナを起動する「Docker run」

まずは「hello-world」を起動する。
    `docker run hello-world`


Ubuntuコンテナを起動しUbuntuを操作する。
    `docker run -it ubuntu bash`

Ubuntuのバージョンを確認いたします。
    `cat /etc/issue`


## 3.1 起動したubuntuにcurlを利用できるようにする

まずはUbuntuのアップデートを行う。
    `apt-get -y update`
    `apt-get -y install curl`
    `curl ifconfig.me/ip`

exitで、コンテナから出られる。
    `exit`

再度コンテナを動かしてみる。
    `docker run -it ubuntu bash`

再びIPアドレスを入れようとしても動かない
    `curl ifconfig.me/ip`

# 4. バックグランド（デタッチドモード）でコンテナを動かす

今の時刻を毎秒表示するコンテナを起動する
    `docker run jpetazzo/clock`

バックグランド（デダッチドモード）でコンテナを動かす
    `docker run -d jpetazzo/clock`


# 5. 基礎的なDockerコマンド

## 6. docker psでコンテナの確認
    docker ps

docker ps -aで今まで起動したコンテナを確認
    `docker ps -a`

「docker ps -l」で直近に操作したコンテナを表示し「docker ps -q」でコンテナのショートIDが表示される。
    `docker ps -l`
    `docker ps -q`

## 6.1 docker logsでコンテナのログを確認する

先ほどバックグランドで動かしたコンテナのログを見る。ここでは
    `docker logs（コンテナのID）`

ログの指定された数行だけを見る
    `docker logs --tail 3 (コンテナのID)`

リアルタイムでログを確認する。
    `docker logs --tail 1 --follow (コンテナのID)`

## 6.2 docker kill、docker stopでコンテナを止める

デタッチモードで起動したサーバを停止させるには下記のコマンドでとめる。
    `docker kill (コンテナのID)`
    `docker stop (コンテナのID)`

## 6.3 停止したコンテナを確認する。

「docker ps」で先ほど止めたコンテナがないか確認
    `docker ps`

「docker ps -a」で先ほど止めたコンテナを確認する。
    `docker ps -a`

#7. Docker上でGhostをインストールする

ここでは簡易ブログツール「Ghost」をDockerを利用してインストールしてみます。
    `docker run  -p 80:2368 -d ghost`

ブラウザに作成したサーバのIPアドレスを入力してアクセスができるか確認し、アクセスができるようであれば、コンテナを止める。
    `docker kill (コンテナのID)`


#8. nginxコンテナを立ち上げてページを編集する。


##8.1 nginxを起動
下記コマンドでnginxを起動
    `docker run -itd -p 80:80 nginx:latest`

起動後にブラウザからIPアドレスを入力してnginxの画面を表示し、正常にnginxが起動しているか確認をする。

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

docker psでnginxのコンテナIDを確認
    `docker ps`

docker exec コマンドで bash の追加プロセスを実行。
    `docker exec -it $(docker ps -ql) /bin/bash`

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

Nginx のドキュメント・ルートにある index.html を書き換えます。
    `echo 'hello world' > /usr/share/nginx/html/index.html`
    `cat /usr/share/nginx/html/index.html`


ブラウザで表示を確認します。ブラウザの再読み込みボタンを押すと、画面にhello worldが表示されます。（うまく表示できない場合は「Shift」キーを押しながら再読み込みボタン）

bashを終了する
    `exit`

##8.3 Nginx イメージの作成

docker commit コマンドで mynginx:1.0 イメージを作成します。
    `docker commit $(docker ps -ql) mynginx:1.0`

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

作成した mynginx:1.0 イメージを使って、新しいコンテナを実行します。
    `docker run -d -p 8080:80 mynginx:1.0`

curl コマンドで、コマンドライン上でポート 8080 を開きます。
    `curl http://localhost:8080`


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

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

　コンテナを停止するため docker kill コマンドを実行します。
    `docker kill $(docker ps -q)`

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

　docker rm コマンドでコンテナ（コンテナ用のイメージ・レイヤとメタ情報）を削除します。
    `docker rm $(docker ps -aq)`
    `docker ps -a`

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

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

　次のコマンドを実行し、 Dockerfile を作成します。
    `
tee ./Dockerfile <<-'EOF'
FROM nginx:latest
RUN  echo "hello world<br />$(date)" > /usr/share/nginx/html/index.html
EOF`

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

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


作成した mynginx:1.1 イメージを使って、新しいコンテナを実行します。
    `docker run -d -p 8888:80 mynginx:1.1`

curl コマンドで、コマンドライン上でポート 8888 を開きます。
    `curl http://localhost:8888`


#10 Docker Hub にログイン
##10.1 アカウント作成

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

##10.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

#11 Docker イメージの登録と公開
##11.1 イメージをタグ付け

　docker tags コマンドで mynginx:1.1 イメージに Docker Hub ID の情報を付けます。
    `docker tag mynginx:1.1 <自分のID名>/mynginx:1.1`


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

##11.2 docker push でイメージ送信。

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

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

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



##11.3 不要なイメージの削除

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

    `docker images -q`

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

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

##11.4 Arukas にログイン

https://app.arukas.io/


##11.5 Arukas で実行

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

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

#17 おまけ

##17.1 DockerでWordPressを動かす

WordPressのイメージを持ってくる
    `docker run wordpress`

MySQLのイメージを持ってくる。
    `docker pull mysql`

MySQLの設定
    `docker run --name mysql -e MYSQL_ROOT_PASSWORD=(パスワード) -d mysql`

WordPressを動かす
    `docker run --name wordpress2 -d --link mysql:mysql -p 80:80 wordpress`

##17.2 Docker composeでロケットチャットを動かす

Docker composeでRocket.Chatを動かす
下記2つのコマンドでDocker composeをインストール
    `curl -L https://github.com/docker/compose/releases/download/1.6.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose`

    chmod +x /usr/local/bin/docker-compose
   

上記のコマンドでyamlをこのページから取ってくる。
    `git clone https://github.com/zembutsu/sakura-cloud-hands-on.git`

作成されたフォルダに移動する。
    `cd sakura-cloud-hands-on/rocketchat`

Rocket.Chatに必要なファイルを取ってくる
    `docker-compose pull`

下記コマンドでRocket.Chatを動かす
    `docker-compose up -d`