[Docker] Cloud9 + PHP 7 環境を軽量なAlpine Linuxで構築する

年末年始ということで、作業環境の大掃除&断捨離をするべく、開発環境をDocker+Cloud9に移行中です。今回は、どのマシンからも同じCloud9環境を短時間で構築するべく、DockerでCloud9を構築します。軽量化もしたいので、ベースはAlpine Linuxにしました。

環境

マシン:MacBook 12インチ(early 2016)
Docker: 17.09.1-ce-mac42
docker-compose: 1.17.1

オリジナルのDockerイメージ

こちらのDockerイメージをベースに使わせてさせていただきました。

anatolinicolae/cloud9-docker

ディレクトリ構成

cloud9
└── .gitignore
└── c9_config //<--設定ディレクトリ
    └── .nakignore
    └── metadata
    └── project.settings
    └── state.settings
└── Dockerfile
└── docker-compose.yml

Dockerfile

FROM anatolinicolae/alpine-cloud9
MAINTAINER c0d3man <hoge@fuga.com>

RUN sed -i -e 's/v3\.4/v3.6/g' /etc/apk/repositories
RUN apk --no-cache add php7 php7-fpm php7-mysqli php7-json php7-openssl php7-curl \
php7-zlib php7-xml php7-phar php7-intl php7-dom php7-xmlreader php7-ctype \
php7-mbstring nginx supervisor curl

オリジナルから修正点

レポジトリをv3.6にアップグレードする

オリジナルのDockerイメージはAlpine Linuxのレポジトリがv3.4になっています。

そのまま使う分には問題ないんですが、他のプログラムをインストールしようとすると、レポジトリが最新でないことでエラーになるので、レポジトリを最新にします。

RUN sed -i -e 's/v3\.4/v3.6/g' /etc/apk/repositories

参考:Upgrading Alpine

他のプログラムをインストール

オリジナルのDockerイメージは、シンプルなCloud9なので、Cloud9のターミナル上で各種プログラムを実行するために、プログラムもインストールします。

今回は、PHPをインストールしていますが、同じ要領で他のプログラムもインストール可能です。

RUN apk --no-cache add php7 php7-fpm php7-mysqli php7-json php7-openssl php7-curl \
php7-zlib php7-xml php7-phar php7-intl php7-dom php7-xmlreader php7-ctype \
php7-mbstring php7-gd nginx supervisor curl

docker-compose.yml

version: '2.2'
services:
  main:
    build: .
    container_name : cloud9-main
    volumes_from:
      - cloud9-data
    ports:
      - "8082:80"
    restart: always
    cpu_count: 1
    cpu_percent: 50
    mem_limit: 512000000
  data:
    image: busybox
    container_name: cloud9-data
    volumes:
      - ~/Workspace:/workspace
      - ./c9_config:/workspace/.c9

複数の端末で同じ設定を使いまわすために

Cloud9の設定は、workspace以下の.c9ディレクトリに記録されるので、.c9ディレクトリをgitで管理するために、docker-compoaseと同じディレクトリに「c9_config」というディレクトリを作って、コンテナ内の.c9ディレクトリにマウントします。

- ./c9_config:/workspace/.c9

ただし、metadataディレクトリとstate.settingsファイルは画面の設定の記録なので、こちらは.gitignoreで同期させないようにします。
(都度git pushするのが面倒なので)

c9_config/metadata/
c9_config/state.settings

ここはリアルタイムで保存されると便利なので、Google Driveに移すなり後日対処を考えたいと思います。

ホストマシンの負荷を下げる

メモリをバカ食いしたり、ホストマシンがパツパツになって固まるのは嫌なので、制限を入れています。

    cpu_count: 1
    cpu_percent: 50
    mem_limit: 512000000

起動

準備ができたら起動します。

docker-compose build
docker-compose up -d

イメージサイズ

DockerでCloud9というと、kdelfour/supervisor-dockerがよく出てきますが、ベースイメージをUbuntuなのでイメージサイズ802MBもあります。

今回のAlpine Linuxベースの場合、PHP込みで500M以下(494MB)に抑えることができました。
(ちなみに、オリジナルのanatolinicolae/alpine-cloud9は441MBです)

500MBくらいだとdocker pullもすぐ終わるので地味にうれしいところです。

確認

localhost:8082にアクセスするとCloud9が立ち上がるはずです。

今後の予定

DBサーバーや他のサービスとの連携をやりたいので、docker-compose.ymlを拡張予定です。


簡単にですが、DockerでCloud9(Alpine Linuxベース + PHP)を構築してみました。

このままどっかのサーバーにアップするか、ラズパイZeroあたりでも同じように構築してポータブル開発環境を構築するかなど、Dockerを使っているといろいろイメージが膨らみますね。