CentOS 7のDockerでコンテナ型仮想化のコンテナ作成と基本的な操作を行ってみる

docker-operation-top

Photo by Fox from Pexels

前回の記事でDocker CE環境構築とDockerの基本的な操作方法を説明しました。
今回の記事では前回に引き続き、作成したDocker CEの環境を使って、Dockerの基本的な操作をもう少し踏み込んで紹介したいと思います。まだDocker CEの環境を構築していない場合には以下の記事を参考に、導入と基本的な操作を行ってみて下さい。

参考 Docker CEのインストール

Open Source
centos-docker-install-top
Linux CentOS 7にDocker CEをインストールしてコンテナ型仮想化を使ってみる

最近のサーバー構築全般に言えることですが、物理的なサーバーやネットワーク機器を構築することが少なくなってきました。理由としてはシステムの仮想化の技術が進んだことだと思います。システムの仮想化は少し前だとVMWareやHyper-V、KVMぐ ...

Docker CEの基本的な操作ですが、Dockerを利用する上でよく使う「コンテナの作成及び起動」と「仮想環境のベースとなるImageの作成」をメインに紹介していきます。具体的には以下の内容までを行います。

今回の記事で行う内容

  • インターネット上のDocker HubからImageをダウンロードしてコンテナを作成および起動
  • 作成したコンテナからImageの作成
  • 作成Imageを元にコンテナを作成してApache httpdをインストール
  • コンテナからApache httpdが自動的に起動するImageを作成

DockerでのImage作成方法については前の記事でも少し紹介しましたが、以下の2つの方法があります。

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

Dockerでは1.の方法でコンテナ環境から作成するより、2.のDockerfileを利用することが推奨されていますが、本記事ではコンテナやImageの基本的操作を説明するために、コンテナを元にしたImageの作成方法を紹介していきます。

Dockerfileについては別の記事で紹介する予定です。

1. 利用するDockerの環境

本記事で利用するDocker CEの環境は前回の記事で構築した環境になります。

Open Source
centos-docker-install-top
Linux CentOS 7にDocker CEをインストールしてコンテナ型仮想化を使ってみる

最近のサーバー構築全般に言えることですが、物理的なサーバーやネットワーク機器を構築することが少なくなってきました。理由としてはシステムの仮想化の技術が進んだことだと思います。システムの仮想化は少し前だとVMWareやHyper-V、KVMぐ ...

記事中でも紹介していますが、ここでもDockerが動作している環境をまとめておきます。

Docker CEの環境

  • 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-operation-01

イメージ名の「centos」をクリックすることでImageの詳細が確認できます。

docker-operation-02

詳細に「Copy and paste to pull this image」とImageをPullするコマンドが記載されています。
以下のように実行することでImageをPull出来ることが分かります。

 command
# docker pull centos

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

docker search 検索するキーワード

CentOSのImageを検索する場合、以下のように"docker search"コマンドを実行します。

 command
# docker search centos
NAME DESCRIPTION AUTOMATED
centos The official build of CentOS.
ansible/centos7-ansible Ansible on Centos7 [OK]
jdeathe/centos-ssh CentOS-6 6.10 x86_64 / CentOS-7 7.5. [OK]
consol/centos-xfce-vnc Centos container with "headless" VNC [OK]
Imagegine10255/centos6-lnmp-php56 centos6-lnmp-php56 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server
tutum/centos Simple CentOS docker Image with SSH
centos/postgresql-96-centos7 PostgreSQL is an advanced Object-Rel
kinogmt/centos-ssh CentOS with SSH [OK]
centos/php-56-centos7 Platform for building and running PH
pivotaldata/centos-gpdb-dev CentOS Image for GPDB development. T
drecom/centos-ruby centos ruby [OK]
mamohr/centos-java Oracle Java 8 Docker Image based on [OK]
darksheer/centos Base Centos Image -- Updated hourly [OK]
pivotaldata/centos Base centos, freshened up a little w
pivotaldata/centos-mingw Using the mingw toolchain to cross-c
miko2u/centos6 CentOS6 日本語環境 [OK]
pivotaldata/centos-gcc-toolchain CentOS with a toolchain, but unaffil
mcnaughton/centos-base centos base Image [OK]
indigo/centos-maven Vanilla CentOS 7 with Oracle Java De [OK]
blacklabelops/centos CentOS Base Image! Built and Updates [OK]
pivotaldata/centos7-dev CentosOS 7 Image for GPDB developmen
smartentry/centos centos with smartentry [OK]
fortinj66/centos7-s2i-nodejs based off of ryanj/centos7-s2i-nodej
pivotaldata/centos6.8-dev CentosOS 6.8 Image for GPDB developm

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

2-2. CentOS ImageのPull

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

docker pull Image名

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

 command
# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
8ba884070f61: Pull complete
Digest: sha256:b5e66c4651870a1ad435cd75922fe2cb943c9e973a9673822d141482
Status: Downloaded newer Image for centos:latest

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

 command
# docker images
REPOSITORY TAG Image ID CREATED
centos latest 9f38484d220f 2 months ag

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

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

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

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

コンテナの作成は "docker create"コマンドで行いますが、コンテナの作成と起動を同時に行う"docker run"コマンドのほうが使い勝手が良いため、ここでは"docker run"コマンドを利用します。
"docker run"コマンドは以下のように利用します。

docker run [オプション1] [オプション2] [オプション3] Image名

"docker run"コマンドには多くのオプションがありますが、ここでは最低限必要となるオプションのみでコンテナの作成と起動を行います。ここでは以下のオプションを指定して"docker run"コマンドを実行します。

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

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

 command
# docker run -d -it --name centos76 centos
fc77aa03a04aa396267e019d0f2089d46d2d8480f92c3964932a5f9f44bd146d

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

 command
# docker ps -a
CONTAINER ID Image COMMAND CREATED STATUS PORTS NAMES
fc77aa03a04a centos "/bin/bash" 5 seconds ago Up 3 seconds centos76

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

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

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

docker exec [オプション1] [オプション2] [オプション3] コンテナ名 シェル名

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

 command
# docker exec -it centos76 bash

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

 command
[root@0f8535c2b95a /]#

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

 command
[root@0f8535c2b95a /]
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

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

 command
# ping 192.168.241.254
PING 192.168.241.254 (192.168.241.254) 56(84) bytes of data.
64 bytes from 192.168.241.254: icmp_seq=1 ttl=254 time=0.947 ms
64 bytes from 192.168.241.254: icmp_seq=2 ttl=254 time=0.900 ms

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

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番ポートを利用してコンテナに接続する場合は

 command
# docker run -d -it -p 80:80 --name centos76-httpd centos

のような形になります。

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

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

 command
# docker run -d -it -p 80:80 --name centos76-httpd centos
ed31479a5b1e501633e4cf743c6f5c3052d35be0abf8c2acc39c4da3a2935c31

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

 command
# docker ps -a
CONTAINER ID Image COMMAND CREATED STATUS PORTS NAMES
ed31479a5b1e centos "/bin/bash" 3 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp centos76-httpd
0f8535c2b95a centos "/bin/bash" 6 minutes ago Up 6 minutes centos76

ポートフォワーディング用のオプションを付与して作成した「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"コマンドで接続します。

 command
# docker exec -it centos76-httpd bash

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

 command
[root@ed31479a5b1e /]#

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

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

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

 command
[root@ed31479a5b1e /]# yum search httpd
python2-keycloak-httpd-client-install.noarch : Tools to configure Apache HTTPD as Keycloak client
httpd.x86_64 : Apache HTTP Server
httpd-devel.x86_64 : Development interfaces for the Apache HTTP server
httpd-manual.noarch : Documentation for the Apache HTTP server
httpd-tools.x86_64 : Tools for use with the Apache HTTP Server
libmicrohttpd.i686 : Lightweight library for embedding a webserver in applications
libmicrohttpd.x86_64 : Lightweight library for embedding a webserver in applications
mod_auth_mellon.x86_64 : A SAML 2.0 authentication module for the Apache Httpd Server
mod_dav_svn.x86_64 : Apache httpd module for Subversion server
Name and summary matches only, use "search all" for everything.

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

  • httpd.x86_64 : Apache HTTP Server

になります。

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

先の手順で確認した「httpd.x86_64」パッケージをインストールします。"yum install"コマンドでパッケージのインストールを行います。

 command
[root@ed31479a5b1e /]# yum -y install httpd
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
* base: mirrors.cat.net
* extras: mirrors.cat.net
* updates: mirrors.cat.net
Resolving Dependencies
--> Running transaction check
---> Package httpd.x86_64 0:2.4.6-89.el7.centos will be installed
--> Processing Dependency: httpd-tools = 2.4.6-89.el7.centos for package: httpd-2.4.6-89.el7.centos.x86_64
--> Processing Dependency: system-logos >= 7.92.1-1 for package: httpd-2.4.6-89.el7.centos.x86_64
--> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-89.el7.centos.x86_64
--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-89.el7.centos.x86_64Installing:
httpd x86_64 2.4.6-89.el7.centos updates 2.7 M
Installing for dependencies:
apr x86_64 1.4.8-3.el7_4.1 base 103 k
apr-util x86_64 1.5.2-6.el7 base 92 k
centos-logos noarch 70.0.6-3.el7.centos base 21 M
httpd-tools x86_64 2.4.6-89.el7.centos updates 90 k
mailcap noarch 2.1.41-2.el7 base 31 kTransaction Summary
Install 1 Package (+5 Dependent packages)
Total download size: 24 M
Installed size: 31 M
Downloading packages:
【略】
Installed:
httpd.x86_64 0:2.4.6-89.el7.centos
Dependency Installed:
apr.x86_64 0:1.4.8-3.el7_4.1 apr-util.x86_64 0:1.5.2-6.el7
centos-logos.noarch 0:70.0.6-3.el7.centos httpd-tools.x86_64 0:2.4.6-89.el7.centos
mailcap.noarch 0:2.1.41-2.el7
Complete!
[root@ed31479a5b1e /]#

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

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

Apache httpdパッケージがインストールできましたので、「httpd」を起動してホスト側から接続できるかを確認してみます。CentOSではサービスの起動に"systemctl start"コマンドを利用しますが、ここでは「/sbin」にインストールされたhttpdを直接、起動します。

ここで"systemctl"コマンドを利用しない理由は後ほど説明します。

 command
[root@ed31479a5b1e /]# /sbin/httpd

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

 command
[root@ed31479a5b1e /]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 11820 1684 pts/0 Ss+ 09:13 0:00 /bin/bash
root 14 0.0 0.1 11820 1916 pts/1 Ss 09:15 0:00 bash
root 90 0.0 0.3 224052 3456 ? Ss 09:17 0:00 /sbin/httpd
apache 91 0.0 0.2 224052 2952 ? S 09:17 0:00 /sbin/httpd
apache 92 0.0 0.2 224052 2952 ? S 09:17 0:00 /sbin/httpd
apache 93 0.0 0.2 224052 2952 ? S 09:17 0:00 /sbin/httpd
apache 94 0.0 0.2 224052 2952 ? S 09:17 0:00 /sbin/httpd
apache 95 0.0 0.2 224052 2952 ? S 09:17 0:00 /sbin/httpd
root 97 0.0 0.1 51740 1740 pts/1 R+ 09:17 0:00 ps -aux

上記のように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作成には概要でも記載しましたが

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

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

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

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

 command
# docker stop centos76-httpd
centos76-httpd

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

 command
# docker ps -a
CONTAINER ID Image COMMAND CREATED STATUS PORTS NAMES
ed31479a5b1e centos "/bin/bash" 8 minutes ago Exited (137) 15 seconds ago centos76-httpd
0f8535c2b95a centos "/bin/bash" 14 minutes ago Up 14 minutes

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

5-2. docker commit の実行

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

 commanddocker commit [Imageの元になるコンテナ名] [新規で作成するImage名]

ここではImageの元になるコンテナとして「centos76-httpd」を、作成するImageの名前は「centos76-httpd-image-01」として実行してみます。以下のように"docker commit"コマンドを実行します。

 command
# docker commit centos76-httpd centos76-httpd-image-01
sha256:78cda478463cc6a49961362e3521ca79bb3ea5ae2fc15ff75e65a0526f723861

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

 command
# docker images
REPOSITORY TAG Image ID CREATED SIZE
centos76-httpd-image-01 latest 78cda478463c 16 seconds ago 334MB
centos latest 9f38484d220f 3 months ago 202MB

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コマンドの実行時に、以下のようなエラーで利用することができません。

 command
[root@ed31479a5b1e /]# systemctl start httpd
Failed to get D-Bus connection: Operation not permitted

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

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

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

--privileged 特権モードでコンテナを作成

実行するシェルには

 code
/sbin/init

を指定します。また "-it"オプションを付与するとsystemctlが実行できなかったため、"-it"オプションを外しています。

-itオプションはコンソールへ接続する"docker exec"実行時に指定します。

以下のようオプションを付けて"docker run"を実行しました。

 command
# docker run -d --privileged -p 80:80 --name centos76-httpd-inst centos76-httpd-image-01 /sbin/init
b76b0623c7361c6318b60c8c2b8813be41d36c2693f620e84c4392db054e6f67

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

 command
# docker ps -a
CONTAINER ID Image COMMAND CREATED STATUS PORTS NAMES
b76b0623c736 centos76-httpd-image-01 "/sbin/init" 6 seconds ago Up 5 seconds 0.0.0.0:80->80/tcp centos76-httpd-inst
ed31479a5b1e centos "/bin/bash" 10 minutes ago Exited (137) 2 minutes ago centos76-httpd
0f8535c2b95a centos "/bin/bash" 17 minutes ago Up 17 minutes centos76

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

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

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

 command
# docker exec -it centos76-httpd-inst bash

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

 command
[root@b76b0623c736 /]# yum list installed | grep httpd
httpd.x86_64 2.4.6-89.el7.centos @updates
httpd-tools.x86_64 2.4.6-89.el7.centos @updates

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

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

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

 command
[root@b76b0623c736 /]# systemctl start httpd

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

 command
[root@b76b0623c736 /]# systemctl status httpd
 httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2019-06-13 09:25:27 UTC; 11s ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 3458 (httpd)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /docker/b76b0623c7361c6318b60c8c2b8813be41d36c2693f620e84c4392db054e6f67/system.slice/httpd.service
tq3458 /usr/sbin/httpd -DFOREGROUND
mq3463 /usr/sbin/httpd -DFOREGROUND
? 3458 /usr/sbin/httpd -DFOREGROUND

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

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

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

 command
# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

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

 command
[root@b76b0623c736 /]# systemctl is-enabled httpd
enabled

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

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

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

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

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

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

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

になります。

8-1. コンテナの停止

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

 command
# docker ps -a
CONTAINER ID Image COMMAND CREATED STATUS PORTS NAMES
b76b0623c736 centos76-httpd-image-01 "/sbin/init" 3 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp centos76-httpd-inst
ed31479a5b1e centos "/bin/bash" 14 minutes ago Exited (137) 6 minutes ago centos76-httpd
0f8535c2b95a centos "/bin/bash" 21 minutes ago Up 21 minutes centos76

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

 command
# docker stop centos76-httpd-inst
centos76-httpd-inst

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

 command
# docker ps -a
CONTAINER ID Image COMMAND CREATED STATUS PORTS NAMES
b76b0623c736 centos76-httpd-image-01 "/sbin/init" 4 minutes ago Exited (137) 3 centos76-httpd-inst
ed31479a5b1e centos "/bin/bash" 15 minutes ago Exited (137) 7 centos76-httpd
0f8535c2b95a centos "/bin/bash" 21 minutes ago Up 21 minutes centos76

「centos76-httpd-inst」コンテナが停止していることが確認できます。

8-2. Imageの作成

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

 command
# docker commit centos76-httpd-inst centos76-httpd-image-02
sha256:3030eb260e5eacc9b2dd9f909dd1d3a3d43f85077dc4f016ec333a475672ebd6

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

 command
# docker images
REPOSITORY TAG Image ID CREATED SIZE
centos76-httpd-image-02 latest 3030eb260e5e 5 seconds ago 357MB
centos76-httpd-image-01 latest 78cda478463c 6 minutes ago 334MB
centos latest 9f38484d220f 3 months ago 202MB

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

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

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

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

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

 command
# docker run -d --privileged -p 80:80 --name centos76-httpd-enable centos76-httpd-image-02 /sbin/init
29f90aa013f2952eeb9b6c3b8549c462b6f9a65280460ea83d410ee3ae826186

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

 command
# docker ps -a
CONTAINER ID Image COMMAND CREATED STATUS PORTS NAMES
29f90aa013f2 centos76-httpd-image-02 "/sbin/init" 4 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp centos76-httpd-enable
b76b0623c736 centos76-httpd-image-01 "/sbin/init" 6 minutes ago Exited (137) 2 centos76-httpd-inst
ed31479a5b1e centos "/bin/bash" 17 minutes ago Exited (137) 9 centos76-httpd
0f8535c2b95a centos "/bin/bash" 23 minutes ago Up 23 minutes centos76

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

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

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

 command
# docker exec -it centos76-httpd-enable bash
[root@29f90aa013f2 /]#

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

 command
[root@29f90aa013f2 /]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 43100 3328 ? Ss 09:30 0:00 /sbin/init
root 18 0.1 0.2 37120 2888 ? Ss 09:30 0:00 /usr/lib/systemd/systemd-journald
root 27 3.2 0.1 35056 1804 ? Ss 09:30 0:02 /usr/lib/systemd/systemd-udevd
root 140 0.0 0.4 224052 4976 ? Ss 09:30 0:00 /usr/sbin/httpd -DFOREGROUND
root 141 0.0 0.1 24252 1492 ? Ss 09:30 0:00 /usr/lib/systemd/systemd-logind
dbus 143 0.0 0.2 58096 2112 ? Ss 09:30 0:00 /usr/bin/dbus-daemon --system --address=systemd: --n
root 155 0.0 0.0 9904 856 tty1 Ss+ 09:30 0:00 /sbin/agetty --noclear tty1 linux
apache 207 0.0 0.2 224052 2944 ? S 09:30 0:00 /usr/sbin/httpd -DFOREGROUND
apache 208 0.0 0.2 224052 2944 ? S 09:30 0:00 /usr/sbin/httpd -DFOREGROUND
apache 209 0.0 0.2 224052 2944 ? S 09:30 0:00 /usr/sbin/httpd -DFOREGROUND
apache 210 0.0 0.2 224052 2944 ? S 09:30 0:00 /usr/sbin/httpd -DFOREGROUND
apache 211 0.0 0.2 224052 2944 ? S 09:30 0:00 /usr/sbin/httpd -DFOREGROUND
root 3443 0.5 0.1 11820 1888 pts/0 Ss 09:31 0:00 bash
root 3456 0.0 0.1 51740 1744 pts/0 R+ 09:31 0:00 ps -aux

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

 command
[root@29f90aa013f2 /]# systemctl is-enabled httpd
enabled

「enabled」出力結果から、設定した自動起動が有効になっていることが確認できました。最後にブラウザからコンテナのhttpdにアクセスしてページが表示できることを確認します。

docker-operation-04

確認できました。これでCentOS上でApache httpdが自動起動するImageとコンテナの作成までが完了しました。

10. まとめ

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

[st_af name="linux-support-cta"]

  • この記事を書いた人
rem-profile-photo

レムシステム

レムシステムはPC・サーバー・ネットワークでの業務効率化を主な業務としている会社です。全国に対応しています。

-CentOS, Docker