Docker Compose
Setelah melakukan instalasi docker engine atau core docker, langkah selanjutnya kita akan melakukan instalasi docker compose, apa itu docker compose?
“Docker compose berfungsi untuk menjalankan container docker secara bersamaan.”
docker compose ini sangat berguna ketika aplikasi kita terpisah - pisah pada komputer yang berbeda, contohnya adalah aplikasi yang dibuat berada pada 1 container sedangkan database yang akan digunakan oleh aplikasi tersebut berada pada container yang lain.
Ketika menggunakan docker compose maka kita dapat menjalankan kedua container tersebut secara bersamaan dan bahkan kita dapat melakukan link ke container yang kita inginkan.
Dockerfile
Jika anda pernah membuat server untuk sebuah website berbasis html atau php, mungkin anda akan melakukan instalasi web server (contoh: nginx) di server dan kemudian memasukan file website anda di directory /var/www/html. Saat ini anda akan migrasi ke container. Lalu
bagaimana caranya membuat supaya container image anda berisi semua file website anda yang ada di directory /var/www/html tersebut? Caranya adalah dengan membuat custom image sendiri menggunakan Dockerfile. Jika sudah terbentuk image, image tersebut bisa anda upload di docker hub untuk kemudian bisa digunakan dimana saja dan ketika anda menjalankan image tersebut, aplikasi anda akan berjalan dan bisa digunakan.
Apa itu Dockerfile?
Dockerfile adalah sebuah file yang digunakan untuk membuat container image. Lalu bagaimana caranya membuat custom image dengan Dockerfile? Ikuti langkah-langkah yang akan kita bahas dibawah.
Apa itu Docker Hub?
Docker Hub merupakan registry tempat penyimpanan docker image. Setelah anda membuat custom image dengan nama yang anda inginkan, selanjutnya adalah anda bisa push image tersebut ke registry, salah satunya Docker Hub. Selanjutnya jika anda ingin menggunakan image tersebut, anda hanya perlu pull image tersebut ke server dari Docker Hub.
Langkah Praktikum
1. Docker compose telah anda install pada praktikum pertama, jika anda lupa buka kembali modul praktikum docker pertama anda.
2. Untuk mulai menggunakan docker compose silahkan jalankan perintah berikut untuk melakukan akses root.
sudo su
atau sudo -s
3. Selanjutnya ciptakan sebuah directory/folder. Nama folder tersebut terserah anda. Saya menggunakan nama folder: web_dev
mkdir web_dev
4. Masukklah ke directory web_dev tersebut.
cd web_dev
5. Ciptakan sebuah file baru dengan nama file docker-compose dengan extensi file .yml.
Nano docker-compose.yml
6. Isilah file tersebut dengan baris code berikut.
version: '3.3' services:
web:
image: php:7.3-apache container_name: php73 volumes:
- ./php:/var/www/html/
ports:
- 8000:80
7. Ingatlah untuk indentasi yang kita gunakan adalah 2 spasi.
8. Selanjutnya save file tersebut dan ketikan perintah:
Docker-compose up
9. Jika kita perhatikan, ketika perintah docker-compose up dijalankan maka docker engine akan melakukan pull/download image php dengan tag/versi: 7.3-apache yang terdapat pada docker-hub.
10. Jika docker engine sudah selesai pull/download docker image, maka didalam folder web_dev anda akan melihat sebuah folder baru dengan nama folder: php. folder ini adalah hasil pull dari image php yang telah kita defenisikan pada file docker-compose.yml
11. Selanjutnya kita akan menguji docker compose yang melakukan download image php:7.3-apache dengan menciptakan sebuah file percobaan. Silahkan anda masuk ke folder php tersebut dan ciptakan sebuah file baru dengan nama file index.php dengan mengetikkan perintah:
Nano index.php
12. Isilah file index.php dengan baris code berikut:
<?php
Echo ‘hello from jansutris’;
?>
13. Ketikkan perintah dibawah ini untuk mundur ke 1 directory sebelumnya (folder: web_dev):
cd ..
14. Jalankan ulang perintah docker-compose up untuk membuild ulang container php dibawah:
15. Silahkan akses browser kesayangan anda dengan memasukkan URL:
http://localhost:8000/
Keterangan:
Port 8000: port number yang anda defenisikan/ diexpose pada file docker-compose.yml agar bisa diakses dari external (dari luar docker-container).
16. Jika anda akses URL diatas, anda akan mendapatkan pesan error seperti ini pada web-page browser anda. Artinya folder/container php yang ada belum dimilki oleh owner/kepemilikan dengan username anda.
17. Solusinya, silahkan anda ubah hak ownership kepada username yang anda gunakan pada os ubuntu anda terhadap folder/container php tersebut.
18. Sebagai contoh, awalnya folder php tersebut dimiliki/ownership oleh user root. Maka anda berikan ownership user jansutris10 terhadap folder php tersebut. Sesuaikan dengan username anda. Dengan mengetikkan perintah:
chown jansutris10:jansutris10 php/ -R
19. Setelah itu jalankan kembali perintah: docker-compose up dan refresh (F5) web browser anda.
Hasilnya akan seperti ini
20. Mulai saat ini, jika anda ubah kode program anda, baik dari editor ataupun dari command-line dan anda refresh web page tersebut, maka hasilnya akan otomatis berubah pada halaman web.
21. Misalnya, saya ubah “hello from jansutris” menjadi “hello from sitoluama” menggunakan editor nano bawaan dengan membuka terminal kedua, tanpa mematikan terminal yang sedang menjalankan prose docker-compose up (anda juga boleh install visual studio code pada ubuntu anda).
22. Maka hasilnya akan menjadi seperti ini:
23. Hingga tahap ini anda telah berhasil menjalankan docker image php, kita ketahui Bersama bahwa PHP adalah Bahasa pemrograman yang berhubungan dengan back-end. Selanjutnya saya akan download dan install docker-image mysql untuk support simple website berbasis php-native tersebut
menggunakan dockerfile.
24. Sekarang kita langsung saja mencoba membuat dockerfile untuk membuat suatu image yang berisi container. Sebagai contoh disini saya akan membuat container yang berisi php dan mysqli.
25. Silahkan ciptakan sebuah file dengan nama Dockerfile yang disimpan pada folder php.
26. Isilah file Dockerfile tersebut dengan baris code berikut:
Keterangan:
Sebelum kita memulai menggunakan dockerfile untuk membuat sebuah container, kita sedikit belajar dulu tentang perintah command yang ada pada dockerfile.
Untuk dockerfile terdapat beberapa perintah yaitu:
1. Dockerfile Commands
• ADD
Perintah ADD digunakan untuk mengcopy file dari suatu direktori ke direktori tujuan.
• Jika direktori asal adalah sebuah URL, perintah add akan mendownloadnya dan menempatkannya ke direktori tujuan.
• CMD
Perintah CMD hampir sama dengan perintah RUN, CMD digunakan untuk mengeksekusi perintah yang lebih spesifik, seperti pada saat proses pembuatan container pada image.
• ENTRYPOINT
ENTRYPOINT adalah argumen untuk mengeset default aplikasi yang digunakan setiap kali sebuah container dibuat menggunakan image.
• ENV
ENV digunakan untuk mengeset environment variables.
• FROM
FROM argument mendefinisikan sebuah base image yang akan digunakan untuk
memulai membangun proses pada setiap docker image apakah itu di repositori ataupun di host kita sendiri.
• WORKDIR
WORKDIR direktif digunakan untuk mengatur di mana perintah didefinisikan dengan CMD yang akan dieksekusi.
• RUN
RUN adalah perintah yang digunakan untuk membangun docker images yang terpusat untuk mengeksekusi Dockerfiles.
• MAINTAINER
MAINTAINER adalah perintah yang tidak dijalankan tetapi di deklarasikan sebagai author field dari images.
• USER
USER direktif digunakan untuk mengatur UID (atau nama pengguna) yang menjalankan sebuah container berdasarkan dari image yang sedang dibangun.
• VOLUME
Perintah VOLUME digunakan untuk mengaktifkan akses dari kontainer kita ke direktori pada mesin host.
• EXPOSE
Perintah EXPOSE digunakan untuk menghubungkan port tertentu untuk mengaktifkan network antara proses yang berjalan di dalam container dan mesin host.
27. Selanjutnya ubah code docker-compose berikut dengan menambahkan beberapa baris code, seperti berikut ini:
28. Jalankan kembali perintah docker-compose up. Docker engine akan download/pull image docker mysql dengan tag/versi 8.0 dan menciptakan sebuah container dari image tersebut dengan nama mysql8.
29. Docker engine akan build ulang docker image, container dan ciptakan sebuah database dengan spesifikasi yang didefenisikan pada file: docker-compose.yml
30. Silahkan akses ulang, maka web anda akan tetap bisa diakses:
31. Untuk menguji apakah database dari image mysql:8.0 pada container tersebut sudah berhasil dibuild, silahkan akhiri proses docker-compose dengan menekan CTRL + C.
32. Selanjutnya, edit file index.php anda, seperti baris code sebagai berikut:
<?php
$host = 'db';
$user = 'jansutris';
$password = 'qwertyasdf';
$db = 'test_db';
$conn = new mysqli ($host, $user, $password, $db);
if($conn-> connect_error) {
echo 'connection gagal' . $conn->connect_error;
}
echo 'koneksi database berhasil ke MYSQL';
?>
Penjelasan:
Hasil dari code ini akan menampilkan pesan “koneksi anda berhail ke MYSQL”, jika database anda terkonseksi dengan file index.php, ditandai dengan: username, password dan nama database nya sesuai antara isi file index.php dan isi file docker-compose.yml. Jika gagal, maka akan menampilkan pesan “conection gagal” diikuti dengan error status nya.
Seperti pada gambar berikut:
33. Sesuaikan dengan pengaturan yang anda defenisikan pada docker-compose.yml.
34. Tambahkan baris code berikut pada file docker-compose.yml.
Catatan:
Gunakan aturan indentasi dengan 2 spasi!
version: '3.3' services:
web:
build:
context: ./php dockerfile: Dockerfile container_name: php73 depends_on:
- db volumes:
- ./php:/var/www/html/
ports:
- 8000:80 db:
container_name: mysql8 image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password restart: always
environment:
MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: test_db MYSQL_USER: jansutris
MYSQL_PASSWORD: qwertyasdf ports:
- 6033:3306
35. Jalankan ulang perintah: docker-compose up.
36. Sebagai informasi, jika anda menjalankan docker-compose up. Maka docker engine akan pull/download docker images dan create docker container sesuai dengan spesifikasi pada docker- compose.yml.
37. Terakhir, akseslah/refresh URL: localhost:8000. Jika berhasil maka tampilan pada web browser anda akan seperti gambar dibawah ini.
Tugas:
1. Silahkan eksplorasi sebanyak-banyaknya tentang docker-compose, aturan membuat YML files dan dockerfile.
2. Silahkan deploy program aplikasi berbasis php-native kesayangan anda/yang anda miliki dengan kombinasi menggunakan docker-compose.yml dan dockerfile seperti pada contoh diatas. Pastikan program aplikasi anda menggunakan database dan berhasil koneksi kedatabase dengan mengujinya menjalankan fungsi CRUD (Create, Read, update dan delete) pada web browser kesayangan anda.
3. Upload/unggah docker-image yang sudah anda build ke docker-registry (docker-hub)
4. Lampirkan jawaban soal 1, soal 2 dan soal 3 yang terdiri dari kode program, output/hasil dan penjelasannya pada laporan praktikum anda
“Truth can only be found in one place: the code.”
― Robert C. Martin, Clean Code: A Handbook of Agile Software Craftsmanship ―
EOF