.
675 |
--------------------------------------------------------------------------------
/day-01.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 1
2 |
3 |
4 | إيلا بغيتي تجبد آخر Containers صايبتي (docker create/run) ممكن تستعمل l- و n- ديال Docker ps ..
5 | ممكن تخدم هاذ اللعيبة باش تمسح container لي صايبتي مأخرا:
6 |
7 |
8 |
9 | - باش تمسح آخر container :
10 |
11 |
12 | $ docker rm $(docker ps -ql)
13 |
14 |
15 | - باش تمسح آخر خمسة containers :
16 |
17 |
18 | $ docker rm $(docker ps -qn 5)
19 |
20 | > ملاحظة : docker ps -q باش تخرّج غير IDs ديال containers
--------------------------------------------------------------------------------
/day-02.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 2
2 |
3 |
4 | في نفس السياق ديال docker ps، ايلا الفورما output ديال docker ps ماعجبكش ممكن تبدلو باستعمال format-- .
5 | هاذ اللعيبة تاتنفع في Debugging باش تشوف المعلومات لي عندك بيهم غرض فقط .
6 | و خاصة في reports فين ممكن تجبد اللائحة ديالة containers بواحد الفورما معينة (فيها غير ذاكشي لي تايهم الفريق ديالك(ولا الكليان)، و تزيدها في report و تسيفطو ليهم.
7 |
8 |
9 |
10 | - باش تجبد الأسماء و CMD لي تإكزيكيتات ديال جميع container على شكل table :
11 |
12 |
13 | $ docker ps -a --no-trunc --format="table {{.Names}}\t{{.Command}}"
14 |
15 |
16 | - باش تجبد اللائحة ديال containers و ports ديالهم على وديت شي رابور :
17 |
18 |
19 | $ docker ps --format="- Container {{.Names}} with ID {{.ID}} is running on those ports {{.Ports}}" >> report.md
20 |
21 | ---
22 | ملاحظات:
23 |
24 | - الكومند docker ps -a باش تجبد جميع containers حتى لي ماشي running
25 | - ايلا كانت شي معلومة طويلة docker ps تاتاخد غير واحد العدد ديال الحروف و تاتدير truncate لداكي لي بقى و ايلا بغينا نمنعوها من هاذشي، يعني بغينا المحتوى كامل تانستعملوا no-trunc--
26 | - اذيك << باش نزيدو المحتوى ديال docker ps في report في اللخر
27 | - هاذ format-- تاتخدم Go template syntax
28 | - في التصويرة كاين شنو ممكن نجبدو بالضبط من format--
29 |
30 |
31 |
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/day-03.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 3
2 |
3 |
4 | في نفس السياق ديال docker ps عاوتاني، ممكن تفيلتري المحتوى ديال docker ps بلا grep بلا والو غير ب filter-- .
5 | هاذ اللعيبة تاتنفع عاوتاني في Debugging و حتى منين تاتبغي تمسح container لي مابقيتيش بغيتيهم و ممكن تخدمها مع format-- .
6 |
7 |
8 |
9 | - شي مرات تاتطلع ليك شي error و تاتبقى تصايب بزاف ديال containers باش تحاول تحلها، و منين تاتسالي و تايخدم ذاكشي تاتلقى بزاف ديال containers ماعندك ماتدير بيهم .. يكفي أنك تعرف الأول لي صايبتي و تخلي كلشي ل filter--
10 |
11 |
12 | $ docker rm -f $(docker ps -aq --filter="since=66bf51ac5a4b")
13 |
14 |
15 | - ايلا صايبنا شي image سميناها DevC لي تاتexecute commands معينين، و بغينا نعرفو containers لي كراشاو بسبب أن الكومند غالطة يعني error code = 127
16 |
17 |
18 | $ docker ps -a -f "exited=127" -f="ancestor=DevC" --format "{{.ID}} {{.Command}}"
19 |
20 | ---
21 | ملاحظات:
22 |
23 | - التصويرة فيها الفلترز لي ممكن نستعملوهم
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/day-04.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 4
2 |
3 |
4 | آخر لعيبة على الفيلترز و ذاكشي .. هاذاكشي ديال فيلترز و فورما ماكاينش غير في docker ps، كاين حتى بالنسبة لimages.
5 | كاين شي اختلافات و لكن قليلة، و هذا واحد منها
6 | ال dangling images هو واحد النوع في شكل images لي غالبا غادي تكون فايت شايفهم (هاذوك لي سميتهم None و لي شادين ليسباص بلا سبب) .
7 | الfilter-- ديال docker images تاتعطينا الامكانية أننا نجبدو هاذ الimages
8 |
9 |
10 |
11 | - ايلا بغيتي تمسح جميع dangling image و تخوي شوية السطوكاج
12 |
13 |
14 | $ docker rmi -f $(docker images -qf "dangling=true")
15 |
16 | ---
17 | ملاحظات:
18 |
19 | - ماشي جميع images لي سميتهم none تايكونو dangling و تايكونوا بدون فائدة .
20 | - منين تاتدير build أو pull لشي image عندك أصلا و بنفس tag . تايمشي docker يحيد للقديمة tag باش يطاكّي الجديدة، وهنا فين تايخرجو dangling images
21 |
22 |
--------------------------------------------------------------------------------
/day-05.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 5
2 |
3 |
4 | شفنا قبل كيفاش نجبدوا المعلومات باستعمال docker ps و docker images عاوتاني .. اليوم غادي نشوفوا طريقة أقوى باش نجبدوا معلومات أكثر على containers و images لي هي docker inspect لي كاتعطي جميع المعلومات تقريبا .
5 | لي زوين في docker inspect هي أنها by default تاتعطي النتيجة على شكل json لي ممكن تبارسيه Parse و تجبد لي بغيتي .
6 |
7 |
8 |
9 | - باش نجبدوا المعلومات على image ديالنا DevC:rabat و تخبيهم في json file
10 |
11 |
12 | $ docker inspect --type image DevC:rabat > DevC.json
13 |
14 |
15 | - باش نجبدوا معلومات علىnetworking ديال container ديالنا و نديروه في الرابور لي غانصيفطو لSRE باش يشوف شنو المشكل
16 |
17 |
18 | $ echo -e "\`\`\`json\n$(docker inspect devC | jq '.[0].NetworkSettings')\n\`\`\`" > report.md
19 |
20 |
21 | - باش نحضيو capabilities ديال containers .. و نكتبوا شي حاجة ايلا شي حاجة ماشي هي هاذيك
22 |
23 |
24 | $ docker inspect 86e2d8181c53 | jq -r '.[0].EffectiveCaps' | grep -i DAC_OVERRIDE > /dev/null && echo "Fin awa ghaadi ?"
25 | ---
26 | ملاحظات:
27 |
28 | - بالنسبة type-- تاتنفع منين تايكون عندك container و image بنفس الاسم.
29 | - بالنسبة للبارسين parsing ممكن تديرو بلغة البرمجة ديالك أو بjq لي هو CLI tool ساهل و سريع 😃
30 | - النتيجة ديال docker inspect تاتكون على شكل array
31 |
32 |
--------------------------------------------------------------------------------
/day-06.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 6
2 |
3 |
4 | غادي ناخدوا استراحة من commands و نهضروا على كيفاش containers يقدروا يسهلوا علينا شي حوايج لي ممكن يكونوا شوية معنكشين .
5 | مثلا ايلا بغيتي تدوز requests ديالك من Tor Network و تحس براسك آنونيموس بكل سهولة 😁 ، ممكن تدير هاذشي بكل بساطة باستعمال واحد community image سميتها
dperson/torproxy لي مقادة باش تدير هاذشي
6 |
7 |
8 |
9 | - أولا جبد public ip address ديالك
10 |
11 |
12 | $ curl ifconfig.me
13 |
14 |
15 | - من بعد صايب كونتينر ديال torproxy
16 |
17 |
18 | $ sudo docker run -it -p 8118:8118 -p 9050:9050 -d dperson/torproxy
19 |
20 |
21 | - عاود جبد public ip address ديالك، ولكن هاذ المرة مور البروكسي .. تاداااا 🎉
22 |
23 |
24 | $ curl -x 127.0.0.1:8118 ifconfig.me
--------------------------------------------------------------------------------
/day-07.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 7
2 |
3 |
4 | هاذ النهار غادي نهضروا على Dockerfiles لي هوما files لي تايكون فيهم المراحل لي غادي نتبعوا باش غادي نبنيو image ديالنا منين غادي نعيطوا على docker build
5 | خلال البناء build كانحتاجوا نكوبييو شي ملفاتfiles ديالنا لimage .. و باش نديرو هاذشي كاينين 2 طرق COPY و ADD .. و الفرق هو أن ADD ذكية شوية على COPY:
6 |
7 |
8 |
9 | - بالنسبة ل COPY تاتكوبيي لينا الملفات (مثلا الكون ديل آبليكاسيون) لي عطيناها من الحاسوب ديالنا Host، للimage لداخل .. و فقط ماتازيد والو من راسها.
10 | المثال الجاي غادي يكوبيي devC من الحاسوب ديالنا ل/app لداخل في image
11 |
12 |
13 | COPY ./devC /app
14 |
15 |
16 | - أما ADD فهي شوية ذكية، بحيث أنها تاتقدر تعرف النوع ديال source و تتعامل معاه على حساب .. ADD تاتقدر تكوبيي ملفات عادي بحال COPY زائد URLs أو Archive ليتدير ليهم extract أوتوماتيكيا.
17 |
18 |
19 | # the archive will be extracted into /app
20 | COPY devC.tar.gz /app
21 | # download the files into /app
22 | ADD devcrabat.com/code.tar /app
23 |
24 | ---
25 | ملاحظات:
26 |
27 | - ممكن تبان ليك ADD أحسن في جميع الحالات و لكن بالعكس منين تبغي تكوبي الملفات ديالك ديما استعمل COPY الا ايلا كنتي محتاج ADD بالصح. السبب هو أن COPY is explicit يعني تاتكون عارف شنو غاجي يوقع مسبقا، في حين ADD تقدر خاصك تحضي راسك لاتمشي تدير شي حاجة بلا ماترد ليها البال، مثلا نتى محتاج تكوبي tar هو النيت، و لكن ADD تExtractih
28 | - غادي نبدل التوقيت ديال البوستس، ل بوسط كل يومين باش تبقى لي الفرصة نحط حوايج آخرين.
29 | - هاذ اليامات كانوجد واحد البروجي صغير، كنت بديتو شحال هاذي و من بعد كّيكّس بلابلا لي فاتت، قررت نرجع نكملو.
30 |
31 |
32 |
--------------------------------------------------------------------------------
/day-08.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 8
2 |
3 |
4 | كمالة على ذاكشي ديال COPY و ADD .
5 | بزاف ديال المرات تانكونوا بغينا نكوبييو شي ملفات وبغيناهم يبانو بشي USER:GROUP معينين و هنا كاينين حلول لي بديهية
6 |
7 |
8 | # Solution 1
9 | COPY ./devC /app
10 | RUN chmod devc:devc
11 | # Solution 2
12 | USER devc:devc
13 |
14 |
15 |
16 | COPY ./devC /app
17 |
18 |
19 | هاذ الحلول خدامة و لكن ماشي optimal خاصة الأول و غادي تزيد الحجم و الشكل ديال image ديالنا شوية .
20 | الحل هو نستعملوا غير COPY
21 |
22 |
23 | COPY --chown devc:devc ./devC /app
--------------------------------------------------------------------------------
/day-09.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 9
2 |
3 |
4 | كيفما قلنا قبل، عموما كلما كان عدد commands في Dockerfile كلما أحسن، و السبب أن images تايكونوا على شكل طبقات layers و كل طبقة تاتكون النتيجة ديال شي command
5 | في هاذ القضية كاينين 2 أنواع ديال Commands .. الcommands لي تايبدلو شي حاجة في Filesystem بحال RUN و COPY و هاذو تايخلقوا طبقات عندها حجم و الcommands لي تايبدلوا غير في Metadata بحال EXPOSE و ENTRYPOINT
6 | باش نجبدو الطبقات لي كاينين في شي image و الحجم ديالهم و شنو command لي خلقاتهم كانستعملوا docker history
7 |
8 |
9 | $ docker history devC:latest
10 |
11 | ---
12 | ملاحظات:
13 |
14 | - كيفاش تايخبي Docker الimages و كيفاش تاتعامل معاهم فيه بزاف مايتقال و ماكرهتش نديرو ليه شي حاجة بوحدو
15 | - كاينين أدوات ديال كوميونيتي لي تايعطيو معلومات أكثر على الimages بحال Dive
16 |
17 |
--------------------------------------------------------------------------------
/day-10.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 10
2 |
3 |
4 | دائما مع Dockerfiles .. كاينين 3 ديال Commands لي لي تايمكنونا نexecutew commands، لي هوما RUN و CMD و ENTRYPOINT .
5 |
6 |
7 |
8 | - بالنسية لRUN الCommand تاتexecuta وسط الimage براسها، يعني منين تاندير docker build .
9 |
10 |
11 | # dockerfile
12 | ...
13 | RUN apt-get update && apt-get install curl
14 | ...
15 | # ---
16 |
17 |
18 |
19 | # this will be executed when we'll call this
20 | $ docker build -t devc:rabat .
21 |
22 |
23 | - بالنسبة لCMD و ENTRYPOINT تايexecutaw منين تانرانيو container ديالنا. يعني Docker run
24 |
25 |
26 | # dockerfile
27 | ...
28 | CMD curl Devc.com
29 | ...
30 | # ---
31 |
32 |
33 | # this will be executed when we'll call this
34 | $ docker run devc:rabat
35 |
36 |
37 | حاجة أخرى مهمة هي أنن هاذ الكوماندس ممكن ياخدو 2 أشكال
38 |
39 | - الEXEC Form و هنا تانعطيو الbinary لي بغينا نexecutew مع باراميترز ديالو على شكل array و docker تايمشي يقلب في الPATH و تايقضي الغرض
40 |
41 |
42 |
43 | # dockerfile
44 | ...
45 | RUN ["apt", "install", "-y", "curl"]
46 | CMD ["/bin/curl", "https://devc.com"]
47 | ...
48 |
49 |
50 |
51 | - الSHELL form لي تانعطيو فيها commands لي بغينا على شكل string هاذ المرة و Docker تايدوزهم للشيل الشهير sh باش يexecutehom
52 |
53 | هاذ الثانية تاتنفعنا ايلا بغينا نستعملو شي خاصيات ديال الشيل بحال && و || و pipes ....
54 |
55 |
56 | # dockerfile
57 | ...
58 | RUN apt install -y curl
59 | # is equivalent to
60 | CMD ["/bin/sh", "-c", "apt install -y curl"]
61 |
62 |
63 | ---
64 | ملاحظات:
65 |
66 | - بالنسبة لshell form، في حالة CMD أو ENTRYPOINT الpid 1 تايكون هو sh و هاذشي لي تايمنعنا من أننا نتواصلو مع الexecutable ديالنا مباشرة باستعمال Unix Signals يعني ايلا كان عندك شي program تاي...handle CTRL+C or CTRL+Z بشي طريقة في شكل من الأحسن تستعمل EXEC form .. حيت في هاذ الحالة غادي يكون sh حاجز بينك و بين البروكّرام ديالك و هو لي غادي يتكلف ب signals.
67 | - كاين فرق بين CMD و ENTRYPOINT غادي نهضرو عليه المرة الجاية
68 |
69 |
--------------------------------------------------------------------------------
/day-11.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 11
2 |
3 |
4 | اليوم غادي نهضروا على CMD و ENTRYPOINT .. هاذ الموضوع فلسفي و أزلي في Docker و متلف العالم كامل و منهم أنا ..
5 | عموما منين تانbuild'ew شي container image تانكونوا أمام 2 ديال الخيارات ..
6 |
7 |
8 |
9 | - الاول هو أن الimage تاتكون عبارة عن package للآبليكاسيون ديالنا .. يعني تانوجدو كّاع ذاكشي لي خاص الآبليكاسيون باش تخدم في runtime و تانقولو لDocker أنها Runnable و كيفاش غادي يrunيها.
10 | هنا تانستعملوا Docker من اجل Packaging يعني في آخر المطاف هاذيك Image غادي هي الطريقة الكافية باش أي واحد يخدم الأبليكاسيون ديالنا (Process)
11 | في هاذ الحالة كايخاصنا نقولو لDocker منين يجي image ديالنا، يعني شناهو الProcess لي تايشكل الهوية ديال أبليكاسيون ديالنا. و هذا هو entrypoint ديال image ديالنا.
12 | هاذا هو الusecase الأكثر شيوعا ديال docker و images في هاذ السياق هوما images ديال أبليكاسيونات ديالنا لي تانصايبو.
13 |
14 |
15 |
16 |
17 | - الخيار الثاني هو تانستعملو docker باش نصايبو واحد الوسط مناسب (يعني فيه libs و dependencies لي بغينا) فين نrun'ew شي commands و شي Applications ديالنا.
18 | هنا كانهضرو على images بحال ديال gnu/linux distro ولا ديال programming ecosystems بحال python أو node.js ....
19 | في هاذ الحالة image ديالنا ماتاتكونش مراد منها تكون package و لكن تاتكون ecosystem .. و هاذشي لي تايخليها ماتايكونش عندها Entrypoint واحد مفروض على user في runtime .. و لكن بالعكس تايكون مطلوب منها تكون قادرة تexecute واحد العدد ديال commands aka CMD
20 | في هاذ الUsecase تايكون ممكن لينا نحددوا CMD في الBuild و لكن ماتاتكونش مفروضة علينا في الRun و تايمكن لينا نبدلوها بسهولة
21 | دابا من بعد ما هضرنا على ENTRYPOINT و CMD و الفرق بيناتهم و Motivation ديال كل واحدة .. آجي نشوفو كيفاش نخدموهم.
22 | عمليا، ENTRYPOINT و CMD عندهم نفس المفعول في أغلب الحالات.. الفرق هو أن CMD ممكن تبدلوها بcommand لي بغينا في Runtime
23 |
24 |
25 |
26 | # dockerfile
27 | ...
28 | ENTRYPOINT ["node", "devc.rabat.js"]
29 | ...
30 | # ---
31 |
32 | # this will run the devc rabat node application.
33 | docker run -it devc:rabat
34 |
35 |
36 | نفس المثال بCMD
37 |
38 |
39 | # dockerfile
40 | ...
41 | CMD ["node", "devc.rabat.js"]
42 | ...
43 | # ---
44 |
45 | # this will run the devc rabat node application.
46 | docker run -it devc:rabat
47 | # but this will run the devc casa node application.
48 | docker run -it node devc.casa.js
49 |
50 |
51 | واحد من usecases الزوينين لCMD هو نستعملوها باش ندوزو Parameters لENTRYPOINT ديالنا مادام المحتوى ديال CMD دائما تايتزاد في الأخير (هاذ اللعيبة تاتخدم في Exec form فقط)
52 |
53 |
54 | # dockerfile
55 | ...
56 | CMD ["--help"]
57 | ENTRYPOINT ["node", "devc.js"]
58 | ...
59 | # ---
60 |
61 | # this will display the help message for our app
62 | docker run -it devc:rabat
63 | # this will run our app with awesome argument.
64 | docker run -it devc:rabat awesome
65 |
66 | ---
67 | ملاحظات:
68 |
69 | - حتى ENTRYPOINT ممكن نبدلوه في Runtime باستعمال entrypoint-- و لكن غير منصوح بيها حيث غانكون تانبدلو الهوية ديال container بحد ذاتها
70 | - كنت بغيت نهضر على One process per container Philosophy و كيفاش تاتأثر في Design ديال Dockerfiles و CMD و ENTRYPOINT و لكن تايبان لي غادي نخليوها لمرة أخرى
71 |
72 |
--------------------------------------------------------------------------------
/day-12.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 12
2 |
3 |
4 | اليوم غادي نكملو على نفس الأفكار ديال الايام ليدازو و غادي نهضرو على واحد القاعدة مهمة ديال Docker لي هي One Process per container ..
5 | واخا تاتبان بسيطة، هاذ القاعدة ضروري نكونوا فاهمينها باش نطيحوش في مشاكل من بعد ..
6 |
7 |
8 |
9 | بما أن Docker is a process container system يعني أنه تايهمتم بprocess واحد و تاrun'eh بواحد الطريقة لي تاتخليه معزول على البقية ديال processes عكس Machine container systems بحال LXC مثلا لي مديوريين باش يتكلفو بuse cases فين ماينين Processes بزاف..
10 |
11 |
12 |
13 | أهم حاجة هنا هي process واحد .. docker دائما تايفترض أنه مخدم غير process واحد هو لي تايكون في CMD أو ENTRYPOINT (لي شفناهم المرة لي فاتت) و لي تايكون عندو PID1 ..
14 |
15 |
16 |
17 | من بعد Docker تايبقى على تواصل مع هاذ الprocess دائما باستعمال IPC signals لي باستعمالهم تايعرف واش باقي حي و ليبيهم تايقتلو ايلا بغا ..
18 | هاذ المبدأ يقدر يبان لينا بايخ و ماشي مهم، و لكن مهم بزاف ..
19 |
20 |
21 |
22 | نفترض أننا في ENTRYPOINT تانطلبو من Docker يخدم لينا واحد Shell script لي براسو تايخدم بزاف ديال programs مثلا nginx و php-fpm و شي php scripts لي تايديرو شي حاجة ..
23 |
24 |
25 | #!/bin/bash
26 | nginx &
27 | php-fpm &
28 | php ./debugging.php &
29 | php ./observability.php &
30 | ---
31 | # Dockerfile
32 | ENTRYPOINT ["script.sh"]t
33 |
34 |
35 | في الحالة العادية، ايلا مات شي واحد من هاذ الprograms غادي نبغيو docker يعرف، و ياخد القرار ولا يسيفط المعلومة لشي بلاصة (لkubernetes مثلا) .. و لكن ماشي هاذشي لي غادي يوقع حيت docker ما عندو تاشي علاقة بهاذ الprograms و تايعرف غير مول PID1 لي هو shell ديالنا bash أو sh
36 |
37 |
38 | docker exec -it devC bash
39 | pkill nginx
40 |
41 | # Nothing will happen,
42 | # the container will still be up an running
43 |
44 | kill 1 # which will kill /bin/bash
45 | # This will code the container to exit
46 |
47 |
48 | في هاذ الحالة الحل هو نطوروا ذاك الscript ديالنا باش يتكلف ب Error handling و يصيفط signals لDocker ما ان طرى شي حاجة لشي process أو نستعملو شي program لي متخصص في process management بحالsupervisor أو dumb-init
49 |
--------------------------------------------------------------------------------
/day-13.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 13
2 |
3 |
4 | ايلا كنتي تاتخدم بdocker ضروري غادي تتعامل بزاف مع Shell خاصة في Dockerfiles .. اليوم غادي نشوفو واحدالمجموعة ديال القوالب و النصائح لي عندهم علاقة بShell و لي ممكن ينفعونا منين نكونو تانكتبو dockerfiles ديالنا
5 |
6 |
7 |
8 | - موما منين تايعيطو على شي program وسط الshell script ديالنا أو منين تانخدموا أي program في Linux .. تايطرى واحد البلان سميتو fork يعني أن kernel تايدير نسخة من process اﻷب (لي هو shell في الحالة ديالنا) و من بعد تايدير exec لي تاتشد الprogram ديالنا و تاتخشيه في هاديك النسخة الجديدة ديال الأب ..
9 | طريقة أخرى باش نصايبو process جديد هي نحرقو المراحل و مانعيطوش على fork و ندوزو نيشان من exec ..يعني أننا غادي نشدو program ديالنا و غادي نخشيوه وسط الأب براسو.
10 | أبسط مثال على هاذشي هو ps:
11 |
13 |
14 | # here we'll get two processes the parent(shell) and child (ps)
15 | ps > processes.txt
16 | # Here we'll only get one process (ps).
17 | exec ps > processes.txt
18 |
19 |
20 |
21 | هاذ اللعيبة (exec) لي هي shell wrapper over exec syscalls تاتفعنى منين تانخدمو Shell form في ENTRYPOINT أو CMD و تاتخلينا نبدلة process ديال الshell بالprocess ديال الprogram ديالنا و نتهناو من ديك الوصاية ديال shell لي هضرنا عليها في البوسط لي فات.
22 | -
23 | اللعيبة الثانية لي غادي نهضرو عليها هي set -euo pipefail .. من الحوايج الصعابين في shell scripting هو error handling .. شي مرات تاتكون الerror في الشرق و الميساج في الغرب ..هاذ الكومند غادي تعاونا نردو scripts ديالنا أفضل من ناحية error handling
24 |
25 | -
26 | الe- : عموما واخا يكون سكريبت ديالنا فيه شي مشكل .. الshell تايكمل بحال ايلا ماكاين والو حتى الآخر .. هاذ e- تاتقول لshell يخرج ايلا شي كومند exit code ديالها ماكانش 0
27 |
28 | -
29 | ال o pipefail- : ايلا كان الscript ديالنا فيه شي pipeline يعني هاذي | 😁 .. e- ماتانفعش بزاف بحيث أنها تاتشوف exit code ديال pipeline كاملة يعني ديال آخر كومند في pipeline فقط .. و هاذ pipefail تاتحل لينا هاذ المشكل و تاتبزز على shell يخرج ايلا لقى شي كومند في pipe ماخدماش..
30 |
31 | -
32 | ال-u: هاذي عاوتاني مهمة بزاف .. عموما الshell ماعندوش مشكل مع empty variables باستعمال هاذ option ممكن نقولو ليه بي ايلا استعملنا شي variables خاوية را كاين مشكل.
33 |
34 | -
35 | اللعيبة الثالثة هي Debugging ..ال set -x تاتقول لshell يكتب أي كومند قبل ما يexecute'ha هاكا تانعرفو فين كاين المشطل ايلا كان
36 |
37 |
38 |
--------------------------------------------------------------------------------
/day-14.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 14
2 |
3 |
4 | البوسط لي داز كان على shell scripting و شي حوايج لي ممكن ينفعونا نكتبوا Dockerfiles ديالنا .. هاذ البوسط غادي يكون كمالة على ذاكشي لي كنا بدينا ..
5 |
6 |
7 |
8 | اليوم غادي نهضرو على Filename Expansion و Docker و واحد الحاجة مهمة لي كاتستعمل بزاف في dockerfiles و ماهضرناش عليها المرة لي دازت و لي هي shopt -s nullglob
9 |
10 |
11 |
12 | الposix shells فيهم واحد الخاصية سميتها Filename Expansion و هي منين تانعطيوه شي filename و تانعطيوه وسط منو واحد من [ ] أو * أو ? تاحاول يستعملهم باش يجبد filenames كاميلين مثلا
13 |
14 |
15 | # this will delete all pdf file in the working directory
16 | rm *.pdf
17 | # This will remove mp3, mp4 and any files ending with "mp" followed by a character
18 | rm *.mp?
19 | # this will remove all files starting with a, n or k
20 | rm [akn]*
21 |
22 |
23 | في حالة ايلا shell ماقدرش يدير expansion تايدوز هاذيك glob كيفما هي للcommand و هاذشي لي تايعطينا error على حساب command لي استعملنا.
24 | اش نفهموا أكثر آجي نتخيلو واحد function تانعطيوها واحد المجموعة ديال files و هي تاتدير عليهم شي خدمة.
25 | المشكل ايلا دوزنا ليها شي glob لي ماتاتماتشي والو غادي يدوزها هاكاك و هاذشي يقدر يعطينا شي حاجات ماشي هي هاذيك.
26 | باش نحلو هاذ المشكل انستعملو nullglob لي في حالة الglob ماماتشات والو تاترد لينا empty string ""
27 |
28 |
29 |
30 | # if we execute this statement
31 | myfunction *.pdf
32 | ## if there are pdf files in cwd the shell will execute this
33 | ## > myfuction 1.pdf 2.pdf book.pdf
34 | ## if there are no pdf files
35 | ## > myfunction "*.pdf"
36 | ## Since there is no file named "*.pdf" our function will file (a lot of times silently)
37 | ## if nullglob is on
38 | ## > myfunction ""
39 |
40 |
41 | ممكن نستعملو failglob لي تاتحبس الscript ايلا كان شي مشكل و لكن عموما هاذا هو التصرف الاعتيادي ايلا كنا خدامين ب set -e
42 |
--------------------------------------------------------------------------------
/day-15.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 15
2 |
3 |
4 | هذا غادي يكون آخر بوسط على shell scripting
5 | في الأول كنت بغيت ندير بوسط على expansions و لكن لقيت بلي غادي يخاص بزاف ديال الكتابة داكشي علاش غادي نحاول نهضر اليوم على substring expansion فقط لي مفيدة بزاف ..
6 |
7 |
8 |
9 |
10 | قبل مانعرف substring expansion فينما كنت تانبغي نخدم على شي حاجة لي تاتحتاج بزاف ديال string manipulation تانفكل مباشرة في python (أي high level scripting language قاضي الغرض) .. و لكن دابا وليتا تانخدم غير بBash صافي..
11 | الsyntax ساهلة {param:offset:limit}$
12 | بحيث أن param هي variable ديالنا (shell parameters مفهموم أشمل في shells تايضم حتى الvariables) و الoffset هو منين بغينا نبداو slice و limit هو عدد الcharacter لي بغينا ناخدو ..
13 |
14 |
15 | a="DevC Rabat"
16 | echo ${a} # basic param expansion
17 | echo ${a:5} # >> Rabat
18 | echo ${a:0:4} # >> DevC
19 | echo "${a:5} ${a:0:4}" >> Rabat DevC
20 |
21 | ---
22 | ملاحظات:
23 |
24 | - هاذ القضية تاتنفع بزاف في scripts ديالنا ولكن المشكل ديالها هو أنها ماشي POSIX يعني ماكايناش في sh و هاذشي علاش خاص نردو معاها البال في Dockerfiles و ENTRYPOINT و نسبقوها ب bash -c أو نزيدو Shebang الفوق فيها bash ايلا كان سكريبت ..
25 |
26 |
--------------------------------------------------------------------------------
/day-16.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 16
2 |
3 |
4 | اليوم غادي نهضرو على واحد command مامشهوراش بزااف و لكن مهمة بزاف خاصة في debugging و في long running containers ..
5 | الكومند هي docker diff .. هاذ الكوموند تاترد لينا التغييرات لي طراو في container ديالنا منين تcrea'ya ..
6 |
7 |
8 | docker exec -it DevC bash
9 | touch /app/docker.md
10 | rm /app/text.txt
11 | cat "hello" >> /app/devc.txt
12 | # Results
13 | C /app
14 | A /app/docker.md
15 | D /app/text.txt
16 | C /app/devc.txt
17 |
18 |
19 | كيفما تانشوفو الoutput تايكون على شكل file path و حداهم على اليمين إما C (Changed) أو A)added) أو D)Deleted)
20 |
--------------------------------------------------------------------------------
/day-17.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 17
2 |
3 |
4 | اليوم غادي نهضروا على أكثر على Docker Images و على كيفاش نكتبوا Dockerfiles أحسن ..
5 | باش يstore'e الimages ديالنا Docker تايعتامد على Storage Drivers لي تايخزنوهم على شكل Layers في Filesystem ديالنا ..
6 | فاش كانكونوا خدامين على Dockerfile منين تانديرو شي command بحال COPY أو ADD أو RUN تاتصايب Layer جديدة .. مثلا في هاذ المثال غادي يتصايبوا 3 ديال layers
7 |
8 |
9 | # This will create 3 layers
10 | RUN apt update
11 | RUN apt install ca-certificate
12 | RUN apt install curl
13 |
14 |
15 | و هاذشي لي ممكن يزيد الحجم ديال image ديالنا بزاف .. باش نعرفوا علاش خاصنا نفموا خاصية جديدة لي تايستعملها Storage Driver لي هي Copy On Write (COW) ..
16 | جميع الlayers في image ديالنا تايكونوا ثابتين Immutable و مايمكناش نبدلوا فيهم مباشرة Read Only ...
17 | باش نبدلو شي file كاين في شي layer في شي layer تحت منها .. Docker تايدير واحد النسخة لهذاك الfile في الlayer الجديدة و تايبدل فيها (مادام مايمكنش يبدل في Layer الفوقانية حيت هي Immutable) .. مثلا هنا في هاذ المثال، غادي يكوونوا عندنا 2 ديال النسخ ديال DevC.txt كل واحدة في Layer بوحدها ..
18 |
19 |
20 | # Create DevC.txt file in laye1
21 | RUN echo "DevC" > /DevC.txt
22 | # Copy DevC.txt from layer1 and add content to it
23 | RUN echo " Rabat" >> /DevC.txt
24 |
25 |
26 | أكثر من هاذشي، حتا المسيح Deletetions ماتايبدلوش في Layers لي قبل بل غير تايحجبوا هاذوك files لي مسحنا من Layer الحالية
27 | يعني ايلا رجعنا للمثال الأول جميع الfiles لي غادي تبدلهم apt غادي تدير منهم نسخ جديدة و هاذشي غادي يكبر حجم Image ديالنا بزاف.
28 | أخيرا الحل ديال هاذشي هي نديروا أقل عدد ممكن ديال Layers قدر المستطاع يعني المثال ديالنا ممكن نحولوه لشي حاجة بحال هاكا، لي غادي يصايب لينا غير layer واحدة
29 |
30 |
31 | # This will create 3 layers
32 | RUN apt update && apt install -y ca-certificate curl
33 |
34 |
35 | علاش هاذشي كاع؟
36 | هاذ البلان ديال layers تايبان ماصالحش، ولك في الواقع هو مهم بزاف حيت تايعطينا الامكانية، نشاركوا layers بين بزاف ديال images و containers و تايعطينا القدرة على أننا نCache'ew هاذ الLayers بين Builds و نسرعوا Build .
37 |
38 |
39 |
40 | ملاحظات:
41 |
42 | - كاينين Commands لي ماتايصايبوش layers جداد بحال Expose مثلا
43 | - الStorage Drivers هوما واجهة لل Filesystems لي تايوفروا هاذوك الخاصيات بحال COW و Layering .. الFS الأكثر استعمالا هو OverlayFS 2
44 |
45 |
46 |
47 | 
48 |
--------------------------------------------------------------------------------
/day-18.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 18
2 |
3 |
4 | اليوم غادي نكملوا الهضرة على Dockerfiles و هاذ المرة غادي نهضروا على package managers و كيفاش نستعملوهم بطريقة مزيانة في Dockerfiles
5 |
6 | كيفما قلنا قبل في اليوم 17 docker تايخبي Images على شكل immutable layers و أننا مخاصناش نكثروا الlayers باش نتفاداو نزيدوا الحجم ديال Images ديالنا.
7 |
8 | حاجة آخرى هي خاصنا نحاولوا ما أمكن نحديوا Temporary Files بحال Build tools في layer في زدناهم، حيت كيفما قلنا قبل ايلا مشاو تابقاو ماغاديش يمكن نمسحوهم في شي Layer من بعد.
9 |
10 |
11 | RUN apt update && apt install -y git && git clone https://github.com/DevC_Rabat/DevC.git /DevC
12 | WORKDIR /DevC
13 | RUN chmod u+x install.sh && ./install.sh
14 |
15 |
16 | في المثال لي داز عندنا واحد المشكل .. ال Image ديالنا غادي يكون فيها git و الSource Code ديالنا لي حنا مامحتاجينهمش أصلا في Final Image و واخا نمسحوهم في Layer من بعد ماغاديش
17 | غير غادي يتخباو و غادي يبقى الحجم ديال Image كبير.
18 |
19 |
20 |
21 | بحال هاذ المشاكل تايتعاودوا بزاف مع Package Managers .. نشوفوا شي techniques باش نتفاداوهم في كل Package manager
22 | مشكل الupdate ديال الpackage list في layer بوحدها
23 |
24 | RUN apt-get update
25 | RUN apt-get install -y php
26 |
27 |
28 |
29 |
30 | بالاضافة لأنه غادي تزاد عندنا layer إضافية .. منين تانديرو apt-get update في layer بوحدها، الpackage list ماغاديش يبقى يتبدل بين Docker builds واخا نبدلوا packages .. حيت هاذشي الlayer ماغاديش تبدل و Docker غادي يبقى ديما يجبدها من الcache ديالو.
31 | تحديد الversions ديال packages
32 |
33 | من الأحسن دائما نديروا versions ديال packages لي تانآنسطاليو و نتفاداو Default version لي غادي ينقصوا من Visibility ديالنا و غادي يخليونا ماعارفينش شنو كاين في image ديالنا
34 |
35 | RUN apt-get update && apt-get install -y php7.3 git=2.1.3
36 |
37 |
38 |
39 |
40 | نستعملوا الversions اللخرين ديال Distributions
41 | النسخ القدام منين تاينديرو update لل package cache تايضطروا يتيليشارجيوا أكثر من الversion الجداد ..
42 | نتفاداو الpackages الزايدين
43 | في الimages المبنيين فوق من debian ممكن نقولو ل apt مايتيليشاجيش ال recommended packages
44 |
45 | RUN apt-get update && apt-get install -y --no-install-recommends php7.3
46 |
47 |
48 |
49 |
50 | نحيدوا package list و package cache في نفس الlayer
51 | باش نديروا هاذشي في debian
52 |
53 | RUN apt-get update && apt-get install -y --no-install-recommends php7.3 && rm -rf /var/lib/apt/lists/* && apt-get clean
54 |
55 | في أغلب الofficial base images ديال debian و ubuntu ال apt-get clean تاتدار أوتوكاتيطيا
56 | باش نديروا هاذشي في redhat-based distros
57 |
58 |
59 | RUN yum -y php && rm -rf /var/cache/yum
60 |
61 |
62 | في البوسط الجاي غادي نهضروا على كيفاش ننقصوا من size ديال image أكثر في Debian
63 |
--------------------------------------------------------------------------------
/day-19.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 19
2 |
3 |
4 | في البوسط لي قبل هضرنا على كيفاش ننقصوا الحجم ديال Docker image و في هاذ البوسط غاذي نديرو واحد case study على Debian based images
5 |
6 | أول حاجة هي package cache w package lists:
7 | منين تانديروا apt-get update تاتعمر تايجبد lists ديال الpackages كاملين لي كاينين في repositories لي كاينة في `/etc/apt/sources.list` و تايتيليشارجيهم ل `/var/lib/apt/lists/` و في نفس الوقت منين تانديروا `apt-get install` الpackages لي تايتيليشارجاو تايخبيهم apt في `/var/cache/apt/archives/` في حالة ما حتاجيناهم من بعد.
8 | أول حاجة غانديروها هي غادي نتخلصو من هاذشي كامل من بعد مانساليو installation
9 |
10 | RUN apt-get update && \
11 | apt-get install -y --no-install-recommends \
12 | autoconf gcc g++ make git && \
13 | git clone $REPO /app && \
14 | cd /app && \
15 | make && make install && \
16 | rm -rf /var/lib/apt/lists/*
17 | # apt-get clean will be executed automatically if the image is official
18 |
19 | باستعمال هاذشي جميع الfiles الزايدين لي غادي يزيدهم apt غادي يتمسحوا في نفس الlayer و هاكا غادي نقتاصدو بزاف ديال space في image ديالنا ..ال build Dependencies
20 |
21 | في المثال لي داز آ جميع الpackage لي آنسطالينا ماغاديش نستعملوهم في production و آنسطاليناهم غير باش نBuild'ew آبليكاسيون ديالنا ..
22 |
23 | يعني غادي يخاصنا نحيدوهم في الأخير .. أبسط طريقة هي نكوبييو هاذيم الليست كاملة و نديروها قدام واحد apt-get remove و لكن ايلا كانوا كتار و مفرقين على مراحل غادي تصعاب علينا
24 | القضية ..
25 |
26 | الحل هو نستعملوا apt-mark لي تاتبدل لينا الاعدادات ديال ال packages اللي تانعطيوها .. لي تايهمنا من هاذ ااعدادات هوما manual و auto لي تايحددوا واش الpackage تآنسطالا manually أو أنه تآنسطالا automatically as some other package dependency .
27 |
28 | و من بعد غادي نستعملوا `apt-get purge -y --auto-remove` لي تاتمسح جميع الpackages لي تآنسطالاو auto و مابقيناش محتاجيهم .. و النتيجة غادي تولي شي حاجة بحال هاكا.
29 |
30 | RUN apt-get update && \
31 | # Before the installation, Save the list of all manual packages to a variable
32 | savedAptMark="$(apt-mark showmanual)"&& \
33 | # Install
34 | apt-get install -y --no-install-recommends \
35 | autoconf gcc g++ make git && \
36 | git clone $REPO /app && \
37 | cd /app && \
38 | make && make install && \
39 | rm -rf /var/lib/apt/lists/* && \
40 | # mark all the packages as auto
41 | apt-mark auto '.*' > /dev/null && \
42 | # get the list of previously installed packages and mark them as manual
43 | [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark && \
44 | # Delete all the packages that are marked auto
45 | apt-get purge -y --auto-remove
46 | # apt-get clean will be executed automatically if the image is official
47 |
48 | هنا قبل مانبداو لانسكالاسيون ديال build dependencies تانقيدوا لا ليست ديال packages لي أصلا كاينين .. من بعد تانآنسطاليو داكشي ديالنا و تانخدموا بيه و تاينماركيوه auto باش تمسحوا autoremove
49 |
50 | ملاحظات:
51 |
52 | - في المثال لي الفوق مادرتش واحد المرحلة مهمة لي هي نماركي dependencies ديال جميع binaries لي عندنا في image باش يبقاو خدامين
53 |
54 | ```
55 | find /usr/local -type f -executable -exec ldd '{}' ';' \
56 | | awk '/=>/ { print $(NF-1) }' \
57 | | sort -u \
58 | | xargs -r dpkg-query --search \
59 | | cut -d: -f1 \
60 | | sort -u \
61 | | xargs -r apt-mark manual
62 | ```
63 |
64 | السطر 1 تانقليو على binaries ديالنا و تانجبدو dependencies ديالهم ب ldd و في السطر 2 و 3 تانجبدو السميات ديالهم .so وتانرتبوهم و في السطر 4 و 5 و 6 تانقلبوا على السميات ديال package names و تانرتبوهم .. و في السطر الأخير تانماركيوهم manual
65 |
66 | > ايلا بغيتي تتعمق أكثر ضرب طليلة على الريبو ديال docker official images في github
67 | https://github.com/.../blob/master/7.4/buster/fpm/Dockerfile
68 |
69 |
70 |
--------------------------------------------------------------------------------
/day-20.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 20
2 |
3 |
4 | في البوسط لي قبل هضرنا على كيفاش ننقصوا الحجم ديال Docker image في Debian based images و في هاذ البوسط غادي نديرو case study آخرى على Alpine based images
5 | ا Alpine linux هي واحد الdistribution صغيرة بزاااف مقارنة مع لاخرين و لي مديورة خصيصا للاستعمال في container images .
6 |
7 | القضية هنا أسهل مادام package manager فيه features لي غادي ينفعونا ننقصوا من الحجم ديال الimage ديالنا من اللخر ..
8 |
9 | ### ال package cache w package lists
10 |
11 | الpackage manager ديال alpine سميتو apk .. فيه واحد الoption --no-cache لي تاتعطيني الامكانية نمسحوا الcache كامل من بعد الأنسطالاسيون.
12 |
13 | RUN apk add --no-cache autoconf gcc g++ make git
14 |
15 | ### ال build Dependencies
16 |
17 | هاذ المرة عاوتاني القضية أسهل، باستعمال --virtual لي تاتعطينا الامكانية باش نصايبو named groups ديال الpackages لي ممكن نمسحو بيه من بعد جميع الpackages ب apk del
18 |
19 | RUN apk add --no-cache --virtual .build-deps autoconf gcc g++ make git && \
20 | git clone $REPO /app && \
21 | cd /app && \
22 | make && make install && \
23 | apk del .build-deps
24 |
25 |
26 |
--------------------------------------------------------------------------------
/day-21.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 21
2 |
3 |
4 | من بعد ماهضرنا على good practices ديال package management في dockerfiles دابا نهضروا على شي نضائح حول الستيل ديال dockerfile
5 | أول حاجة و لي كانت حتى في البوسطات لي دازو هي نقسموا RUN Commands الطوال لعدة سطور مفرقين ب \&& أو \;
6 |
7 | RUN apk add --no-cache --virtual .build-deps autoconf gcc g++ make git && \
8 | git clone $REPO /app && \
9 | cd /app && \
10 | make && make install && \apk del .build-deps
11 |
12 | أبعد من هاذشي ممكن في حالة package installation من الأحسن نديرو كل واحد في سطرو نرتبوهم Alphabetically
13 |
14 | RUN apk add --no-cache --virtual .build-deps \
15 | autoconf \
16 | g++ \
17 | gcc \
18 | git \
19 | make
20 |
21 | و أخيرا ايلا بغينا نزيدو شي سطر في الأول أو في الأخير ديال هاذ RUN غادي يخاصنا ضروري نبدلوه يعني و هاذشي غادي يخلق لينا مشكل ايلا كنا خدامين ب Git مداام أن git diff ديالنا غادي تطلع فيها أن السطر الأول تبدل واخا حنا زدنا فيه \ && في اﻷخير.
22 |
23 | RUN set -eux && \ # diff here
24 | apk add --no-cache --virtual .build-deps \ # and here
25 | autoconf \
26 | g++ \
27 | gcc \
28 | git \
29 | make && \ # diff here
30 | git clone $REPO # and here
31 |
32 | الحل نأونكادريو هاذيك الRUN بcommands ماتايديرو والو بحال : .. لي ماتاتدير والو من غير أنها تاتexpand الparameters لي تانعطيوها.
33 |
34 | RUN : && \
35 | apk add --no-cache --virtual .build-deps \
36 | autoconf \
37 | g++ \
38 | gcc \
39 | git \
40 | make && \
41 | :
42 |
43 | دابا ايلا زدنا شي سطر الdiff غادي يكون فيها غير السطر لي زدنا
44 |
45 | RUN : && \
46 | set -eux && \ # diff only here
47 | apk add --no-cache --virtual .build-deps \
48 | autoconf \
49 | g++ \
50 | gcc \
51 | git \
52 | make && \
53 | git clone $REPO # diff only here
54 | :
55 |
56 |
--------------------------------------------------------------------------------
/day-22.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 22
2 |
3 |
4 | هاذ البوسط غادي نهضروا على واحد من أهم المواضيع لي كنت بغيت نهضر عليهم، مادام فيهم بزاف ديال الغموض و لليهوما ttys و standard I/O streams
5 | هاذ المفهومين غادي ينفعونا نفهموا شي جزئيات في Docker run و Docker create و عموما مهمين بزاف و غادي نلقاوهم في كل بلاصة في عالم Containers و Linux .
6 |
7 | ### الTTY
8 |
9 | من أهم المبادئ لي في لينكس هي Everything is a file يعني جميع الحوايج لي كاينين في السيتام ديالنا تايتعامل معها الkernel على أساس أنها files
10 | من أهم الأمثلة الDevices .. جميع الDevices لي عندنا مجموعين في files في واحد الضوسيي سميتو dev/ و أغلبيتهم ممكن نقراو منهم و نكتبوا فيهم (حيت هوما مجرد files).. مثلا ممكن تحل الكاميرا ديال البيسي ديالك و تشوف راسك باستعمال media player ديال مثلا vlc أو mpv
11 |
12 | mpv /dev/video0
13 |
14 | هاذ الDevices منهم لي تايكونوا حقيقين و مبرونشين في الحاسوب ديالنا بحال disk في `dev/sdX/` (السمية تاتختالف على حساب الديسترو، و على حساب الconnectors ... و الكاميرا `dev/video0/` (تاهي تاتختالف على حساب السيستام ديالك)
15 |
16 | و منهم لي تايكون مصايبهم kernel باش يديرو شي خدمة بحال `dev/null/` و `dev/random/`
17 |
18 | من أهم الdevices لي تانلقاو هوما `dev/ttyx/` (مع x عدد صحيح طبيعي) .. لي تايشيرو لTeleType ..
19 | هاذ الTeleTypes هوما واحد الآلات كانوا تايتسخدموا شحال هاذي باش يدخلو input و يخرجوا output من الحواسيب (بحال لي في التصورية)
20 |
21 | مع الوقت TeleTypes مابقاوش ولكن بقات هاذوك Drivers لي مكلفين بيهم في Unix و من بعدو Linux و ولا عندهم استعمال آخر (نفس الاستعمال غير الDevices لي تبدلو)
22 |
23 | اليوم tty هوما واحد Devices لي تايصايبهم Kernel و لي تاياخدوا input ديالنا من Keyboard و تايوريونا output في Screen .. هوما لي تانسميوهم اليوم الTerminal 😁😁
24 | الLinux Kernel تايصايب بزاف ديل tty (على حساب السيستام ديالك) و ممكن نتنقلوا بينات شي وحدين منهم باستعمال CTRL+ALT+F1-9
25 |
26 | كاين مشكل ..
27 | كيفما قلنا kernel تايصايب لينا واحد العدد محدود من terminals و لكن في الوقت ديالنا مع Desktop environment ممكن نحلو مئات الterminals مغلا في tmux و ماكاينش مشكل .. ماشي غادي يساليو لينا ttys ؟
28 | الحل هنا هو الuserpace ttys أو pseudo tty أو ptty .. هاذ النوع الجديد ديال الttys ماتايكونش مبرونشي نيشان مع kernel و تايعطينا الامكاينية نصايبو بزاف ديال ttys .. مادام تايخدم ب Master Slave Architecture لي تاتكون فيها مكون master واحد ptmx و بزاف ديال المكونات slave لي هو pts و لي هوما لي تايهمونا
29 | التطبيقي
30 | باش نعرفوا اينا tty حنا فيه يكفي نستعملو الكوموند
31 |
32 | tty
33 | # output /dev/pts/14
34 |
35 | و باش نبدلو الإعدادات ديال شي tty تانستعملوا stty مثلا ايلا درتي full screen و داكشي بقى مقطع ممكن تستعمل stty باش تبدل الطول و العرض ديال tty
36 |
37 | stty -F /dev/pts/10 rows 29 columns 10
38 | stty -a # to display all settings
39 |
40 | إيلا بغيتي تعرف أكثر على ttys ممكن تشوف هنا
41 |
42 | http://www.linusakesson.net/programming/tty/index.php
43 |
44 | ### ال standard I/O streams
45 |
46 | الموضوع الثاني هو stdio streams .. في لينكس كل process تاتكون عندوا واحد file descriptor table لي تايكون فيها جميع files لي حالهم و كيفاش تايتعملهم مرتبين من 0 لواحد الرقم محدد غالبا تايكون 1024 و ممكن نبدلوه.
47 | من هاذ الfile descriptors تايكون عندنا واحد 3 مميزين ليهموما من 0 ل 2 أو بالترتيب STDIN و STDOUT و STDERR ..
48 |
49 | هاذو بكل بساطة تايتكلفوا ب standard I/O يعني أي حاجة تاتدخل و تاتخرج بالشكل default/standard يعني باستعمال print و scanf (تقريبا، حيت حتى هاذو ممكن نقولو ليهم يكتبوا في بلايص آخرين ماشي standard)
50 |
51 | المهم باش نشوفوا هاذ الfd ممكن نمشيو ل proc/ .. ايلا كان pid ديال الprocess ديالنا هو 1200 نلقاوهم في
52 |
53 | ls /proc/1200/fd
54 |
55 | للاشارة هاذو تاهوما files وممكن نقراو منهم و نكتبو فيهم ب unix utils مثلا هاذي
56 |
57 | echo "Hello DevC Rabat" > /dev/1200/fd/0
58 |
59 | مكافئة لأننا ندخلو input لبورغرام ديالنا نيشان من terminal (جربوها مع شي scanf في شي بروغرام.)
60 |
61 | ### ال standard I/O streams و علاقتهم بTTYs
62 |
63 | أغلب الprocesses ليتاrun'ew في terminals تايكونوا std I/O streams ديالهم كاملين مبرونشيين مع tty device لي هوما خدامين فيه ..
64 | مثلا ايلا شدينا واحد البروغرام DevC.bin و خدمناه في `dev/pts16/` عموما (ايلا مابدلناش في اللوجيك لداخل أو ايلا مادرناش redirections أو pipes في command line) غادي يكونوا الfds من 0 ل2 مجرد symlinks ل `dev/pts16/`
65 |
66 | ./DevC.bin # run in the foreground
67 | # from another tty
68 | ls -l /proc/1234/fd
69 | total 0
70 | lrwx------ 1 devc devc 64 Sep 12 02:38 0 -> /dev/pts/16
71 | lrwx------ 1 devc devc 64 Sep 12 02:38 1 -> /dev/pts/16
72 | lrwx------ 1 devc devc 64 Sep 12 02:38 2 -> /dev/pts/16
73 |
74 | باش نعرفوا واش شي fd مبرونشي مع شي tty ممكن نقلبو في proc/ مباشرة ولا ممكن نستعملوا واحد الfunction سميتها `(fd)isatty` من وسط الprogram ديالنا ..
75 |
76 | ملاحظات
77 |
78 |
79 | - أغلب اللعيبات لي في docker مبنيين على Linux technologies ذاكشي علاش غادي يخاصنا نفهمو شوية Linux ايلا بغينا نفهموا Docker و Containers عموما
80 |
81 |
82 |
83 |
84 | 
85 |
--------------------------------------------------------------------------------
/day-23.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 23
2 |
3 |
4 | اليوم غادي نهضروا على شوية ديال المفاهيم Terminology لي عندها علاقة ب container images .. هاذ المفاهيم غادي ينفعونا في البوسطات الجايين.
5 | المفاهيم هي:
6 |
7 | ### الContainer Image :
8 |
9 | هي واحد المجموعة ديال الملفات غالبا tar files لي مرتبين على شكل طبقات layers. كل طبقة تاتخزن التغيير في Filesystem لي تدار مقارنة بالطبقة لي قبل منها. هاذ التغييرات تايتدارو في أغلبية دالحالات بفعل الكومندس لي في Dockerfile ديالنا و تايتسماو بلغة containers ب Image Filesystem Changeset أو Image Diff
10 | مثلا ايلا عندنا في الDockerfile
11 |
12 | ```
13 | RUN touch DevC.md
14 | ```
15 |
16 | المحتوى ديال Changeset غادي يكون هاذاك DevC.md لي زدنا.
17 |
18 | ### ال Container registry
19 |
20 | هي واحد البلاصة في ممكن نخزنوا الimages ديالنا بطريقة فعالة و optimized .. من registry المعروفين هوما Docker hub و Quay و Gitlab registry و gcr و ecr و غيرهم
21 |
22 | ### ال image repository و image tag
23 |
24 | منين تانبغيو نbuildiw شي image تايخاصنا نحددو 2 ديال الأجزاء من بعد ديك t- الجزء الأول ديال الrepository و الثاني الtag ..
25 | الrepository ممكن يكونوا فيه بزاف ديال images بtags مختلفين. مثلا
26 |
27 | ```
28 | php:fpm-buster
29 | php:apache
30 | php:7.3-alpine
31 | ```
32 |
33 | الrepository هو php و الجزء لي من بعد تايتسمى tag و تايحدد image مختلفة. منين غادي نpush'ewهم كاملين في شي container registry غادي يكونوا تاينتاميو لنفس repository
34 |
35 |
36 |
37 | 
38 |
--------------------------------------------------------------------------------
/day-24.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 24
2 |
3 |
4 | كيفاش Docker تايخزن container images ؟
5 | باش نجاوبوا على السؤال غادي يخاسنا نختاروا شي container image ونجبدوها لعندنا.
6 |
7 | docker save node:alpine > node.tar
8 | skopeo docker://node:alpine docker-archive://node.tar
9 |
10 | هاذشي غادي يعطينا واحد الفيشي tar لي فيه الimage ديالنا، هاذ الفيشي ممكن نديرو بيه لي بغينا بحال مثلا نسيفطوه في email لشي حد و ديك الساعة هة يimporteha عندو
11 | دابا آجي نشوفو شنو فيه لداخل
12 |
13 | tar xvf node.tar
14 |
15 | - ال`manifest.json` و هو لي فيه معلومات عامة على image بحال فين كاينة config ديال الimage و الtags لي لاسقين مع image و سميات ديال layers لي كاينين و الترتيب ديالهم
16 | - الrepositories فيه معلومات على repository ديالنا و tags لي معاها
17 | - الconfig file تايكون جميع الconfigs ديال image بحال exposed ports و architecture و Workdir و user و CMD و بزاف ديال الحاجات آخرين لي تانزيدوهم في Dockerfile
18 | - الlayers: كل واحدة تاتكون في folder ديالها الخاص لي تايكون السمية ديالو هو الID ديال الlayer و لداخل فيه تيكون فيشيي سميتو json فيه المعلومات و الconfig الخاصة بديك layer و فيشي سميتو VERSION اللي فيه json schema version ديال هاذاك الفيشي json
19 |
20 | الdocker image specification V1
21 | هاذشي لي هذرنا عليه تايتسمى Docker image spec v1 و لي تايحدد كيفاش docker كان تايخزن container images في الأول .. دابا Docker داز ل Docker imager spec v2
22 | من الحوايج لي فيهم مشكل في هاذ النسخة الأولى ديال specification هوما
23 |
24 | - ماكاينينش قيود على كيفاش layer id خاص يكون it is an implementation detail، و عموما تايكون عدد عشوائي من 256bits و هاذشي كافي باش كل layer تكون عندها id ديالها مختلف على الآخرين .. و لكن ايلا تبدلات شي حاجة فيها ماعندناش شي طريقة باش نعرفوا بلي تبدلات و الimages لي تايعتامدوا عليها يقدر تطرا فيهم مشاكل regressions
25 | - هاذ البلان تايتسمى content-addressablity
26 | - كل layer عندها config file ديالها لي فيه شي حوايج بحال env و cmd و غيرهم، و لكن هاذشي ماعندو تا معنى مادام حنا ماكانستعملوش layers بوحدهم و لكن تانخدمو images
27 | - منين بدا docker كان تايدعم x86_64 architectures و لكن مع الوقت تطورات الأمور و ولينا محتاجين الدعن ديال architectures آخرين و هاذشي ماكاين حتى شي طريقة باش نعبرو عليه باستعمال Docker image spec V1
28 |
29 | هاذشي كامل خلا Docker تدوز لDocker image spec V2 لي تاتحل هاذ المشاكل .. و تاتزيد حوايج آخرين مهمين
30 |
31 | ال Docker image specification V2 فيها 2 نسخ:
32 |
33 | - النسخة الأولى V2 Schema1 و لي تاتقدم واحد الطبقة ديال backward compatibility مع V1
34 | - النسخة الثانية V2 Schema2 لي يحال V2S1 و لكن ماشي compatible مع V1 و أكثر تعبيرا .. هاذ القدرة التعبيرية تاتجي من Json Mediatypes الجداد لي تزادو و كيفاش تفرقات الأمور و ولات modular أكثر و من جهة أخرى ولات أغنى
35 |
36 | أهم الحاجات اللي تبدلوا في V2S2 هوما
37 | - الlayers ولاو files لي فيهم changeset فقط و مابقاش فيهم config خاصة و تاتولي عندنا config عامة ديال image فقط.
38 | - الmanifest.json ولا أكبر fat و أكثر تعبيرا .. عموما ولا فيه واحد list ديال manifests و كل واحد فيهم خاص بarchitecture معينة.
39 | - كل manifest ولات فيه size و platform لي تاتجمع معلومات على architecture و os و غيرهم و digest لي تايكون فين hash value ديال config file.
40 | و أخير الmanifest القديم ديال V1 تعوض بImage manifest و لي فيه معلومات على image و layers لي فيها و كل واحدة type ديالها، و size و digest ديال tar file لي تايطينا content addressablity لي دوينا عليها قبل.
41 |
42 | على أساس هاذ الفورما V2S2 جات منظمة Open Container Initiative و دارت واحد Specification ديالها و لي تقريبا compatible مع V2S2 (مختلفين غير الأسماء و Image layout) .. و دابا ولا عندنا standard لي ممكن نتبعوه باش نصايبوا images ديالنا و يكونوا compatible مع أي OCI Compliant Container Engine.
43 |
44 | - الصورة الأولى فيها الفرق بين oci image layout و docker v2s2
45 | - الصورة الثانية فيها الفرق بين الmanifests لي كيفما تايبان لينا compatible مع بعضهم و الفرق غير في السميات ديال Mediatypes 😃
46 |
47 |
48 |
49 | 
50 | 
51 |
--------------------------------------------------------------------------------
/day-25.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 25
2 |
3 |
4 |
5 | اليوم غادي نهضروا على واحد البلان زوين بزاف و مفيد، و لي غادي يقدر ينفع بزاف ديال الناس، خاصة الناس لي خدامين Docker في CI/CD
6 | في Docker عندنا بزاف ديال المكونات منهم Docker Daemon لي هو لي تانهضروا معاه بDocker CLI أو Docker-compose باش يقضي لينا الغرض.
7 |
8 | التواصل مع هاذ الDocker Daemon تايتدار إما عن طريق Unix Socket لي هو فيشيي تانطتبوا فيه باش نهضروا مع Docker أو عن طريق TCP لي هو port تانهضروا فيه مع Docker
9 | واخا ال Unix Socket هو default في Docker تايبقى Limited حيت مايمكنش نهضروا مع Docker daemon إلا ايلا كان في نفس الحاسوب. ذاكشي علاش TCP بلان زوين.
10 |
11 | ```bash
12 | #### Dockerd ####
13 | # start docker daemon (listen to Unix socket)
14 | sudo dockerd -H unix:///var/run/devc.sock
15 |
16 | # start docker daemon (listen to default port on 2 interfaces)
17 | sudo dockerd -H tcp://192.168.59.106 -H tcp://10.10.10.2
18 |
19 | # start docker daemon (listen to 9999 tcp port on all tnterfaces)
20 | sudo dockerd -H tcp://0.0.0.0:9999
21 |
22 |
23 |
24 | ### Docker CLI ####
25 | # List all running containers on first docker host (daemon)
26 | sudo docker -H unix:///var/run/devc.sock ps
27 |
28 | # Run DevC container on the second docker host (equivalent)
29 | sudo docker -H tcp://192.168.59.106 run -it devc:latest sudo docker -H tcp://10.10.10.2 run -it devc:latest
30 | ```
31 |
32 | و لكن TCP تايجي بمشاكلوا تا هو حيت غادي يخلي Docker daemon ديالنا محلول للناس لي معانا في الريزو، و غادي يخاصنا نأمنوه و نسيكيريزيوه باش مانتصيدوش.
33 |
34 | كاين واحد الحل وسط: Docker تايعطينا الإمكانية أننا نتكونيكطاو لDocker daemon عن بعد باستعمال SSH و ندوزو الكوموند ديالنا عبر SSH النيت بلا مانحتاجوا نExposew الDaemon
35 | .
36 |
37 | ```bash
38 | #### Docker using SSH ####
39 | # List running containers on the devc docker host via SSH
40 | # This requires SSH access only (docker daemon is not exposed to the outside world)
41 | sudo docker -H ssh://devc-user@devc.com ps
42 |
43 | # We can use DOCKER_HOST env variable to specify the docker host
44 | # When specifying DOCKER_HOST we can ommit the -H directive
45 | export DOCKER_HOST=ssh://devc-user@devc.local
46 | # These commands will be run on the remote machine devc.local
47 | sudo docker run -d devc:latest
48 | sudo docker-compose -f devc-stack.yml up
49 | ```
50 |
51 |
52 |
--------------------------------------------------------------------------------
/day-26.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 26
2 |
3 |
4 |
5 | المرة لي فاتت هضرنا على docker daemon و كيفاش ممكن نستعملوا docker cli باش نهضروا معاه فينما كان باستعمال TCP أو باستعمال Unix Sockets مع SSH أو بلا SSH
6 |
7 | دابا آجي نتخيلوا عندنا بزاف ديال Docker daemons في بزاف دالبلايص، مثلا واحد في الحاسوب ديالنا، وواحد في الريزو ديال الخدمة مExposer في ماشين سميتها devc.local في البورت 10000 و واحد في أنترنت devc.com و لي ممكن نهضروا معاه غير بSSH
8 |
9 | كيفاش ممكن نهضروا مع هاذشي كامل بسهولة ؟
10 | هنا فين تايجي الدور ديال Docker contexts .. ممكن تصايبوا context لكل واحد من هاذز لي هدرنا عليهم و نبقاو نسويتشيو بيناتهم بسهولة.
11 |
12 | ```bash
13 | # Create docker contexts
14 | docker context create --docker host=unix:///var/run/docker.sock mine
15 | docker context create --docker host=tcp://devc.local:10000 devc-local
16 | docker context create --docker host=ssh://devcuser@devc.com devc-com
17 |
18 | # List all contexts
19 | docker context list
20 |
21 | # Switch to our local one
22 | docker context use mine
23 | ## Execute commands against my docker daemon
24 | docker ps
25 | docker run devc:latest
26 |
27 | # Switch to DevC local context
28 | docker context use devc-local
29 | ## Execute commands in DevC local daemon via TCP
30 | docker ps
31 | docker run devc:latest
32 |
33 | # Switch to devc-com context
34 | docker context use devc-com
35 | ## Execute commands in the devc-com host via ssh.
36 | docker ps docker
37 | run devc:latest
38 | ```
39 |
40 |
41 |
--------------------------------------------------------------------------------
/day-27.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 27
2 |
3 |
4 |
5 | من الحوايج لي ممكن نستعملوا docker فيهم هو تخدموا stacks ديالنا، (يعني أبليكاسيون بكلشي ليها) و هاذشي ممكن نديروه بسهولة باستعمال docker compose .
6 |
7 | من الحوايج لي صعيب نديرهم بdocker compose هو batch computing يعني بزاف ديال الحوايج لي غادي نرانيوهم بواحد الترتيب و ربما غادي يكونوا مرتبطين ببعضهم.
8 | في الحالات الصعابين ممكن نستعملوا شي tool معين بحال Kubernetes و لكن في أغلب الحالات، سكريبت كافي.
9 |
10 | من الحوايج لي ممكن ينفعونا في هاذ القضية بزاف هي docker wait لي كاتتسنى واحد الcontainer حتى تايسالي و تاتكتب exit status ديالو
11 | مثال في الكود ممكن تستعمل هاذ البلان باش تدير CI/CD ديالك راسك 🤪
12 |
13 |
14 |
15 | ```bash
16 | # Download music from internet
17 | jobl=$(docker run -d --rm -v /home/devc/Music:/Music devc-music-downloader:latest)
18 | exit_code=$(docker wait $jobl)
19 | test $exit_code -eq 11 || exit $exit_code
20 |
21 | # convert it using ffmpeg
22 | job2=$(docker run -d --rm -v /home/devc/Music:/Music -v ./transcode.sh:/transcode sh linuxserver/ffmpeg )
23 | exit_code=$(docker wait $job2)
24 | test $exit_code -eq 11 || exit $exit_code
25 |
26 | # Upload it to s3 bucket
27 | job3=$(docker run -d --rm -v /home/devc/Music:/Music devc-s3-uploader:latest)
28 | exit_code=$(docker wait $job3)
29 | test $exit_code -eq 11 || exit $exit_code
30 |
31 | # Notify Music Server to sync new music from S3
32 | job4=$(docker run -d --rm devc-mediaserver-notifier:latest)
33 | exit_code=$(docker wait $job4)
34 | test $exit_code -eq 11 || exit $exit_code
35 |
36 | ```
--------------------------------------------------------------------------------
/day-28.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 28
2 |
3 |
4 |
5 | في لينكس كاينين 2 أنواع ديال الprocesses، الpriviliged processes و الunpriviliged processes.
6 |
7 | الpriviliged processes تايكونوا يقدروا يدروا لي بغاو و العكس بالنسية للpriviliged processes،
8 | يعني ايلا كتبنا شي بروغرام تايدير شي حوايج لي غير root لي تايقددر يديرهم ماغاديش يقدر يديهم ايلا خدمناه بUnpriviliged user
9 |
10 | هاذشي كان قبل النسخة 2.2 ديال لينكس .. من بعد ولاو الRoot priviliges مفرقين ماشي مجموعين، و هاذشي لي سميتو Capabilities.
11 |
12 | أي Process ولا ممكن نعطيوه واحد العدد معين ديال Capabilities بلا مانعطيوه الPriviliges كاملين.
13 | كاينين بزاف ديال Linux Capabilities منهم CAP_KILL لي كاتخلي Process يقدر يسيفط Signals ل processes آخرين. و CAP_SETUID و CAP_SETGID لي تايخلي الprocess يبدل المعلومات الخاصة ب user و group ديالو.
14 |
15 | آDocker تايخدم بزاف بLinux Capabilities باش يزير Containers 😆😆 و مايخليهمش يديروا لي بغاو.
16 | في Docker عندنا By default كل container تايجي بواحد الLinux capabilities و ممكن نزيدوا ليه شي واحدين و ننقصوا لي آخرين باستعمال cap-add و cap-drop
17 |
18 |
19 |
20 | ```bash
21 | • • •
22 | # Prevent container from setting capabilities of processes and from writing to the kernel audit logs
23 | docker run --cap-drop=setfcap --cap-drop=audit_write devC:latest
24 |
25 | # Drop all capabilities besides setuid and setgid
26 | docker run --cap-drop=all --cap-add=setuid --cap-add=setgid devC:latest
27 |
28 | # Prevent container from binding to privileged ports (< 1024 inside its namespace)
29 | docker run --cap-drop=net_bind_service devC:latest
30 |
31 | # Give the container SYS_ADMIN capabilities (equivalent to root)
32 | docker run --cap-add=CAP_SYS_ADMIN devC:latest
33 | ```
--------------------------------------------------------------------------------
/day-29.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 11
2 |
3 |
4 | اليوم غادي نهضروا على CMD و ENTRYPOINT .. هاذ الموضوع فلسفي و أزلي في Docker و متلف العالم كامل و منهم أنا ..
5 | عموما منين تانbuild'ew شي container image تانكونوا أمام 2 ديال الخيارات ..
6 |
7 |
8 |
9 | - الاول هو أن الimage تاتكون عبارة عن package للآبليكاسيون ديالنا .. يعني تانوجدو كّاع ذاكشي لي خاص الآبليكاسيون باش تخدم في runtime و تانقولو لDocker أنها Runnable و كيفاش غادي يrunيها.
10 | هنا تانستعملوا Docker من اجل Packaging يعني في آخر المطاف هاذيك Image غادي هي الطريقة الكافية باش أي واحد يخدم الأبليكاسيون ديالنا (Process)
11 | في هاذ الحالة كايخاصنا نقولو لDocker منين يجي image ديالنا، يعني شناهو الProcess لي تايشكل الهوية ديال أبليكاسيون ديالنا. و هذا هو entrypoint ديال image ديالنا.
12 | هاذا هو الusecase الأكثر شيوعا ديال docker و images في هاذ السياق هوما images ديال أبليكاسيونات ديالنا لي تانصايبو.
13 |
14 |
15 |
16 |
17 | - الخيار الثاني هو تانستعملو docker باش نصايبو واحد الوسط مناسب (يعني فيه libs و dependencies لي بغينا) فين نrun'ew شي commands و شي Applications ديالنا.
18 | هنا كانهضرو على images بحال ديال gnu/linux distro ولا ديال programming ecosystems بحال python أو node.js ....
19 | في هاذ الحالة image ديالنا ماتاتكونش مراد منها تكون package و لكن تاتكون ecosystem .. و هاذشي لي تايخليها ماتايكونش عندها Entrypoint واحد مفروض على user في runtime .. و لكن بالعكس تايكون مطلوب منها تكون قادرة تexecute واحد العدد ديال commands aka CMD
20 | في هاذ الUsecase تايكون ممكن لينا نحددوا CMD في الBuild و لكن ماتاتكونش مفروضة علينا في الRun و تايمكن لينا نبدلوها بسهولة
21 | دابا من بعد ما هضرنا على ENTRYPOINT و CMD و الفرق بيناتهم و Motivation ديال كل واحدة .. آجي نشوفو كيفاش نخدموهم.
22 | عمليا، ENTRYPOINT و CMD عندهم نفس المفعول في أغلب الحالات.. الفرق هو أن CMD ممكن تبدلوها بcommand لي بغينا في Runtime
23 |
24 |
25 |
26 | # dockerfile
27 | ...
28 | ENTRYPOINT ["node", "devc.rabat.js"]
29 | ...
30 | # ---
31 |
32 | # this will run the devc rabat node application.
33 | docker run -it devc:rabat
34 |
35 |
36 | نفس المثال بCMD
37 |
38 |
39 | # dockerfile
40 | ...
41 | CMD ["node", "devc.rabat.js"]
42 | ...
43 | # ---
44 |
45 | # this will run the devc rabat node application.
46 | docker run -it devc:rabat
47 | # but this will run the devc casa node application.
48 | docker run -it node devc.casa.js
49 |
50 |
51 | واحد من usecases الزوينين لCMD هو نستعملوها باش ندوزو Parameters لENTRYPOINT ديالنا مادام المحتوى ديال CMD دائما تايتزاد في الأخير (هاذ اللعيبة تاتخدم في Exec form فقط)
52 |
53 |
54 | # dockerfile
55 | ...
56 | CMD ["--help"]
57 | ENTRYPOINT ["node", "devc.js"]
58 | ...
59 | # ---
60 |
61 | # this will display the help message for our app
62 | docker run -it devc:rabat
63 | # this will run our app with awesome argument.
64 | docker run -it devc:rabat awesome
65 |
66 | ---
67 | ملاحظات:
68 |
69 | - حتى ENTRYPOINT ممكن نبدلوه في Runtime باستعمال entrypoint-- و لكن غير منصوح بيها حيث غانكون تانبدلو الهوية ديال container بحد ذاتها
70 | - كنت بغيت نهضر على One process per container Philosophy و كيفاش تاتأثر في Design ديال Dockerfiles و CMD و ENTRYPOINT و لكن تايبان لي غادي نخليوها لمرة أخرى
71 |
72 |
--------------------------------------------------------------------------------
/day-30.md:
--------------------------------------------------------------------------------
1 | # 30 Days of Docker - Day 11
2 |
3 |
4 | اليوم غادي نهضروا على CMD و ENTRYPOINT .. هاذ الموضوع فلسفي و أزلي في Docker و متلف العالم كامل و منهم أنا ..
5 | عموما منين تانbuild'ew شي container image تانكونوا أمام 2 ديال الخيارات ..
6 |
7 |
8 |
9 | - الاول هو أن الimage تاتكون عبارة عن package للآبليكاسيون ديالنا .. يعني تانوجدو كّاع ذاكشي لي خاص الآبليكاسيون باش تخدم في runtime و تانقولو لDocker أنها Runnable و كيفاش غادي يrunيها.
10 | هنا تانستعملوا Docker من اجل Packaging يعني في آخر المطاف هاذيك Image غادي هي الطريقة الكافية باش أي واحد يخدم الأبليكاسيون ديالنا (Process)
11 | في هاذ الحالة كايخاصنا نقولو لDocker منين يجي image ديالنا، يعني شناهو الProcess لي تايشكل الهوية ديال أبليكاسيون ديالنا. و هذا هو entrypoint ديال image ديالنا.
12 | هاذا هو الusecase الأكثر شيوعا ديال docker و images في هاذ السياق هوما images ديال أبليكاسيونات ديالنا لي تانصايبو.
13 |
14 |
15 |
16 |
17 | - الخيار الثاني هو تانستعملو docker باش نصايبو واحد الوسط مناسب (يعني فيه libs و dependencies لي بغينا) فين نrun'ew شي commands و شي Applications ديالنا.
18 | هنا كانهضرو على images بحال ديال gnu/linux distro ولا ديال programming ecosystems بحال python أو node.js ....
19 | في هاذ الحالة image ديالنا ماتاتكونش مراد منها تكون package و لكن تاتكون ecosystem .. و هاذشي لي تايخليها ماتايكونش عندها Entrypoint واحد مفروض على user في runtime .. و لكن بالعكس تايكون مطلوب منها تكون قادرة تexecute واحد العدد ديال commands aka CMD
20 | في هاذ الUsecase تايكون ممكن لينا نحددوا CMD في الBuild و لكن ماتاتكونش مفروضة علينا في الRun و تايمكن لينا نبدلوها بسهولة
21 | دابا من بعد ما هضرنا على ENTRYPOINT و CMD و الفرق بيناتهم و Motivation ديال كل واحدة .. آجي نشوفو كيفاش نخدموهم.
22 | عمليا، ENTRYPOINT و CMD عندهم نفس المفعول في أغلب الحالات.. الفرق هو أن CMD ممكن تبدلوها بcommand لي بغينا في Runtime
23 |
24 |
25 |
26 | # dockerfile
27 | ...
28 | ENTRYPOINT ["node", "devc.rabat.js"]
29 | ...
30 | # ---
31 |
32 | # this will run the devc rabat node application.
33 | docker run -it devc:rabat
34 |
35 |
36 | نفس المثال بCMD
37 |
38 |
39 | # dockerfile
40 | ...
41 | CMD ["node", "devc.rabat.js"]
42 | ...
43 | # ---
44 |
45 | # this will run the devc rabat node application.
46 | docker run -it devc:rabat
47 | # but this will run the devc casa node application.
48 | docker run -it node devc.casa.js
49 |
50 |
51 | واحد من usecases الزوينين لCMD هو نستعملوها باش ندوزو Parameters لENTRYPOINT ديالنا مادام المحتوى ديال CMD دائما تايتزاد في الأخير (هاذ اللعيبة تاتخدم في Exec form فقط)
52 |
53 |
54 | # dockerfile
55 | ...
56 | CMD ["--help"]
57 | ENTRYPOINT ["node", "devc.js"]
58 | ...
59 | # ---
60 |
61 | # this will display the help message for our app
62 | docker run -it devc:rabat
63 | # this will run our app with awesome argument.
64 | docker run -it devc:rabat awesome
65 |
66 | ---
67 | ملاحظات:
68 |
69 | - حتى ENTRYPOINT ممكن نبدلوه في Runtime باستعمال entrypoint-- و لكن غير منصوح بيها حيث غانكون تانبدلو الهوية ديال container بحد ذاتها
70 | - كنت بغيت نهضر على One process per container Philosophy و كيفاش تاتأثر في Design ديال Dockerfiles و CMD و ENTRYPOINT و لكن تايبان لي غادي نخليوها لمرة أخرى
71 |
72 |
--------------------------------------------------------------------------------
/images/docker-ps-filtering.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Iduoad/30DaysOfDocker/0c42328558302490226e53673884e34228e66a5f/images/docker-ps-filtering.png
--------------------------------------------------------------------------------
/images/docker-ps-formatting.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Iduoad/30DaysOfDocker/0c42328558302490226e53673884e34228e66a5f/images/docker-ps-formatting.png
--------------------------------------------------------------------------------
/images/layers.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Iduoad/30DaysOfDocker/0c42328558302490226e53673884e34228e66a5f/images/layers.jpg
--------------------------------------------------------------------------------
/images/lifecycle.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Iduoad/30DaysOfDocker/0c42328558302490226e53673884e34228e66a5f/images/lifecycle.jpg
--------------------------------------------------------------------------------
/images/oci-image-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Iduoad/30DaysOfDocker/0c42328558302490226e53673884e34228e66a5f/images/oci-image-1.jpg
--------------------------------------------------------------------------------
/images/oci-image-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Iduoad/30DaysOfDocker/0c42328558302490226e53673884e34228e66a5f/images/oci-image-2.jpg
--------------------------------------------------------------------------------
/images/terminal.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Iduoad/30DaysOfDocker/0c42328558302490226e53673884e34228e66a5f/images/terminal.jpg
--------------------------------------------------------------------------------