開発用とデプロイ用のイメージの違い
まずはプロダクション用の各種ファイル。
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へデプロイします。