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>:2375
2.Managing the startup of your container’s services
همانطور که میدانیم کانتینر های docker هر کدام برای بالا اوردن یک سرویس هستند . اما زمانی هست که میخواهیم چندین سرویس را داخل کانتینر داشته باشیم برای همین میتونیم از supervisor و وب سرویس های apache2 و tomcat استفاده کنیم.
خب ابتدا باید image مربوط به supervisor را بسازیم.پس با استفاده از Dockerfile زیر image را می سازیم.
FROM ubuntu:14.04
RUN apt-get update && apt-get install -y python-pip apache2 tomcat7
ENV DEBIAN_FRONTEND noninteractive
RUN pip install supervisor
RUN mkdir -p /var/lock/apache2
RUN mkdir -p /var/run/apache2
RUN mkdir -p /var/log/tomcat
RUN echo_supervisord_conf > /etc/supervisord.conf
ADD ./supervisord_add.conf /tmp/supervisord_add.conf
RUN cat /tmp/supervisord_add.conf >> /etc/supervisord.conf
RUN rm /tmp/supervisord_add.conf
CMD ["supervisord","-c","/etc/supervisord.conf"]
حالا باید supervisor را کانفیگ کنیم و مشخص کنیم چه سرویس هایی باید بالا بیان روی کانتینر
[supervisord]
nodaemon=true
# apache
[program:apache2]
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"
# tomcat
[program:tomcat]
command=service start tomcat
redirect_stderr=true
stdout_logfile=/var/log/tomcat/supervisor.log
stderr_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 supervised
3.The “save game” approach to develop
زمانی پیش میاد که داخل کانتینر تغییراتی اعمال کردیم مثل تغییر محتوای داخل یک فایل یا ساخت یک فایل و میخواهیم این تغییرات رو save نگه داریم .
راه حلی که براش وجود داره اینه که بعد از اعمال تغییرات کامیتشون کنیم.
طبق توضیحات پایین می تونیم این کارو انجام بدیم:
docker run --rm -d -p 8000:8000 --name todoapp dockerinpractice/todoapp
docker exec -it todoapp bash
سپس یک editor نصب میکنیم
apt-get update
apt install vim
و یک فایل ایجاد می کنیم
vim text.html
و tag زیر را داخلش قرار میدم
<title>this is test</title>
حالا با دستور زیر کامیت میکنم
docker commit todoapp
8c3d5d3ffd70d17e9e47e90801af7d12d6fc0b8b14a8b33131fc708423ee4672
حالا داخل یک ترمینال دیگر دستور زیر را اجرا می کنیم
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 imagename
docker push username/imagename
ارسال image به رجیستری private
docker tag registry_url/imagename imagename
docker 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-8
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ONBUILD ADD . /usr/src/app
ONBUILD RUN mvn install
و داکرفایل به شکل زیر است:
FROM maven:3.3-jdk-8-onbuild
CMD [ “java”,”-jar”,”/usr/src/app/target/demo-1.0-SNAPSHOT-jar-with-dependencies.jar”]
که زمان اجرا داکرفایل چون maven:3.3-jdk-8-onbuild را در FROM گزاشتیم ابتدا ONBUILD ها رو اجرا می کنه بعد CMD
7.Cleanly killing containers
زمانی که می خواهید به container خاتمه دهید دو راه وجود دارد:
Command Default signal Default signal value
kill TERM 15
docker kill KILL 9
docker 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/bash
9.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-data
10. Inspecting containers
برای اطلاعات جزئی تر از container مثل ip و … میتوانیم از دستور زیر استفاده کنیم
docker inspect ubuntu
با زدن این دستور یه فایل json مشاهده می کنین از اطلاعات contaiener که داخل .NetworkSettings میتوانیم ip کانتینر رو ببینیم
حتی موقع inspect گرفتن می توانین تعیین کنین فرمت رو
docker inspect \
--format '{{.NetworkSettings.IPAddress}}' \
ubuntu