1-2 bo'lim mashqlari — MySQL va Adminer konteynerda

~30 daq · Docker · Konteynerlar bilan ishlash

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
  • alpine ning /etc/os-release fayli
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 ⭐⭐

  1. MySQL 8.4 konteynerini ishga tushiring: nomi baza, root paroli root123, dokon bazasi va app / app123 foydalanuvchisi avtomatik yaratilsin
  2. Port faqat lokal kompyuterdan ochiq bo'lsin (3306)
  3. Konteyner tayyor bo'lganini loglardan aniqlang
  4. exec bilan MySQL ga kiring va MySQL kursining 5-darsidagi toifalar jadvalini 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? ⭐⭐

  1. baza konteynerini to'xtating va qayta ishga tushiring. toifalar jadvali bormi?
  2. Endi konteynerni o'chiring (rm -f) va xuddi shu buyruq bilan qayta yarating. Jadval bormi?
  3. 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:5432 da qaysi port qayerniki?
  • Nima uchun bazalarni 127.0.0.1: bilan ochish kerak?
  • Konteyner ishga tushib darhol to'xtasa — birinchi nima qilasiz?
  • docker stop va docker rm dan keyin ma'lumot bilan nima bo'ladi?
  • Nima uchun latest teg o'rniga aniq versiya?

Keyingi bo'lim

3-bo'lim: Dockerfile — tayyor image lardan foydalanishdan o'z image ingizni yasashga o'tamiz.