Docker techniques

1.Open your Docker daemon to the world می دانیم که docker deamon فقط روی ‌host قابل دسترسه. اما گاهی به دلایلی مثل دیباگ یا انجام کاری لازم باشه به صورت ریموت افراد دیگه دسترسی داشته باشند. پس در این جا با وجود این که امنیت زیر سوال میره میتونیم اجازه دسترسی به docker daemon رو به افراد باید بدیم.کانفیگ پیش فرض داکر به این صورت که دسترسی ها ازطریق سوکت دامنه /var/run/docker.sock/ محدود شده و فرایند های خارجی بهش دسترسی ندارند.ایجاد دسترسی به docker daemon از طریق سوکت TCP 2375 انجام می دهیم و برای وصل شدن از IP و پورت 2375 استفاده می شود.خب برای ایجاد دسترسی باید docker را stop کنیمSystemctl stop docker.service و سپس دستور زیر را میزنیم dockerd -H tcp://0.0.0.0:2375 در حقیقت docker daemon را start می کنیم.و برای وصل شدن به آن از دستور زیر استفاده می کنیم.docker -H tcp://<your host's ip>:23752.Managing the startup of your container’s servicesهمانطور که میدانیم کانتینر های docker هر کدام برای بالا اوردن یک سرویس هستند . اما زمانی هست که میخواهیم چندین سرویس را داخل کانتینر داشته باشیم برای همین میتونیم از supervisor و وب سرویس های apache2 و tomcat استفاده کنیم.خب ابتدا باید image مربوط به supervisor را بسازیم.پس با استفاده از Dockerfile زیر image را می سازیم.FROM ubuntu:14.04RUN apt-get update && apt-get install -y python-pip apache2 tomcat7ENV DEBIAN_FRONTEND noninteractiveRUN pip install supervisorRUN mkdir -p /var/lock/apache2RUN mkdir -p /var/run/apache2RUN mkdir -p /var/log/tomcatRUN echo_supervisord_conf > /etc/supervisord.confADD ./supervisord_add.conf /tmp/supervisord_add.confRUN cat /tmp/supervisord_add.conf >> /etc/supervisord.confRUN rm /tmp/supervisord_add.confCMD [&quotsupervisord&quot,&quot-c&quot,&quot/etc/supervisord.conf&quot]حالا باید supervisor را کانفیگ کنیم و مشخص کنیم چه سرویس هایی باید بالا بیان روی کانتینر[supervisord]nodaemon=true# apache[program:apache2]command=/bin/bash -c &quotsource /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND&quot# tomcat[program:tomcat]command=service start tomcatredirect_stderr=truestdout_logfile=/var/log/tomcat/supervisor.logstderr_logfile=/var/log/tomcat/supervisor.error_log[supervisord]nodaemon=true این قسمت برای کانفیگ کلی supervisor می باشد# apache[program:apache2]# tomcat[program:tomcat]در این قسمت سرویس هایی که میخواهیم اجرا بشوند را قرار می دهیمبا دستور زیر image را می سازیمdocker build -t supervised .و سپس اجرا می کنیمdocker run -p 9000:80 --name supervised supervised3.The “save game” approach to develop زمانی پیش میاد که داخل کانتینر تغییراتی اعمال کردیم مثل تغییر محتوای داخل یک فایل یا ساخت یک فایل و میخواهیم این تغییرات رو save نگه داریم .راه حلی که براش وجود داره اینه که بعد از اعمال تغییرات کامیتشون کنیم. طبق توضیحات پایین می تونیم این کارو انجام بدیم:docker run --rm -d -p 8000:8000 --name todoapp dockerinpractice/todoappdocker exec -it todoapp bashسپس یک editor نصب میکنیمapt-get updateapt install vimو یک فایل ایجاد می کنیمvim text.htmlو tag زیر را داخلش قرار میدم<title>this is test</title>حالا با دستور زیر کامیت میکنمdocker commit todoapp8c3d5d3ffd70d17e9e47e90801af7d12d6fc0b8b14a8b33131fc708423ee4672حالا داخل یک ترمینال دیگر دستور زیر را اجرا می کنیمdocker run -p 8001:8000 8c3d5d3ffd70d17e9e47e90801af7d12d6fc0b8b14a8b33131fc708423ee4672نکته: با commit کردن فقط وضعیت فایل سیستم را ذخیره می کنیم و فرایند ها ذخیره نمی شوند.4.Docker taggingزمانی یک image ایجاد می کنیم یک id به ما میده که طولانیه و سخته همیشه بخوایم باهاش کار کنیم یا حفظش کنیم بخاطر همین بهتره برای image هامون tag بزاریم با استفاده از دستور زیر:docker tag 8c3d5d3ffd70d17e9e47e90801af7d12d6fc0b8b14a8b33131fc708423ee4672 todoapp و از این به بعد بخوایم با image کار کنیم می تونیم با tag صداش بزنیم. 5.Sharing images on the Docker Hubبرای ذخیره کردن image ها باید از یک رجیستری استفاده کنیم .می تونیم از رجیستری public مثل docker hub استفاده کنیم یا از یک رجیستری peivate که خودمون راه اندازی کردیم.برای استفاده از ‌رجیستری docker hub یا رجیستری private باید ابتدا login کنیمdocker login -u username -p password registry_urlبه طور مثال ما یک image داریم و میخوایم بفرستیم به رجیستری public باید به صورت زیر عمل کنیمdocker tag username/imagename imagenamedocker push username/imagenameارسال image به رجیستری privatedocker tag registry_url/imagename imagenamedocker push registry_url/imagenamem برای pull کردن image از رجیستری private باید از دستور زیر استفاده کنیدdocker pull registry_url/imagename وقتی داخل dockerhub یک image قرار می دهید این image در ریپازیتوری شما قرار می گیرد و افرادی که به این ریپازیتوری دسترسی داشته باشند می توانند از آن استفاده کنند. 6.onbuild and galangیک زمانی ما دو تا داکر فایل با دو اسم متفاوت داریم اما می خواهیم تعداد کامند هایی که هر کدام اجرا می کنن رو کم کنیم و یکسری کامند رو فقط زمان های خاصی اجرا کنیم. در اینجا می تونیم از ONBUILD استفاده کنیم.به این صورت که ما یک داکرفایل base داریم به شکل زیر:FROM maven:3-jdk-8RUN mkdir -p /usr/src/appWORKDIR /usr/src/appONBUILD ADD . /usr/src/appONBUILD RUN mvn install و داکرفایل به شکل زیر است:FROM maven:3.3-jdk-8-onbuildCMD [ “java”,”-jar”,”/usr/src/app/target/demo-1.0-SNAPSHOT-jar-with-dependencies.jar”]که زمان اجرا داکرفایل چون maven:3.3-jdk-8-onbuild را در FROM گزاشتیم ابتدا ONBUILD ها رو اجرا می کنه بعد CMD7.Cleanly killing containersزمانی که می خواهید به container خاتمه دهید دو راه وجود دارد:docker stopdocker killCommand Default signal Default signal value kill TERM 15docker kill KILL 9docker stop TERM 15که در ادامه تفاوت این دو را توضیح میدم.docker stop:زمانی که از docker stop استفاده می کنیم ابتدا سیگنال TERM رو ارسال می کنه و به مدت 10 ثانیه صبر می کنه و بعد سیگنال KILL رو می فرسته یعنی به container این فرصت رو میده که خاتمه پیدا کنه. docker kill:زمانی که از docker kill استفاده می کنیم مستقیما سیگنال KILL رو ارسال می کنه و فرصتی به container داده نمی شود برای خاتمه پیدا کردن و ممکنه فایل های مربوط به اجرای پروسس در سیستم باقی بمانند.در کل بهتره که برای خاتمه دادن به container ها از docker stop استفاده بشه. 8.Retaining your container’s bash history یه وقتایی پیش میاد میخوایم history مربوط به bash کانتینر رو به host انتقال بدیم .برای این کار می توانیم از فلگ e- موقع run کردن container استفاده کنیمdocker run -e HIST_FILE=/root/.bash_history \-v=$HOME/.bash_history:/root/.bash_history \-ti ubuntu /bin/bash9.Data containersما به طور مثال 4 container داریم که 3 از آن ها از یک فایل یکسان container چهارم استفاده می کنن .به طور مثال ما یک container برای ubuntu بالا اوردیم و داخل آن یک فایل ایجاد کردیم حالا می خوایم بدون این که این فایل mount بشه روی هاست mount کنیم روی سه container دیگهابتدا یک کانتینر با اسم dc میاریم بالا و یک فولدر به اسم shared-data می سازیم که فقط روی کانتینر هست و mount نشده به هاستdocker run -v /shared-data --name dc busyboxسپس داخل فولدر یک فایل می سازیمtouch /shared-data/somefileحالا می خوایم سه کانتینر ubuntu دیگه بالا بیاریم که هر سه بتونن این فایل رو ببینن. که برای این کار باید از volumes-from-- استفاده کنیمباید هر سه کانتینر دیگر رو با کامند زیر ایجاد کنیمdocker run -t -i --volumes-from dc ubuntu /bin/bashاگر داخل کانتینر دستور زیر را بزنید باید somefile رو ببینیدls /shared-data10. Inspecting containersبرای اطلاعات جزئی تر از container مثل ip و … میتوانیم از دستور زیر استفاده کنیمdocker inspect ubuntu با زدن این دستور یه فایل json مشاهده می کنین از اطلاعات contaiener که داخل .NetworkSettings میتوانیم ip کانتینر رو ببینیمحتی موقع inspect گرفتن می توانین تعیین کنین فرمت روdocker inspect \--format '{{.NetworkSettings.IPAddress}}' \ubuntu