Docker
Develop, Ship & Run anywhere என்பதே docker-ன் தத்துவம் ஆகும். ஓரிடத்தில் உருவாக்கப்படும் அப்ளிகேஷனை, இடம் மாற்றி, எங்கு வேண்டுமானாலும் நிறுவி தங்கு தடையின்றி இயங்க வைக்குமாறு செய்ய docker உதவுகிறது. Cloud சிஸ்டம் தனது சேவைகளை மூன்று விதங்களில் வழங்குகிறது. அவை PaaS ( P -Platfrom), SaaS ( S -Software), IaaS ( I -Infrastructure) என்று அழைக்கப்படுகின்றன. இதில் Platform as a service என்பதை வழங்குவதற்குத் தேவையான கருவிகளை உள்ளடக்கியதே docker ஆகும்.
முன்னரெல்லாம் நம்முடைய லோக்கல் சர்வரில் நம்முடைய configurations-ல் உருவாக்கப்பட்ட ஒரு அப்ளிகேஷனை, வேறொரு புதிய சர்வருக்கு அனுப்பும்போது அங்கு நிலவும் configurations-ஆல் அதனால் சரிவர இயங்கி பயனளிக்க முடியாது. ஆகவே இப்பிரச்சினையைத் தீர்க்கும் iபொருட்டு அப்ளிக்கேஷனுக்குத் தேவையான மென்பொருட்கள், லைப்ரரி, config கோப்புகள் மற்றும் OS-ஐக் கூட மெய்நிகராக்கம் (virtualization) செய்து அனைத்தையும் ஒன்றாக மூட்டை கட்டி ஒரு தொகுப்பாக அமைக்கிறது. இதற்கு container என்று பெயர். இதற்குள் இருப்பவற்றை இயக்கி நமது அப்ளிகேஷனின் இயங்கக்கூடிய பதிப்பினை (executable version) உருவாக்கம் செய்வதே image என்று அழைக்கப்படுகிறது. இந்த இமேஜை உருவாக்கத் தேவையான விதிகளைக் கொண்டுள்ள கோப்பு Dockerfile என்று அழைக்கப்படுகிறது.
நமது கணினியில் docker-ஐ நிறுவுவற்கான மற்றும் நீக்குவதற்கான கட்டளைகள் பின்வருமாறு.
$ sudo apt-get install docker $ sudo apt-get remove docker
docker-ஐ நிறுவிய பின்னர் நமது கணினியில் தற்போது இயங்கிக்கொண்டிருக்கும் கன்டெய்னர்களைக் காண docker ps எனும் கட்டளை பயன்படும். -a என சேர்த்துக் கொடுத்தால் இயக்கத்தில் இல்லாத கன்டெய்னர்களையும் காட்டும். docker images எனும் கட்டளை இதுவரை உருவாக்கியுள்ள இமேஜ் அனைத்தையும் பட்டியலிடும்.
இப்போது நான் இதுவரை உருவாக்கியுள்ள இமேஜ் அனைத்தையும் அழித்துவிட்டு புதிதாக ஒரு இமேஜை உருவாக்கப் போகிறேன். ஆகவே
$ docker system prune -a
எனும் கட்டளை மூலம் இயக்கத்தில் இல்லாத அனைத்து கன்டெய்னர்கள், இமேஜ், நெட்வொர்க் போன்ற அனைத்தையும் நீக்கியுள்ளேன்.
இப்போது இமேஜ் எதுவும் வெளிப்படவில்லை.
அடுத்ததாக இமேஜை உருவாக்குவதற்குத் தேவையான விதிகளை உள்ளடக்கிய டாக்கர் கோப்பினை உருவாக்க வேண்டும்.
Dockerfile
நாம் விரும்பும் வேலைகளை கணினியை செய்ய வைக்க ஒவ்வொரு கட்டளைகளாகக் கொடுத்து கணினிக்கு உத்தரவு பிறப்பிப்போம். இவ்வாறு பல கட்டளைகளை தனித்தனியே தட்டச்சு செய்வதை விட, அவை அனைத்தையும் ஒரே file-ல் எழுதி ஒரே கட்டளை மூலம் அந்தக் கோப்பில் உள்ள எல்லா commands-ஐயும் ஒன்றன்பின் ஒன்றாக இயங்க வைக்க முடியும். இதுவே லினுக்ஸில் shell scripting என்றும், விண்டோஸில் Batch file என்றும் அழைக்கப்படுகிறது. இதே வேலையை ஒரு container-க்குள் செய்து இமேஜை உருவாக்க உதவுவதே Dockerfile ஆகும்.
இங்கு real_time, sample எனும் இரண்டு ஃபோல்டருக்குள் இரண்டு வெவ்வேறு அப்ளிகேஷன்கள் சேமிக்கப்பட்டுள்ளன. ஆகவே ஒவ்வொரு ஃபோல்டருக்குள்ளும் சென்று அந்தந்த அப்ளிகேஷனை இயக்குவதற்குத் தேவையான விதிகளை உள்ளடக்கிய டாக்கர் கோப்பினை உருவாக்க வேண்டும்.
முதலில் sample எனும் ஃபோல்டருக்குள் சென்று பின்வரும் கட்டளைகளை உள்ளடக்கிய ஒரு கோப்பினை உருவாக்கி அதனை Dockerfile எனும் பெயரில் சேமிக்கவும்.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
FROM ubuntu:20.04 | |
COPY . /app | |
WORKDIR /app | |
RUN apt-get update | |
RUN apt-get install python3-pip -y | |
ENTRYPOINT ["python3"] | |
CMD ["sample_api.py"] |
இக்கோப்பிற்குள் கொடுக்கப்பட்டுள்ள கட்டளைகளின் வரிசைப்படி பார்த்தால், முதலில் உபுண்டு 20.04-ன் இமேஜை பிரதியெடுத்து டாக்கருக்குள் உருவாக்கும். பின் தற்போதைய sample டைரக்டரியில் உள்ளதை உபுண்டுவின் /app எனும் டைரக்டரிக்குள் செலுத்தும். பின் அதனை வொர்கிங் டைரக்டரியாக மாற்றி உபுண்டுவை ஒருமுறை அப்டேட் செய்யும். பின் நமது அப்ளிகேஷனுக்குத் தேவையான நிரலாக்க மொழியை நிறுவும். இதன் தொடர்ச்சியாக இன்ஸ்டால் செய்யப்படவேண்டிய லைப்ரரி அனைத்தையும் ஒன்றன்பின் ஒன்றாக நிறுவுவதற்கான கட்டளைகளை இங்கேயே கொடுத்தாலும் கொடுக்கலாம் அல்லது requirements.txt எனும் பெயரில் தனியாக ஒரு கோப்பினை உருவாக்கி அதிலிருந்து ஒவ்வொன்றாக எடுத்து நிறுவும் படியும் சொல்லலாம். இங்கு flask எனும் ஒரே ஒரு லைப்ரரி மட்டும் தேவைப்படுவதால், அதற்கான கட்டளையை இங்கேயே கொடுத்துவிட்டோம். இதன் பின் நமது ப்ரோக்ராமை இயக்குவதற்குத் தேவையான கட்டளைகள் கொடுக்கப்பட்டுள்ளன.
அடுத்ததாக docker build எனும் கட்டளை மூலம் இமேஜ் உருவாக்கப்பட்டுள்ளது. -t என்பது tag என்பதைக் குறிக்கும். அதாவது sample எனும் பெயர்கொண்ட v1 என tag செய்யப்பட்ட ஒரு இமேஜ் id உருவாக்கப்படும்.
$ sudo docker build -t sample:v1 .
இதைத்தொடர்ந்து real_time எனும் ஃபோல்டருக்குள் சென்று prediction_api எனும் ப்ரோக்ராமை இயக்குவதற்குத் தேவையான டாக்கர் ஃபைலை உருவாக்கவும்.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 ["prediction_api.py"] |
இங்கு ப்ரோக்ராமை இயக்குவதற்குத் தேவையான லைப்ரரி அதிகமாக இருப்பதால் அவை அனைத்தும் requirements.txt எனும் கோப்பிற்குள் கொடுக்கப்பட்டு அதிலிருந்து நிறுவுமாறு, டாக்கருக்குள் எழுதப்பட்டுள்ளது.
requirements.txt
pandas numpy flask scikit-learn==0.23.1 joblib
பின் docker build எனும் கட்டளை மூலம் prediction எனும் பெயர் கொண்ட v1 என tag செய்யப்பட்ட ஒரு இமேஜ் id உருவாக்கப்பட்டுள்ளது.
$ sudo docker build -t prediction:v1 .
docker images எனும் கட்டளை இதுவரை நாம் உருவாக்கியுள்ள இமேஜ் அனைத்தையும் பட்டியலிடுவதைக் காணலாம். ஆனால் docker ps எனும் கட்டளை இன்னும் கன்டெய்னர்கள் எதுவும் உருவாக்கப்படவில்லை என்பதைத் தெரிவிக்கிறது.
docker run எனும் கட்டளை கொடுக்கப்பட்ட இமேஜை கன்டெய்னரில் போட்டு, நமது அப்ளிகேஷனுக்கென தனியொரு கன்டெய்னரை உருவாக்கும். டாக்கர் கோப்பில், தேவையான மாடியூலை இன்ஸ்டால் செய்வதற்கான கட்டளைகள் இல்லையெனில் பின்வருவது போன்ற தவறுகள் ஏற்படும்.
இதுபோன்ற தருணத்தில் ஏற்கனவே உருவாக்கிய இமேஜை அழித்து, டாக்கரில் திருத்தம் செய்து மீண்டும் ஒரு இமேஜை உருவாக்க வேண்டும். docker rmi -f என்பது இமேஜை அழிக்க உதவும் கட்டளை ஆகும்.
அடுத்து திருத்தப்பட்ட இமேஜ் உருவாக்கப்படுகிறது.
இப்போது இரண்டு அப்ளிகேஷன்களுக்குமான இரண்டு கன்டெய்னர்கள் தனித்தனியே பின்வருமாறு உருவாக்கப்பட்டுள்ளன.
$ sudo docker run -d -p 6600:5600 sample:v2 $ sudo docker run -d -p 6600:5600 prediction:v1
-d என்பது daemon process –ஐக் குறிக்கிறது. இதுவே நமது அப்ளிகேஷனை பின்புறத்திலிருந்து இயங்குமாறு செய்கிறது.
-p என்பது port ஆகும். Colon-க்கு இடப்புறம் ஹோஸ்ட் சர்வரில் மதிப்பு வெளிப்பட வேண்டிய போர்ட் எண்ணையும், வலப்புரம் நம்முடைய லோக்கல் அப்ளிகேஷனுக்குள் நாம் கொடுத்த போர்ட் எண்ணையும் குறிப்பிட வேண்டும்.
docker ps எனும் கட்டளை நாம் உருவாக்கிய கன்டெய்னர்களை வெளிக்காட்டுவதைக் காணலாம். அவ்வளவுதான்! இந்தக் கன்டெய்னர்கள் வழியே நமது அப்ளிகேஷனுக்கான சர்வீஸ் பின்புலத்தில் இயங்கிக் கொண்டிருக்கும். கொடுக்கப்பட்ட போர்டில் மதிப்புகளை வெளிப்படுத்திக் கொண்டிருக்கும்.
போஸ்ட்மேன் கருவி வழியே இதனை நாம் மீண்டும் சரிபார்த்துக் கொள்ளலாம்.
டாக்கர் மூலம் வேறொரு புதிய சர்வரில் ஹோஸ்ட் செய்யாமல் என்னுடைய கணினியையே நான் பயன்படுத்தியதால் இங்கு 0.0.0.0 எனும் லோக்கல் ஹோஸ்ட் இடம்பெற்றுள்ளது. ஆனால் 5500, 5600 ஆகிய போர்ட் எண்களில் இயங்கிக் கொண்டிருந்தது தற்போது 6500, 6600 ஆகிய போர்ட் எண்களில் செயல்படுவது டாக்டரின் இயக்கத்தை உறுதி செய்கிறது.
மேலும் start, stop, rm ஆகிய கட்டளைகள் கன்டெய்னரின் இயக்கத்தை துவக்குதல், நிறுத்துதல், கன்டெய்னரை நீக்குதல் போன்ற வேலைகளைச் செய்கின்றன. முதலில் கன்டெய்னர்களின் நிலைகளையும்(STATUS) இச்செயல்களுக்குப் பின்பு அவற்றின் நிலைகளையும் பின்வருமாறு காணலாம்.
ஒரு அப்ளிகேஷனை நிறுவுவதில் டாக்கரின் பயன்பாடு பற்றி இப்பகுதியில் பார்த்தோம். இதில் ஜென்கின்ஸ் பங்களிப்பு பற்றி இனிவரும் பகுதியில் காணலாம்.