docker build -t reservasi .
docker-compose up -d
FROM ubuntu:16.04
RUN apt-get update && apt-get -y install python-pip libmysqlclient-dev
RUN pip install --upgrade pip
ENV DB_NAME=reservasi \
DB_USERNAME=userawan \
DB_PASSWORD=buayakecil
COPY reservasi /reservasi
WORKDIR /reservasi
RUN pip install -r requirements.txt
ENTRYPOINT ["python"]
CMD ["server.py"]
Setiap container nantinya akan memiliki environment variables seperti yang tertera pada Dockerfile untuk konfigurasi db pada app.
Jalankan perintah:
sudo docker build -t reservasi .
Buat 3 buah worker dengan menggunakan image yang dibuat pada soal 1.
services:
worker1:
image: reservasi
worker2:
image: reservasi
worker3:
image: reservasi
Tambahkan service untuk load balancer.
services:
balancer:
container_name: reservasi-balancer
image: nginx
depends_on:
- worker1
- worker2
- worker3
links:
- worker1:worker1
- worker2:worker2
- worker3:worker3
ports:
- 5000:80
volumes:
- ./balancer.conf:/etc/nginx/conf.d/default.conf
Keterangan:
depends_on
Balancer akan menunggu sampai semua worker sudah berjalan baru balancer dimulai.links
Memberikan alias dari setiap worker pada balancer.ports
Port mapping dari port 80 container ke port 5000 hostvolumes
Mount file balancer.conf ke directory/etc/nginx/conf.d
pada container dimana nginx akan meng-include config server.
Tambahkan docker networks pada compose file agar balancer dan workers berada pada satu network.
upstream workers {
server worker1;
server worker2;
server worker3;
}
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
location / {
proxy_pass http://workers;
}
}
Tambahkan service untuk database (mysql).
services:
db:
image: mysql
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
MYSQL_DATABASE: reservasi
MYSQL_USER: userawan
MYSQL_PASSWORD: buayakecil
volumes:
- ./reservasi/reservasi.sql:/docker-entrypoint-initdb.d/reservasi.sql
Keterangan:
volumes
: container mysql akan meng-execute semua file sql yg berada pada direktori/docker-entrypoint-initdb.d
secara berurutan (alphabetically). Sehingga dump database untuk app reservasi diletakkan di direktori tersebut.
Tambahkan dependency workers terhadap db agak db di-load terlebih dahulu sebelum workers.
services:
worker1:
depends_on:
- db
worker2:
depends_on:
- db
worker3:
depends_on:
- db
Tambahkan volumes.
volumes:
reservasi:
Tambahkan volumes pada node db agar data persistent.
services:
db:
volumes:
- reservasi:/var/lib/mysql
Final docker-compose.yml
version: '3.6'
services:
worker1:
container_name: reservasi-worker1
image: reservasi
depends_on:
- db
environment:
DB_HOST: db
worker2:
container_name: reservasi-worker2
image: reservasi
depends_on:
- db
environment:
DB_HOST: db
worker3:
container_name: reservasi-worker3
image: reservasi
depends_on:
- db
environment:
DB_HOST: db
db:
container_name: reservasi-db
image: mysql
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
MYSQL_DATABASE: reservasi
MYSQL_USER: userawan
MYSQL_PASSWORD: buayakecil
volumes:
- reservasi:/var/lib/mysql
- ./reservasi/reservasi.sql:/docker-entrypoint-initdb.d/reservasi.sql
balancer:
container_name: reservasi-balancer
image: nginx
depends_on:
- worker1
- worker2
- worker3
links:
- worker1:worker1
- worker2:worker2
- worker3:worker3
ports:
- 5000:80
volumes:
- ./balancer.conf:/etc/nginx/conf.d/default.conf
volumes:
reservasi:
Jalankan perintah:
docker-compose up -d
Buka localhost:5000
pada browser.