takaya030の備忘録

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

Kubernetes で nginx + php-fpm を動かす

Google Container Engine (GKE) で Kubernetes を使って nginx + php-fpm を動かしたときの手順メモ

Docker イメージの作成

今回は 1 個の pod 内で nginx と php-fpm の 2 つのコンテナを起動させます。そのための Docker イメージを作成します。

nginx の Dockerfile

FROM nginx:latest
MAINTAINER takaya030

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

server.conf

同じ pod のコンテナは同一ホストで起動するので php-fpm を localhost:9000 で参照する設定にしています。

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

    access_log off;
    error_log off;

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

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

nginx イメージのビルド

$ docker build -t gcr.io/my_project_id/k8sphp_nginx .

php-fpm の Dockerfile

FROM php:7-fpm
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

COPY index.php /var/www/html/

index.php

<?php
	phpinfo();

php-fpm イメージのビルド

$ docker build -t gcr.io/my_project_id/k8sphp_php7 .

イメージを Container Registry へ push

$ gcloud docker push gcr.io/my_project_id/k8sphp_nginx
$ gcloud docker push gcr.io/my_project_id/k8sphp_php7

pod の作成

pod-k8sphp.yaml

apiVersion: v1
kind: Pod
metadata:
  name: k8sphp
  labels:
    app: webphp
spec:
  containers:
    - name: nginx
      image: gcr.io/my-project-id/k8sphp_nginx
      ports:
        - containerPort: 80
    - name: php-fpm
      image: gcr.io/my-project-id/k8sphp_php7
      ports:
        - containerPort: 9000

pod の作成

$ kubectl create -f pod-k8sphp.yaml
pod "k8sphp" created

pod の作成確認

$ kubectl get pods
NAME      READY     STATUS    RESTARTS   AGE
k8sphp    2/2       Running   0          34s

service の作成

service-k8sphp.yaml

apiVersion: v1
kind: Service
metadata:
  name: phptest
spec:
  ports:
    -
      port: 80
      targetPort: 80
  selector:
    app: webphp
  type: LoadBalancer

service の作成

$ kubectl create -f service-k8sphp.yaml
service "phptest" created

service の作成確認

$ kubectl get services
NAME         CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
kubernetes   10.3.240.1    <none>        443/TCP   45m
phptest      10.3.242.13                 80/TCP    25s

動作確認

service を作成してから 1 分程経過するとグローバルIP (EXTERNAL-IP) が割り当てられるので、 http://EXTERNAL-IP にブラウザでアクセスして以下のように表示されれば成功です。
f:id:takaya030:20160618004808p:plain

後始末

service、pod の削除

$ kubectl delete -f service-k8sphp.yaml
service "phptest" deleted

$ kubectl delete -f pod-k8sphp.yaml
pod "k8sphp" deleted