Memasang laravel dengan Docker
Ini adalah nomor 5 mengenai menggunakan laravel. Tapi untuk yang docker ini emang perlu persiapan tambahan. Pertama jelas docker sebagai engine utamanya dan yang kedua adalah docker-compose.
Apa itu docker-compose ? Menurut situs docker sendiri saya menyimpulkan seperti ini :
- Dapat membuat environment terpisah menggunakan
Dockerfile
sehinga bisa digunakan dimana saja. - Mendefinesikan masing-masing service aplikasi melalui
docker-composer.yml
sehingga dapat berjalan bersamaan.
Memasang Docker Compose
Pertama kita bisa cek dulu versi docker compose di halaman githubnya di sinihttps://github.com/docker/compose/releases saat saya menulis ini berada di versi 1.9.
Lalu docker-composer
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Lalu ubah permission docker compose tersebut :
$ sudo chmod +x /usr/local/bin/docker-compose
Jika sudah silakan cek dengan menggunakan
$ docker-compose --version
Akan menghasilkan informasi sebagai berikut misalnya :
docker-compose version 1.9.0, build 2585387
Laravel
Saya berasumsi bahwa sudah sudah memiliki source laravel di komputer/laptop masing-masing. Jika sudah buka folder laravel di mesin masing-masing. Lalu di root folder sejajar dengan .env, composer.json, dan lainnya buatlah satu berkas baru dengan nama docker-compose.yml
.
Di sini saya akan mempersiapkan laravel dengan environment sebagai berikut :
- Menggunakan PHP versi 7
- Menggunakan nginx
- Menggunakan database mysql versi 5.6
Lalu isikan informasi berikut di docker-compose.yml
sebagai berikut :
ersion: '2'
services:
web:
build:
context: ./
dockerfile: web.docker
volumes:
- ./:/var/www/docker
ports:
- "8080:80"
links:
- app
app:
build:
context: ./
dockerfile: app.docker
volumes:
- ./:/var/www/docker
database:
image: mysql:5.6
environment:
- "MYSQL_ROOT_PASSWORD=secret"
- "MYSQL_DATABASE=dockerApp"
ports:
- "33061:3306"
Penjelasan Singkat :
Di atas tadi saya menyiapkan 3 buah service untuk laravel docker ini :
- Web : Build context berarti lokasi source code, karena docker composer berada di root aplikasi cukup ketikan
./
saja. dockerfile saya beri nama web.docker di sinilah saya mengatur konfigurasi webserver (nginx). Volumes : path untuk source di dalam docker. Ports : menggunakan port 8080 yang diteruskan ke 80 - app : Build context sama dengan penjelasan sebelumnya, dockerfile diberi nama app.docker di sini saya mengatur tentang konfigurasi php dan sejenisnya.
- database : Menggunakan mysql 5,6 dengan passwod dan database yang disiapkan. Menggunakan port 33061 yang diterukan ke 3306.
Membuat docker-file
Tadi saya menyebutkan konfigurasi untuk web server di web.docker
dan untuk aplikasinya di app.docker
.
app.docker masih di root aplikasi buat berkas baru dengan nama app.docker dan isikan sebagai berikut :
FROM php:7-fpm
RUN useradd -ms /bin/bash docker
RUN apt-get update && apt-get install -y libmcrypt-dev mysql-client \
&& docker-php-ext-install mcrypt pdo_mysql
USER docker
WORKDIR /var/www/docker
Penjelasan singkat ;
- Menggunakan php 7
- Menambahkan user baru “docker” sehingga saat login ssh ke dalam docker container yang ini levelnya tidak langsung root.
- Install php dan libaray-library-nya.
- Memastikan direktori berada di
/var/www/docker
web.docker Masih di root aplikasi buat berkas baru dengan anam web.docker
dan isikan sebagai berikut
FROM nginx:1.10
ADD ./vhost.conf /etc/nginx/conf.d/default.conf
WORKDIR /var/www/docker
Penjelasan singkat :
- Menggunakan nginx versi 1.10
- Menggunakan konfigurasi dari berkas
vhsot.conf
(ini akan dibuat setelah ini) yang disalin ke direktori nginx di docker - Memastikan direktori berada di
/var/www/docker
.
vhost.conf
Kareana tadi disebutkan konfigurasi nginx akan menyalin dari konfigurasi yang sudah ada maka buat dulu berkas vhost.conf
di root aplikasi.
server {
listen 80;
index index.php index.html;
root /var/www/docker/public;
location / {
try_files $uri /index.php?$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
Setelah semua siap, maka sekarang saatnya megaktifkan container
yang dibuat tadi dengan cara :
docker-compose up -d --build
Tunggu sampai selesai.
Jika sudah akses di browser localhost:8080
akan menghasilkan :
Issue yang muncul
Ini issue yang saya alami saat saya hendak menggunakan database. sebelumnya di file .env saya sudah set konfigurasi seperti ini
DB_CONNECTION=mysql
DB_HOST= 127.0.0.1
DB_PORT=33061
DB_DATABASE=dockerApp
DB_USERNAME=root
DB_PASSWORD=secret
Tapi selalu error “SQLSTATE[HY000] [2002] Connection refused” cara menanggulanginya adalah :
- Cek docker network Periksa terlebih dahulu daftar docker network yang digunakan dengan cara
docker network ls
Akan menghasilkan informasi sebagai berikut
NETWORK ID NAME DRIVER SCOPE 0899554a5194 bridge bridge local 6be447f9587f host host local 66eaf73473be laraveldocker_default bridge local 2606a2d09a28 none null local
Laravel docker mempunyai NETWORK ID 66eaf73473be
dan menggunakan tipe bridge. Sekarang cek ip dari network tersebut
2. Periksa Network
sudo ifoconfig
Maka akan menghasilkan informasi network yang tersedia. Fokus saja ke network yang akan digunakan yaitu network laravel docker. Pada kasus saya terdapat informasi berikut
br-66eaf73473be Link encap:Ethernet HWaddr 02:42:f8:30:1e:3d
inet addr:172.18.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:f8ff:fe30:1e3d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5931 errors:0 dropped:0 overruns:0 frame:0
TX packets:7890 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1706901 (1.6 MiB) TX bytes:6782068 (6.4 MiB)
Ip yang dimiliki ternyata 172.18.0.1
, maka di .env ubah menjadi :
DB_CONNECTION=mysql
DB_HOST= 172.18.0.1
DB_PORT=33061
DB_DATABASE=dockerApp
DB_USERNAME=root
DB_PASSWORD=secret
Terakhir lakukan perintah composer dumpautoload
dan php artisan config:cache
maka aplikasi seharusnya bisa tersambung ke database.
Tambahan : Sebenarnya ada cara lebih mudah yaitu menggunakan laradock ( silahkan cek ke github dengan kata kunci tersebut ). Tapi karena ingin mengenal docker saya memilih menggunakan cara manual seperti ini.
REFERENSI :
- https://docs.docker.com/compose/overview/
- https://docs.docker.com/compose/install/
- https://kyleferg.com/laravel-development-with-docker/#laravel-setup