alma pourhosseni
alma pourhosseni
خواندن ۱ دقیقه·۳ سال پیش

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>: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 [&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 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 خاتمه دهید دو راه وجود دارد:

  • docker stop
  • docker kill


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


شاید از این پست‌ها خوشتان بیاید