1-2 bo'lim mashqlari — MySQL va Adminer konteynerda
Qanday ishlash kerak
Siz docker run, portlar, muhit o'zgaruvchilari, loglar, exec va tozalashni bilasiz. Endi ularni amalda birlashtiramiz. Har bir mashqni avval o'zingiz bajaring — keyin yechimga qarang.
1-mashq: Turli versiyalar ⭐
Bitta buyruq bilan (har biri) quyidagi versiyalarni ko'rsating — kompyuterga hech narsa o'rnatmasdan:
- Node.js 18, 20, 22
- Python 3.11 va 3.13
alpinening/etc/os-releasefayli
Yechim
docker run --rm node:18 node --version
docker run --rm node:20 node --version
docker run --rm node:22 node --version
docker run --rm python:3.11 python --version
docker run --rm python:3.13 python --version
docker run --rm alpine cat /etc/os-release
--rm — har bir konteyner ishini tugatgach o'chadi. docker ps -a toza qoladi.
2-mashq: MySQL bazasi ⭐⭐
- MySQL 8.4 konteynerini ishga tushiring: nomi
baza, root paroliroot123,dokonbazasi vaapp/app123foydalanuvchisi avtomatik yaratilsin - Port faqat lokal kompyuterdan ochiq bo'lsin (3306)
- Konteyner tayyor bo'lganini loglardan aniqlang
execbilan MySQL ga kiring va MySQL kursining 5-darsidagitoifalarjadvalini yarating, 3 ta toifa qo'shing
Yechim
docker run -d --name baza \
-e MYSQL_ROOT_PASSWORD=root123 \
-e MYSQL_DATABASE=dokon \
-e MYSQL_USER=app \
-e MYSQL_PASSWORD=app123 \
-p 127.0.0.1:3306:3306 \
mysql:8.4
docker logs -f baza
# "ready for connections" qatori — ikkinchi marta ko'ringanda tayyor
# (birinchisi — vaqtinchalik ichki server, init uchun). Ctrl + C
docker exec -it baza mysql -uapp -papp123 dokon
CREATE TABLE toifalar (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(100) NOT NULL UNIQUE
);
INSERT INTO toifalar (nom) VALUES ('Telefonlar'), ('Noutbuklar'), ('Aksessuarlar');
SELECT * FROM toifalar;
exit
127.0.0.1:3306:3306 — tarmoqdagi boshqa qurilmalar ulana olmaydi (9-dars).
3-mashq: Adminer — brauzerda baza ⭐⭐
Adminer — bitta faylli veb-interfeys bazalar uchun (phpMyAdmin ga o'xshash). Uni konteynerda ishga tushiring va 2-mashqdagi bazaga brauzer orqali ulaning.
Muammo: Adminer konteyneri baza konteyneriga qanday ulanadi? Adminer ichidagi localhost — Adminer ning o'zi (9-dars).
Yechim
Hozircha (tarmoqlarni 24-darsda o'rganamiz) — host orqali ulanish:
docker run -d --name adminer -p 127.0.0.1:8080:8080 adminer
http://localhost:8080 — kirish oynasi:
- System: MySQL
- Server: host.docker.internal (Docker Desktop da — konteyner ichidan kompyuterga murojaat); Linux da —
172.17.0.1 - Username:
app, Password:app123, Database:dokon
toifalar jadvali va uchta qator ko'rinadi.
To'g'ri yo'l (24-dars) — ikkalasini bitta tarmoqqa qo'yish va server nomi sifatida baza ni yozish:
docker network create dokon-net
docker network connect dokon-net baza
docker network connect dokon-net adminer
# Adminer da Server: baza
4-mashq: Konteyner o'chsa ma'lumot nima bo'ladi? ⭐⭐
bazakonteynerini to'xtating va qayta ishga tushiring.toifalarjadvali bormi?- Endi konteynerni o'chiring (
rm -f) va xuddi shu buyruq bilan qayta yarating. Jadval bormi? - Nima uchun? Ma'lumot aslida qayerda edi?
Yechim va tushuntirish
docker stop baza && docker start baza
docker exec baza mysql -uapp -papp123 dokon -e "SELECT COUNT(*) FROM toifalar"
# 3 — saqlangan (stop — o'chirish emas, 4-dars)
docker rm -f baza
docker run -d --name baza -e MYSQL_ROOT_PASSWORD=root123 -e MYSQL_DATABASE=dokon \
-e MYSQL_USER=app -e MYSQL_PASSWORD=app123 -p 127.0.0.1:3306:3306 mysql:8.4
# ... tayyor bo'lgach:
docker exec baza mysql -uapp -papp123 dokon -e "SELECT COUNT(*) FROM toifalar"
# ERROR 1146: Table 'dokon.toifalar' doesn't exist
Biz -v bermadik, lekin MySQL image i /var/lib/mysql uchun anonim volume yaratadi. Konteyner o'chirilganda yangi konteyner yangi anonim volume oladi — eski ma'lumot hech qayerga ulanmaydi (u "osilib qolgan" volume sifatida diskda qoladi: docker volume ls).
Yechim — nomlangan volume (19-dars):
docker run -d --name baza -v baza-data:/var/lib/mysql ... mysql:8.4
Endi konteynerni o'chirib qayta yaratsangiz ham, baza-data volume i qayta ulanadi va ma'lumot joyida.
5-mashq: Debug ⭐⭐⭐
Quyidagi buyruq bilan konteyner ishga tushadi va darhol to'xtaydi. Sababini toping va tuzating:
docker run -d --name pg postgres:17
Yechim
docker ps -a --filter name=pg # Exited (1)
docker logs pg
Error: Database is uninitialized and superuser password is not specified.
You must specify POSTGRES_PASSWORD to a non-empty value for the superuser.
docker rm pg
docker run -d --name pg -e POSTGRES_PASSWORD=maxfiy -p 127.0.0.1:5432:5432 postgres:17
Debug tartibi (8-dars): ps -a → logs → tuzatish.
Tozalash
docker rm -f baza adminer pg
docker network rm dokon-net
docker system df
docker volume ls # anonim volume lar — 4-mashqdan
docker volume prune # ⚠️ faqat sinov ma'lumotlari ekaniga ishonch hosil qiling
O'zingizni tekshiring
- Image va konteyner farqi nima?
-p 5433:5432da qaysi port qayerniki?- Nima uchun bazalarni
127.0.0.1:bilan ochish kerak? - Konteyner ishga tushib darhol to'xtasa — birinchi nima qilasiz?
docker stopvadocker rmdan keyin ma'lumot bilan nima bo'ladi?- Nima uchun
latestteg o'rniga aniq versiya?
Keyingi bo'lim
3-bo'lim: Dockerfile — tayyor image lardan foydalanishdan o'z image ingizni yasashga o'tamiz.