Deployment dengan Docker
Perkembangan teknologi dewasa ini tidak terlepas dari dukungan program dan aplikasi yang tersedia yang sangat beragam. Hal ini tentunya membuat proses distribusi program menjadi salah satu perhatian utama. Berangkat dari hal tersebut, kini dikenal sebuah teknologi yang disebut container, dan salah satu bentuk aplikasinya yaitu Docker.
Container
Secara harfiah, container merupakan alat untuk mempermudah mengemas dan mendistribusikan suatu hal dari satu tempat ke tempat lai. Sedangkan dalam konteks lingkungan linux, kontainer dapat diartikan sebagai alat yang dapat dipergunakan untuk memberikan sistem yang terisolasi (isolated environment) pada level OS yang dijalankan pada satu induk linux kernel (host). Dengan container, sebuah program disatukan bersama dengan library, file konfigurasi, dan seluruh hal yang dibutuhkannya. Aplikasi yang berjalan menggunakan container pun jauh lebih cepat dan lebih efisien.
Docker
Docker adalah salah satu platform yang dibangun berdasarkan teknologi container. Docker merupakan sebuah open-source project yang menyediakan platform terbuka untuk developer maupun sysadmin untuk dapat membangun, mengemas, dan menjalankan aplikasi dimanapun sebagai sebuah wadah (container) yang ringan.
Deployment pada LEARNFAZZ
Pada LEARNFAZZ, Docker digunakan untuk melakukan deployment server back-end dan database. Deployment ini dilakukan menggunakan https://portainer.docker.ppl.cs.ui.ac.id yang merupakan Docker yang telah disiapkan oleh Fakultas Ilmu Komputer UI. Berikut merupakan tahap-tahap deployment dengan portainer:
- Menyiapkan image
Image adalah sebuah executable package yang terdiri dari aplikasi, runtime, library, environment variable, dan file konfigurasi. Untuk database, karena proyek kami menggunakan postgres, maka image bisa didapatkan pada https://hub.docker.com/_/postgres. Sedangkan, untuk server back-end, image dibuat dengan menuliskan kode berikut :
docker build -t registry.docker.ppl.cs.ui.ac.id/pplb4/back-end:${ENVIRONMENT} .
Variabel ${ENVIRONMENT} menandakan environment tempat image akan dibuat. Adapun environment yang kami gunakan ada 2, yaitu development dan staging. Sedangkan . adalah relative path di mana aplikasi yang akan dibangun berada.
Berikut ini adalah perintah-perintah yang dijalankan saat membuat image:
Pada Dockerfile
# deklarasi dependency image (image golang)
FROM golang# deklarasi environment variables yang dibutuhkan saat build image
ENV GOPKG $GOPATH/src/gitlab.cs.ui.ac.id/ppl-fasilkom-ui/2019/PPLB4/back-end
ENV GO111MODULE on# menyiapkan directory di mana aplikasi kami akan disimpan dalam
# image
RUN mkdir -p $GOPKG
COPY . $GOPKG/
WORKDIR $GOPKG# membuat executable dari aplikasi dan menginstall dependencies
RUN GOBIN=`pwd`/output go install infrastructure/cmd/main.go
RUN ./dependency.sh# perintah yang dijalankan ketika docker dijalankan
ENTRYPOINT ["./docker-entrypoint.sh"]
Pada dependency.sh
#!/bin/shcurl -s https://packagecloud.io/install/repositories/golang-migrate/migrate/script.deb.sh | bashapt-get install -y migrate
Pada docker-entrypoint.sh
#!/bin/shmigrate -path infrastructure/migrations/ -database ${DB_SOURCE} up
./output/main
Adapun perintah yang dijalankan untuk melakuan push image adalah sebagai berikut:
docker push registry.docker.ppl.cs.ui.ac.id/pplb4/back-end:${ENVIRONMENT}
- Menyiapkan volume
Tujuan dibuatnya volume adalah agar data yang ada tidak hilang jika dilakukan penggantian container database. Berikut adalah contoh pembuatan volume dalam docker:
- Menyiapkan network
Tujuan dibuatnya network adalah agar container-container yang dibuat bisa berkomunikasi satu sama lain. Berikut adalah contoh pembuatan network:
- Membuat container
Container dibuat sebanyak jumlah environment yang ada. Untuk mempermudah pembuatan container, kami menggunakan Docker compose. Berikut ini adalah file docker-compose.yml.
version: '2'services:
postgres:
image: postgres:latest
environment:
POSTGRES_DB: ${DB_NAME}
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- learnfazz-development-postgres_data:/var/lib/postgresql/data
networks:
private:
ipv4_address: ${DB_PRIVATE_IP}
backend:
depends_on:
- "postgres"
image: registry.docker.ppl.cs.ui.ac.id/pplb4/back-end:${ENVIRONMENT}
ports:
- ${BACKEND_PUBLIC_PORT}:8080
environment:
DB_SOURCE: postgres://${DB_USER}:${DB_PASSWORD}@${DB_PRIVATE_IP}:5432/${DB_NAME}?sslmode=disable
networks:
private:
ipv4_address: ${BACKEND_PRIVATE_IP}volumes:
learnfazz-development-postgres_data:
name: learnfazz-${ENVIRONMENT}-postgres_data
external: truenetworks:
private:
external:
name: learnfazz-${ENVIRONMENT}-private
Pada kode di atas, variabel ${BACKEND_PUBLIC_PORT} akan diisi dengan sebuah public port, misalnya 20000. Kode tersebut menjadi 20000:8080, yang artinya port 8080 yang dipakai pada container di-expose ke port 20000 yang merupakan public port, agar bisa diakses dari luar.