Dockerのチュートリアルをやってみた

# Dockerのチュートリアルをやってみた

## 開発環境
- Mac OS X mavericks
- Vagrant 1.7.2
- ubuntu 14.04

## この記事の目的
- DockerのTutorialでやっていることをMac内で実際にやってみることがゴール
- チュートリアルの一部は省略しています。
- そもそもDockerとは？って人は見ても何やってるかわからないかもしれないです。

> https://www.docker.com/tryit/

## この記事でやっていること
- Mac内に仮想サーバのUbuntuを立てる
- UbuntuでDockerをインストールする
- コンテナのimage持ってくる
- image内でHello worldをする
- imageにpingをインストールする
- imageをcommitする
- 新しくできたimageからgoogleにpingを打つ
- 新しくできたimageをpushする

## Mac内に仮想サーバを立ち上げる
`チュートリアルには含まれていません`

- Vagrantのbox追加に関しては省略。

`vagrant box add`とかやってなんとかubuntu/trusty64を取得してください

```bash:Vagrantfile
# -*- mode: ruby -*-
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
 config.vm.box = "ubuntu/trusty64"
 config.vm.network "private_network", ip: "192.168.81.9"
end
```

## UbuntuでDockerをインストールする

```bash:
$ vagrant up
$ vagrant ssh
$ sudo apt-get update
$ sudo apt-get install docker.io
```

参考
> https://docs.docker.com/installation/ubuntulinux/

## コンテナのimage持ってくる

`ここからがチュートリアルの開始状態`

- imageを探す

```bash:
$ sudo docker search tutorial
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
learn/tutorial 6

```
- imageを持ってくる

```bash:
$ sudo docker pull learn/tutorial
Pulling repository learn/tutorial
8dbd9e392a96: Download complete
```

## image内でHello worldをする
最初の引数以外は別に気にしなくていいっぽい

```bash:
$ sudo docker run learn/tutorial echo Hello world
Hello world
```
## imageにpingをインストールする
`-y`をつけて実行確認を出さない

```bash:
$ sudo docker run learn/tutorial apt-get install -y ping
```

## imageをcommitする
- pingをインストールしたプロセスを探す

```bash:
$ sudo docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
be1c53191c1f learn/tutorial:latest apt-get install -y p 6 minutes ago Exited (0) 6 minutes ago clever_pare
```
- commitする

```bash:
$ sudo docker commit be1c learn/ping
ffdd612f3aae57c58dc9269896caa73ff90558c75643a4d62a29bdba9f501802
```

commitする際はプロセスの最初の4文字程度で良い

## 新しくできたイメージからgoogleにpingを打つ

```bash:
$ sudo docker run learn/ping ping www.google.com
www.google.com (173.194.117.240) 56(84) bytes of data.
--- www.google.com ping statistics ---
6 packets transmitted, 0 received, 100% packet loss, time 5025ms
```
- 何も表示されない…？
  - この辺りは多分ネットワーク周りの話になってくるので、また後の話
  - 今回はpingを打てたことが重要
- pingがインストールされていない場合(最初のイメージ)はpingないよってエラーが出る

```bash:
$ sudo docker run learn/tutorial ping www.google.com
2015/02/05 06:50:42 exec: "ping": executable file not found in $PATH
```

## 新しくできたimageをpushする
- ここからはチュートリアルと少し違うところになる
- Dockerのイメージは `Docker Hub` にアップロードするのでアカウントが必要
- 先にアカウントを作成してきてください
> https://registry.hub.docker.com/

```bash:
$ sudo docker push learn/ping
The push refers to a repository [learn/ping] (len: 1)
Sending image list
Please login prior to push:
Username: ------
Password:
Email: ------@gmail.com
Login Succeeded
The push refers to a repository [learn/ping] (len: 1)
Sending image list
2015/02/05 06:58:09 Error: Status 403 trying to push repository learn/ping: "Access denied, you don't have access to this repo"
```

- エラーが出た。
  - 理由は権限がないから。
  - ここでDocker Hubのお作法的なお話
    - Docker Hubはイメージ名を `アカウント名/hogehoge` とするので、自分はlearnさんではないのでエラーが出た。
- imageの作り直しをして再度挑戦

```bash:
$ sudo docker commit be1c [イメージ名]
$ sudo docker push [イメージ名]
The push refers to a repository [イメージ名] (len: 1)
Sending image list
Pushing repository [イメージ名] (1 tags)
************: Image already pushed, skipping
************: Image successfully pushed
Pushing tag for rev [************] on {https://cdn-registry-1.docker.io/v1/repositories/[イメージ名]/tags/latest}
```

Docker Hubにもリポジトリができていると思うのでそちらを確認する

## 最後に
今回はチュートリアルをそのまま実践することだけしかやっていません。
運用であったり環境構築はまた別の話になってくるので、その辺りはまた今度