Help us understand the problem. What is going on with this article?

Dockerを使ったCentOS + Apache + PHP + freetds 開発環境構築

この記事を書き始めたきっかけ

嬉しいことに、弊社もだんだんと人が増えて賑やかになってきました。
そこで、入社してすぐにやることといえば、開発環境構築ではないでしょうか。
今までは、Parallels DesktopやVirtualBoxを使って仮想OSをインストールして、各種設定ファイルをvimで編集して、・・・
結果、新人さんのPCで動かない。自分の環境では動くのになんで!?みたいなことが発生するのは容易に想像がついてしまうんですよね。

そこで、少ない手順で、同一環境を構築できるようにとDockerを使って開発環境してみようと思います。
これで、今後新しいエンジニアさんが来ても↑の結果のようなことにならない・・・はず。

検証環境

  • MacOS X Mojave 10.14.6

手順

  1. Docker for macのインストール 以下のリンクからDocker Desktop for Macをインストールする。

https://www.docker.com/products/docker-desktop

  1. Dockerfile,各ソフトウェアの設定ファイルの準備 Dockerfileは、コンテナを作成するためのレシピになります。 今回はCentOS6.8のコンテナをベースに、Apache、PHP5.6、freetds(SQLServerに接続するためのライブラリ)をインストールします。

2.1. ディレクトリ構成
以下の構成で作成します。

$ tree
.
└── dev-server
    ├── Dockerfile
    ├── apache
    │   ├── httpd.conf
    │   └── httpd.vh80.conf
    ├── freetds
    │   └── freetds.conf
    └── php
        └── php.ini

2.2. 設定ファイル
- Apache(httpd.conf, httpd.vh80.conf)
httpd.confと、VirtualHost毎(今回はポート80番にアクセスがあった際の設定のみ作成します。)の設定ファイルを作成しました。

dev-server/apache/httpd.conf
# アクセスログ、エラーログの設定は省略

# VirtualHostの設定ファイルの読み込み
Include ./conf/httpd.vh80.conf

dev-server/apache/httpd.vh80.conf
# VirtualHostの設定
# ポート80番でアクセスされた場合の設定を記載
Listen 80

<VirtualHost *:80>
  DocumentRoot "/var/dev-api/htdocs"
  <Directory "/var/dev-api/htdocs">
    Options FollowSymLinks
    AllowOverride All
  </Directory>
</VirtualHost>

  • PHP(php.ini)
    初期状態から最大メモリ割当量と、タイムゾーンの設定のみ変更
dev-server/php/php.ini
; メモリ上限を開発環境に合わせて上限を上げてあげる(ここでは512MBほど割り当ててみる)
; Maximum amount of memory a script may consume (128MB)
; http://www.php.net/manual/en/ini.core.php#ini.memory-limit
;memory_limit = 128M
memory_limit = 512M

; ###中略###

[Date]
; タイムゾーンを"Asia/Tokyo"に変更する。
; Defines the default timezone used by the date functions
; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
date.timezone = Asia/Tokyo

  • freetds(freetds.conf)
dev-server/freetds/freetds.conf
# Production
[productiondb.windows.net,1234]
host = productiondb.windows.net
port = 1234
tds version = 8.0

# Staging
[stagingdb.windows.net,1433]
host = stagingdb.windows.net
port = 1433
tds version = 8.0

# Test
[testdb.windows.net,1433]
host = testdb.windows.net
port = 1433
tds version = 8.0

  • Dockerfile
    CentOS 6.8のイメージを元にして、開発環境のイメージを作成するDockerfileを作成する。
dev-server/Dockerfile
# CentOS 6.8
FROM centos:6.8
RUN yum update -y && yum clean all

# Add repositories
# EPEL
RUN yum install -y epel-release
# remi
RUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

# Install apache
RUN yum install -y httpd
RUN chkconfig httpd on

# Install PHP modules
RUN yum install -y --enablerepo=remi,remi-php56 php php-devel php-mbstring php-mysql php-sybase_ct php-json php-xml php php-gd
RUN yum -y install mod_ssl
RUN yum install -y freetds freetds-devel
RUN yum -y install cronolog


# Copy freetds.conf
# TODO docker-compose.yml でマウントする設定にする。
RUN mv /etc/freetds.conf /etc/freetds.conf.org
COPY freetds/freetds.conf /etc/freetds.conf

# Copy httpd.conf
RUN mv /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
COPY apache/*.conf /etc/httpd/conf/

# Copy php.ini
COPY php/php.ini /etc/httpd/conf.d/php.ini

# Install composer
COPY --from=composer /usr/bin/composer /usr/local/bin/composer

# make directories
RUN mkdir -p /var/dev-server

# Port
EXPOSE 80

# docker runの時に実行する
# これでdocker run した場合、すぐにコンテナがとまってしまう。要改善
# CMD ["/etc/init.d/httpd", "start"]

  1. 実行する 実行する際は、docker runコマンドにオプションを指定する。
$ docker run -itd -v .php_projects/dev-server:/var/dev-server -p 1122:80 {コンテナID} /bin/sh

このままではApacheが起動しないので、docker exec コマンドでApacheを実行する。

$ docker exec {コンテナID} /etc/init.d/httpd start

まだ解決していない問題

今回は、Dockerfilerを作成して、コンテナの起動→コンテナに対してApache起動コマンドを実行するという2段階の手順を踏んでコンテナを起動しているが、ここをdocker run実行時に一発でApache起動までさせて楽にしたいです。
解決方法が判明次第、この記事も更新しようと思います。

あとがき

会社のMacのOSをやっと最新版にしました。
今のところ、上記の方法でも実行できそうです。

koji-oura
普段は、Android/iOSアプリ、サーバーサイドの開発しています。
ayudante
いつもユーザー中心で技術者とコンサルタントがとことん考え抜く それがアユダンテです
https://ayudante.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした