Docker のインストールからレポジトリへのpush までやってみた【CentOS 7】


# やること

最近よくDocker について見かけるので、自分でも試してみました。
インストールからDocker image の作成、リポジトリへのアップロードまでを行っています。
以下は全てCentOS 7.2 で行っています。

## インストール

[公式ページ](https://docs.docker.com/engine/installation/linux/centos/) に以下の記述があります。

> Docker requires a 64-bit installation regardless of your CentOS version. Also, your kernel must be 3.10 at minimum, which CentOS 7 runs.

どうやらCentOS の場合64 ビットの7 以上でカーネルのバージョンは3.1 以上でないといけないようです。

```
%  uname -r
3.10.0-327.el7.x86_64
```

インストールですが、公式ページで紹介されている方法(https://get.docker.com/ からcurl や`sudo yum install docker-engine`) だとdependency が云々でインストールできなかったので、以下のコマンドで行いました。

```
%  sudo yum install docker
```

バージョン確認。

```
%  docker -v
Docker version 1.10.3, build d381c64-unsupported
```

起動してみます。

```
%  sudo systemctl start docker
```

## docker イメージのダウンロード

次に、docker イメージをダウンロードします。
イメージのダウンロードは`docker pull` コマンドで行います。
[Official Repositry](https://hub.docker.com/explore/) からダウンロードするイメージを探します。
ここはGit でいうGithub のようなものみたいです。後で試していますが、サインインすることで自分のリポジトリも作れます。
CentOS のところを見ると、5 から7.2 まであるみたいです。
CentOS 7 をダウンロードします。
`docker pull <イメージ名>:<タグ名>` で、指定したタグのものをpull できます。

```
%  sudo docker pull centos:7
Trying to pull repository docker.io/library/centos ...
7: Pulling from docker.io/library/cento%
8d30e94188e7: Pull complete
Digest: sha256:2ae0d2c881c7123870114fb9cc7afabd1e31f9888dac8286884f6cf59373ed9b
Status: Downloaded newer image for docker.io/centos:7
```

ちなみにroot でないユーザーでsudo を付けてないと`Cannot connect to the Docker daemon. Is the docker daemon running on this host?` って言われてしまいます。sudo なしで実行する方法もあるようですが、ここではとりあえずsudo を付けて行っています。

ダウンロードしてきたイメージの確認は`docker image` コマンドで行います。

```
%  sudo docker image
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos    7                   980e0e4c79ec        34 hours ago        196.7 MB
```

CentOS 7 があることがわかります。

## docker イメージの起動

ダウンロードしてきたCentOS 7 を実行してみます。実行は`docker run` コマンドでできます。
[Docker docks のrun reference のページ](https://docs.docker.com/engine/reference/run/) に
> For interactive processes (like a shell), you must use -i -t together in order to allocate a tty for the container process. 

とあります。
シェルのようなインタラクティブプロセスでは、-i と-t オプションを付けなさいということなので、bash を実行し起動を以下のコマンドで行います。


```
%  sudo docker run -it centos:7 /bin/bash
[root@fdb376b21eaf /]#
```

プロンプトが切り替わりました。
OS のバージョンを確認してみます。

```
[root@fdb376b21eaf /]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
```

CentOS 7.2 が動いているようです（自分の使ってるマシンと全く同じでした）。
いくつかコマンドを試してみましたが、ほとんどのコマンドは入っていないようです。docker イメージは最小限の構成のみ、あとはユーザー側でいろいろやってねということなのでしょう。
このシェルを抜ける場合、`exit` や`Ctrl-d` でコンテナを終了しつつ抜け、`Ctrl-p Ctrl-q` だと実行したまま抜けることができるそうです。

```
[root@fdb376b21eaf /]# exit
exit
```

docker コンテナの一覧を確認するコマンドに、`docker ps` があります。このコマンドのオプションに`-a` を渡すことで、停止しているコンテナを含め全て確認することができます。

```
%  sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
fdb376b21eaf        centos:7            "/bin/bash"         6 minutes ago       Exited (0) 4 seconds ago                            distracted_lamarr
```

`exit` したため、ステータスがExited となっています。
停止しているコンテナを起動するには、`docker start` コマンドを指定します。コンテナID を指定することで、指定したコンテナを起動できます。
起動したコンテナへは、`docker attach` コマンドでアタッチできます。

```
%  sudo docker start fdb376b21eaf
fdb376b21eaf
%  sudo docker attach fdb376b21eaf
[root@fdb376b21eaf /]# 
```

コンテナID はフルで指定しなくても、先頭3文字(上の例だと`fdb`) くらいでコンテナを一意に決めることができれは大丈夫みたいです。

## コンテナを触ってみる

とりあえず、zsh でも入れてみます。

```
[root@fdb376b21eaf /]# yum install zsh
（略）
Complete!
[root@fdb376b21eaf /]#zsh
[root@fdb376b21eaf]/# 
```

プロンプトがほぼ同じなのでわかりにくいですが、きちんとインストールされています。

```
[root@5d83fad2e905]/# set | grep -ai  version
ZSH_VERSION=5.0.2
[root@5d83fad2e905 /]# set | grep -ai  version
BASH_VERSION='4.2.46(1)-release'
```

紛らわしいのでプロンプトを黄色くしておきます。bash っぽくカレントディレクトリを表示するようにもします。

```~/.zshrc
autoload -Uz colors
colors
PROMPT="%{${fg[yellow]}%}[%n@%m %1~]%#  %{${reset_color}%}"
```

## docker image の作成

先ほど作ったコンテナからイメージファイルを作ってみます。
`docker commit` コマンドを使います。

```
%  sudo docker commit fdb376b21eaf zsh-installed
sha256:18247f8cdbc4762a611b080342347d19c8b84fe0773b70ba88021876a97d51c5
%  sudo docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
zsh-installed           latest              18247f8cdbc4        8 seconds ago       297.9 MB
docker.io/centos        7                   980e0e4c79ec        2 days ago          196.7 MB
```

コンテナID `fdb376b21eaf` に`zsh-installed` という名前を付けてイメージを作りました。
このイメージからコンテナを起動することで、先ほど作成したコンテナと同じものを起動できるようです。

```
[ytakahashi ~]%  sudo docker run -it zsh-installed:latest "/bin/zsh"
[root@819faf2dbbd3 /]#
```

上記のようにzsh を指定して起動できます（先ほど変更したようにプロンプトも黄色くなっています）。

```
[ytakahashi ~]%  sudo docker ps -a
CONTAINER ID        IMAGE                  COMMAND             CREATED             STATUS              PORTS               NAMES
819faf2dbbd3        zsh-installed:latest   "/bin/zsh"          3 minutes ago       Up 3 minutes                            determined_spence
fdb376b21eaf        centos:7               "/bin/bash"         About an hour ago   Up 45 minutes                           distracted_lamarr
```

## docker hub にpush してみる

作成したイメージは、クラウドにあるリポジトリへとアップロードできます。
上の方でイメージをpull するために使った[docker hub](https://hub.docker.com/explore/) にアカウントを登録することで、自分のリポジトリを作ることができます。

ログインしてみます。
![docker hub](http://i.imgur.com/ZVFPPEF.png  =20x)

ここにリポジトリを作れますが、無料ユーザーの場合、プライベートリポジトリは1つしか作れないようです。
今回はパブリックリポジトリで試してみます。

パブリックリポジトリの場合、上記ページから作らなくてもCUI からpush すれば作成されるようです。
リポジトリへpush するために、docker でログインします。

```
%  sudo docker login
Username: umimi
Password: 
Email: XXXXXX@XXXXXXX
WARNING: login credentials saved in /root/.docker/config.json
Login Succeeded
```

ユーザー名、パスワード、メールアドレスを入力し、ログインに成功しました。

次に、push したいイメージに、`docker tag` コマンドで`<アカウント名><リポジトリ名>:<タグ名>` というタグを付加します。
`docker commit` コマンドで作成したイメージID `18247f8cdbc4` のイメージにタグを付けます。
イメージの最新版にはlatest というタグをつけることが慣習となっているそうなので、タグ名はlatest としています。

```
%  sudo docker tag 18247f8cdbc4 umimi/zsh-installed:latest
%  sudo docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
umimi/zsh-installed     latest              18247f8cdbc4        About an hour ago   297.9 MB
zsh-installed           latest              18247f8cdbc4        About an hour ago   297.9 MB
```

タグ付けしたものが`zsh-installed` と同じIDでDocker Image としてできていることが確認できます。

これをリモートリポジトリへとpush するには、`docker push` コマンドを使います。

```
%  sudo docker push umimi/zsh-installed:latest
The push refers to a repository [docker.io/umimi/zsh-installed]
e8f7f665745a: Mounted from umimi/test-repository 
0aeb287b1ba9: Mounted from library/centos 
latest: digest: sha256:ba75f871c950782e48466cb66dd7d1ab90f67bb906e72150c0ec12f285e05f95 size: 719
```

できました。

docker hub を見てみると、リポジトリが作成されていることがわかります。

![repository](http://i.imgur.com/rw0iHn7.png)

## 探してみる

docker hub のパブリックリポジトリに置かれているイメージは`docker search` コマンドで検索することができます。
試しに、`zsh` で検索してみると以下のような結果になりました。

```
%  sudo docker search zsh
INDEX       NAME                                               DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/bwithem/oh-my-zsh-tmux                                                                   1                    [OK]
docker.io   docker.io/everhopingandwaiting/rpi-zsh             jyaosuse/rpi-zsh:v1.0                           1
docker.io   docker.io/hoshinotsuyoshi/zsh-on-coreos                                                            1                    [OK]
docker.io   docker.io/j0n17/zsh-ubuntu                         Ubuntu container packaged with Zsh / Oh-my...   1
docker.io   docker.io/jess/zsh                                                                                 1                    [OK]
docker.io   docker.io/omegabit/docker-zsh                      docker-zsh                                      1                    [OK]
docker.io   docker.io/alphanso/zsh                                                                             0
docker.io   docker.io/bketelsen/zsh                                                                            0
docker.io   docker.io/doomhammer/alpine-zsh                    Minimal zsh image based on Alpine Linux.        0                    [OK]
docker.io   docker.io/dvc94ch/zsh                                                                              0
docker.io   docker.io/imwithye/zsh                             Docker Container for ZSH                        0                    [OK]
docker.io   docker.io/jcmuller/zsh                                                                             0
docker.io   docker.io/jiatower/oh-my-zsh-tmuxinator-ssh                                                        0                    [OK]
docker.io   docker.io/jmervine/zshrc                                                                           0                    [OK]
docker.io   docker.io/k0ner/alpine-zsh                         zsh and oh my zsh over jare/vim-bundle          0                    [OK]
docker.io   docker.io/kalz/zsh_tty                             Javascript based Terminal/Console which yo...   0                    [OK]
docker.io   docker.io/katelibbey/zsh                                                                           0
docker.io   docker.io/luttig/sg-zsh                            Docker container to test zsh + Go environment   0
docker.io   docker.io/mhlavac/docker-ubuntu-zsh                Ubuntu, ZSH with antigen.                       0                    [OK]
docker.io   docker.io/mhoush/zsh                               An alpine:3.3 with zsh                          0                    [OK]
docker.io   docker.io/moacirosa/zsh                            Just a small an experimental container for...   0
docker.io   docker.io/pktangyue/oh-my-zsh-and-configured-vim   docker based on centos7 with oh-my-zsh and...   0                    [OK]
docker.io   docker.io/stayfi/zsh-php                           Docker container for PHP Development with ...   0                    [OK]
docker.io   docker.io/twcoral/zsh                              zsh with oh-my-zsh                              0
docker.io   docker.io/umimi/zsh-installed                      CentOS 7.2 with zsh                             0
```

一番下に先ほど作ったリポジトリがありました。
これで誰でも`docker pull umimi/zsh-installed` だけで今回作ったDockerImage が使えるようになりました。
ほぼデフォルトのCentOS 7 と変わりませんが、よかったら試してみてね！



## 終わりに
こんな感じでDocker のインストールから実行、Image ファイルの作成〜リモートリポジトリへのアップロードまで試してみました。
CentOS で試しているので、次はMac で試してみようと思います。
リポジトリからpull、編集したものをcommit、リポジトリにpush という流れはGit ユーザーにとっては理解しやすいのではないでしょうか。
今回は軽く使い方を調べた程度なので、これをどう使っていくかは今後調べたいところです。


# 参考文献

* [CentOS7 に Docker をインストールし、CentOS7コンテナ上で Apache を起動する](http://fnya.cocolog-nifty.com/blog/2016/03/centos7-docker-.html)
* [Dockerコンテナをクラウドサービス上で共有できる「Docker Hub」を使ってみる](http://knowledge.sakura.ad.jp/tech/2210/)
* [Docker超入門](http://blog.ieknir.com/blog/try-docker/)
* [Dockerを導入する（CentOS版）](http://qiita.com/zwirky/items/991f61a231f4e198a320)
* [EC2にDockerをインストールしてNginxコンテナを作る](http://labs.septeni.co.jp/entry/2015/11/19/213714)