-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsection_1.txt
More file actions
225 lines (144 loc) · 9.34 KB
/
Copy pathsection_1.txt
File metadata and controls
225 lines (144 loc) · 9.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
1. Quraşdırma və ilk təcrübə: Windows, WSL2, Linux
--------------------------------------------------
1. Windows və Docker problemi
Docker Linux kernel primitivlərinə (namespaces, cgroups, overlayfs və s.) söykənir.
Windows kernelində bunların eynisi yoxdur. Deməli, Windows öz-özlüyündə Docker-i işlədir bilməz.
Bunu həll etmək üçün iki yol var:
1. Arxa planda kiçik Linux VM açmaq.
2. WSL2 (Windows Subsystem for Linux v2) istifadə etmək.
Docker Desktop əslində bu işləri sənin üçün avtomatlaşdırır.
O, Windows-da proqram kimi qurulur, amma arxa planda WSL2 və ya Hyper-V ilə Linux nüvəsini işə salır və
Docker Engine həmin Linux qatında işləyir.
2. WSL2 nədir və niyə vacibdir?
WSL2 – Windows-un içində yüngül virtualizasiya ilə işləyən real Linux kernelidir.
Əvvəlki WSL1 sadəcə sistem çağırışlarını tərcümə edirdi,
amma WSL2-də Microsoft artıq əsl Linux kernelini quraşdırdı.
Bu kernel VM kimi işləyir, amma çox yüngüldür, host OS ilə sıx inteqrasiya olunub.
Docker Desktop da bu WSL2 nüvəsindən istifadə edir.
Sənin Docker konteynerlərin WSL2 Linux qatının içində açılır, amma sən Windows terminalından və fayl sistemindən rahat idarə edə bilirsən.
3. Quraşdırma addımları (Windows + WSL2)
Əsas ardıcıllıq belədir:
3.1. WSL2 aktivləşdir.
wsl --install
Bu, default olaraq Ubuntu quraşdırır və WSL2-ni aktiv edir.
3.2. Docker Desktop quraşdır.
İlk açılışda soruşacaq: WSL2 istifadə etsin, yoxsa Hyper-V. Ən yaxşısı WSL2-ni seçməkdir.
3.3. İlk test
Terminal aç (PowerShell və ya Windows Terminal):
docker run hello-world
Bu image Docker Hub-dan çəkiləcək, konteyner açılacaq və bir “Hello from Docker!” mesajı yazacaq.
Bu sənin Docker-in düzgün işlədiyini göstərir.
-RESPONSE-
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
17eec7bbc9d7: Pull complete
Digest: sha256:a0dfb02aac212703bfcb339d77d47ec32c8706ff250850ecc0e19c8737b18567
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
-END RESPONSE-
-Izahat-
-- Docker iki hissədən ibarətdir:
1. Docker client - sənin əlinlə yazdığın docker run, docker build, docker ps kimi əmrlərdir. Bu sadəcə CLI alətidir.
2. Docker daemon (dockerd) - əslində bütün işi görən server prosesi.
Konteynerləri yaradan, image qatlarını yığan, cgroups və namespaces açan budur.
Yəni sən Windows terminalında docker run hello-world yazanda əslində client, arxa planda işləyən daemon-a müraciət edir.
-- Windows + WSL2 vəziyyətində nə baş verir?
Sənin sistemində Docker Desktop var. Bu belə işləyir:
Docker client → Windows-da işləyən docker.exe proqramıdır.
Bu client, WSL2-nin içində işləyən dockerd ilə danışır. Yəni sənin gördüyün əmrlər əslində WSL2-dəki Linux kernelinə ötürülür.
Dockerd də Linux kernelində namespaces, cgroups və overlayfs istifadə edib konteyneri qaldırır.
--- overlay fs ---
Başlanğıc nöqtə belədir:
image layları read-only qalır.
Kernel isə overlayfs ilə bu read-only layların üstündə bir write qatı birləşdirib “merged” adlı yekun görünüş yaradır.
Terminlər çox sadədir.
lowerdir -> read-only qatların zənciridir, yəni image layları;
upperdir -> konteynerə məxsus yazı qatıdır;
workdir -> overlayfs-in daxili iş qovluğudur;
merged -> isə prosesin gördüyü kök fayl sistemidir.
Docker konteyneri start edəndə məhz belə mount edir:
lowerdir=“image layları”, upperdir=“konteyner diff-i”, workdir=“xüsusi iş qovluğu”, merged=“/” kimi prosesə göstərilən root.
-
Silinmə və “nə üçün görünmür” məsələsi də overlayfs-in öz anlayışı ilə işlənir.
Əgər merged altında bir faylı silsən, lowerdəki orijinalı həqiqətən silmək olmaz, çünki o read-only-dur.
Kernel upperdə xüsusi “whiteout” izi yaradır. Bu, adətən .wh.filename kimi görünən markerdir.
Merged görünüşündə həmin fayl itmiş kimi görünür, çünki whiteout lowerdəki nüsxəni maskalayır.
Bütün bir qovluğu “boşaltmaq” istəyəndə də overlayfs qovluğa “opaque” atributu qoyur (trusted.overlay.opaque=y), yəni alt qatdakı məzmunu gizlədir.
Docker build/commit edəndə bu whiteout/opaque işarələrini image layer tar arxivinə kodlayır,
ona görə də “yuxarı layda sildim” effekti digər maşında da eyni cür görünür.
-
Namespaces və cgroups necə kernel primitividirsə, OverlayFS də eynilə kernel primitividir.
Sadəcə Docker onu çox intensiv və sistemli şəkildə istifadə edir.
-- Docker konteyneri qaldıranda:
image qatlarını lowerdir kimi bağlayır (bunlar read-only qovluqlar olur),
konteynerin yazı qatını upperdir kimi göstərir,
texniki iş üçün workdir yaradır,
və nəticədə birləşdirilmiş görünüşü merged mount edir.
NOTE: Yəni sən docker run yazanda Docker sadəcə kernelin mount -t overlay ... əmrinə bənzər əmrləri özü avtomatik edir.
-
Bu Docker-ə aid xüsusi şey deyil. İstənilən Ubuntu və ya başqa Linux-da root hüququ ilə belə edə bilərsən:
`bash
-----
mkdir -p /tmp/ovl/lower /tmp/ovl/upper /tmp/ovl/work /tmp/ovl/merged
: Burada lower, upper, work, merged adında 4 qovluq hazırladıq.
echo "salam" > /tmp/ovl/lower/hello.txt
: lower qovluğunda hello.txt faylı var. İçində “salam” yazısı yazır.
sudo mount -t overlay overlay \
-o lowerdir=/tmp/ovl/lower,upperdir=/tmp/ovl/upper,workdir=/tmp/ovl/work \
/tmp/ovl/merged
: İndi kernelə dedik: “lower = bu qovluq, upper = o qovluq, iş qovluğu da var,
: bunları birləşdir və nəticəni merged-də göstər”.
cat /tmp/ovl/merged/hello.txt # "salam"
: Burada nəticə “salam” olacaq. Çünki hazırda fayl lower qatdan gəlir, oxumaq üçün heç bir kopyalama yoxdur.
echo "dunya" > /tmp/ovl/merged/hello.txt
: Faylı dəyiş (copy-on-write)
: İndi sən faylı dəyişmək istədin. Overlayfs nə etdi? Faylı lower qatdan götürdü, upperdir-ə kopyaladı və dəyişiklik orada baş verdi.
cat /tmp/ovl/upper/hello.txt # burada "dunya" olacaq
cat /tmp/ovl/lower/hello.txt # burada hələ də "salam" qalır
rm /tmp/ovl/merged/hello.txt
ls -a /tmp/ovl/upper
: İndi upper qovluğunda .wh.hello.txt adlı xüsusi fayl yaranacaq. Bu whiteout markeridir:
merged görünüşündə fayl sanki silinib, amma lower qatdakı orijinal hələ də durur.
`
Burada heç Docker iştirak etmir. Bu, sırf kernelin OverlayFS mexanizminin özüdür.
Docker sadəcə bu mexanizmi alıb, image-layer konsepsiyası ilə birləşdirib avtomatlaşdırır.
---
-- Hello-world ssenarisi necə işləyir?
Sən docker run hello-world yazırsan → bu əmri client (docker.exe) qəbul edir.
Client WSL2 içindəki docker daemon ilə API vasitəsilə danışır.
Daemon yoxlayır ki, “hello-world:latest” image lokalda varmı? Yoxdursa → Docker Hub-dan çəkir.
Image qatlarından rootfs qurur, namespaces və cgroups hazırlayır və image-in içindəki sadə proqramı (/hello) işə salır.
Bu proqram sadəcə “Hello from Docker!” yazır və çıxır.
Daemon həmin çıxışı client-ə göndərir, o da terminalda göstərir.
Əslində dockerd elə bir server prosesidir ki, yalnız Docker əmrlərini icra etmək üçün yaşayır.
Ona görə də sən hər dəfə əmri client-dən verirsən, amma əməliyyatı həyata keçirən daemon-dur.
4. İlk real təcrübə
docker run -it --rm alpine sh
alpine → çox kiçik bir Linux distributivi image-i.
-it → interaktiv terminal açır.
--rm → konteyner çıxanda avtomatik silinsin.
sh → konteynerdə sadə shell açır.
İndi sən əslində Windows-un içində Alpine Linux terminalına düşmüsən.
Orada ls, pwd, apk add curl (Alpine-in paket meneceri ilə) yaza bilərsən.
Sonra exit desən, konteyner bağlanacaq və --rm olduğuna görə tamamilə silinəcək.
Buradan çıxardığın nəticə:
konteynerin içində nə qurursansa, konteynerlə birlikdə gedir. Bu müşahidə növbəti mövzu – volumes və davamlılıq – üçün baza rolunu oynayacaq.
QEYD: Əsas fərqi yadda saxlamaq
Windows öz kernelində Docker işlədə bilmir.
Docker Desktop + WSL2 → arxa planda Linux kernel açılır, Docker Engine orada işləyir.
Sən Windows terminalından idarə etsən də, konteynerlərin əslində Linux-un içində yaşayır.