Dockerfileを用いてapache,php,postgresqlをインストールしたCentOS7のimageの作成

ソフトウェア

Dockerfileを作成することで、環境構築が非常に楽になります。

最近、Apache,php,postgresqlをインストールしたCentOS7のimageを作成するDockerfileを作成したので記載します。

Dockerがインストールされていることは前提とします。

下記記事でインストールしているので必要であれば参照してください。

Dockerfileを作成する

まずは適当な場所にDockerfileを作成します。

フォルダ名も適当です。

私は/home/[ユーザー名]の配下にdocker_centos7というフォルダを作成し、その下にDockerfileを作成しました。

mkdir /home/[ユーザー名]/docker_centos7
cd /home/[ユーザー名]/docker_centos7
touch Dockerfile

作成したDockerfileを編集します。

vi Dockerfile

下記の通りに記載します。

FROM centos:centos7

RUN <<EOF
yum -y install epel-release
yum -y install https://repo.ius.io/ius-release-el7.rpm
yum -y update
yum --disablerepo=ius,epel --enablerepo=base -y install centos-logos.noarch mailcap openldap-devel expa-devel libdb-devel openssl perl
yum --disablerepo=ius --enablerepo=epel -y install nghttp2 brotli
yum -y install --disablerepo=base,extras,updates,epel --enablerepo=ius httpd httpd-devel mod_ssl
EOF

RUN <<EOF
yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum -y install --enablerepo=remi,remi-php82 php php-mbstring php-xml php-xmlrpc php-gd php-pdo php-pecl-mcrypt php-mysqlnd php-pecl-mysql
EOF

RUN <<EOF
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum install -y postgresql15-server
EOF

記載完了したら保存してください。

Dockerファイルに記載した内容

Webサーバーの基本的なパッケージのインストール、PHPのパッケージのインストール、postgresqlのパッケージのインストールに分けて説明します。

Webサーバーの基本的なパッケージをインストールするための記載

RUN <<EOF
…
EOF

こちらはヒアドキュメントの書き方でEOFが出てくるまで実行することを意味します。

ヒアドキュメントとは複数行に渡る文字列をプログラム内に埋め込むための書き方です。

yum -y install epel-release

こちらではepel-releaseをインストールしています。

epel-releaseとはCentOSに追加の機能を提供するEPELリポジトリを有効化するパッケージです。

yum -y install https://repo.ius.io/ius-release-el7.rpm

IUSリポジトリを有効化するためのパッケージをインストールしています。

IUSリポジトリはOS標準では搭載されていないサードパーティ製のパッケージを提供してくれます。

yum -y update

これはOSで入れているパッケージを全てアップデートするコマンドで、OSを入れたら必ずやるコマンドです。

yum --disablerepo=ius,epel --enablerepo=base -y install centos-logos.noarch mailcap openldap-devel expa-devel libdb-devel openssl perl

centos-logos.noarch、mailcap…などのパッケージをインストールしています。

disablerepoでは見に行かないようにするリポジトリを指定でき、enablerepoでは見に行くリポジトリを指定できます。

ここではbaseリポジトリを指定しています。

ちなみにbaseリポジトリはOSをインストールしたタイミングで有効化されています。

インストールしたパッケージのcentos-logos.noarchはCentOSのロゴやアイコンを提供してくれます。

mailcapはメールクライアントなどのMIME対応のアプリケーションが他のMIMEタイプのファイルにどう反応するか設定できます。

MIMEタイプはファイルなどのコンテンツの形式を表現する識別子です。

例えばtextとimage/jpegは異なるMIMEタイプです。

openldap-develはopenLDAPの開発に必要なライブラリやヘッダファイルを提供するパッケージです。

LDAPはLightweight Directory Access Protocolを指していて、ネットワーク上のディレクトリサービスにアクセスするための標準プロトコルです。

ディレクトリサービスは、ユーザー、グループ、デバイス、アプリケーションを一元的に管理する仕組みです。

ユーザー認証や電子メールアドレスの検証はこの仕組みを使います。

expa-develはEXPOの開発者向けパッケージです。

EXPOはReact Nativeを使用してAndroid、iOS、ウェブアプリケーションを開発するためのプラットフォームです。

React NativeとはFacebook社が開発したオープンソースのモバイルアプリケーションフレームワークです。

このフレームワークを利用するとJavascriptを使用してAndroi、iOSのネイティブアプリケーションを作成できます。

ネイティブなアプリケーションとは特定のOS用のアプリケーションで、特定のOSの純粋なAPI等を使用して作成されるためパフォーマンスがよくなります。

libdb-develとは、Berkeley DBを利用するアプリケーションを開発するための開発者向けパッケージです。

Berkeley DBはアプリケーション組み込み型のデータベースライブラリです。

opensslはSSL/TLSプロトコルを実装するためのパッケージです。

最後にperlはperlプログラミング言語の実行環境やperlで記述されたライブラリやアプリケーションのパッケージです。

インストール対象は要否考えて必要なものを入れましょう。

PHPパッケージをインストールするための記載

RUN <<EOF
yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum -y install --enablerepo=remi,remi-php82 php php-mbstring php-xml php-xmlrpc php-gd php-pdo php-pecl-mcrypt php-mysqlnd php-pecl-mysql
EOF

まずは、remi-release-7.rpmをインストールしています。

yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

CentOS7にインストールできるRemi’s RPMリポジトリを有効化するためのパッケージです。

Remi’s RPMリポジトリには、PHP、MySQL、PostgreSQLなどのパッケージが含まれます。

インストールしたRemi’s RPMパッケージを使ってPHP関連のパッケージをインストールします。

yum -y install --enablerepo=remi,remi-php82 php php-mbstring php-xml php-xmlrpc php-gd php-pdo php-pecl-mcrypt php-mysqlnd php-pecl-mysql
EOF

phpパッケージは、PHPプログラミング言語の実行環境やphpで記述されたライブラリやアプリケーションを使用できます。

php-mbstringはPHPでマルチバイト文字列をサポートするためのモジュールです。

php-xmlはPHPにXMLの処理機能を追加するモジュールです。

php-xmlrpcはXML-RPCプロトコルのサポートを提供するモジュールです。

XML-RPCとは、ウェブやアプリケーション間でデータをやり取りするためのプロトコルです。

php-gdはPHPに画像処理機能を追加するモジュールです。

php-pdoはPHPでデータベースへのアクセスができるようにします。

php-pecl-mcryptはPHPのデフォルトの暗号化機能よりも強力かつ柔軟な暗号化をできるようにするモジュールです。

php-pecl-mysqlはPHPにmySQLデータベースへの接続機能を提供するモジュールです。

postgresqlパッケージをインストールするための記載

RUN <<EOF
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum install -y postgresql15-server
EOF

まずはpgdg-redhat-repo-latest.noarch.rpmをインストールします。

yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm

pgdg-redhat-repo-latest.noarch.rpmはRed Hat系ディストリビューションのLinux OSにPostgreSQLリポジトリを追加するためのRPMパッケージです。

インストールしたパッケージを用いてpostgresql15-serverをインストールします。

yum install -y postgresql15-server

postgresql15-serverをインストールすると、PostgreSQL 15のデータベースサーバーをインストールできます。

Dockerfileの作成完了です。

Dockerfileからimageを作成する

docker buildコマンドでDockerfileからイメージを作成できます。

docker build -t centos7_apachephppostgres ./

docker imagesコマンドで作成したイメージを確認できます。

docker images

作成したimageでdockerのコンテナを作成する

docker runコマンドで確認したimageでコンテナを作成してみましょう。

docker run -itd -p [IPアドレス]:8080:80 --privileged centos7_apachephppostgres /sbin/init

-itで標準入力・標準出力・標準エラーをコンテナに接続します。

コマンドを実行したターミナルエミュレーター(私の場合Tera Term)がコンテナの入力・出力を受け付けるインターフェースになります。

-dでコンテナをバックグラウンド起動します。

バックグラウンド起動することで標準出力・標準エラーがターミナルエミュレーターに表示されなくなります。

-pはコンテナのポートとホスト(コンテナを動かしているシステム)のポートのマッピングを行います。

私の記載であれば、指定したIPのシステム(ホスト)のポート8080にコンテナのポート80を接続しています。

8080は適当ですので他のポート番号でも構いません。

–privilegedはコンテナに権限を与えます。

ホストのデバイスにアクセスしたり、ネットワークにアクセスしたりする権限を与えます。

centos7_apachephppostgresは本手順内で作成したimageの名称です。

/sbin/initはコンテナ内でinitプロセスを起動します。

実行してエラーが発生しなければ完了です。

docker psコマンドで存在するコンテナを一覧表示できます。

docker ps -a

-aをつけることで停止しているコンテナを含めて存在するコンテナ全てを一覧表示できます。

結果として、先ほどのimageで作成されたコンテナのコンテナIDが表示されているはずです。

dockerのコンテナを起動する

起動して一応プロセスに入ってみましょう。

docker startコマンドで起動できます。

docker start [コンテナID]

起動したコンテナにdocker execでアクセスします。

docker exec -it  [コンテナID] /bin/bash

-itで標準入力・標準出力・標準エラーをコンテナに接続します。

/bin/bashでbashシェルを起動します。

アクセスできれば完了です。

apache,php,postgresqlインストールしたコンテナを作成できました。

インストールしただけですのでアプリケーションごとにまだ設定は必要です。

タイトルとURLをコピーしました