ডকার আমার অপছন্দের বস্তুর তালিকায় উপরের দিকে ছিলো। অপছন্দের কারন ম্যাকে ডকারের বাজে পারফরমেন্স। সেটা অবশ্য অনেক দিন আগের কথা (তখন ডকার ম্যাকে চলতো Boot to Docker
ভার্চুয়াল মেশিনে) কিন্তু প্রথম ইমপ্রেশন খারাপ দেখে ডকার জিনিসটা ভালোভাবে কখনো দেখার ধৈর্য হয়নি। কাজের খাতিরে দুই একটা ডকার ফাইলে কিছু পরিবর্তন করতে হয়েছে এই যা। কিন্তু সিরিয়াস কিছু কখনো করিনি ।
ঘটনা কয়েক মাস আগেরকার: প্রায় দেড় বছর আগে আয়নিক ফ্রেমওয়ার্কে লেখা একটা হাইব্রিড মোবাইল এপ এন্ড্রয়েডের জন্য বিল্ড করতে গিয়ে খেয়াল করলাম, রিসেন্ট নোডজেএস এর সাথে পুরান আয়নিক CLI
কাজ করেনা। সেটার জন্য NVM
ইনস্টল করে নোড ডাউনগ্রেড করলাম। এবং তার পর আবিস্কার করলাম এনড্রয়েড বিল্ড টুলও কাজ করেনা। সেইটাও পাল্টায়ে গেছে। গেছে তো গেছে পুরান জিনিপাতি খুজে খুজে ধরে ধরে বের করে কিছু কিছু ক্ষেত্রে ম্যানুয়ালি ইনস্টল করলাম। সেই যাত্রায় কাজ চলে গেল।
সমস্যা হলো যখন আমার ম্যাক অসুস্থ হয়ে সার্ভিস সেন্টারে গেল। বাংলাদেশের অন্য সব সার্ভিস সেন্টারের মত এরাও হার্ডওয়্যার জনিত সমস্যা সল্ভ করার পাশাপাশি ফ্রিতে ডিস্ক ফরম্যাট করে দিলো। আমার কাছে ফিরে আসার পর পুরাই মাথায় হাত। চিন্তা করলাম এই বিরক্তি থাকতে থাকতে ডকার শিখে ফেলা যায় কিনা দেখি। সেখান থেকেই শুরু।
এখন কাজের কথায় আসি। ডকার কি এটা জানা খুব সহজ, সার্চ দিলেই পাবেন। কনসেপ্ট খুব সিম্পল। আমি আমার মত করে যদি বলি :
কোন এপ্লিকেশন আপনি তার প্রায় সব ডিপেন্ডেন্সি সহ শিপ করতে চাইলে ডকার খুব ভালো টুল। প্রায় বেশীভাগ ডকার ইমেজ পোর্টেবল আর অলমোস্ট প্লাটফর্ম ইন্ডিপেন্ডেন্ট (উইন্ডোজে কিছু রেয়ার কেইসে অদ্ভুত ঝামেলা করে)
আমার ডেফিনেশন নিয়ে আমি নিজেই খুশি না। তাই সাজেস্ট করবো একটা ওয়েব সার্চ দিয়ে আরো উন্নতমানের ডেফিনেশন জেনে আসুন।
ডকার নিয়ে কাজ করতে গিয়ে সবচেয়ে বড় সমস্যা যেটা হলো, সেটা হলো, ইমেজ, কনটেইনার নিয়ে কনফিউশন। রান, স্টার্ট বিল্ড এইগুলা কি! শুরু করার আগে তাই ইমেজ আর কনটেইনার নিয়ে আলোচনা করা দরকার। সহজ একটা উদাহরন খুজছিলাম। পরে ভাবলাম প্রিন্টিং প্রেস দিয়ে উদাহরন দেই।
ধরেন আপনি কুদ্দুস ট্রেডার্স নামে নতুন একটা সফটওয়্যার কোম্পানি খুললেন। এখন কোম্পানির জন্য তো কিছু জিনিস লাগে, তাই আপনি গেলেন ঢাকার নীলখেতে, একটা প্রেসে গিয়ে আপনি বললেন আপনার কোম্পানির লেটারহেড লাগবে (কোম্পানির লোগো, ঠিকানা প্রিন্ট করা থাকে যেই কাগজে। পরে কোম্পানির ডকুমেন্ট ঐ কাগজে প্রিন্ট করা যায়) । আপনি ওদের ডিজাইন দিয়ে বাসায় চলে আসলেন।
এখান থেকে আমাদের উদাহরন শুরু:
ডকার ফাইল (Dockerfile) :
ধরেন প্রেসে যে আপনার ডকুমেন্ট প্রিন্ট করবে, তারা প্রিন্ট করার জন্য একটা লিখিত প্রোসেস ব্যাবহার করে।
১। প্রথমে সাদা কাগজ নিতে হবে
২। কাগজ কেটে A4 সাইজ বানাতে হবে
৩।প্রথমে কালো কালির প্রিন্ট করতে হবে
৪ । তারপর সায়ান কালির
৫। তারপর মেজেন্টা কালার
৬। তারপর হলুদ কালার
ঠিক তেমনি ডকার ফাইল একটা ডকার ইমেজ তৈরী করার ইনসট্রাকশন। ডকার ফাইল দেখতে কিছুটা এমন:
FROM ubuntu:16.04
LABEL MAINTAINER Anam Ahmed
# Install All the avengers
RUN apt-get update && apt-get install -y nginx
WORKDIR /var/www/html
COPY . /var/www/html
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
লাইন গুলো একটু বিশ্লেশন করে দেই:
FROM ubuntu:16.04
প্রতিটা ডকার ইমেজ অন্য কোন একটা বেস ইমেজ থেকে তৈরী হয়। এই ডকার ফাইলের বেস ইমেজ Ubuntu
আর সাথে 16.04
হচ্ছে ট্যাগ। প্রায় ৯৯% সময় দেখা যাবে আপনার বেস ইমেজ আসবে ডকার হাব থেকে। ট্যাগের সুবিধা হচ্ছে, একই নামে অনেক ধরনের ইমেজ রাখা যায়। যেমন 16.04
ট্যাগে উবুন্টু 16.04
এর বেস ইমেজ আছে, এর বদলে 18.04
ট্যাগ ব্যাবহার করলে উবুন্টু 18.04
এর বেস ইমেজ পাওয়া যেত।
LABEL MAINTAINER Anam Ahmed
লেবেলে যেকোন টাইপের ইনফরমেশন দেয়া যায়। সাধারনত ইমেজ নিয়ে এক্সট্রা ইনফরমেশন দেয়ার জন্য (ভার্শন, কে বানিয়েছে) ব্যাবহার করা হয়। আপনি ফরম্যাট ঠিক রেখে যেকোন কিছু লিখতে পারেন এখানে। যেমন ধরেন আপনি লিখলেন:
LABEL ANTIHERO DEADPOOL
এতেও কোন সমস্যা নাই
# Install all the avengers
এখনো যদি না বুঝে থাকেন, এই লাইনটা একটা কমেন্ট।
RUN apt-get update && apt-get install -y nginx
আপনার ইমেজ তৈরী করার সময় যেকেন কমান্ড চালানোর দরকার হতে পারে, আমি এখানে উবুন্টুর প্যাকেজ ম্যানেজার apt
দিয়ে nginx
ওয়েব সার্ভার এপ্লিকেশন ইনস্টল করেছি। যেহেুতু বেস ইমেজ উবুন্টুর, তাই উবুন্টুর যেকোন কমান্ড RUN
দিয়ে চালানো যাবে।
খেয়াল করে দেখলে দেখবেন আমি sudo
ব্যাবহার করিনি। ডকার ইমেজের ডিফল্ট ইউজার রুট। এটাও পাল্টানো যায় অবশ্য।
WORKDIR /var/www/html
ইমেজ বিল্ড শুরু হওয়ার সময়, ওয়ার্কিং ডিরেক্টরী থাকে রুট ইউজারের হোম, /root
, WORKDIR
দিয়ে ওয়ার্কিং ডিরেক্টরী পাল্টানো যায়।
এখন প্রশ্ন আসতে পারে, আমি তো RUN cd /var/www/html
করতে পারতাম। জী পারতেন। কিন্তু ডকার ফাইল কনফিউজিং হতো। প্লাস WORKDIR
কমান্ড দিয়ে কোন ফোল্ডারে গেলে, ইমেজে সেই ফোল্ডার না থাকলে ডকার সেই ফোল্ডার তৈরী করে নেয়।
COPY . /var/www/html
কপি কমান্ড নিয়ে আলোচনা করার আগে বিল্ড কনটেক্সট নিয়ে আলোচনা করা দরকার, ডকার ফাইল যেই ফোল্ডারে থাকে, সেই ফোল্ডার সাধারনত আপনার বিল্ড কনটেক্সট। আপনি বিল্ড কনটেক্সট থেকে চাইলে যেকোন ফাইল আপনার ডকার ইমেজে কপি করে নিয়ে যেতে পারেন। উপরের স্যাম্পল কমান্ডে আমি বিল্ড কনটেক্সটের সবকিছু((.) মানে বর্তমান ফোল্ডার
) ইমেজের /var/www/html
ফোল্ডারে কপি করে নিয়ে গিয়েছি।
EXPOSE 80
আপনি আপনার ইমেজ থেকে কোন পোর্ট এক্সপোজ করতে চাইলে এই লাইন লাগবে। আমি এখানে পোর্ট ৮০ বাইরে এক্সপোজ করেছি।(পোর্ট এক্সপোজ করার কাজ কিন্তু অর্ধেক বাকী আছে পরে আলোচনা আছে এটা নিয়ে)
CMD ["nginx","-g","daemon off;"]
আপনার ইমেজ থেকে একটা কনটেইনার চালু করলে যেই কমান্ড চলবে সেই কমান্ড CMD
দিয়ে লিখে দিতে হবে। নরমালি টার্মিনালে লিখলে কমান্ডটা দেখতে এমন হতো: nginx -g daemon off;
একটা গুরুত্বপুর্ন ব্যাপার হচ্ছে: আপনার কমান্ড বন্ধ হয়ে গেলে কিন্তু আপনার কনটেইনার বন্ধ হয়ে যাবে। তাই একটা কমান্ড চালিয়ে রাখতে হবে। উপরের কমান্ডে nginx সার্ভার
daemon
হিসেবে না চলে ফোরগ্রাউন্ডে চলবে, যেন আপনার কনটেইনার বন্ধ হয়ে না যায়।
ইমেজ আর কনটেইনার :
আপনার ফিনিশড লেটারহেড গুলো ইমেজের মত। খেয়াল করে দেখেন, শুধু লেটারহেড একটা জেনারেল ব্যাপার। আপনার ইমেজ ব্যাবহার করতে হলে ইমেজ থেকে একটা কনটেইনার চালু করতে হবে। কনটেইনার চালু করাটা কিছুটা ব্রাউজারের নতুন ট্যাব খোলার মত। অথবা লেটারহেড উদাহরন থেকে বললে, আপনি একটা লেটারহেডে কোন কর্মকর্তার স্যালারী সার্টিফিকেট বানালেন, লেটারহেড ইমেজের উপর একটা কনটেইনারে স্যালারী সার্টিফিকেট হলো। অরিজিনাল লেটারহেডের কিন্তু কোন পরিবর্তন হলো না, অন্য একটা লেটারহেড দিয়ে চাইলেই অন্য কাজ করতে পারবেন।
উপরের স্যাম্পল ডকার ফাইলটা একটা ফোল্ডার বানিয়ে সেটাতে Dockerfile
(কোন এক্সটেনশন নাই) তৈরী করে রেখে দিন, সাথে একটা index.html
ফাইল বানায়ে ভিতরে কিছু লিখে রাখেন সেই ফোল্ডারে।
আপনার ডকার ফাইল যেই ফোল্ডারে আছে, সেখানে গিয়ে ডকার ফাইল থেকে ইমেজ তৈরী করতে চাইলে, একটা কমান্ড চালাতে হবে, তাহলে ডকার আপনার ডকার ফাইল থেকে ইমেজ তৈরী করবে। কমান্ডটা হচ্ছে:
docker build -t theanam/dockersample .
docker build
অংশটা বোঝা সহজ, -t
দিয়ে ইমেজকে একটা ট্যাগ দিয়ে দিলাম, এখানে ট্যাগ দিলাম theanam/dockersample
আপনি চাইলে অন্য যেকোন ট্যাগ ব্যাবহার করতে পারতেন, তবে আপনার ডকার হাব ইউজারনেম/ইমেজের নাম দেয়াটা স্ট্যান্ডার্ড (ডকার নিয়ে গভীর পড়াশোনা করলে বুঝতে পারবেন)
শেষের (.)
টা অনেকেই খেয়াল করেনা, এটা দিয়ে বুঝায় আপনি টার্মিনাল দিয়ে যেই ফোল্ডারে আছেন সেই ফোল্ডার আপনার বিল্ড কনটেক্সট। এই ডট ভুলে যাবেন না।
ইমেজ তৈরী হয়ে গেলে আপনি চাইলে ইমেজ থেকে নতুন কনটেইনার রান করতে পারেন। কমান্ড হচ্ছে:
docker run --name mycontainer -p 8080:80 theanam/dockersample
কমান্ডের প্রথম অংশ বোঝা সহজ, সাথে --nam
(দুইটা ড্যাশ কিন্তু --) দিয়ে কনটেইনারের একটা নাম দিয়ে দিলাম। আর তারপর -p দিয়ে ডকার কনটেইনারের ভিতরের পোর্টের সাথে হোস্ট কম্পিউটারের পোর্ট ম্যাপ করতে হবে। ফরম্যাট হচ্ছে -p hostport:containerport
এখানে আমি হোস্ট মেশিনের পোর্ট ৮০৮০, কনটেইনারের পোর্ট ৮০ তে ম্যাপ করে দিয়েছি (মুরুব্বিরা বলে স্ট্যাটিক পোর্ট ম্যাপিং বুঝে শুনে ব্যাবহার করতে)
তার পরে আমার বানানো ইমেজের ট্যাগ theanam/dockersample
দিয়ে দিয়েছি। এখন সবকিছু ঠিক থাকলে আপনার ব্রাউজারে গিয়ে http://localhost:8080 দিলে আপনার ইনডেক্স ফাইল দেখতে পাবেন।
আচ্ছা, বেইস ইমেজও তো ইমেজ, সেইগুলাও কিন্তু রান দিয়ে রান করানো যাবে।
টার্মিনালে গিয়ে লিখেন:
docker run -it ubuntu:16.04 /bin/bash
বাংলায় একটা কথা আছে, রুপ থাকলে ধরে দিবো, না থাকলে গড়ে দিবো। ঠিক এমনই, আপনার লোকাল সিস্টেমে এই ইমেজ না থাকলে ডকার হাবে গিয়ে ইমেজ নিয়ে এসে কিছুক্ষন পর দেখবেন আপনাকে একটা উবুন্টু শেলে ঢুকায়ে দিছে।
এখানে -it
দিয়ে সহজ ভাষায় কনটেইনারের শেল (stdin
আর stdout
) এ এক্সেস নিচ্ছি যেন টারমিনাল ব্যাবহার করা যায়। আর শেষের কমান্ড টা হুবহু ডকার ফাইলের CMD
এর মত। কনটেইনারে ডুকে ব্যাশ চালু হবে।
এই আর্টিকেল লেখার সময় বার বার মনে হচ্ছিলো আমি ডকার নিয়ে যথেষ্ট ইনফরমেশন দিতে পারবো না। আবার লম্বা আর্টিকেল লিখলে কেও পড়েনা। আমি যদি ডকার নিয়ে আপনার মনে যথেষ্ট পরিমান প্রশ্ন তৈরী করতে সক্ষন হয়ে থাকি তাহলে আজকেই অফিশিয়াল ডকুমেন্টেশন পড়তে লেগে যান।
ডকার শেখার ভালো একটা বই (ফ্রি না): https://dockerbook.com/
ডকার শিখতে Maateen আর তারিকুর ভাই অনেক সাহায্য আর ইনসপিরেশন দিয়েছেন।