Deployment dengan Docker

Hema Mitta Kalyani
LEARNFAZZ
Published in
3 min readMay 24, 2019
Sumber: www.docker.com

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: true
networks:
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.

--

--