LaravelAPPをk8sでデプロイ(とりあえずDockerコンテナ編)

kubernetes

前回のあらすじ

ってことでコチラで構成チェック。
https://kami-programming.com/infrastructure/kubernetes/laravelapp-deploy-intro

この様に下準備が長ったらしのも記事として如何なものかとも思いましたが、筆者である私自身がk8sを学んでいる最中疑問符だったのが、

「あれれ?これってソースコードどうすんねん?イメージに含めるん?それともVolumeMountするん?」

とかだったので、この辺の下準備からお伝えすることは一定の価値があるのではと思いでまとめております。

今回はDockerのおさらい程度の内容になっちゃうので、「そんなのヘッチャラさ!」って方はスルーでOKだと思います。

まずはDockerHubに登録だ

Docker

kubernetesはコンテナオーケストレーションシステムなので、当然コンテナを扱うわけですが、そのデフォルトのイメージレジストリがDockerHubでございます。

特段理由がないならDockerHubに思考停止で登録しましょう。

$ docker login

DockerHubに登録ができたらターミナルでdocker loginコマンドでログインしてください。

これやんないとイメージをpushできません。

ひとまずlocalでlaravelを動かす

必要なファイル構成はコチラにて取得できます。

kube-study-standard/9_laravel_deploy at master · kamayla/kube-study-standard
Contribute to kamayla/kube-study-standard development by creating an account on GitHub.

こちらのGithubのファイルを使います。

まずはnginxのDockerifle

FROM nginx:latest

COPY ./nginx_conf/prod.conf /etc/nginx/conf.d/default.conf
COPY ./laravel /var/www/

設定ファイルと、アプリのディレクトリ直下をコンテナにCOPYする記述が成されています。

続いてnginxの設定ファイルであるdefault.conf

server {
    listen 80;
    server_name localhost;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name localhost;

    root  /var/www/public;
    index index.php;

    gzip  on;
    ssl on;
    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    # 証明書
    ssl_certificate /etc/nginx/ssl/localhost+1.pem;
    # 秘密鍵
    ssl_certificate_key //etc/nginx/ssl/localhost+1-key.pem;

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

    # php-fpmとの連携
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(\.+)$;
        fastcgi_pass laravel-study:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        gzip_types text/css text/javascript
                   application/x-javascript application/javascript
                   application/json;
        gzip_min_length 1k;
        gzip_disable "msie6";
    }
}

gzipとかいろいろ細かいことは置いておいて、とりあえずココではクライアントからのリクエストに対して、.phpの処理をどうやらphp-fpmに処理を投げてるんだなぁ程度でOKです。

続いてlaravelを動かすためのphp-fpmのDockerfile

FROM php:7.2-fpm
COPY php.ini /usr/local/etc/php/
COPY ./laravel /var/www/

RUN apt-get update \
  && apt-get install -y zlib1g-dev mariadb-client \
  && docker-php-ext-install zip pdo_mysql

#Composer install
COPY --from=composer /usr/bin/composer /usr/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin

WORKDIR /var/www

RUN composer global require "laravel/installer"

RUN chmod 777 -R storage

php7.2のコンテナにcomposerなどlaravelに必要なパッケージマネージャーをインストールしてます。

そしてコチラがこれらのコンテナをまとめるdocker-composeファイルです。

version: '3.7'

services:
  laravel-study:
    container_name: laravel-study
    build:
      context: .
      dockerfile: Dockerfile.php
    volumes:
    - ./laravel:/var/www
    networks:
    - laravel_study-network

  nginx-study:
    image: nginx
    container_name: nginx-study
    ports:
    - 80:80
    - 443:443
    volumes:
    - ./laravel:/var/www
    - ./nginx_conf/default.conf:/etc/nginx/conf.d/default.conf
    - ./cert-key:/etc/nginx/ssl
    depends_on:
    - laravel-study
    networks:
    - laravel_study-network

  study-db:
    image: mysql:5.7
    container_name: study-db
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: database
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
    - study_mysql_volume:/var/lib/mysql
    ports:
    - 4306:3306
    networks:
    - laravel_study-network

networks:
  laravel_study-network:
    driver: bridge
volumes:
  study_mysql_volume:
    driver: local

ざっくりと、NginxとPHPとMYSQLコンテナが起動してるんだなぁ程度でここではOKです。

細かい話をするとDockerの話に脱線しすぎるので、ココではgithubをクローンしたら以下のコマンドでコンテナを起動してください。

docker-comose up -d

めでとうございます🎉

皆様お馴染みの、laravelの初期画面がお目見えです。

まとめ

今回はDockerの解説記事ではないのでDocker自体の詳しい解説は避けたのですが、実際にk8sで運用して行く際には、Dockerについて深堀りして学んで行くと良いでしょう。

なぜかというとk8sのコンテナ運用においてはimageサイズの小ささというのが割と大事になってきます。

これは当然の話しでImageサイズが大きければ大きいほどDockerHubからPullする際のネットワーク通信も遅くなりますし、Imageをbuildする時間も大きくなります。

そうなるといかにk8sの強みが無停止更新と言えど、無駄なタイムロスが増えてしまいます。

昨今Golangがバックエンドで流行しているのもこのImageサイズの小ささと関係しています。

一般的にGolangで作成したほとんど空のWebサーバーImageと、ユーザーコードの無いRubyの実行環境を備えたImageのサイズを比較した場合その大きさは250倍もrubyが大きいです。

このケースは極端な例ですが、ここでお伝えしたいのはどんなコンテナを作る場合も無駄なレイヤーを増やすことなく要件を満たすImageを作成することがk8s運用においては大事になります。

次回は実際にDockerHubにアップロードするためのImageの作成をまとめます。

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