Dockerの勉強会（ハンズオン）用のテキストをつくってみた - 基礎編

# はじめに

- 私は、そもそも勉強会というのもがあまり好きではありません。なので、参加はほとんどしたことがありません。
- また、人前で発表したりするのも苦手です。
- 拒否反応をいままで示していましたが、色々なきっかけで開催まで踏み切ってみたお話です。
- 発表内容や資料などは稚拙なものや誤りがあるかもしれません。ご了承ください。
- [前回の機械学習](https://qiita.com/neriai/items/87703c41f031cdc199f1)が終わったので、Dockerについて開催してみました。
- 第1回としては、簡単な導入や操作について行いました。

# アジェンダ

## 目的とゴール

Docker環境を導入して、仮想イメージを作ってみよう。

1. Dockerとは　※約10分
2. コンテナの作成と起動　※約10分
3. イメージの作成と保存　※10分
4. イメージをDocker Hubに保存する　※約10分
5. ホストマシンとコンテナ間のファイル共有　※約10分（時間があれば）
6. 演習:好きなソフトウェアを入れてみよう（特になければMySQL）　※約10分（時間があれば）

## 進め方

- ノートパソコンを用意してください。（64bitマシンが必要です）
- ペアプログラミングでもかまいません。用意が難しいけど参加してみたい場合は、相談ください。
- 事前にDockerをインストールしておいてください。
    - Windows: https://www.docker.com/docker-windows
    - Mac: https://www.docker.com/docker-mac
- 事前にDocker Hubのアカウントを取得しておいてください。
    - https://hub.docker.com/
- 特に前提知識はありません。アジェンダに添って事前に予習していただいてもかまいません。
- 開始も終了も時間厳守にします。あまりにも中途半端な場合は宿題 or 次回持越とします。

## 宿題

イメージとコンテナのインポートとエクスポートをやってみよう

# Dockerとは

https://www.slideshare.net/KeitaNeriai/docker-84331236

# Dockerのインストール

## Macの場合

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

## Windowsの場合

https://docs.docker.com/docker-for-windows/

# Dockerの起動

## プロキシの設定をする

Preferences > Proxies

## 起動する

start

# イメージの取得

## Docker Hubにログインする

```
docker login
```

## イメージ一覧を確認する

```
docker images
```

## CentOS 6を取得する

```
docker pull centos:6
```

## 取得したイメージを確認する

```
docker images
```

# コンテナの作成と起動

## 起動中のコンテナ一覧を確認する

```
docker ps
```

## コンテナの作成

※なお、イメージ取得も同時に行ってくれるためpullは省略可能

```
docker run -it centos:6
```

### OSのバージョンを確認する

```
cat /etc/redhat-release
```

# コンテナの起動と停止

## コンテナからログアウトする

cntl + Q か cntrl + P

## 起動中のコンテナIDを取得する

```
docker ps
```

## 起動中のコンテナにログインする

```
docker attach ｛コンテナID｝
```

```
docker exec ｛コンテナID｝ /bin/bash
```

## コンテナを停止する

```
exit
```

## コンテナの停止状態を確認する

```
docker ps
```

# コンテナの再起動

##　起動するコンテナIDを取得する

```
docker ps -a
```

## コンテナを起動する

```
docker start {コンテナID}
```

## コンテナを停止する

```
docker stop {コンテナID}
```

# すべてのコンテナの状態を削除する

```
docker rm `docker ps -a -q`
```

# イメージを削除する

```
docker rmi {イメージID}
```

# イメージの作成と保存

## プロキシの設定を追加する

```
export http_proxy="{URL}"
export https_proxy="{URL}"
export ftp_proxy="{URL}"
export no_proxy="localhost,127.0.0.1,172.17.0.0/16"
```

## yumのダウンロードのタイムアウト設定を変更する

```
echo "timeout=300" >> /etc/yum.conf
```

## Apacheをインストールする

```
yum install -y httpd
```

## Apacheのサーバ名を設定する

```
sed -i -e 's/\#ServerName www.example.com:80/ServerName example-web-server.example.com/g' /etc/httpd/conf/httpd.conf
```

## Apacheの起動テストをする

```
/etc/init.d/httpd configtest
```

## Apacheを起動する

```
/etc/init.d/httpd start
```

## 接続テスト用のHTMLを作成する

```
echo "docker test server" >> /var/www/html/index.html
```

## 起動確認をする

```
curl http://127.0.0.1/
```

## コンテナを停止する

```
exit
```

## 停止したコンテナIDを取得する

```
docker ps -a
```

## コンテナをイメージにコミットする

```
docker commit {コンテナID} {イメージ名(centos:6/httpd-test)}
```

# Apacheをブラウザから確認する

## ポートを指定してコンテナを起動する

```
docker run -i -t -p {アクセスポート:docker内部の起動ポート(10080:80)} {イメージ名(centos:6/httpd-test)} /bin/bash
```

## Apacheの起動状態を確認する

```
ps alx | grep httpd
```

## Apacheを起動する

```
/etc/init.d/httpd start
```

## ブラウザから確認する

```
http://localhost:10080
```

# イメージをDocker Hubに保存する

## イメージIDを取得する

```
docker images
```

## タグを作成する

```
docker tag {イメージID} {ユーザ名/イメージ名：タグ名(neriai/httpd-test:latest)}
```

## Docker Hubにプッシュする

```
docker push {ユーザ名/イメージ名：タグ名(neriai/httpd-test:latest)}
```

## プッシュされたことを確認する

```
https://hub.docker.com/
```

## 他の人のイメージを検索してみる

```
docker search {イメージ名(neriai)}
```

# ホストマシンとコンテナ間のファイル共有

## ホスト側のマウント先を確認する

Preferences > File Sharing

## ホスト側のマウントしたいディレクトリとファイルを作成する

```
mkdir docker-share
```

```
touch index.html
```

```
echo "docker share test" >> index.html
```

## マウント元とマウント先を指定して起動する

```
docker run -v "{ホスト側のマウント元ディレクトリ{/Users/neriai/***}}:{コンテナ側のマウント先ディレクトリ(/var/www/html/)}" -i -t -p 10080:80 "centos:6/httpd-test" /bin/bash
```

## 正常にマウントされ、起動できるかを確認する

```
cat /var/www/html/index.html
```

```
/etc/init.d/httpd start
```

```
http://localhost:10080
```

# 演習:好きなソフトウェアを入れてみよう

※以下MySQLの場合のヒントTipsです

## インストール

```
yum install -y http://repo.mysql.com/mysql-community-release-el6-4.noarch.rpm
yum install -y mysql-community-server
```

## 初期設定

```
echo "" >> /etc/my.cnf
echo "[mysql]" >> /etc/my.cnf
echo "default-character-set=utf8" >> /etc/my.cnf
echo "" >> /etc/my.cnf
echo "[client]" >> /etc/my.cnf
echo "default-character-set=utf8" >> /etc/my.cnf
```

## 起動

```
/etc/rc.d/init.d/mysqld start
```

```
CREATE DATABASE {データベース名} DEFAULT CHARACTER SET utf8;
```

## ホストマシンからの接続

```
docker run -i -t -p 13306:3306 {コンテナ名} /bin/bash
```

```
GRANT ALL PRIVILEGES ON *.* TO root@"%";
```
# 宿題

## イメージをエクスポートする

```
docker save ｛イメージ名(sample-image)｝ > {ファイル名(sample-image.tar)}
```

## イメージをインポートする

```
docker load < {ファイル名(sample-image.tar)}
```

## コンテナをエクスポートする

```
docker export ｛コンテナ名(sample-image)｝ > {ファイル名(sample-image.tar)}
```

## コンテナをインポートする

```
docker import < {ファイル名(sample-image.tar)}
```