n333_Docker

ssu_hyunยท2021๋…„ 10์›” 5์ผ
0

[codestates] AI Bootcamp

๋ชฉ๋ก ๋ณด๊ธฐ
35/62

#Docker #Docker Hub #Docker Image #Docker Container #Docker Compose

๐Ÿ† ํ•™์Šต ๋ชฉํ‘œ

  • CLI๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋งํ•  ์ˆ˜ ์žˆ๋‹ค
  • Docker Hub์—์„œ Docker Image๋ฅผ ๊ฒ€์ƒ‰ํ•œ ๋’ค ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•œ ๊ฐœ์˜ Docker Image๋ฅผ ์ด์šฉํ•ด์„œ Container๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‘ ๊ฐœ ์ด์ƒ์˜ Docker Container๋ฅผ ์ด์šฉํ•ด์„œ Container๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Docker LifeCycle์„ ํ†ตํ•ด ์˜ค๋Š˜ ๋ฐฐ์šฐ์ง€ ์•Š์€ ๋ถ€๋ถ„์ด ๋ฌด์—‡์ธ์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.



warm up

์›น ๋ธŒ๋ผ์šฐ์ €์™€ ์›น ์„œ๋ฒ„ยถ

IP ์ฃผ์†Œ

  • ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์›น ์„œ๋ฒ„(์ง‘ PC๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰)์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์•Œ์•„์•ผํ•˜๋Š” (ํ•ด๋‹น ์›น์„œ๋ฒ„๊ฐ€ ์‹คํ–‰์ค‘์ธ) ์ปดํ“จํ„ฐ ์ฃผ์†Œ
  • ๊ฐ ์ปดํ“จํ„ฐ๋งˆ๋‹ค ๊ณ ์œ ๋ฒˆํ˜ธ๋กœ ํ• ๋‹น๋˜์–ด ์žˆ๋‹ค.(์–ด๋Š ์ปดํ“จํ„ฐ์ธ์ง€ ๊ตฌ๋ถ„)
    ex) 192.168.0.1

๋„๋ฉ”์ธ(domain) ์ด๋ฆ„
์™ธ์šฐ๊ธฐ ์–ด๋ ค์šด IP ์ฃผ์†Œ๋ฅผ ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋ฐ”๊พผ ๊ฒƒ
ex) naver.com


DNS(Domain Name Server)
์›น ๋ธŒ๋ผ์šฐ์ €์— ์ž…๋ ฅํ•œ URL์ฃผ์†Œ์˜ ๋„๋ฉ”์ธ ์ด๋ฆ„์„ IP์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์„œ๋ฒ„
> URL (Uniform Resource Locator) : ์ธํ„ฐ๋„ท ์ƒ ์ž์›์˜ ์œ„์น˜
> ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ URL์ž…๋ ฅ ํ›„ ์ผ์–ด๋‚˜๋Š” PROCESS

  • ํด๋ผ์ด์–ธํŠธ(Client) : ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์š”์ฒญํ•˜๋Š” ์ปดํ“จํ„ฐ
  • ์„œ๋ฒ„(Server) : ์š”์ฒญ์„ ๋ฐ›์•„ ์•Œ๋งž์€ ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณต(serve)ํ•˜๋Š” ์ปดํ“จํ„ฐ
    • ๋ณดํ†ต ์„œ๋ฒ„๋Š” IDC(Internet Data Center), ์ธํ„ฐ๋„ท ๋ฐ์ดํ„ฐ ์„ผํ„ฐ๋ž€ ์‹œ์„ค์— ์žˆ๋‹ค.

ํฌํŠธ(port)

  • ์–ด๋–ค ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ• ์ง€ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฒˆํ˜ธ
  • ํด๋ผ์ด์–ธํŠธ๋Š” IP ์ฃผ์†Œ์™€ ํ•จ๊ป˜ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด ์›ํ•˜๋Š” ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์— ์—ฐ๊ฒฐํ•˜๊ฒŒ ๋œ๋‹ค.
    ex) ์›น ์„œ๋ฒ„ ๊ธฐ๋ณธ ํฌํŠธ : 80
    => URL์—์„œ ํ”„๋กœํ† ์ฝœ์ด http์ธ ๊ฒฝ์šฐ ๋ณ„๋„๋กœ ํฌํŠธ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด 80๋ฒˆ ํฌํŠธ๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค๋Š” ๋œป



๋„์ปค(Docker) ยถ

์—๋ฎฌ๋ ˆ์ดํ„ฐ(Emulator)
: ํ•œ ์‹œ์Šคํ…œ์—์„œ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์„ ๋ณต์ œํ•˜์—ฌ ๋‘ ๋ฒˆ์งธ ์‹œ์Šคํ…œ์ด ์ฒซ ๋ฒˆ์งธ ์‹œ์Šคํ…œ์„ ๋”ฐ๋ผ ํ–‰๋™ํ•˜๋Š” ๊ฒƒ
ex) ๋‹ค๋ฅธ ์žฅ์น˜์—์„œ ๋™์ž‘ํ•˜๋Š” ๊ฒŒ์ž„์„ PC์—์„œ ๋™์ž‘์‹œํ‚จ๋‹ค๋Š” ๊ฒƒ


ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์„ ์œ„ํ•ด Linux ํ™˜๊ฒฝ์„ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ(Tool)
๋ฆฌ๋ˆ…์Šค์—์„œ ๋Œ์•„๊ฐ€๋Š” ํ”„๋กœ๊ทธ๋žจ์„ PC์—์„œ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๋Š” ๊ฒƒ + ์‰ฝ๊ณ (Dockerfile), ๋น ๋ฅด๊ฒŒ(Container)
CLI๋ฅผ ํ†ตํ•ด Docker ์ž‘์—…์„ ์ง„ํ–‰

์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ณ  OS๋ฅผ ๊ฒฉ๋ฆฌํ™”ํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ์ˆ 

๋ฆฌ๋ˆ…์Šค ์ปจํ…Œ์ด๋„ˆ(Linux Container)๊ฐ€ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ ๋ฐ ๊ธฐ์ˆ 
์–ด๋–ค ๋ถ€๋ถ„์„ ๋„์ปค๊ฐ€ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์—ˆ๋Š”๊ฐ€?
CASE 1 ํ™˜๊ฒฝ ํ‘œ์ค€ํ™” - ํ™˜๊ฒฝ์ด ์ผ์ •ํ•˜์ง€ ์•Š์•„์„œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ

  • ๋Œ€ํ‘œ์ ์ธ ์šด์˜์ฒด์ œ : Linux, MacOS, Windows
  • ์—”์ง€๋‹ˆ์–ด๋“ค์€ ์ž์‹ ์ด ๊ฐœ๋ฐœํ•˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์–ด๋–ค ํ™˜๊ฒฝ์—์„œ ๊ตฌ๋™๋ ์ง€ ์ƒ๊ฐํ•œ ํ›„ ๊ฐœ๋ฐœํ•ด์•ผํ•˜๋ฉฐ ๊ฐœ๋ฐœํ•˜๋ ค๊ณ  ํ•˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋”ฐ๋ผ ๊ตฌ๋™ํ•˜๋Š” ์šด์˜์ฒด์ œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅด๋‹ค๋ฉด ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์กฐ๊ธˆ์”ฉ ๋ณ€๊ฒฝํ•ด์ค˜์•ผํ•œ๋‹ค.
  • ๊ฐ™์€ Linux๋ผ๊ณ  ํ• ์ง€๋ผ๋„ Ubuntu, CentOS, Debian ๋“ฑ ์—ฌ๋Ÿฌ ๋ฒ„์ „์ด ์กด์žฌํ•œ๋‹ค.

CASE 2 ์ˆ˜์ž‘์—…์œผ๋กœ ์ผ์น˜์‹œํ‚ค๋Š” ํ™˜๊ฒฝ ๊ตฌ์„ฑ
๊ฐœ๋ฐœ๋œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‚ด ์ปดํ“จํ„ฐ์— ์„ค์น˜ํ•˜๊ณ ์ž ์‚ฌ์šฉํ•˜๊ณ ์žํ•  ๋•Œ, '๋‚ด ์ปดํ“จํ„ฐ' ํ˜น์€ '๋‚ด ์‚ฌ์šฉ๋ชฉ์ '์—๋งŒ ๋งž๋Š” ์„ค์ •์ด ๋”ฐ๋กœ ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค.
ex) ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ตฌ์„ฑ, ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ •, ๋ฐฉํ™”๋ฒฝ ์„ค์ •, ์‚ฌ์šฉ์ž ๊ถŒํ•œ ์„ค์ •, Port ์„ค์ •
=> ๊ฐœ๋ฐœ ํ˜น์€ ์‹คํ–‰์— ๋Œ€ํ•œ ํ™˜๊ฒฝ ์„ค์ •์ด ์ฝ”๋“œํ™”๋˜์–ด ์žˆ๋‹ค๋ฉด ํŽธํ•˜๊ฒŒ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ?

CASE 3 ๋ฆฌ์†Œ์Šค ๊ฒฉ๋ฆฌ์„ฑ
ํฌํŠธ : ์ธํ„ฐ๋„ท ํ”„๋กœํ† ์ฝœ์—์„œ ์šด์˜ ์ฒด์ œ ํ†ต์‹ ์˜ ์ข…๋‹จ์ ์œผ๋กœ ํ”„๋กœ์„ธ์Šค(ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰)๋ฅผ ์‹๋ณ„ํ•œ๋‹ค.
*์ข…๋‹จ์  : ํ„ฐ๋ฏธ๋„์ด ์—ฐ๊ฒฐ๋œ ์›๊ฒฉ ํ†ต์‹ ๋ง์—์„œ์˜ ์ ‘์†์ 

๋ฆฌ์†Œ์Šค ๊ฒฉ๋ฆฌ์„ฑ : ํ•˜๋‚˜์˜ ์ปดํ“จํ„ฐ์—์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ปดํ“จํ„ฐ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ˆ ๋กœ๋Š” ๊ฐ€์ƒ๋จธ์‹ , ๋„์ปค๊ฐ€ ์žˆ๋‹ค.

  • ๊ฐ€์ƒ ๋จธ์‹ 
    • OS๋„ ์ผ์น˜์‹œํ‚ค๊ณ , ํ™˜๊ฒฝ๋„ ์ผ์น˜์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋‚ด๊ฐ€ ๊ฐœ๋ฐœ ํ˜น์€ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์„ ์ด๋ฏธ์ง€๋กœ ์ €์žฅํ•˜๊ณ  Host OS ์œ„์— ๊ฒŒ์ŠคํŠธ OS๋ฅผ ๋„์šฐ๋Š” ๋ฐฉ์‹
    • VirtualBox, VMware
  • ๋„์ปค
    • ๋„์ปค๋Š” Virtual Machine๋งŒํผ ๊ฒฌ๊ณ ํ•œ ๊ฒฉ๋ฆฌ์„ฑ์„ ์ œ๊ณตํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.
    • ๋„์ปค๋Š” ๋ฆฌ๋ˆ…์Šค์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ด์šฉํ•œ ๊ธฐ์ˆ ๋กœ OS ์œ„์— ๋‹ค๋ฅธ OS๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— Virtual Machine๋ณด๋‹ค ์ข‹์€ ์„ฑ๋Šฅ์„ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
    • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ํ™˜๊ฒฝ์„ Docker๋Š” ๊ฒฉ๋ฆฌ์„ฑ์„ ์ค‘์‹ฌ์œผ๋กœ ํ•œ VM์˜ ๊ด€์  ๋ณด๋‹ค๋Š” Container์˜ ๊ด€์ ์—์„œ ๋น ๋ฅด๊ณ , ๊ฐœ๋ฐœ์ž์™€ ์‚ฌ์šฉ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํ˜œํƒ์„ ์ œ๊ณตํ•˜๋Š”๋ฐ ์žˆ๋‹ค.
    • ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋Š” Virtual Machine๊ฐ™์€ ํ•œ ์„œ๋ฒ„ํ™˜๊ฒฝ์ด ์•„๋‹ˆ๋ผ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ํ•œ ํ™˜๊ฒฝ์ด๊ณ  ๋ช…๋ น์„ ์ดํ–‰์‹œ์ผœ์ค„ ๋ฟ์ด๋‹ค.

=> ๋‘˜ ๋‹ค ๊ฒฉ๋ฆฌ์„ฑ์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ๊ฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งˆ๋‹ค ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ IP, Port ๋“ฑ์„ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

Linux Container

  • ๋ฆฌ๋ˆ…์Šค ๊ธฐ๋ฐ˜์˜ ๊ธฐ์ˆ  ์ค‘์— ํ•˜๋‚˜๋กœ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ชจ์•„์„œ ๋งˆ์น˜ ๋ณ„๋„์˜ ์„œ๋ฒ„์ฒ˜๋Ÿผ ๊ตฌ์„ฑํ•œ ๊ฒƒ
  • ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ด๋ฃจ๋Š” ๋„คํŠธ์›Œํฌ ์„ค์ •, ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋“ฑ์˜ ์‹œ์Šคํ…œ ์ž์›์€ ๊ฐ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์†Œ์œ ํ•˜๊ณ  ์žˆ๋‹ค.
  • ๊ฐ€์ƒ๋จธ์‹ ๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๊ธฐ์ˆ 

ํŠน์ง•
1. ํ”„๋กœ์„ธ์Šค์˜ ๊ตฌํšํ™”

  • ํŠน์ • ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ž‘๋™ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ทธ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ๋งŒ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์˜ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์—†๋‹ค.
  1. ๋„คํŠธ์›Œํฌ์˜ ๊ตฌํšํ™”
  • ๊ธฐ๋ณธ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ํ•˜๋‚˜์— IP ์ฃผ์†Œ๊ฐ€ ํ• ๋‹น๋˜์–ด ์žˆ๋‹ค.
  1. ํŒŒ์ผ์‹œ์Šคํ…œ์˜ ๊ตฌํšํ™”
  • ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ๊ตฌํšํ™”๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์—์„œ์˜ ๋ช…๋ น์ด๋‚˜ ํŒŒ์ผ ๋“ฑ์˜ ์•ก์„ธ์Šค๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ ์˜ ์—ญ์‚ฌ

FreeBSD JailSolaris Containers
- ์˜คํ”ˆ์†Œ์Šค Unix์ธ FreeBSD์—์„œ ์‚ฌ์šฉ๋œ ๊ธฐ์ˆ 
- Unix๋ฒ„์ „์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋ฉฐ, Jail์ด๋ผ๋Š” ๋ช…์นญ์˜ ์ปจํ…Œ์ด๋„ˆ ์‚ฌ์šฉ
- Orcla์˜ ์ƒ์šฉ Unix์ธ Solaris์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋กœ, 2005๋…„์ธ Solaris 10์—์„œ ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ
- Solaris์กด, Solaris ๋ฆฌ์†Œ์Šค ๋งค๋‹ˆ์ €๋กœ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰
- Docker๊ฐ€ ๋‚˜์˜ค๊ธฐ 10๋…„ ์ „ ๊ธฐ์ˆ ์ด์ง€๋งŒ Docker์™€ ์ƒ๋‹นํžˆ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

Docker CLI(Command Line Interface)

์šฉ์–ด ๋ฐ ๊ฐœ๋… ์ •๋ฆฌ

  • Docker Docs : Docker CLI(๋ช…๋ น์–ด, ์˜ต์…˜ ๋“ฑ ์‚ฌ์šฉ๋ฒ•), ์‚ฌ์šฉ๋ฒ•๊ณผ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• ํ™•์ธ
    • ์‚ฌ์šฉ๋ฒ• : Docker CLI, Docker-Compose CLI, API Reference
    • ํ™˜๊ฒฝ ๋ฐ ๋นŒ๋“œ ํŒŒ์ผ ๊ตฌ์„ฑ : DockerFile, Docker-Compose File



๋„์ปค ์ด๋ฏธ์ง€(ํ”„๋กœ๊ทธ๋žจ)
๋„์ปค ์ปจํ…Œ์ด๋„ˆ = ๋„์ปค ์ด๋ฏธ์ง€๊ฐ€ ์‹คํ–‰๋œ ๊ฒƒ (ํ”„๋กœ์„ธ์Šค)

๋„์ปค ์ด๋ฏธ์ง€(Docker image) ์ด๋ฆ„

ex) docker/whalesay:latest
=> Docker Hub๋ผ๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ docker๋ผ๋Š” ๋ถ„์ด ์˜ฌ๋ฆฌ์‹  whalesay ์ด๋ฏธ์ง€ ํ˜น์€ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์—์„œ latest ํƒœ๊ทธ๋ฅผ ๊ฐ€์ง„ ์ด๋ฏธ์ง€

  • ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(Registry)
    • ๋„์ปค ์ด๋ฏธ์ง€๊ฐ€ ๊ด€๋ฆฌ๋˜๋Š” ๊ณต๊ฐ„
    • Docker Hub : ์–ด๋–ค Docker Image๋ฅผ ์ฐพ๊ฑฐ๋‚˜, Docker Image์˜ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•  ๋•Œ ์ด์šฉ
    • ํŠน๋ณ„ํžˆ ๋‹ค๋ฅธ ๊ฒƒ์„ ์ง€์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋„์ปค ํ—ˆ๋ธŒ(Docker Hub)๋ฅผ ๊ธฐ๋ณธ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ์„ค์ •
    • ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋Š” Docker Hub, Private Docker Hub, ํšŒ์‚ฌ ๋‚ด๋ถ€์šฉ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋“ฑ์œผ๋กœ ๋‚˜๋‰จ
  • ๋ ˆํฌ์ง€ํ† ๋ฆฌ(Repository)
    • ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋‚ด์— ๋„์ปค ์ด๋ฏธ์ง€๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„
    • ์ด๋ฏธ์ง€ ์ด๋ฆ„์ด ์‚ฌ์šฉ๋˜๊ธฐ๋„ ํ•จ
    • GitHub์˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์™€ ๋น„์Šทํ•œ ๊ฐœ๋…
  • ํƒœ๊ทธ(Tag)
    • ๊ฐ™์€ ์ด๋ฏธ์ง€๋ผ๊ณ  ํ• ์ง€๋ผ๋„ ๋ฒ„์ „ ๋ณ„๋กœ ์•ˆ์˜ ๋‚ด์šฉ์ด ์กฐ๊ธˆ์€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.
    • ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฒ„์ „ ์ •๋ณด๋ฅผ ์ฃผ๋กœ ์ž…๋ ฅ
    • ํŠน๋ณ„ํžˆ ๋‹ค๋ฅธ ๊ฒƒ์„ ์ง€์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด latestํƒœ๊ทธ๋ฅผ ๋ถ™ํžŒ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

์‹ค์Šต1_docker/whalesay

๊ธฐ๋ณธ ๋ช…๋ น์–ด

  • docker image pull
  • docker image ls
  • docker container run
  • docker container ls
  • docker container rm
  • docker image rm / docker rmi
  • docker rm --force
  • docker start
  • docker stop
  • docker (-f) logs
  • docker exec [์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„] pwd/ls : ์ปจํ…Œ์ด๋„ˆ ๋Œ€์ƒ ๋ช…๋ น์–ด
  • docker exec -it [์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„] /bin/(sh) or (bash) : ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋ช…๋ น์–ด๋ฅผ ์šด์˜์ฒด์ œ์—๊ฒŒ ์ „๋‹ฌํ•ด์ฃผ๋Š” ์ผ์ข…์˜ ์ฐฝ๊ตฌ์—ญํ• (์ง€์†์ ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ๋Œ€์ƒ ๋ช…๋ น์–ด ์ž…๋ ฅ ๊ฐ€๋Šฅ)
    => exit ์ž…๋ ฅํ•˜๋ฉด ์ดํ›„๋กœ๋Š” ํ˜ธ์ŠคํŠธ ๋Œ€์ƒ ๋ช…๋ น์–ด ์ž…๋ ฅ

0. ๋„์ปค ๋ฐ๋ชฌ ์‹คํ–‰ ์—ฌ๋ถ€ ํ™•์ธ

docker info

  • Error ๋ฐœ์ƒ or ์ž‘์—…ํ‘œ์‹œ์ค„์— ๊ณ ๋ž˜ ๊ทธ๋ฆผ ์—†์„ ๊ฒฝ์šฐ => ๋„์ปค ๋ฐ๋ชฌ ์‹คํ–‰ X
  • ์‹คํ–‰ => ๋„์ปค ์•„์ด์ฝ˜ ํด๋ฆญ or ์ž‘์—…ํ‘œ์‹œ์ค„ ๊ณ ๋ž˜ ๊ทธ๋ฆผ์—์„œ ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ˆŒ๋Ÿฌ 'Dashboard' ํด๋ฆญ

1. ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ์ด๋ฏธ์ง€ ํ˜น์€ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ(pull)

docker (image) pull docker/whalesay:latest

2. ๋„์ปค ์ด๋ฏธ์ง€ ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ

docker images (ls)

3. ๋ฐ›์•„์˜จ ์ด๋ฏธ์ง€(์ปจํ…Œ์ด๋„ˆ) ์‹คํ–‰ (์ด๋ฏธ์ง€ -> ์ปจํ…Œ์ด๋„ˆ)
: docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]

docker container run --name myName docker/whalesay:latest cowsay boo

  • [OPTION]
    --name : ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„ ํ• ๋‹น
  • [COMMAND]
    cowsay : ์ปจํ…Œ์ด๋„ˆ์—์„œ cowsay๋ฅผ ํ˜ธ์ถœ (python์„ ํ˜ธ์ถœํ•˜๋“ฏ ์ด์šฉํ•˜๋Š” ๊ฒƒ)
  • [ARG..]
    boo : COMMAND์ธ cowsay์— ๋„˜๊ฒจ์งˆ ํŒŒ๋ผ๋ฏธํ„ฐ

4. ์ปจํ…Œ์ด๋„ˆ ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ

docker (container) ps -a

  • -a : Default ๋กœ๋Š” ์‹คํ–‰๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ์ง€๋งŒ ์ข…๋ฃŒ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ์ถœ๋ ฅ

5. ์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ

docker container rm myName

  • ์ปจํ…Œ์ด๋„ˆ ๋ช…์‹œํ•  ๋•Œ๋Š” ps ๋ช…๋ น์„ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” NAMES ํ˜น์€ CONTAINER ID ์‚ฌ์šฉ
  • ์ปจํ…Œ์ด๋„ˆ์˜ STATUS๊ฐ€ Existed ํ˜น์€ STOP ์ธ ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€๋Šฅ
  • ์ปจํ…Œ์ด๋„ˆ ๋ฆฌ์†Œ์Šค ์ง€์›Œ๋ณด๊ณ  ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด์„œ cowsay ๋ช…๋ น์–ด์— ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ณ€๊ฒฝํ•ด๋ณผ ๊ฒƒ

6. ์‚ฌ์šฉํ•œ ์ด๋ฏธ์ง€ ์šฉ๋Ÿ‰ ํ™•์ธ ๋ฐ ์‚ญ์ œ(์ปจํ…Œ์ด๋„ˆ ๊ด€๋ จ ๋ฆฌ์†Œ์Šค ์‚ญ์ œ)

  • docker image ์˜ ์šฉ๋Ÿ‰ ํ™•์ธ
    : docker image ls / docker images

  • docker/whalesay ์ด๋ฏธ์ง€ ์ง€์šฐ๊ธฐ
    : docker image rm docker/whalesay (docker rmi๋„ ๊ฐ™์€ ๊ธฐ๋Šฅ ์ˆ˜ํ–‰)

  • ์ด๋ฏธ์ง€ ๋ฐ›์•„์˜ค๊ธฐ+์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰+๋ฆฌ์†Œ์Šค ์‚ญ์ œ(ps -a๋‚ด์šฉ ์ง€์›€)
    : docker container run --name my_name --rm docker/whalesay cowsay boo

    • {container} run
      : ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ (์ด๋ฏธ์ง€๊ฐ€ ์—†๋‹ค๋ฉด ์ด๋ฏธ์ง€๋ฅผ ๋ฐ›์•„์˜จ ๋’ค(pull) ์‹คํ–‰)
    • --rm
      : ์ปจํ…Œ์ด๋„ˆ ์ผํšŒ์„ฑ์œผ๋กœ ์‹คํ–‰(์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ์ปจํ…Œ์ด๋„ˆ์™€ ๊ด€๋ จ๋œ ๋ฆฌ์†Œ์Šค ๋ชจ๋‘ ์ œ๊ฑฐ)

์‹ค์Šต2_danielkraic/asciiquarium

docker container run -it --rm danielkraic/asciiquarium:latest
# -it : -i, -t ๋™์‹œ์— ์‚ฌ์šฉํ•œ ๊ฒƒ/ํ„ฐ๋ฏธ๋„ ์ž…๋ ฅ์„ ์œ„ํ•œ ์˜ต์…˜/์‚ฌ์šฉ์ž์™€ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์— ์ธํ„ฐ๋ ‰์…˜์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ

### ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ๋“ค์—ฌ๋‹ค๋ณด๊ธฐ
docker container ps -a
docker container exec -it [๋„์ปค ์ปจํ…Œ์ด๋„ˆ NAMES]
uname -a  #=> ์–ด๋–ค OS๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ๋ณด์—ฌ์คŒ

Docker CP & DockerFIle

๋กœ์ปฌ์— ์žˆ๋Š” ํŒŒ์ผ๊ณผ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•

  • CP(Copy) : ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ดํ„ฐ ์‚ฌ์ด์— ํŒŒ์ผ ๋ณต์‚ฌ(Copy)
  • Volume : ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ดํ„ฐ ์‚ฌ์ด์— ๊ณต๊ฐ„ ๋งˆ์šดํŠธ(Mount)
    ๋งˆ์šดํŠธ : ์ €์žฅ ๊ณต๊ฐ„์„ ๋‹ค๋ฅธ ์žฅ์น˜์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฒฝ๋กœ๋ฅผ ํ—ˆ์šฉํ•ด ๋งˆ์น˜ ํ•˜๋‚˜์˜ ์ €์žฅ๊ณต๊ฐ„์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•˜๋Š” ์ž‘์—…
    ๋ณผ๋ฅจ ๊ด€๋ จ ์‚ฌ์ดํŠธ : 1, 2

์‹ค์Šต_platzhersh/pacman-canvas

httpd(http daemon) : Apache HTTP Server ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ”ˆ์†Œ์Šค ์›น ์„œ๋ฒ„ ์†Œํ”„ํŠธ์›จ์–ด

### codestates/pacman-canvas ๋ ˆํฌ clone
git clone https://github.com/codestates/pacman-canvas


### httpd ์‹คํ–‰
docker container run --name my_web --rm -p 818:80 httpd
# -p : ๋กœ์ปฌ(ํ˜ธ์ŠคํŠธ)์˜ ํฌํŠธ & ์ปจํ…Œ์ด๋„ˆ์˜ ํฌํŠธ ์—ฐ๊ฒฐ


### ๋ธŒ๋ผ์šฐ์ €์—์„œ 127.0.0.1:818 ํ˜น์€ localhost:818 ์„ ํ†ตํ•ด ์›น ์„œ๋ฒ„๊ฐ€ ์ž‘๋™ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธ


### ์ด๋ฏธ์ง€, ์ปจํ…Œ์ด๋„ˆ ์‚ดํŽด๋ณด๊ธฐ
docker image ls
docker container ps -a


### ์ปจํ…Œ์ด๋„ˆ copy
# ์ปจํ…Œ์ด๋„ˆ -> ํ˜ธ์ŠคํŠธ : docker container cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
# ํ˜ธ์ŠคํŠธ->์ปจํ…Œ์ด๋„ˆ : docker cp [OPTIONS] SRC_PATH| - CONTAINER: DEST_PATH
docker container cp ./ my_web:/usr/local/apache2/htdocs/
# ./ (SRC_PATH): ํ˜„์žฌ ๊ฒฝ๋กœ์— ์žˆ๋Š” ๋ชจ๋“  ํŒŒ์ผ (ํ„ฐ๋ฏธ๋„ ํ˜„์žฌ ๊ฒฝ๋กœ์— ๋ณต์‚ฌํ•  ๋ชจ๋“  ํŒŒ์ผ์ด ์กด์žฌํ•ด์•ผํ•จ : dir ํ™•์ธ)
# my_web : (๋ณต์‚ฌ๋ณธ ๋ถ™์—ฌ๋„ฃ์„) ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„
# my_web:/usr/local/apache2/htdocs/ (CONTAINER: DEST_PATH): my_web ์ปจํ…Œ์ด๋„ˆ์˜ ๋‹ค์Œ ๊ฒฝ๋กœ์— ๋ณต๋ถ™


### ์ปจํ…Œ์ด๋„ˆ ์•ˆ์„ bash์‰˜๋กœ ๋“ค์–ด๊ฐ€๋ณด๊ธฐ
docker exec -it my_web /bin/bash
cd
dir
cd htdocs/
dir  #=> ๋ณต์‚ฌํ•˜๋ คํ–ˆ๋˜ ํŒŒ์ผ๋“ค์ด ๋ชจ๋‘ copy๋˜์—ˆ๋Š”์ง€ ํ™•์ธ


### ๋ธŒ๋ผ์šฐ์ €์—์„œ 127.0.0.1:818 ํ˜น์€ localhost:818 ์— ์ ‘์†ํ•ด์„œ ๊ฒŒ์ž„ ์„œ๋ฒ„(ํŒฉ๋งจ)๊ฐ€ ๊ตฌ๋™๋˜๋Š”์ง€ ํ™•์ธ

Container -> Image

์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค์–ด๋†“์œผ๋ฉด

  • ์ด์ „์— ์ž‘์—…ํ–ˆ๋˜ ๋‚ด์šฉ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค
  • ๋ฐฐํฌ ๋ฐ ๊ด€๋ฆฌ๊ฐ€ ์œ ์šฉํ•˜๋‹ค
  1. ๊ตฌ๋™ํ•œ Docker Container ๋ฅผ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• : commit
    docker container commit [OPTIONS] CONTAINER [new REPOSITORY ์ด๋ฆ„[:TAG]]
### commit
docker container commit my_web my_pacman:1.0
### ์ด๋ฏธ์ง€ ์ƒ์„ฑ ํ™•์ธ
docker images
### ์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€๋ฅผ ์ด์šฉํ•ด์„œ 818 ํฌํŠธ์— ์›น์„œ๋ฒ„ ๊ตฌ๋™
docker run --name my_web2 -p 818:80 my_pacman:1.0
  1. Docker Image ๋นŒ๋“œ๋ฅผ ์œ„ํ•œ ํŒŒ์ผ์ธ Dockerfile ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•
### get Dockerfile content
(linux) cat Dockerfile
(window) type Dockerfile
### Dockerfile content
FROM httpd:2.4 # ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€๋ฅผ httpd:2.4 ๋กœ  ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
COPY ./ /usr/local/apache2/htdocs/ # ํ˜ธ์ŠคํŠธ์˜ ํ˜„์žฌ๊ฒฝ๋กœ์— ์žˆ๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ด๋ฏธ์ง€ /usr/local/apache2/htdocs/ ์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.
### docker build ๋ช…๋ น : Dockerfile ์„ ๋ฐ”ํƒ•์œผ๋กœํ•œ ๋„์ปค ์ด๋ฏธ์ง€ ํŒŒ์ผ ์ƒ์„ฑ
# --tag ๋Š” name:tag ํ˜•์‹์œผ๋กœ ์ด๋ฏธ์ง€ ์ƒ์„ฑ
# ์ง€์ •ํ•œ ๊ฒฝ๋กœ์— ์žˆ๋Š” Dockerfile ์ฐพ์•„ ๋นŒ๋“œ
docker build --tag my_pacman:2.0 .
### ์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€๋ฅผ ์ด์šฉํ•ด์„œ 818 ํฌํŠธ์— ์›น์„œ๋ฒ„ ๊ตฌ๋™
docker run --name my_web3 -p 901:80 my_pacman:2.0
### ๋ธŒ๋ผ์šฐ์ €์—์„œ 127.0.0.1:901 ํ˜น์€ localhost:901 ์„ ํ†ตํ•ด ์›น ์„œ๋ฒ„๊ฐ€ ์ž‘๋™ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธ



docker-compose : ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰

0. express.js, mongodb ์ด๋ฏธ์ง€ pull

1. docker-compose.yml ํŒŒ์ผ ์ž‘์„ฑ

# docker-compose ๋ฒ„์ „
version: '3.7'

# ์‚ฌ์šฉํ•  container
# ์„œ๋น„์Šค ์ •์˜
services: 
  express: 
    # ์›น ์„œ๋ฒ„
    container_name: express
    image: jmuppala/node-server:latest
    command : ["./wait-for-it.sh", "mongodb:27017","--","npm","start"] 
    ports:
      - 3000:3000

  mongodb:
    container_name: mongodb
    image: jmuppala/mongo-server:latest

3. express.js, mongodb ์ด๋ฏธ์ง€ pull

4. docker-compose up
: ํ•ด๋‹น ๋ช…๋ น์–ด CLI์—์„œ ์ž…๋ ฅ ํ›„ ๋ธŒ๋ผ์šฐ์ € 127.0.0.1:3000์—์„œ ํ™•์ธ




๋ฆฌ๋ˆ…์Šค ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ? => ๋ฆฌ๋ˆ…์Šค๊ฐ€ ์˜ˆ์ „๋ถ€ํ„ฐ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜์–ด์„œ, ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ๋งŽ์ด ์‚ฌ์šฉํ•ด์„œ, ๋ณด์•ˆ๋ชฉ์ 

์œ ๋‹‰์Šค-๋ฆฌ๋ˆ…์Šค-๋งฅ
๋„์Šค-์œˆ๋„์šฐ

์—๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” ํ•œ ์‹œ์Šคํ…œ์—์„œ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์„ ๋ณต์ œํ•œ๋‹ค. ๊ทธ๋ฆฌํ•˜์—ฌ ๋‘ ๋ฒˆ์งธ ์‹œ์Šคํ…œ์ด ์ฒซ ๋ฒˆ์งธ ์‹œ์Šคํ…œ์„ ๋”ฐ๋ผ ํ–‰๋™ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ธฐ์กด : ๋ฐ”๋กœ ์„ค์น˜
๋„์ปค : ๋ฆฌ๋ˆ…์Šค๋ฅผ ๋„์šฐ๊ณ , ๊ทธ ์œ„์— ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰

์ฝ˜๋‹ค : ํŒจํ‚ค์ง€ ์ถฉ๋Œ
๋„์ปค : ์‹คํ–‰ํ™˜๊ฒฝ์ด ์„œ๋กœ ์ถฉ๋Œํ•˜์ง€ ์•Š๊ธฐ์œ„ํ•ด์„œ

๋„์ปค๋ฅผ ๋„์šด๋‹ค = ๋ฆฌ๋ˆ…์Šค๋ฅผ ๋„์šด๋‹ค.
vmmem = ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ(์œˆ๋„์šฐ)

  • ๊ฐ์ž์˜ ํ”„๋กœ๊ทธ๋žจ๋งˆ๋‹ค ํฌํŠธ๋ฒˆํ˜ธ๊ฐ€ ์ •ํ•ด์ ธ์žˆ์Œ



์›น์„œ๋ฒ„์˜ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ~ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ




๐Ÿ“š Reference
Get Started with Docker
Docker Docs
Docker Hub
Postgres in Docker Hub
pgAdmin in Docker Hub
pgAdmin Docs
jmuppala github Repo

0๊ฐœ์˜ ๋Œ“๊ธ€