takaya030の備忘録

PHP、Laravel、Docker などの話がメインです

Docker と Lumen を使って Google App Engine for PHP の開発環境を作る

はじめに

今まで GAE は Twitter Bot をいくつか動かす程度にしか使っていませんでしたが、こちらの記事を読んで感化され、本格的に使うために開発環境を構築してみました。
cloud-ja.googleblog.com

以前にも Docker で GAE for PHP の環境は作ったことはありましたが、改めて見るとイケてなかったので良い機会なので作り直しました。
takaya030.hatenablog.com


ポイントは以下の二点です。

  • GAE for PHP が対応している PHP の最新バージョンは 5.5.34 (2017年6月現在)
  • PHP の Memcache や Memcached 拡張がインストールされていると SDK のアプリがローカルで動作しないため、サーバーの PHP はソースビルドでインストールする

検証環境

Windows10 Home Edition
VirtualBox 5.1.22
Docker version 17.05.0-ce, build 89658be
docker-compose version 1.6.2, build 4d72027

ディレクトリ構成

+---gae
|   |   docker-compose.yml
|   |   
|   +---composer
|   |       Dockerfile
|   |       
|   +---data
|   |       Dockerfile
|   |       
|   +---phpcli
|   |       Dockerfile
|   |       
|   +---sdk
|           Dockerfile
|            
+---logs
|    
+---www

各種設定ファイル

gae/docker-compose.yml

version: "2"
services:
  data:
    build: ./data
    volumes:
      - ../:/data
  composer:
    build: ./composer
    volumes_from:
      - data
  phpcli:
    build: ./phpcli
    volumes_from:
      - data
  sdk:
    build: ./sdk
    volumes_from:
      - data
    ports:
      - "8080:8080"
      - "8000:8000"

gae/composer/Dockerfile

FROM php:5.5.34
LABEL maintainer "takaya030"

WORKDIR /tmp

RUN apt-get update -y && \
	apt-get install -y git unzip sudo && \
	apt-get clean

# create docker user
RUN useradd -d /home/docker -m -s /bin/bash -u 1000 -g 50 docker

# install composer
RUN curl -sS https://getcomposer.org/installer | php && \
	mv composer.phar /usr/local/bin/composer && \
	composer self-update

ENV COMPOSER_HOME /home/docker/.composer
RUN sudo -u docker composer global require hirak/prestissimo

RUN mkdir -p /data/www
VOLUME ["/data"]
WORKDIR /data/www

USER 1000

ENTRYPOINT ["composer"]
CMD ["--help"]

gae/data/Dockerfile

FROM busybox
LABEL maintainer "takaya030"

RUN mkdir -p /data
VOLUME ["/data"]
CMD ["true"]

gae/phpcli/Dockerfile

主に artisan コマンドを実行するためのイメージです

FROM php:5.5.34
LABEL maintainer "takaya030"

RUN apt-get update && \
  apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng12-dev libmcrypt-dev && \
  docker-php-ext-install pdo_mysql mysqli mbstring gd iconv mcrypt && \
  apt-get clean

RUN mkdir -p /data/www
VOLUME ["/data"]
WORKDIR /data/www

ENTRYPOINT ["php"]
CMD ["--version"]

gae/sdk/Dockerfile

FROM google/cloud-sdk:alpine
LABEL maintainer "takaya030"

# build PHP 5.5.34
RUN apk add --update --no-cache --virtual .persistent-deps \
		ca-certificates \
		curl \
		tar \
		libpng \
		libxml2 \
		xz
RUN apk add --no-cache --virtual .build-deps \
	autoconf \
	dpkg-dev dpkg \
	file \
	g++ \
	gcc \
	libc-dev \
	make \
	pcre-dev \
	pkgconf \
	re2c \
	coreutils \
	curl-dev \
	libedit-dev \
	libxml2-dev \
	libpng-dev \
	sqlite-dev \
	libressl \
	libressl-dev \
	zlib-dev \
  && curl -Lso php-5.5.34.tar.gz http://jp2.php.net/get/php-5.5.34.tar.gz/from/this/mirror && \
	tar xvzf php-5.5.34.tar.gz && \
	cd php-5.5.34 && \
	./configure --prefix=/usr/local/php-5.5.34/ \
    --enable-bcmath \
    --enable-calendar \
    --enable-ftp \
    --enable-mbstring \
    --enable-opcache \
    --enable-phar \
    --enable-soap \
    --enable-sockets \
    --enable-zip \
    --disable-fileinfo \
    --disable-flatfile \
    --disable-posix \
    --with-curl \
    --with-gd \
    --with-openssl \
    --without-sqlite3 \
    --without-pdo-sqlite \
    --without-imap \
    --without-kerberos \
    --without-imap-ssl \
    --without-interbase \
    --without-ldap \
    --without-mssql \
    --without-oci8 \
    --without-pgsql \
    --without-pear \
    --with-pdo-mysql=mysqlnd \
    --with-mysqli=mysqlnd \
    --with-mysql=mysqlnd \
	--with-config-file-path=/etc && \
	make && make install && \
	cp ./php.ini-production /etc/php.ini && \
	cd .. && \
	rm -r php-5.5.34 php-5.5.34.tar.gz \
  && apk del .build-deps

# modify /etc/php.ini
RUN sed -i -e "s/;date.timezone *=.*$/date.timezone = Asia\/Tokyo/" /etc/php.ini

# symbolic links
RUN ln -s /usr/local/php-5.5.34/bin/php /usr/local/bin/php && \
	ln -s /usr/local/php-5.5.34/bin/php-cgi /usr/local/bin/php-cgi && \
	ln -s /usr/local/php-5.5.34/bin/php-config /usr/local/bin/php-config && \
	ln -s /usr/local/php-5.5.34/bin/phpize /usr/local/bin/phpize

# install GAE for PHP SDK
RUN gcloud components install app-engine-php

# create docker user
RUN adduser -S -u 1000 -g 50 docker \
	&& echo 'docker:tcuser' | chpasswd

RUN mkdir -p /data/www
VOLUME ["/data"]
WORKDIR /data/www

USER 1000

CMD ["dev_appserver.py","--php_executable_path=/usr/local/bin/php-cgi","--host","0.0.0.0","--admin_host","0.0.0.0","./"]

イメージのビルド

gae ディレクトリに移動後、以下のコマンドでイメージをビルドします。

$ docker-compose build

Lumen のインストー

イメージビルド後、以下のコマンドで Lumen をインストールします。(www フォルダにインストールされます)
後述する GaeSupportLumen を使用する場合 Lumen 5.1 が必要なため下記の通り "v5.1.4" を指定します。

$ docker-compose run --rm composer create-project laravel/lumen . v5.1.4

GaeSupportLumen のインストー

Lumen インストール後、以下のコマンドで GaeSupportLumen をインストールします。

$ docker-compose run --rm composer require shpasser/gae-support-lumen:~1.0
$ docker-compose run --rm composer require illuminate/mail:~5.0

bootstrap/app.php を下記の通りに変更します。

--- bootstrap\app.php.orig   Mon Aug 03 21:56:04 2015
+++ bootstrap\app.php        Sat Jun 24 10:43:33 2017
@@ -19,7 +19,7 @@
     realpath(__DIR__.'/../')
 );

-// $app->withFacades();
+$app->withFacades();

 // $app->withEloquent();

@@ -80,6 +80,7 @@

 // $app->register(App\Providers\AppServiceProvider::class);
 // $app->register(App\Providers\EventServiceProvider::class);
+$app->register(Shpasser\GaeSupportLumen\GaeSupportServiceProvider::class);

 /*
 |--------------------------------------------------------------------------

以下のコマンドで GAE の各種設定を行います。

$ docker-compose run --rm phpcli artisan gae:setup --config my-gae-project

動作確認

以下のコマンドで開発用サーバーが起動します。

$ docker-compose up -d

web ブラウザで http://192.168.99.100:8080 にアクセスして以下の画面が表示されれば成功です。
f:id:takaya030:20170624114005p:plain

http://192.168.99.100:8000 にアクセスすると管理ページが表示されます。
f:id:takaya030:20170624114032p:plain

更新履歴

  • (2017/06/27) composer の hirak/prestissimo プラグインが機能していなかったのを修正

Docker で Amon2 の開発環境を構築

docker-compose を使った Amon2 の開発環境構築の手順メモ

検証環境

Windows10 Home Edition
VirtualBox 5.1.20
Docker version 17.05.0-ce, build 89658be
docker-compose version 1.6.2, build 4d72027

ディレクトリ構成

+---amon
|   |   docker-compose.yml
|   |   
|   +---data
|   |       Dockerfile
|   |       
|   +---perlcli
|           Dockerfile
|            
+---logs
|    
+---www
        cpanfile

各種設定ファイル

amon/docker-compose.yml

version: "2"
services:
  data:
    build: ./data
    volumes:
      - ../:/data
  perlcli:
    build: ./perlcli
    volumes_from:
      - data
  plack:
    image: amon_perlcli
    volumes_from:
      - data
    ports:
      - "3000:3000"
    command: ["carton","exec","--","plackup","-p","3000","-r","myapp/app.psgi"]
    depends_on:
      - perlcli

amon/data/Dockerfile

FROM busybox
LABEL maintainer "takaya030"

RUN mkdir -p /data
VOLUME ["/data"]
CMD ["true"]

amon/perlcli/Dockerfile

FROM perl:5.24.1
LABEL maintainer "takaya030"

WORKDIR /tmp

RUN apt-get update -y && \
	apt-get clean && \
	rm -fr /var/lib/apt/lists/*

# install carton
RUN cpanm Carton

# create docker user
RUN useradd -d /home/docker -m -s /bin/bash -u 1000 -g 50 docker

RUN mkdir -p /data/www
VOLUME ["/data"]
WORKDIR /data/www

USER 1000

CMD ["perl","-v"]

www/cpanfile

requires 'Plack', '1.0044';
requires 'Amon2', '6.13';
requires 'Amon2::Lite', '0.13';

イメージのビルド

amon ディレクトリに移動後、以下のコマンドでイメージをビルドします。

$ docker-compose build

Amon2 と Plack のインストー

イメージビルド後、以下のコマンドで Amon2 と Plack をインストールします。

$ docker-compose run --rm perlcli carton install

動作確認

以下のコマンドでサンプルアプリケーションを作成します。

$ docker-compose run --rm perlcli carton exec -- amon2-setup.pl --flavor=Lite myapp

以下のコマンドで plack サーバーが起動します。

$ docker-compose up -d

web ブラウザで http://192.168.99.100:3000 にアクセスして以下の画面が表示されれば成功です。
f:id:takaya030:20170618190751p:plain

Terraform で Amazon EC2 に CentOS7 のインスタンスを立てる

Terraform で EC2 に ssh でログイン可能な CentOS7.3 のインスタンスを立てたときの手順メモ

検証環境

Windows10 Home Edition
Terraform v0.9.6

インスタンス作成時の注意点

EC2 に立てた CentOSインスタンスssh でログインするには下記の 2 項目が設定されている必要があります

  1. ログイン認証で使用するキーペア(秘密鍵)
  2. SSHを許可したセキュリティグループ

Terraform のインストー

ダウンロード

こちらのサイトから zip ファイルをダウンロード。解凍した実行ファイルを PATH の通ったフォルダにコピー
www.terraform.io

terraform の動作確認

$ terraform version
Terraform v0.9.6

ディレクトリ構成

+---aws_terraform
        centos7.tf

設定ファイル

aws_terraform/centos7.tf

provider "aws" {
    access_key = "MY ACCESS_KEY"
    secret_key = "MY SECRET_KEY"
    region = "ap-northeast-1"
}

resource "aws_instance" "example" {
    ami = "ami-571e3c30"
    instance_type = "t2.micro"
    key_name = "MY KEY_PAIR"
    security_groups = ["${aws_security_group.centos7_test.name}"]
}

resource "aws_security_group" "centos7_test" {
    name = "centos7_test"
    description = "Used in the terraform"

    # SSH access from anywhere
    ingress {
        from_port = 22
        to_port = 22
        protocol = "tcp"
        cidr_blocks = ["0.0.0.0/0"]

    }

    egress {
        from_port = 0
        to_port = 0
        protocol = "-1"
        cidr_blocks = ["0.0.0.0/0"]
    }
}

最新の CentOS の AMI ID はこちらのサイトで確認できます

インスタンス作成

事前確認

$ cd aws_terraform
$ terraform plan

作成実行

$ terraform apply

インスタンスssh で接続

AWS コンソール "EC2"→"インスタンス"→"接続" からインスタンスの接続方法を確認
下記のコマンドでログイン(ユーザーIDは "centos" )

$ ssh -i my_key_pair.pem centos@ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com

インスタンス破棄

事前確認

$ terraform plan -destroy -out=.\terraform.tfplan

破棄実行

$ terraform apply .\terraform.tfplan

Docker で Mojolicious の開発環境を構築

docker-compose を使った Mojolicious の開発環境構築の手順メモ

検証環境

Windows10 Home Edition
VirtualBox 5.1.20
Docker version 17.05.0-ce, build 89658be
docker-compose version 1.6.2, build 4d72027

ディレクトリ構成

+---mojo
|   |   docker-compose.yml
|   |   
|   +---data
|   |       Dockerfile
|   |       
|   +---perlcli
|           Dockerfile
|            
+---logs
|    
+---www
        cpanfile

各種設定ファイル

mojo/docker-compose.yml

version: "2"
services:
  data:
    build: ./data
    volumes:
      - ../:/data
  perlcli:
    build: ./perlcli
    volumes_from:
      - data
  plack:
    image: mojo_perlcli
    volumes_from:
      - data
    ports:
      - "3000:3000"
    command: ["carton","exec","plackup","-p","3000","myapp.pl"]
    depends_on:
      - perlcli

mojo/data/Dockerfile

FROM busybox
LABEL maintainer "takaya030"

RUN mkdir -p /data
VOLUME ["/data"]
CMD ["true"]

mojo/perlcli/Dockerfile

FROM perl:5.24.1
LABEL maintainer "takaya030"

WORKDIR /tmp

RUN apt-get update -y && \
	apt-get clean && \
	rm -fr /var/lib/apt/lists/*

# install carton
RUN cpanm Carton

# create docker user
RUN useradd -d /home/docker -m -s /bin/bash -u 1000 -g 50 docker

RUN mkdir -p /data/www
VOLUME ["/data"]
WORKDIR /data/www

USER 1000

CMD ["perl","-v"]

www/cpanfile

requires 'Plack', '1.0044';
requires 'Mojolicious', '7.31';

イメージのビルド

mojo ディレクトリに移動後、以下のコマンドでイメージをビルドします。

$ docker-compose build

Mojolicious と Plack のインストー

イメージビルド後、以下のコマンドで Mojolicious と Plack をインストールします。

$ docker-compose run --rm perlcli carton install

動作確認

以下のコマンドでサンプルアプリケーションを作成します。

$ docker-compose run --rm perlcli carton exec -- mojo generate lite_app myapp.pl

以下のコマンドで plack サーバーが起動します。

$ docker-compose up -d

web ブラウザで http://192.168.99.100:3000 にアクセスして以下の画面が表示されれば成功です。
f:id:takaya030:20170530233327p:plain

Docker で nginx + php-fpm + Larvel5.4 の環境構築

こちらの記事を参考に Docker で Laravel5.4 の開発環境を構築したときの手順メモ
(フロントエンド関連ツールは省いています)
qiita.com

ディレクトリ構成

+---la54
|   |   docker-compose.yml
|   |   
|   +---composer
|   |       Dockerfile
|   |       
|   +---data
|   |       Dockerfile
|   |       
|   +---fpm
|   |       Dockerfile
|   |       
|   +---nginx
|   |       Dockerfile
|   |       server.conf
|   |       
|   +---phpcli
|           Dockerfile
|            
+---logs
|    
+---www

各種設定ファイル

la54/docker-compose.yml

version: "2"
services:
  data:
    build: ./data
    volumes:
      - ../:/data
  fpm:
    build: ./fpm
    volumes_from:
      - data
  nginx:
    build: ./nginx
    volumes_from:
      - data
    links:
      - fpm:fpm
    ports:
      - "80:80"
  composer:
    build: ./composer
    volumes_from:
      - data
  phpcli:
    build: ./phpcli
    volumes_from:
      - data

la54/composer/Dockerfile

FROM php:7.1.4-cli
LABEL maintainer "takaya030"

WORKDIR /tmp

RUN apt-get update -y && \
	apt-get install -y git unzip sudo && \
	apt-get clean

# create docker user
RUN useradd -d /home/docker -m -s /bin/bash -u 1000 -g 50 docker

# install composer
RUN curl -sS https://getcomposer.org/installer | php && \
	mv composer.phar /usr/local/bin/composer && \
	composer self-update

ENV COMPOSER_HOME /home/docker/.composer
RUN sudo -u docker composer global require hirak/prestissimo

RUN mkdir -p /data/www
VOLUME ["/data"]
WORKDIR /data/www

USER 1000

ENTRYPOINT ["composer"]
CMD ["--help"]

la54/data/Dockerfile

FROM busybox
LABEL maintainer "takaya030"

RUN mkdir -p /data
VOLUME ["/data"]
CMD ["true"]

la54/fpm/Dockerfile

FROM php:7.1.4-fpm
LABEL maintainer "takaya030"

RUN apt-get update && \
  apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng12-dev libmcrypt-dev && \
  docker-php-ext-install pdo_mysql mysqli mbstring gd iconv mcrypt && \
  apt-get clean

RUN mkdir -p /data
VOLUME ["/data"]

la54/nginx/Dockerfile

FROM nginx:latest
LABEL maintainer "takaya030"

ADD server.conf /etc/nginx/conf.d/server.conf

RUN mkdir -p /data
VOLUME ["/data"]

la54/nginx/server.conf

server {
    listen 80 default;
    server_name _;
    root /data/www/public;
    index index.php index.html index.htm;
    charset utf-8;

    access_log /data/logs/access_log;
    error_log /data/logs/error.log warn;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ ^/index.php$ {
        fastcgi_pass fpm:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
}

la54/phpcli/Dockerfile

FROM php:7.1.4-cli
LABEL maintainer "takaya030"

RUN apt-get update && \
  apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng12-dev libmcrypt-dev && \
  docker-php-ext-install pdo_mysql mysqli mbstring gd iconv mcrypt && \
  apt-get clean

RUN mkdir -p /data/www
VOLUME ["/data"]
WORKDIR /data/www

ENTRYPOINT ["php"]
CMD ["--version"]

使用方法

la54 ディレクトリに移動後、docker-compose を実行。

# nginx, php-fpm コンテナの起動
$ docker-compose up -d

# Laravel のインストール (最後のピリオドを忘れずに)
$ docker-compose run --rm composer create-project laravel/laravel .

# composer パッケージのアップデート
$ docker-compose run --rm composer update

# artisan コマンド
$ docker-compose run --rm phpcli artisan list

変更履歴

  • (2017/05/24) composer の実行ユーザーを docker に変更
  • (2017/06/27) composer の hirak/prestissimo プラグインが機能していなかったのを修正

minikube で Windows 上に Kubernetes 環境を構築する

minikube で Windows + VirtualBox に Kubernetes 環境をセットアップしたときの手順メモ

検証環境

Windows10 Home Edition
VirtualBox 5.1.20

minikube のダウンロード

下記のリンクから最新の Windows 用の exe (minikube-windows-amd64.exe) をダウンロードします。(2017年4月30日現在の最新バージョンは v0.18.0 です)

minikube のインストール

ダウンロードしたファイルは minikube.exe とリネームしてパスの通ったフォルダにコピーします。

minikube の config 設定

デフォルトの vm driver を VirtualBox にするため、コマンドプロンプトで以下のコマンドを入力

C:\> minikube config set vm-driver virtualbox

kubectl の インストール

kubectl がインストールされていない場合、以下のメッセージが表示されます
メッセージに表示された URL から kubectl.exe をダウンロードしてパスの通ったフォルダに配置します

C:\> minikube config set vm-driver virtualbox
========================================
kubectl could not be found on your path.  kubectl is a requirement for using minikube
To install kubectl, please do the following:

download kubectl from:
https://storage.googleapis.com/kubernetes-release/release/v1.6.0/bin/windows/amd64/kubectl.exe
Add kubectl to your system PATH

To disable this message, run the following:

minikube config set WantKubectlDownloadMsg false
========================================
These changes will take effect upon a minikube delete and then a minikube start

kubectl.exe が使用可能なときは以下のように警告メッセージが表示されません

C:\>minikube config set vm-driver virtualbox
These changes will take effect upon a minikube delete and then a minikube start

Kubernates クラスタの作成

"minikube start" で Kubernetes クラスタを作成します。このコマンドは %USERPROFILE% と異なるドライブで実行した場合エラーになることがあります。

C:\>minikube start
Starting local Kubernetes cluster...
Starting VM...
Downloading Minikube ISO
 89.51 MB / 89.51 MB [=============================================] 100.00% 0s
SSH-ing files into VM...
Setting up certs...
Starting cluster components...
Connecting to cluster...
Setting up kubeconfig...
Kubectl is now configured to use the cluster.

"kubectl version" で以下のようにサーバーバージョンが取得できた場合、Kubernetes クラスタが正常に作成されています

C:\>kubectl version
Client Version: version.Info{Major:"1", takaya030:"6", GitVersion:"v1.6.0", GitCommit:"fff5156092b56e6bd60fff75aad4dc9de6b6ef37", GitTreeState:"clean", BuildDate:"2017-03-28T16:36:33Z", GoVersion:"go1.7.5", Compiler:"gc", Platform:"windows/amd64"}
Server Version: version.Info{Major:"1", takaya030:"6", GitVersion:"v1.6.0", GitCommit:"fff5156092b56e6bd60fff75aad4dc9de6b6ef37", GitTreeState:"dirty", BuildDate:"2017-04-07T20:46:46Z", GoVersion:"go1.7.3", Compiler:"gc", Platform:"linux/amd64"}

Kubernetes クラスタの停止

"minikube stop" で停止します

C:\>minikube stop
Stopping local Kubernetes cluster...
Machine stopped.

Docker コンテナの中で NetBeans を起動する

ubuntu desktop のイメージを使って NetBeans を起動し、VNC 接続を検証したときの手順メモ

Docker 環境

Windows10 Home Edition
VirtualBox 5.1.6
docker 1.10.3
docker-machine 0.6.0

各種設定ファイル

Dockerfile

FROM dorowu/ubuntu-desktop-lxde-vnc 
LABEL maintainer "takaya030"

RUN sed 's/main$/main universe/' -i /etc/apt/sources.list && \
    apt-get update && apt-get install -y software-properties-common && \
    add-apt-repository ppa:webupd8team/java -y && \
    apt-get update && \
    echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections && \
    apt-get install -y oracle-java8-installer && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* && \
    rm -rf /tmp/*

ADD state.xml /tmp/state.xml

RUN wget http://download.netbeans.org/netbeans/8.2/final/bundles/netbeans-8.2-php-linux-x64.sh -O /tmp/netbeans.sh -q && \
    chmod +x /tmp/netbeans.sh && \
    echo 'Installing netbeans' && \
    /tmp/netbeans.sh --silent --state /tmp/state.xml && \
    rm -rf /tmp/*

ADD run /usr/local/bin/netbeans

state.xml

<?xml version="1.0" encoding="UTF-8"?><!--
  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
  Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
  Oracle and Java are registered trademarks of Oracle and/or its affiliates.
  Other names may be trademarks of their respective owners.
  The contents of this file are subject to the terms of either the GNU General Public
  License Version 2 only ("GPL") or the Common Development and Distribution
  License("CDDL") (collectively, the "License"). You may not use this file except in
  compliance with the License. You can obtain a copy of the License at
  http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
  License for the specific language governing permissions and limitations under the
  License.  When distributing the software, include this License Header Notice in
  each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
  designates this particular file as subject to the "Classpath" exception as provided
  by Oracle in the GPL Version 2 section of the License file that accompanied this code.
  If applicable, add the following below the License Header, with the fields enclosed
  by brackets [] replaced by your own identifying information:
  "Portions Copyrighted [year] [name of copyright owner]"
  
  Contributor(s):
  
  The Original Software is NetBeans. The Initial Developer of the Original Software
  is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
  Rights Reserved.
  
  If you wish your version of this file to be governed by only the CDDL or only the
  GPL Version 2, indicate your decision by adding "[Contributor] elects to include
  this software in this distribution under the [CDDL or GPL Version 2] license." If
  you do not indicate a single choice of license, a recipient has the option to
  distribute your version of this file under either the CDDL, the GPL Version 2 or
  to extend the choice of license to its licensees as provided above. However, if you
  add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
  option applies only if the new code is made subject to such option by the copyright
  holder.
--><state xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="state-file.xsd">
<components>
        <product platform="windows linux solaris-sparc solaris-x86 macosx-ppc macosx-x86" status="to-be-installed" uid="nb-base" version="8.2.0.0.201609300101">
            <properties>
                <property name="installation.location.windows">$N{install}/NetBeans 8.2</property>
                <property name="minimum.jdk.version">1.8.0</property>
                <property name="jdk.location">/usr/lib/jvm/java-8-oracle</property>
                <property name="installation.timestamp">1485833188374</property>
                <property name="start.menu.shortcut.location">current.user</property>
                <property name="installation.location.macosx">$N{install}/NetBeans/NetBeans 8.2.app</property>
                <property name="installation.location">/usr/local/netbeans-8.2</property>
                <property name="desktop.shortcut.location">current.user</property>
                <property name="netbeans.summary.message.text">101 updates successfully installed.

</property>
            </properties>
        </product>
        <product platform="windows linux solaris-sparc solaris-x86 macosx-ppc macosx-x86" status="to-be-installed" uid="nb-extide" version="8.2.0.0.201609300101">
            <properties>
                <property name="show-in-wizard">false</property>
                <property name="installation.location">/usr/local/netbeans-8.2</property>
            </properties>
        </product>
        <product platform="windows linux solaris-sparc solaris-x86 macosx-ppc macosx-x86" status="to-be-installed" uid="nb-webcommon" version="8.2.0.0.201609300101">
            <properties>
                <property name="installation.location">/usr/local/netbeans-8.2</property>
            </properties>
        </product>
        <product platform="windows linux solaris-sparc solaris-x86 macosx-ppc macosx-x86" status="to-be-installed" uid="nb-php" version="8.2.0.0.201609300101">
            <properties>
                <property name="installation.location">/usr/local/netbeans-8.2</property>
            </properties>
        </product>
        <product platform="windows linux solaris-sparc solaris-x86 macosx-ppc macosx-x86" status="to-be-installed" uid="nb-cnd" version="8.2.0.0.201609300101">
            <properties>
                <property name="installation.location">/usr/local/netbeans-8.2</property>
            </properties>
        </product>
        <product platform="windows linux solaris-sparc solaris-x86 macosx-ppc macosx-x86" status="to-be-installed" uid="nb-ergonomics" version="8.2.0.0.201609300101">
            <properties>
                <property name="installation.location">/usr/local/netbeans-8.2</property>
            </properties>
        </product>
    </components>
</state>

run

#!/bin/bash

# Make sure the user data directory is owned by the ubuntu user
if [ -d /home/ubuntu/.netbeans ]; then
  sudo chown ubuntu:ubuntu /home/ubuntu/.netbeans
fi
exec /usr/local/netbeans-8.2/bin/netbeans

イメージのビルド

$ docker build -t takaya030/netbeans

イメージの確認

$ docker images
REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
takaya030/netbeans               latest              a74eced20d24        13 minutes ago      2.09GB
dorowu/ubuntu-desktop-lxde-vnc   latest              54ee7716013e        7 weeks ago         1.23GB

動作確認

$ docker run --rm -it -p 80:80 takaya030/netbeans

WEBブラウザで "http://192.168.99.100" にアクセスすると ubuntu desktop の画面が表示される
左下のメニューボタンから LXTerminal を起動する
f:id:takaya030:20170423125256p:plain

ターミナルで "/usr/local/bin/netbeans &" と入力する
f:id:takaya030:20170423125318p:plain

NetBeans が起動できれば成功
f:id:takaya030:20170423125339p:plain