CentOS7の検証用環境をDockerイメージとして作成し「Docker Hub」へプッシュする

2019-03-29Docker

はじめに

検証環境としてクリーンなCentOS7環境が必要なことが多いですが、とはいえほぼ必要になるツールが決まっていることが多いです。

アプリケーションのインストール方法として git が必須ということが多いですし、 データ編集用や確認用に vimview コマンドがあると便利です。

API呼び出し後のJSONデータ検証のために jq が必要だったりもしますね。

そのような頻繁に使われるツールがインストール済みの薄いCentOS7環境が予めあると助かります。
Dockerのイメージ作成の復習も兼ねてイメージ作成から「Docker Hub」での公開までの流れをまとめてみました。

検証環境

$ uname -moi
x86_64 MacBookPro11,4 Darwin

$ docker --version
Docker version 18.09.2, build 6247962

前提条件

  • Dockerがインストールされていること

作業開始

作業用ディレクトリのディレクトリ作成

作業用のディレクトリを作成しましょう。

$ mkdir centos-sandbox

$ cd centos-sandbox

Dockerfile(Dockerイメージを作成するためのレシピ)を作成する

Dockerイメージを作成するための「レシピ」となる Dockerfile を作成します。

ここでは、 gitvim コマンドを使えるようにしています。
また yum を使ったあとはキャッシュ情報がローカルディスクに残ってしまいますが、ディスク使用領域が増えるとDockerイメージが大きくなり、立ち上げや「Docker Hub」のアップロードが遅くなりますので削除しておきます。

実施した内容をブログやWikiに転記することも多いので、プロンプトはシンプルなもの( $ のみ )にしておきます。

$ cat <<'EOF'
FROM centos:centos7

RUN yum install -y git vim \
  && rm -rf /var/cache/yum/* \
  && yum clean all \
;

ENV PS1 '$ '
EOF

内容を確認します。

$ cat Dockerfile
FROM centos:centos7

RUN yum install -y git vim \
  && rm -rf /var/cache/yum/* \
  && yum clean all \
;

ENV PS1 '$ '

Dockerイメージを作成する

先程作成した Dockerfile を使ってDockerのイメージを作成します。

-t オプションでイメージにタグ(名前)を付与します。

ここでは genzouw/centos-sandbox というタグ名を付与しています。(ややこしい書き方になっていますが、ディレクトリ名からタグ名を付与するようにしています。)

# docker build . --tag=genzouw/centos-sandbox でも同じ
$ docker build . --tag=genzouw/"$(basename $(readlink -f .))"
Sending build context to Docker daemon  2.048kB
...(省略)...
Successfully built d40f461d99f8
Successfully tagged genzouw/centos-sandbox:latest

作成できたか確認してみましょう。

# docker images | grep genzouw/centos-sandbox でも同じ
$ docker images | grep "$(basename $(readlink -f .))"
genzouw/centos-sandbox             latest                 d40f461d99f8        20 hours ago         295MB

Dockerイメージを「Docker Hub」にプッシュ(アップロード)する

いよいよ、Dockerのイメージを「Docker Hub」にアップロードします。

「Docker Hub」のアカウントを作成

Docker Hubのページにアクセスし、アカウントを作成します。

ここでの注意点は、先程作成したDcokerイメージのタグ名のスラッシュ前方部分(僕の場合は genzouw/centos-sandbox としているので、 genzouw になりますね)とアカウント名を合わせておくということです。
タグ名の方を変更したい場合はもう一度 docker build し直しましょう。

クライアントマシンで認証を行う

アカウント発行後はクライアントマシンで認証を行っておきます。
プッシュを行う前に認証して置かなければいけません。

# ユーザ名、パスワード、メールアドレスを入力してログインしましょう
$ docker login

Dockerイメージをにプッシュする

Dockerイメージをプッシュするには docker push コマンドを利用します。
Dockerイメージを選択するには先程指定した「タグ名」を使います。
ここでは genzouw/centos-sandbox というタグ名を選択しています。(ややこしい書き方になっていますが、ディレクトリ名からタグ名を付与するようにしています。)

# docker push genzouw/centos-sandbox でも同じ
$ docker push genzouw/"$(basename $(readlink -f .))"
The push refers to repository [docker.io/genzouw/centos-sandbox]
...

特にエラーがなければアップロード完了です。

「Docker Hub」のリポジトリページを確認

「Docker Hub」ページは以下のようになりました。

動作確認

本当にできたのか動作確認してみます。
アップロードしたDockerイメージファイルをクライアントマシン上から削除した後、「Docker Hub」からダウンロードしてこれるか確認してみます。

# クライアントマシン上のイメージを一度削除
$ docker rmi genzouw/centos-sandbox
Untagged: genzouw/centos-sandbox:latest
Untagged: genzouw/centos-sandbox@sha256:5da38cda138fd628895c5b258ffcad215832141b0b12ffad91c55f84a5240269
Deleted: sha256:d40f461d99f89003ba6bc976003ad5f272a5d3cbfd00b625c52cde5e41552d50
Deleted: sha256:036928fad58701c41846486b0d7e7f5f375706f495fb187a88e789a67d615afc
Deleted: sha256:a6af9067306b50027923396e1fc64c130ba7b3af6397a26f330e59cce1757841

# さて動作するか??
$ docker run --rm -it genzouw/centos-sandbox bash

初めてのダウンロードなので、1分程度かかります。
コンテナにログインできれば、 gitvim を実行してみましょう。利用できることがわかるはずです。

Dockerfile も公開しておこう

「Docker Hub」上に公開されているコンテナイメージですが、どんなセキュリティリスクがあるかわかりません。
レシピとなる Dockerfile が公開されていれば利用者が判断できますが、 Dockerfile が公開されていないイメージは利用されることは殆どないはずです。

せっかくなので Dockerfile も公開してみてもらいましょう。

ここでは hub コマンドを使って「Github」おリポジトリを作成していますが、ブラウザから手動操作で作成しても構いません。

# ローカルリポジトリ作成
$ git init
Initialized empty Git repository in /private/tmp/work/centos-sandbox/.git/

# ファイルを追加
$ git add .

# コミット
$ git commit -m "first commit."
[master (root-commit) bd62a6b] first commit.
 1 file changed, 8 insertions(+)
 create mode 100644 Dockerfile

# Githubの公開リポジトリを作成します。(非公開にしないこと!)
$ hub create -o

# Githubにプッシュ
$ git push -u origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 311 bytes | 311.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:genzouw/centos-sandbox.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

作成後は「Docker Hub」のリポジトリページと「Github」の公開リポジトリを紐づけてやります。

こちらのページを開き、 「Link to Github」 ボタンを押す。

紐づけしたい「Github」リポジトリを選択します。

正しく設定ができれば、他のユーザからはこのように見えます。

Github連携機能のすごいところ

「Github」連携機能ですが、 Dockerfile を編集して「Github」にプッシュしたタイミングで、「Docker Hub」にフックされるようです。
「Docker Hub」はフックをトリガにビルドした後、Dockerイメージを自動的に作り直してくれます。ホント便利。

ひとこと

無料でこのような環境を提供してくれるなんて素晴らしいですね。

2019-03-29Docker