Deploy Laravel App to Amazon Lightsail Container (Part 1)

Deploy Laravel App to Amazon Lightsail Container (Part 1)

Hallo Guys, kali ini akan sharing step by step bagaimana deploy aplikasi Laravel yang telah kita buat ke AWS menggunakan Amazon Lightsail Container.

Gambar diatas contoh topologi Standard Laravel Deployment. Permasalahan pertama pada gambar di atas aplikasi Laravel berjalan hanya di 1 server kita akan susah untuk scalling jika aplikasi Laravel yang telah kita buat akan di akses oleh user yang terus bertambah. Biasa nya yang akan bertambah yaitu Database dan Session Files. Selain itu permasalahan kedua environment kita terkadang berbeda dari local di deploy ke server publish yang mengakibatkan aplikasi tidak dapat berjalan, Nah untuk mengatasi permasalahan tersebut kita bisa deploy aplikasi laravel yang berisikan (Code, Os Package, Runtime, Libraries) di bungkus menggunakan container image Docker ke AWS menggunakan Amazon Lightsail Container.

Mari kita coba jalankandi local dahulu sebelum di deploy ke Amazon Lightsail.

Requirement :

  1. Docker (docker desktop for windows)

  2. Akun AWS.

  3. Akun Docker Hub.

  4. Apache 2

  5. PHP 7.4

  6. Composer 2.0

  7. mysql-server 5.7

Pertama kita persiapkan dahulu aplikasi Laravel. Di sini saya menggunakan aplikasi Laravel yang saya clone dari github saya https://github.com/mdrdani/MarketPlace.

kita buat file Dockerfile.local

FROM public.ecr.aws/docker/library/php:7.4-apache
RUN docker-php-ext-install bcmath pdo pdo_mysql

Kita coba build docker image untuk local development dahulu.

$ docker build -t php-mysql-ext:7.4-apache -f Dockerfile.local .

Check Image yang sudah di build.

$ docker images

Selanjutnya masuk ke directory aplikasi Laravel. Lakukan composer install via docker.

$ docker run --rm -it -v ${pwd}:/app public.ecr.aws/docker/library/composer:2.0 composer install --no-dev

check version php.

$ docker run --rm -it -v ${pwd}:/var/www/html php-mysql-ext:7.4-apache php --version

selanjut nya kita copy environment nya ke 2 file local dan production.

$ cp .\.env.example .env.local
$ cp .\.env.example .env.prod

kita pasang key generate nya di environment local dengan docker.

$ docker run --rm -it -v ${pwd}:/var/www/html php-mysql-ext:7.4-apache php artisan --env=local key:generate

setelah itu kan kita akan migration dan memerlukan database, di sini kita akan mengambil docker image mysql-server terlebih dahulu.

$ docker pull mysql/mysql-server:5.7

dan kita membuat network agar antar container dapat terhubung dengan command

$ docker network create -d bridge my_network
$ docker network ls

jika sudah terbentuk network selanjut nya kita akan hubungkan container mysql-server dengan container php dengan cara kita create dahulu container mysql-server.

$ docker run -d --name mysqldock -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=password -v mysql:/var/lib/mysql --network my_network mysql/mysql-server:5.7

command di atas password root bisa di ganti terserah semaunya, dan untuk nama juga terserah, jika sudah jadi container mysql-server jangan lupa create database nya, setelah itu jalankan migration dengan docker. Perhatikan di bagian DB_HOST di situ samakan dengan yang ada di docker container.

$ docker run --network my_network --rm -it -v ${pwd}:/var/www/html php-mysql-ext:7.4-apache php artisan --env=local migrate:refresh --seed

hubungkan juga storage:links.

$ docker run --network my_network --rm -it -p 8089:8000 -v ${pwd}:/var/www/html php-mysql-ext:7.4-apache php artisan --env=local storage:link

dan coba run dengan mengakses http://localhost:8080.

$ docker run --network my_network --rm -it -p 8080:8000 -v ${pwd}:/var/www/html php-mysql-ext:7.4-apache php artisan --env=local serve --host=0.0.0.0

Sampai di sini percobaan di local menggunakan docker sudah selesai. next kita akan publish ke Amazon lightsail.

buat file Dockerfile

FROM php:7.4.32

RUN apt-get update -y && apt-get install -y openssl zip unzip git
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN docker-php-ext-install bcmath pdo pdo_mysql
WORKDIR /app
COPY . /app
RUN composer install --no-dev --optimize-autoloader --no-interaction
RUN php artisan config:cache && \
php artisan route:cache && \
php artisan view:cache && \
php artisan storage:link && \
chmod 0777 -R /app/storage
CMD php artisan serve --host=0.0.0.0 --port=8181
EXPOSE 8181

Buat generate key untuk environment production

$ docker run --rm -it -v ${pwd}:/var/www/html php-mysql-ext:7.4-apache php artisan key:generate

selanjut nya kita build menjadi docker image dan siap kita push ke docker hub.

$ docker build --rm -t marketplace:latest .

jika sudah jadi docker image nya , kita push ke docker hub sebelum itu masuk ke https://hub.docker.com/ create repository. dan sebelum menggunakan command tag and push seharus nya login dahulu dengan perintah.

$ docker login