๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
BackEnd๐ŸŒฑ/DB & SQL

Docker ์ปจํ…Œ์ด๋„ˆ์— MariaDB ์„ค์น˜ํ•˜๊ธฐ

by ์•ˆ์ฃผํ˜• 2023. 5. 12.

์„œ๋ก 

๋งค๋ฒˆ ์ƒˆ๋กœ์šด DB ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ๊ฒ€์ƒ‰ํ•˜๋ฉด์„œ ์ฐพ์•„๋ณด๊ธฐ๋„ ๋ฒˆ๊ฑฐ๋กญ๊ณ , ๊ทธ๋ ‡๋‹ค๊ณ  ์„ธํŒ… ์ฃผ๊ธฐ๋„ ๊ทธ๋ ‡๊ฒŒ ์งง์ง€ ์•Š์•„ ๊ธฐ์–ต๋„ ์ž˜ ๋˜์ง€ ์•Š์•„์„œ ์ด๋ฒˆ ๊ธฐํšŒ์— ์•„์˜ˆ ๋ฌธ์„œํ™”๋ฅผ ํ•˜๊ณ ์ž ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ชฉ์ฐจ

  1. Docker ์„ค์น˜
  2. MariaDB Container ์„ค์น˜
  3. MariaDB ์‚ฌ์šฉ์ž ์ถ”๊ฐ€ ๋ฐ user ๊ถŒํ•œ ์„ค์ •
  4. Dokcer์˜ ๋‹ค์–‘ํ•œ ๋ช…๋ น์–ด

 

Docker ์„ค์น˜

๋จผ์ € Docker๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด Docker๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Docker์˜ ์„ค์น˜๋Š” https://www.docker.com/์—์„œ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Docker๋Š” Docker Engine(Daemon)๊ณผ Docker CLI(Client)๋ฅผ Docker๋ผ๋Š” ์šฉ์–ด๋กœ ๋ฌถ์–ด์„œ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด๋“ค์€ Docker์—์„œ ์ œ๊ณตํ•˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐ€์ง€ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค.

  • Docker Engine: Docker์˜ ๋Ÿฐํƒ€์ž„ ๋ถ€๋ถ„์œผ๋กœ, ๋ฐ๋ชฌ ํ˜•ํƒœ๋กœ ์‹คํ–‰ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ์—”์ง„ ๊ทธ ์ž์ฒด
  • Docker CLI: ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” docker ๋ช…๋ น์–ด ์ธํ„ฐํŽ˜์ด์Šค

๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜๋ฉด, Docker Engine์€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•˜๊ณ , Docker CLI๋Š” ์‚ฌ์šฉ์ž๊ฐ€ Docker Engine๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ๋ณดํ†ต Docker Engine์„ ์„ค์น˜ํ•  ๋•Œ Docker CLI๋„ ๊ฐ™์ด ์„ค์น˜๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์šฐ๋ฆฌ๋Š” Docker CLI์˜ ์กด์žฌ๋ฅผ ๋ชจ๋ฅด๊ณ  Docker๋ฅผ ์„ค์น˜ํ–ˆ๋‹ค๊ณ  ํ†ต์นญํ•ด์„œ ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

 

MariaDB  Container ์„ค์น˜

1. Docker Image ๊ฐ€์ ธ์˜ค๊ธฐ

docker pull mariadb

์œ„ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด Docker Hub์—์„œ MariaDB Image๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. 

Docker Image๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์†Œํ”„ํŠธ์›จ์–ด ํŒจํ‚ค์ง€๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ฝ”๋“œ, ๋Ÿฐํƒ€์ž„, ์‹œ์Šคํ…œ ๋„๊ตฌ, ์‹œ์Šคํ…œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์„ค์ • ๋“ฑ์„ ํฌํ•จํ•œ ๋ชจ๋“  ๊ฒƒ์„ ํฌํ•จํ•œ ํŒŒ์ผ์˜ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

Docker Hub๋Š” Docker Image๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐœ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ์šฉ์ž๋Š” Docker Hub๋ฅผ ํ†ตํ•ด ์ž์‹ ์ด ๋งŒ๋“  Docker Image๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์—…๋กœ๋“œํ•œ Docker Image ๋˜ํ•œ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

docker images

์œ„ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์„ค์น˜๋œ Docker Image๋“ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. MariaDB ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ๋ฐ ์‹คํ–‰

docker run -p 3306:3306 --name {์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„ ์ž‘์„ฑ} -e MARIADB_ROOT_PASSWORD={๋น„๋ฐ€๋ฒˆํ˜ธ} -d mariadb

ex) docker run -p 3306:3306 --name test -e MARIADB_ROOT_PASSWORD=1234 -d mariadb

์œ„ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด MariaDB Docker Image๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๋ช…๋ น์–ด ๊ฐ๊ฐ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • -p 3306:3306 : ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์˜ ํฌํŠธ๋ฅผ ์—ฐ๊ฒฐ (host-port:container-port), ํ˜ธ์ŠคํŠธ์—์„œ 3306 ํฌํŠธ ์—ฐ๊ฒฐ ์‹œ ์ปจํ…Œ์ด๋„ˆ 3306 ํฌํŠธ๋กœ ํฌ์›Œ๋”ฉ
  • --name test : ์ƒ์„ฑํ•˜๋ ค๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„์„ test๋กœ ์ง€์ •
  • -e MARIADB_ROOT_PASSWORD=1234 : ์ปจํ…Œ์ด๋„ˆ ๋‚ด ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •. mariadb์˜ root ์‚ฌ์šฉ์ž์˜ ์•”ํ˜ธ ์ง€์ •
  • -d: ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰
// ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ๋งŒ ์กฐํšŒ
docker ps

// ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ์กฐํšŒ
docker ps -a

์œ„ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ํ˜น์€ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. MariaDB์— ์ ‘์†ํ•˜๊ธฐ

์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉด, ์ด์ œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด MariaDB ์„œ๋ฒ„์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

docker exec -it {์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„} mariadb -uroot -p

ex) docker exec -it test mariadb -uroot -p

'mysql -uroot -p' ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด MariaDB์˜ root ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์•”ํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค๋ฉด, ์ด์ „ ๋‹จ๊ณ„์—์„œ ์„ค์ •ํ•œ root ์‚ฌ์šฉ์ž์˜ ์•”ํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์—ฌ๊ธฐ๊นŒ์ง€ Docker์— MariaDB ์„ค์น˜๊ฐ€ ๋๋‚ฌ๊ณ , ์ด์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

MariaDB ์‚ฌ์šฉ์ž ์ถ”๊ฐ€ ๋ฐ user ๊ถŒํ•œ ์„ค์ •

1. ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ƒ์„ฑ

create database {db_name};

ex) create database test;

2. ์‚ฌ์šฉ์ž ์ถ”๊ฐ€

create user 'user_name'@'ip_address' identified by 'user_password';

ex) create user 'tester'@'%' identified by 'tester1234';
ex) create user 'tester'@'localhost' identified by 'tester1234';

์œ„ ๋ช…๋ น์–ด์—์„œ  ๋œปํ•˜๋Š” ๊ฐ๊ฐ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • user_name: ์ƒˆ๋กœ ์ƒ์„ฑํ•  ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„
  • ip_address: ํ•ด๋‹น ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ˜ธ์ŠคํŠธ, %๋กœ ์ง€์ •ํ•˜๋ฉด ๋ชจ๋“  ํ˜ธ์ŠคํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • user_password: ์‚ฌ์šฉ์ž์˜ ํŒจ์Šค์›Œ๋“œ

3. ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ถŒํ•œ ๋ถ€์—ฌ

grant all privileges on db_name.* to 'user_name'@'ip_address';

ex) grant all privileges on test.* to 'tester'@'%';

์œ„์˜ ๋ช…๋ น์–ด๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

4. ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ ์šฉ

๋งˆ์ง€๋ง‰์œผ๋กœ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฆ‰์‹œ ์ ์šฉํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

flush privileges;

MariaDB์™€ MySQL์€ ์‚ฌ์šฉ์ž ๊ถŒํ•œ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์บ์‹œ ํ•˜๊ธฐ์— grant, revoke, set password ๋“ฑ์˜ ๋ช…๋ น์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๊ถŒํ•œ์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ฆ‰์‹œ ์ ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ ์šฉ๋˜๋ ค๋ฉด ๊ถŒํ•œ ์บ์‹œ๊ฐ€ ๋‹ค์‹œ ๋กœ๋“œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

flush privileges; ๋ช…๋ น์€ ๊ถŒํ•œ ์บ์‹œ๋ฅผ ๋‹ค์‹œ ๋กœ๋“œํ•˜๋„๋ก ์„œ๋ฒ„์— ์ง€์‹œํ•˜๋ฏ€๋กœ, ์‚ฌ์šฉ์ž ๊ถŒํ•œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฆ‰์‹œ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž ๊ถŒํ•œ์„ ๋ณ€๊ฒฝํ•œ ํ›„์—๋Š” ํ•ญ์ƒ flush privileges; ๋ช…๋ น์„ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹จ, ์‚ฌ์šฉ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” create user ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์ž๋™์œผ๋กœ ๊ถŒํ•œ ์บ์‹œ๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ๋•Œ๋ฌธ์— flush privileges;๋ฅผ ์‹คํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

 

Docker์˜ ๋‹ค์–‘ํ•œ ๋ช…๋ น์–ด๋“ค

docker --help ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  Docker ๋ช…๋ น์–ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ช…๋ น์–ด๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • docker run: Docker ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ๋กœ์šด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, `docker run ubuntu` ๋ช…๋ น์€ ubuntu ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ๋กœ์šด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • docker ps: ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ชจ๋“  Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. `-a` ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด (`docker ps -a`), ์‹คํ–‰ ์ค‘์ด์ง€ ์•Š์€ ์ปจํ…Œ์ด๋„ˆ๋„ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.
  • docker stop [container_id]: ์‹คํ–‰ ์ค‘์ธ Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. `container_id`๋Š” ์ค‘์ง€ํ•˜๋ ค๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ID๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ID๋Š” `docker ps` ๋ช…๋ น์˜ ์ถœ๋ ฅ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • docker start [container_id]: ์ค‘์ง€๋œ Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์—๋Š” ์ปจํ…Œ์ด๋„ˆ ID๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • docker restart [container_id]: Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์—๋Š” ์ปจํ…Œ์ด๋„ˆ ID๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • docker rm [container_id]: Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์—๋Š” ์ปจํ…Œ์ด๋„ˆ ID๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๋Š” ๋” ์ด์ƒ ์‹คํ–‰ ์ค‘์ด์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • docker pull [image_name]: Docker ์ด๋ฏธ์ง€๋ฅผ Docker Hub ๋˜๋Š” ๋‹ค๋ฅธ Docker ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ๋กœ์ปฌ ์‹œ์Šคํ…œ์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  • docker rmi [image_id]: ๋กœ์ปฌ Docker ์‹œ์Šคํ…œ์—์„œ Docker ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • docker logs [container_id]: Docker ์ปจํ…Œ์ด๋„ˆ์˜ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • docker exec: ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, `docker exec -it [container_id] bash` ๋ช…๋ น์€ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์—์„œ bash ์‰˜์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

 

๊ฐ™์ด ๋ณด๋ฉด ์ข‹์€ ๊ธ€

[MySQL] ์‚ฌ์šฉ์ž ์ƒ์„ฑ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ ๋ฐฉ๋ฒ•

๋Œ“๊ธ€