Development Environment dengan Docker Compose

Hello world!, perkenalkan saya Gilang Pambudi, (part time) DevOps di Skyshi. Pada awal development sebuah projek, kita sering direpotkan dengan installasi bahasa pemrograman, dependency library, third party service (database, search engine) dll. Jika anggota tim ada banyak maka proses tersebut harus didokumentasikan agar environment untuk semua developer sesuai yang diharapkan. Can we do better?

Yes we can!

Docker Compose

Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a Compose file to configure your application’s services. Then, using a single command, you create and start all the services from your configuration.

Dengan docker compose kita bisa menyimpan konfigurasi dalam file, berarti semua perubahan dependency service, seperti versi database dan service lain dapat dimasukkan dalam VCS (Version Control System). Dengan VCS kita dapat lebih mudah men-debug jika terjadi error pada software.

Contoh kasus lain adalah ketika salah satu developer mengupdate service tertentu seperti database. Software mungkin tidak akan jalan untuk database versi sebelumnya, sehingga mungkin terjadi “Fitur x kok gak jalan?”, “Tetapi di tempat ku jalan kok”.

Lets get to the code

Contoh aplikasi yang akan kita buat adalah sebuah web menggunakan PHP. Pertama buat sebuah directory untuk projek kita, kemudian buat file composer.json berisi dependency library php.

Buat file index.php untuk enpoint software kita, script tersebut hanya akan menampilkan pesan “Hello world”

Kemudian kita buat file Dockerfile untuk membuat docker image untuk software kita.

Docker Compose

Jalankan Docker Compose

docker-compose up -d

Install dependency dengan menjalankan perintah `composer install` di dalam docker container

$ docker-compose run --rm web composer install

Wait, tadi kita jalankan composer install dalam docker container tapi di directory local terdapat directory baru `vendor`? Itu karena directory local sudah dimount ke docker, jadi semua perubahan file pada container juga terjadi pada local directory, dan sebaliknya.

volumes:
- .:/app

Untuk melihat output yang dikeluarkan jalankan perintah

docker-compose logs -f

Menambahkan Service

Selanjutnya kita akan menambahkan service redis untuk presisten datanya. Tambahkan code berikut dalam block services di docker-compose.yml

redis:
image: redis:alpine

Tambahkan environment variable untuk service web pada block ‘environment’

web:
build: .
ports:
- 9090:8080
volumes:
- .:/app
environment:
- REDIS_HOST=redis

Restart docker-compose

$ docker-compose up -d

Install library redis, di dalam docker container

$ docker-compose run --rm web composer require predis/predis

Edit index.php, tambahkan line berikut

<?php
...
Predis\Autoloader::register();
$redis = new Predis\Client([
'host' => getenv('REDIS_HOST')
]);
$app->get('/count', function($request, $response) use ($redis) {
$redis->incr('counter');
$counter = $redis->get('counter');
$response->getBody()->write($counter);
  return $response;
});
$app-run();

Lihat hasil

$ curl http://localhost:9090/count
1
$ curl http://localhost:9090/count
2
$ curl http://localhost:9090/count
3

Dengan docker compose kita cukup mendeskripsikan environment yang kita inginkan pada file docker-compose.yml, proses bootstraping secara otomatis di handle oleh docker. File konfigurasi juga dapat dimasukkan dalam CSV sehingga perubahan dependency service bisa dipantau.

👌