前回のあらすじ
ってことでコチラで構成チェック。
https://kami-programming.com/infrastructure/kubernetes/laravelapp-deploy-intro
この様に下準備が長ったらしのも記事として如何なものかとも思いましたが、筆者である私自身がk8sを学んでいる最中疑問符だったのが、
「あれれ?これってソースコードどうすんねん?イメージに含めるん?それともVolumeMountするん?」
とかだったので、この辺の下準備からお伝えすることは一定の価値があるのではと思いでまとめております。
今回はDockerのおさらい程度の内容になっちゃうので、「そんなのヘッチャラさ!」って方はスルーでOKだと思います。
まずはDockerHubに登録だ
kubernetesはコンテナオーケストレーションシステムなので、当然コンテナを扱うわけですが、そのデフォルトのイメージレジストリがDockerHubでございます。
特段理由がないならDockerHubに思考停止で登録しましょう。
$ docker login
DockerHubに登録ができたらターミナルでdocker loginコマンドでログインしてください。
これやんないとイメージをpushできません。
ひとまずlocalでlaravelを動かす
必要なファイル構成はコチラにて取得できます。
こちらの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の作成をまとめます。