DockerhubにDockerイメージを登録してみた

本投稿では、DockerhubにDocker Imageを登録した際に行った作業を備忘録して、まとめて行きたいと思います。
本投稿で作成するDocker Imageの環境は以下の通りで、CentOSをベースにrbenvにてRubyを実行可能な環境を作成します。

## Docker Imageの環境

| 項目 | バージョン |
| :--- | :--- |
| CentOS | 7.5 |
| rbenv | 1.1.2 |
| Ruby | 2.5.1 |

## Step1: Dockerhubへプッシュ（登録）

まずStep1として、DockerhubへプッシュしてDockerイメージを登録するまでの流れを記載します。
流れとしては、以下の手順で実施していきます。

### イメージの作成

まず Docker Image作成用にDockerfileを準備し、そのDockerfileを元に ``docker build`` コマンドでDockerイメージをビルドしていきます。
``docker build`` でビルドする際は ``-t`` コマンドでタグ名を指定する際に、**{dockerhubのアカウント名}/{タグ名}** で登録する必要があります。
以下では、私のアカウント katsuya61 で登録するため、 **katsuya61/ruby** としています。

* Dockerfileの例

```Dockerfile:Dockerfile
FROM centos:7.5.1804

# Install packages for installing rbenv and ruby
RUN yum install -y \
  git \
  gcc \
  gcc-c++ \
  openssl-devel \
  readline-devel \
  bzip2 \
  make

# Download rbenv and ruby-build from git
WORKDIR /usr/local
RUN git clone https://github.com/sstephenson/rbenv.git rbenv \
 && git clone git://github.com/sstephenson/ruby-build.git rbenv/plugins/ruby-build

# Setup rbenv.sh file
WORKDIR  /etc/profile.d
RUN echo 'export RBENV_ROOT="/usr/local/rbenv"' > rbenv.sh \
 && echo 'export PATH="${RBENV_ROOT}/bin:${PATH}"' >> rbenv.sh \
 && echo 'eval "$(rbenv init --no-rehash -)"' >> rbenv.sh

## Install ruby 2.5.1
RUN source /etc/profile.d/rbenv.sh \
 && rbenv install 2.5.1 \
 && rbenv versions \
 && rbenv global 2.5.1 \
 && ruby -v \
 && rbenv rehash \
 && gem install bundler

ENTRYPOINT tail -f /dev/null
```

* Dockerfileからイメージをビルド

```
$ docker build -t katsuya61/ruby .
Sending build context to Docker daemon   2.56kB
Step 1/8 : FROM centos:7.5.1804
 ---> cf49811e3cdb
Step 2/8 : RUN yum install -y   git   gcc   gcc-c++   openssl-devel   readline-devel   bzip2   make
.
.
.
Successfully built 874315f8ee4c
Successfully tagged katsuya61/ruby:latest
```

### Dockerhubへログイン

続いて、DockerhubへDocker Imageを登録できるように``docker login`` コマンドでDockerhubにログインしていきます。<br>
以下は、私のkatsuya61アカウントでログインした例です。``Username``と``Password``を聞かれた際に適切な名前を入力するとログインできます。

```
$ 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: katsuya61
Password:
Login Succeeded
```

### Dockerhubへ登録

最後にDockerhubにログインした状態で ``docker push`` コマンドを実行することでDokcerhubへDocker Imageを登録することができます。

```
$ docker push katsuya61/ruby
The push refers to repository [docker.io/katsuya61/ruby]
c1e4031ded99: Pushed
e285701df928: Pushed
e301cd8b132c: Pushed
9e6a772197d5: Pushed
4826cdadf1ef: Mounted from library/centos
latest: digest: sha256:e906f932ff696943c7ac5b110f8695ecaecd5c3978d6a89d796b59a623e87534 size: 1372
```

<br>

* ``docker push``後のDockerhubの例
<img width="653" alt="docker-hub-sample.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69983/58375ff1-a8c9-91cb-dbb8-b8316b09b710.png">


## Step2: Dockerhubのイメージを利用

Step2では、Step1で登録したDockerhubのイメージを利用して新たにDockerコンテナを作成していく手順を記載します。

### Dockerhubへプッシュしたイメージを利用したイメージの作成

まず、Step1で登録した ``katsuya61/ruby`` イメージを利用して、新しいイメージを作成していく手順を記載します。
本投稿では、シンプルに以下のように Dockerfileに``FROM katsuya61/ruby``のみを記載したイメージを作成していきます。
``docker build`` で作成するイメージのタグ名は **rubytest** にしました。

* Dockerfileの準備

```Dockerfile:Dockerfile
FROM katsuya61/ruby
```

* ``docker build`` でイメージを作成

```
$ docker build -t rubytest .
Sending build context to Docker daemon  2.048kB
Step 1/1 : FROM katsuya61/ruby
 ---> 874315f8ee4c
Successfully built 874315f8ee4c
Successfully tagged rubytest:latest
```

### Rubyのバージョンを確認

最後に新たに作成した rubytest のイメージでコンテナを起動して、Rubyが利用可能なコンテナであることを確認して終わりです。

* ``docker run`` で作成したイメージをコンテナとして起動

```
$ docker run --name test001 -h host001 -itd rubytest
abe0544505b5f726dcf83e226eb19ac221d1b82252a639779031d7f832ab5794
```

* コンテナにアクセスし、rubyのバージョンを確認

```
$ docker exec -it test001 /bin/bash
[root@host001 profile.d]# ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
```

## おまけ

おまけですが、今回作成したDocker Imageは[こちら](https://hub.docker.com/r/katsuya61/ruby)から利用できます。