CentOS 7のDockerでImage作成とコンテナの基本的な操作手順を行ってみる。docker 入門 2

2019/06/28 CentOS, Docker, Linux, オープンソース

docker-operation-top
前回の記事でDocker CE環境構築とDockerの基本的な操作方法を説明しました。引き続きDockerの基本的な部分をもう少し踏み込んで紹介したいと思います。

スポンサーリンク

今回の記事ではコンテナの作成:起動とImageの作成をメインに紹介していきます。具体的には

  • Docker CE環境にDocker HubからCentOSのImageをダウンロードしてコンテナを作成:起動
  • 作成したコンテナからImageの作成
  • 作成Imageを元にコンテナを作成してApache httpdをインストール
  • Apache httpdのインストール後にコンテナからApache httpdが自動的に起動するImageを作成

までを行います。
DockerでのImage作成方法については前の記事でも少し紹介しましたが

  1. コンテナ環境を元からの作成
  2. Dockerfileを利用しての作成

の2つの方法があります。 Dockerでは1のコンテナ環境から作成するより、2のDockerfileを利用することが推奨されていますが 、本記事ではコンテナやImageの基本的操作を説明するために、コンテナを元にしたImageの作成方法を紹介していきます。※Dockerfileについては別の記事で紹介する予定です。
まだDocker CEの環境を構築していない場合には記事
>「CentOS 7でコンテナ型仮想化を利用する。Dockerのインストールと基本的な操作の紹介」
を参照して導入と基本的な操作を行ってみて下さい。

目次

1.利用するDockerの環境

本記事で利用するDocker CEの環境は前回の記事
>「CentOS 7でコンテナ型仮想化を利用する。Dockerのインストールと基本的な操作の紹介」
で構築した環境になります。記事中でも紹介していますが、Dockerが動作している環境を纏めます。

  • Docker CEが動作しているOSはCentOS 7.6 (build 1810)
  • 2019年6月時点でのアップデートまでを適用済み
  • サブネット:192.168.241.0/24
  • Docker CEが動作しているマシンIPアドレス:192.168.241.215
  • Docker CEのバージョン:Docker 18.06 CE

尚、DockerのサービスであるdockerdはCentOS上で起動しているものとします。この環境を元に進めていきます。

2.CentOS Imageのダウンロード(pull)

Dockerの 仮想化単位はアプリケーションの実行環境であるコンテナ単位となります。 本章ではコンテナを作成するのに必要なImageを用意する手順を紹介します。
今回はCentOS上でApache httpdが起動するコンテナとImageの作成をゴールとしています。
先ずはベースとなるCentOSのコンテナを作成するためのImageを用意します。Imageのダウンロードはインターネット上にあるDocker Hubから行います。ダウンロードには docker pull コマンドを利用するため、以後はダウンロードを“Pull”と表記します。

2-1.CentOS Imageの検索

PullするCentOSのImageを検索します。Docker HubのサイトからCentOSのOfficial Imageが確認できます。
Docker HubにあるOSのImage
docker-operation-01
イメージ名の”centos”をクリックすることでImageの詳細が確認できます。
docker-operation-02
詳細に「Copy and paste to pull this image」とImageをPullするコマンドが記載されています。
以下のように実行することでImageをPull出来ることが分かります。

これでCentOSのImage確認とPullするコマンドが分かりました。Docker Hubのサイトから検索を行いましたが、Docker CEをインストールした環境から docker search コマンドでもImageの検索ができます。docker search は以下のように利用します。

CentOSのImageを検索する場合、以下のように実行します。

実行するとcentosと名前のついているImageのリストが表示されます。
今回はOfficialのCentOS Imageを利用しますので、docker pull コマンドで指定するImage名は”centos”という名前になります。

2-2.CentOS ImageのPull

CentOS用Imageの名前が分かりましたので、docker pull コマンドを実行してImageをローカルにダウンロードします。docker pull コマンドは以下のように利用します。

PullするImage名は項目2-1.で確認した centos になります。以下のように docker pull コマンドを実行します。

出力に”Pull complete”と表示されればホストへImageのPullは完了しています。PullしたImageは docker images コマンドで確認できます。オプションを付与せずに実行することですべてのImageが表示できます。
以下のように実行します。

Pullした centos のImageが表示されています。これでコンテナを作成するためのCentOS Imageの用意ができました。

3.コンテナの作成と起動

項目2.でCentOSのImageがローカルに用意できましたので、本章ではImageからCentOSのコンテナを作成する手順を紹介します。

3-1.centosコンテナの作成と起動

コンテナの作成は docker create コマンドで行いますが、コンテナの作成と起動を同時に行う docker run のほうが使い勝手が良いため docker run を利用します。
docker run には多くのオプションがありますが、ここでは最低限、必要となるオプションのみでコンテナの作成と起動を行います。
本記事では以下のオプションを指定して docker run コマンドを実行します。

  • -d バックグラウンドでコンテナを動作させる(デタッチモード)
  • -it ホストとコンテナの標準入出力を接続する。コンテナのコンソールに接続する
  • –name 作成するコンテナ名

docker run コマンドは以下のように利用します。

作成するコンテナ名はcentos76として、以下のように docker run コマンドを実行します。

※オプションはまとめて -dit と指定することも出来ます。
コマンドを実行すると作成されたコンテナのIDが表示されます。docker ps コマンドでコンテナの稼働状況を確認します。

作成された centos76 コンテナが表示されています。起動しているコンテナはSTATUSにUpと表示されます。これでcentos76コンテナの作成:起動と確認は完了です。

3-2.centos76コンテナへのコンソール接続

起動したコンテナは通常のOS環境と同じようにコンソールへ接続して、操作を行うことができます。
作成したcentos76コンテナのコンソールへ接続してみます。コンソールへの接続は docker exec コマンドを利用します。以下のように利用します。

作成したcentos76コンテナのbashシェルに接続する場合には、以下のように docker exec を実行します。

以下のように接続先コンテナ名が付いたプロンプトが表示されれば、コンテナのコンソールに接続できています。

コンテナのCentOSバージョンを確認してみます。

CentOSのバージョンが7.6であることが確認できます。コンテナのネットワークは自動的に設定されます。ホスト側のネットワークとも通信が可能です。
ホスト側のサブネットにあるゲートウェイ 192.168.241.254 に対してpingを実行してみます。

ホスト側のゲートウェイから応答があることから、コンテナとホスト側ネットワークで通信できることが確認できます。基本的にはコンテナでは最低限の環境しかないため、必要なパッケージは追加する必要があります。次章では起動したコンテナにパッケージを追加してみます。

4.Apache httpdが動作するコンテナの作成と起動

本章ではCentOS上でApache httpdが動作するコンテナを作成するところまでを説明します。コンテナは以下の要件に合わせて作成します。

  • CentOSでApache httpdがインストールされて起動している
  • 起動しているAapche httpdにTCPの80番ポートでアクセスできる
  • centosのsystemctlを利用してサービスの自動起動を行う

それではひとつづつ手順を説明していきます。

4-1.コンテナのポートフォワーディング

コンテナ環境でhttpdを動作させるためにパッケージをインストールする必要がありますが、 現在稼働しているcentos76コンテナではApache httpdのパッケージを導入してもTCPの80番を利用しての接続ができません。 Dockerでは作成したコンテナは専用の仮想ネットワークに接続されます。
コンテナ側の仮想ネットワークとホスト側のネットワークについてはデフォルトでは受信を行うことができません。
コンテナ上で動作するサービスに外部から接続するためには、 コンテナの作成時にポートフォワーディングを利用するためのオプション指定が必要になります。 centos76コンテナでは作成時にポートフォワーディングのオプションを付与していませんので、別にポートフォワーディングを設定したコンテナを起動します。

4-1-1.ポートフォワーディング用のオプション

ポートフォワーディングは docker run 実行時に -p オプション付けます。 -p オプションは

という形で指定します。例えばホスト側ネットワーク(192.168.241.0/24サブネット)から80番ポートを利用してコンテナに接続する場合は

のような形になります。

4-1-2.-pオプションを指定してのコンテナ作成と起動

centosのImageを指定してポートフォワーディングを有効にしたコンテナ”centos76-httpd”を作成:起動してみます。以下のように実行しました。

コンテナIDが表示され、正常にコンテナの作成:起動ができました。起動しているコンテナの稼働状況を docker ps コマンドで確認します。

ポートフォワーディング用のオプションを付与して作成した”centos76-httpd”コンテナには PORTSにポートフォワーディングの状態が表示されています。  “centos76-httpd”コンテナではホスト側の80番ポートをコンテナ側の80番へTCP通信を転送することができますので、”centos76-httpd”コンテナにhttpdパッケージを導入することでホスト側からアクセスすることができます。
これでポートフォワーディングを指定したコンテナ”centos76-httpd”の作成と起動は完了です。

4-2.centos76-httpdコンテナへのApache httpdインストール

TCP80番に通信ができるコンテナ”centos76-httpd”ができたので、ウェブサーバー用のアプリケーションであるApache httpdのパッケージをインストールします。 インストールは通常のOSと同様にコンソールから行います。 centos76-httpdコンテナのコンソールに docker exec コマンドで接続します。

docekr exec を実行するとプロンプトが接続先のコンテナIDに変わります。

コンテナに接続出来たら、通常のCentOSと同じよう操作ができます。

スポンサーリンク

4-2-1.Apache httpd用パッケージの確認

インストールはする前に yum search コマンドでパッケージ名の確認を行います。

httpdに関連するパッケージがリストされます。インストールが必要なパッケージは

  • httpd.x86_64 : Apache HTTP Server

になります。

4-2-2.Apache httpd用パッケージのインストール

4-2-1.で確認した”httpd.x86_64″パッケージをインストールします。yum install コマンドでインストールを行います。

最後にComplete!と表示されればhttpd.x86_64パッケージはインストールできています。これでApache httpdのインストールは完了です。

4-3.Apache httpdの起動と動作確認

Apache httpdパッケージがインストールできましたので、httpdを起動してホスト側から接続できるかを確認してみます。CentOSではサービスの起動に systemctl start コマンドを利用しますが、ここでは“/sbin”にインストールされたhttpdを直接、起動します。
※systemctl コマンドを利用しない理由は後ほど説明します。

警告メッセージが表示されますが、 設定ファイルがデフォルトの場合、必ず出力されるものになります。 起動に失敗したというメッセージが表示されなければhttpdは正常に起動しています。httpdが起動していることを ps コマンドで確認します。

上記のようにhttpdプロセスが起動していることが確認できました。

4-4.ブラウザからの接続

次はブラウザからコンテナのApache httpdに接続してみます。
ブラウザにホスト側のIPアドレスである http://192.168.241.215 を入力して開きます。
docker-operation-03
Apache httpdデフォルトのページが表示されました。
これでコンテナへのApache httd導入とサービスの動作確認、ポートフォワーディングの動作確認までが完了しました。

5.コンテナからのImage作成

項目4.までの手順で作成した”centos-httpd”コンテナ環境を元にImageを作成してみます。作成したImageからコンテナを起動することでImageにした時点でのコンテナ環境が docker run コマンドで簡単に利用できるようになります。
このImage作成には概要でも記載しましたが

  • docker commit コマンドによる作成
  • Dockerfileを利用した作成

の2つの方法があります。
DockerではDockerfileを利用してImageを作成ことがベストプラクティスですが、本記事では作成したコンテナを元にImageを作成します。※Dockerfileを利用したImageの作成については別の記事で紹介する予定です。

5-1.centos76-httpd コンテナの停止

作成したコンテナを元にImageを作成するためには docker commit コマンドを利用します。docker commit を実行するためには、作成元となるコンテナが停止している必要があります。実行前に docker stop コマンドで”centos76-httpd”コンテナを停止します。

コンテナ名が表示されればコンテナは停止しています。docker psコマンドでコンテナの状況を確認してみます。

“centos76-httpd”コンテナの STATUSがExitedと表示されていますので、停止していることが確認 できました。

5-2.docker commit の実行

コンテナが停止したら、docker commit コマンドでImageを作成します。docker commitは以下のように利用します。

ここではImageの元になるコンテナとして”centos76-httpd”を、作成するImageの名前は”centos76-httpd-Image-01″として実行してみます。以下のように実行します。

Imageが作成されるとイメージIDが出力されます。作成されたImageを確認するため docker images コマンドを実行します。

Imageとして“centos76-httpd-Image-01”が追加されていることが確認できました。これで docker commit コマンドでのImageの作成は完了です。

6.systemctl時のエラーに対応するコンテナの作成

項目5.で作成したImageからApache httpdが自動起動するコンテナを作成する前にCentOSのoffice Imageから作成したコンテナでの問題に対応します。

6-1.CentOS コンテナ環境でのsystemctlコマンドエラー

CentOSのOfficial Imageからオプションを付与せずにコンテナを起動すると、systemctlコマンドの実行時に、以下のようなエラーで利用することができません。

エラーメッセージに含まれる”D-Bus”はプロセス間の通信を行う機能ですが、 通常のコンテナ作成:起動手順(docker run実行)だと、この機能に対する操作の許可が付与されません。 本記事ではApache httpdの自動起動を設定するためにsystemctlを利用します。
この状態だとsystemctlが利用できないため、利用できるようにコンテナを作成します。

6-2.systemctlコマンド実行時のエラー対応

systemctlを利用するためにはコンテナの作成:起動時にオプションを指定する必要があります。具体的には docker run の実行時に、以下のオプションを付与します。

実行するシェルには

を指定します。また  “-it”オプションを付与するとsystemctlが実行できなかったため、”-it”オプションを外しています。  ※-itオプションはコンソールへ接続する docker exec 実行時にします。
以下のようオプションを付けて docker run を実行しました。

コンテナが作成:起動するとコンテナIDが表示されます。この状態でコンテナの起動状況を見てみます。

“centos76-httpd-inst”コンテナが作成されており、STATUSがUpになっていることが確認できました。

7.Apache httpdの自動起動を設定

systemctlを利用できるコンテナ”centos76-httpd-inst”が作成できましたので、Apache httpdの自動起動を設定するために docker exec コマンドでコンテナのコンソールへ接続します。

“centos76-httpd-inst”コンテナのコンソールに接続後、yum list コマンドでhttpdパッケージがインストールされていることを確認します。

httpdパッケージがインストールされていることが確認できました。

7-1.systemctlでのhttpd起動確認

コンテナにApache httpdがインストールされていることが確認できましたので systemctl start コマンドで httpdを起動してみます。

先に作成したコンテナ環境では出力されていたD-Busのエラーも出力されず、systemctl start で httpdの起動が出来ました。
systemctl status コマンドでサービスの稼働状況を確認してみます。

上記からhttpdが稼働していることが確認できました。

7-2.Apache httpdの自動起動を設定

systemctlコマンドが利用できることが確認できましたので、httpdサービスの自動起動を有効にします。自動起動を有効にする systemctl enable コマンドを実行します。

実行後にhttpdサービスの自動起動が有効になったことを確認します。

“enabled”と表示されれば、httpdサービスの自動起動は有効になっています。

7-3.Apache httpdへの接続確認

httpdの稼働と自動起動設定が完了しましたので、ブラウザからのApache httpdへの接続性を確認してみます。

デフォルトのウェルカムページが表示されることが確認できました。
ここまででhttpdセットアップ済みのコンテナ作成が完了しました。

8.Apache httpdセットアップ済みImageの作成

項目7.までの手順でApache httpdのセットアップ済みCentOSコンテナが作成できました。作成したコンテナからImageを作成します。Imageの作成は、項目6.の手順と同じで

  • Image作成元コンテナの停止
  • docker commitの実行

になります。

8-1.コンテナの停止

現状のコンテナについて稼働状況を確認します。

Image作成元になる”centos76-httpd-inst”コンテナが動作しています。稼働しているコンテナからImageの作成はできないため”centos76-httpd-inst”コンテナを停止します。

コンテナの稼働状況を確認してみます。

centos76-httpd-instが停止していることが確認できます。

8-2.Imageの作成

停止した”centos76-httpd-inst”コンテナからImageを作成するために docker commit コマンドを実行します。作成するイメージ名は”centos76-httpd-Image-02”にしました。

イメージIDが表示されたのでImageが正常に作成できたことが分かります。作成したImageを確認してみます。

作成したImage”centos76-httpd-Image-02″が表示されました。これでImageの作成は完了です。

9.Apache httpdセットアップ済みコンテナの起動

本章では作成したImageからhttpdが自動で起動するコンテナを作成:起動をしてみます。

9-1.centos76-httpd-enable コンテナの作成と起動

Imageからコンテナを作成:起動する docker run コマンドを実行します。コンテナ名としてcentos76-httpd-enableを指定して実行しました。

コンテナIDが表示されましたのでコンテナは正常に作成:起動しています。コンテナの稼働状況を見てみます。

上記のように作成したコンテナ”centos76-httpd-enable”が起動していることが確認できます。

9-2.centos76-httpd-enable コンテナへの接続と確認

作成した”centos76-httpd-enable”コンテナのコンソールに docker exec コマンドで接続します。

コンソールへの接続後に自動起動でhttpdが起動しているかを確認します。psコマンドでプロセスを表示させます。

プロセスにhttpdが表示されていることからから、自動起動によるhttpdプロセスが動作していることが確認できます。
systemctl is-enabled コマンドでhttpd自動起動の設定を確認してみます。

“enabled”出力結果から、設定した自動起動が有効になっていることが確認できました。最後にブラウザからコンテナのhttpdにアクセスしてページが表示できることを確認します。
docker-operation-04
確認できました。これでCentOS上でApache httpdが自動起動するImageとコンテナの作成までが完了しました。

10.まとめ

今回の記事ではここまでをゴールとしていますが、dockerにはこれ以外にも様々な機能が用意されています。 コンテナにファイルをコピーすることやホスト側のディレクトリをマッピングしてマウントすることもできます。  また、今回はコンテナのコンソールで設定を行った環境をImageにしましたが、 実はDockerではこの方法はあまりお勧めできません。コンテナの操作履歴が残らないので、どのような操作を行ってイメージを作成したかが把握できないためです。 このような理由からイメージの作成にはDockerfileを利用することが推奨されています。
Dockerfileからのイメージ作成方法やdockerの機能について、または別の記事で紹介していきますので、先ずは今回の記事を元にイメージの作成などを行っていただければと思います。

関連する記事


Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  • スポンサーリンク