LaravelAPPをk8sでデプロイ(ついにデプロイ用イメージの作成)

kubernetes

開発用とデプロイ用のイメージの違い

まずはプロダクション用の各種ファイル。
docker-compoose.prod.yaml

version: '3.7'

services:
  laravel-study:
    container_name: laravel-study
    build:
      context: .
      dockerfile: Dockerfile.php
    image: kamayla/laravel-study
    networks:
    - laravel_study-network

  nginx-study:
    build:
      context: .
      dockerfile: Dockerfile.nginx
    image: kamayla/nginx-study
    container_name: nginx-study
    ports:
    - 8080:80
    networks:
    - laravel_study-network
    depends_on:
    - laravel-study

networks:
  laravel_study-network:
    driver: bridge

kubernetes環境においてmysqlは公式イメージを使いDeploymentとして実装するのでdocker-composeからは省いています。

開発環境ではnginxにself-certificateを貼り付けてhttps化し443番ポートで公開していましたが、kubernetes上ではnginxコンテナ自体はhttps化せずに8080番ポートでCluster内に公開します。

ここで注目してほしいのがimage名の指定です。

image: kamayla/laravel-study

kamaylaというのが私のdockerHubのアカウント名でその後に続くlaravel-studyというものがImage名になります。

kamaylaの部分はご自身のdockerHubのアカウント名を指定してください。

これはDockerHubの命名規則で、こうすることで自身のレジストリにイメージをpushすることができます。

Dockerfile.nginx

FROM nginx:latest

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

ここでは開発環境でdefault.confをマウントしていたのをprod.confに置き換えcopyしています。

Dockerfile.php

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

開発環境ではlaravelのソースコードをvolumeMountしていましたが、こちらではcopyをしてイメージ内部に含めています。

prod.conf

server {
    listen 80;
    server_name localhost;

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

    gzip  on;

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

    # php-fpmとの連携
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(\.+)$;
        fastcgi_pass localhost: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";
    }
}

これはnginxの本番用confファイルですが、開発環境との違いはhttps化しないのでself-certificateのファイル指定やhttpsの設定などが省かれており、fastcgiの向き先をコンテナ名の名前解決ではなくlocalhostに置き換えています。

これは開発環境では同じDockerNetwork内であればコンテナ名で名前解決できるが、Pod内ではDockerNetwrokをが存在しないので名前解決できないためです。

localostとすることで、pod内部のlocalIPの9000番ポートであるphp-fpmに繋がります。

続いてこれらをImageBuildします。

docker-compose -f docker-compose.prod.yaml build --no-cache

-fでdocker-composeコマンドを実行する際の設定ファイルを指定できます。指定しないとdefaultはdocker-compsoe.ymlが指定されます。

以下のコマンドで作成したimageを確認できます。

docker images

出力は以下。

REPOSITORY                                 TAG                   IMAGE ID            CREATED             SIZE
kamayla/nginx-study                        latest                f232633416bb        32 minutes ago      50.1MB
kamayla/laravel-study                      latest                aef8562386e8        32 minutes ago      550MB

これらをdockerHubへプッシュします。

$ docker push kamayla/nginx-study
$ docker push kamayla/laravel-study

DockerHub上にアップロードされたのが確認できます。

以上で、kubernetesに使用するlaravelAppのImage作成が完了しました。

まとめ

実際にはこれらの処理はJenkinsなどを使い、自動化します。

JenkinsはGithubなどをpollingし、コードの差分を検知するとそれをコンテナ化しテスト用のDockerホストでテストし、問題が無いものをDockerHubへpushします。

次回は、今回作ったImageを元にいよいよminikubeへデプロイします。

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