எளிய தமிழில் DevOps-5

Docker Compose

 

Develop, Ship & Run multi-container application என்பதே டாக்கர் கம்போஸ்ன் தத்துவம் ஆகும். இதுவரை flask மூலம் ஒரே ஒரு அப்ளிகேஷனை உருவாக்கி, கன்டெய்னரில் இட்டு சர்வரில் deploy செய்வது எப்படி என்று பார்த்தோம். ஆனால் நிஜத்தில் வெறும் அப்ளிகேஷன் மட்டும் உருவாக்கப்படாது. ப்ராஜெக்ட் கட்டமைப்பு என்பது அப்ளிகேஷன், அதற்குரிய டேட்டாபேஸ் என அனைத்தும் சேர்ந்தே வரும். ஆகவே இவை ஒவ்வொன்றுக்கும் தனித்தனி கன்டெய்னரை உருவாக்கி அவற்றை ஒன்றோடொன்று தொடர்பு கொள்ளுமாறு செய்வதே docker-compose ஆகும்.

மேலும் ஒரே கணினியில் மல்டி கன்டெய்னர் அப்ளிகேஷனை இயக்குவது docker-compose என்றால் பல்வேறு கணினிகள் இணைந்திருக்கும் கிளஸ்டர் அமைப்பில் இதே வேலையைச் செய்வது docker swarm ஆகும்.

கீழ்க்கண்ட உதாரண ப்ரோக்ராமில் flask-ன் default port 5000-ல் அளிக்கப்படும் மதிப்பினை எடுத்து மாங்கோ db-ல் செலுத்துமாறு ஒரு அப்ளிகேஷன் எழுதப்பட்டுள்ளது. இதில் இரண்டு கூறுகள் உள்ளன. ஒன்று ஃபிளாஸ்க் மூலம் எழுதப்பட்டுள்ள அப்பிளிகேஷன் மற்றொன்று மாங்கோ db. இவை இரண்டுக்குமான கன்டெய்னர்களை தனித்தனியே எவ்வாறு உருவாக்குவது என்று இப்பகுதியில் பார்க்கலாம்.


from flask import Flask, request, jsonify
from pymongo import MongoClient
app = Flask(__name__)
client = MongoClient('mongodb',27017)
db = client.forest
collection = db.flowers
@app.route('/', methods=['POST', 'GET'])
def index():
if request.method == 'POST':
data = request.get_json()
collection.insert_one(data).inserted_id
#with open('./tmpfiles/data.log','a') as f:
#f.write(str(data)+'/n')
return ('', 204)
if request.method == 'GET':
data = collection.find()
response = []
for i in data:
i['_id'] = str(i['_id'])
response.append(i)
return jsonify(response)
if __name__ == '__main__':
app.run(host='0.0.0.0')

view raw

app.py

hosted with ❤ by GitHub


முதலில் இவற்றுக்கான கன்டெய்னர்களை உருவாக்க எப்போதும் போல் Dockerfile மற்றும் requirements.txt ஆகியவற்றை எழுதிவிடவும்.

Dockerfile

FROM ubuntu:20.04
COPY . /app
WORKDIR /app
RUN apt-get update
RUN apt-get install python3-pip -y
RUN pip3 install -r requirements.txt
ENTRYPOINT ["python3"]
CMD ["app.py"]

requirements.txt

flask
pymongo==3.11.0

பின்னர் இவற்றுக்கான கன்டெய்னர்களை தனித்தனியே உருவாக்க docker-compose.yml எனும் ஃபைலை நாம் எழுத வேண்டும்.


version: '3'
services:
app:
build: .
image: flaskapp:v10
environment:
FLASK_ENV=development
ports:
5000:5000
#volumes:
#– /home/nithya/backup:/app/tmpfiles
mongodb:
image: mongo


இதில் நமது அப்ளிகேஷனில் பயன்படுத்தப்படும் பல்வேறு கூறுகளும் தனித்தனியே வரையறுக்கப்படும். docker-compose எனும் கட்டளை இதில் வரையறுக்கப்பட்டுள்ளதற்கு ஏற்ப தனித்தனியாக இமேஜை உருவாக்கி கன்டெய்னர்களை இயக்கும்.

$ docker-compose up

இக்கட்டளை அப்ளிகேஷனை பில்டு செய்து இரண்டு தனித்தனி கன்டெய்னர்களில் சர்வீசை இயக்கிக் கொண்டிருக்கும். ctrl+x எனக் கொடுத்தால் சர்வீசை நிறுத்திவிடலாம். ஆனால் துவக்கும் போது -d எனக்கொடுத்து துவக்கினால், அதனை நிறுத்த down எனக் கொடுக்க வேண்டும். ஏனெனில் சர்வீஸ் daemon பிராசஸ் ஆக பின்புலத்தில் இயங்கிக் கொண்டிருக்கும். இதற்கான கட்டளைகள் பின்வருமாறு அமையும்.

$ docker-compose up -d
$ docker-compose down

இப்போது சர்வீஸ் இயங்கிக் கொண்டிருக்கும் பட்சத்தில் அதனை சோதிக்க curl கட்டளையைப் பயன்படுத்தலாம். முன்பு போஸ்ட்மேன் கருவி வழியே சோதித்துப் பார்த்தோம் அல்லவா! இம்முறை curl-ஐப் பயன்படுத்தலாம்.

5000 எனும் போர்ட்டில் ஒரு json data-வை அளிப்பதற்கான கட்டளை பின்வருமாறு.

$ curl --header "Content-Type: application/json" --request POST --data '{"lotus":10,"tulips":14}' localhost:5000

app.py எனும் நிரலில் கொடுக்கப்பட்டுள்ளது போல இத்தரவினை எடுத்து மாங்கோவில் சென்று forest db-க்குள் flowers collection-க்குள் சேர்ந்து விடும். இதனை சோதிக்க அதே போர்டில் GET செய்து பார்க்கலாம் அல்லது மாங்கோவுக்குள் சென்று பார்க்கலாம்.

மாங்கோவில் சென்று கலெக்சனில் சேமிக்கப்பட்டுள்ளதை எடுத்து 5000 போர்டில் வெளிப்படுத்துவதற்கான கட்டளை பின்வருமாறு.

$ curl --request GET localhost:5000

மாங்கோவுக்குள்ளேயே சென்று பார்க்க விரும்பினால் கீழ்க்கண்ட கட்டளையை அளிக்கவும்.

$ docker exec -it appstack_mongodb_1 /bin/bash

இது மாங்கோவை interactive ஷெல்லாக வெளிப்படுத்தும்.

$ mongo

பின் கீழ்க்கண்ட கட்டளைகளை அளித்து json தரவு சென்று சேர்ந்துள்ளதா என சோதித்துக் கொள்ளலாம்.

> show dbs
> use forest
> db.flowers.find()

அடுத்ததாக ஒருசில துணைக் கட்டளைகளைப் பற்றிப் பார்ப்போம்.

கீழ்க்கண்ட கட்டளை தனித்தனியே ஓடுகின்ற இரண்டு கன்டெய்னர்களின் பெயர் மற்றும் மற்ற விவரங்களை வெளிக்காட்டும்.

$ docker-compose ps

கீழ்க்கண்ட கட்டளை நெட்வொர்க்குகளை பட்டியலிடும்.

$ docker network ls

டாக்கர் கம்போஸ் செய்யும் போதே இரண்டு கன்டெய்னர்களையும் உள்ளடக்கிய ஒரு நெட்வொர்க் உருவாக்கப்படும். இந்த நெட்வொர்க்கில் உள்ள கன்டெய்னர்கள் எந்த ஒரு சிறப்பு அனுமதியும் இன்றி தங்களுக்குள் ஒன்றோடொன்று பேசிக்கொள்ளும். ஆனால் மற்ற நெட்வொர்க்குடன் எந்த ஒரு தொடர்பும் இல்லாமல் தனித்து இயங்கும். இங்கு appstack_default என்ற பெயரில் நெட்வொர்க் உருவாகியுள்ளது. அதாவது நம்முடைய கோப்புகள் எந்த டைரக்டரியில் சேமிக்கப்பட்டுள்ளதோ அந்த டைரக்டரியின் பெயருடன் _default என சேர்த்து நெட்வொர்க்கின் பெயர் உருவாக்கப்படும்.

இது நம்முடைய நெட்வொர்க்கை ஆய்வு செய்ய உதவும்.

$ docker network inspect appstack_default

docker-compose ஐத் தொடர்ந்து ps, logs, start, stop, kill, restart, push, pull போன்ற பல்வேறு துணைக் கட்டளைகளையும் பயன்படுத்தலாம்.

%d bloggers like this: