๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ณต๋ถ€๊ธฐ๋ก/Docker & Kubernetes

๋„์ปค ๊ธฐ์ดˆ ๋ช…๋ น์–ด (Container, Network, Image)

by kaizen_bh 2025. 6. 19.

 

 

 

 

 

์‚ฌ์šฉํ™˜๊ฒฝ

- Azure VM

- Ubuntu 22.04 / 30GM / vCPU 2

 

 

์ž์„ธํ•œ ์ด๋ก  ๋ฐ ์„ค๋ช… ๋ณด๋‹จ ์ฃผ์š” ๋ช…๋ น์–ด์™€ ์‹ค์Šต ์œ„์ฃผ๋กœ ์ •๋ฆฌ

 

 

 

 


 

 

 

 

๋„์ปค ์„ค์น˜

 

โœ… [1] ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ• (๊ณต์‹ ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ)

# ๋„์ปค ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์‹คํ–‰
curl -sSfL https://get.docker.com -o docker.sh
chmod +x docker.sh
sudo ./docker.sh

 

๐Ÿ” ์„ค์น˜ ํ™•์ธ

docker version
systemctl status docker

 

 

 

โœ… [2] ๊ธฐ๋ณธ ๋ฐฉ๋ฒ• (APT ์ €์žฅ์†Œ ๊ธฐ๋ฐ˜ ์„ค์น˜: Ubuntu ๊ธฐ์ค€)

# ํ•„์ˆ˜ ํŒจํ‚ค์ง€ ์„ค์น˜
sudo apt-get update
sudo apt-get install -y \
    ca-certificates \
    curl \
    gnupg

# Docker GPG ํ‚ค ์ถ”๊ฐ€
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
    sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# APT ์ €์žฅ์†Œ ์„ค์ •
echo \
  "deb [arch=$(dpkg --print-architecture) \
  signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Docker ์„ค์น˜
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

# Docker ๋ฐ๋ชฌ ์ƒํƒœ ํ™•์ธ
docker version
systemctl status docker

 

 

 

 

 


 

 

 

 

 

 

์ปจํ…Œ์ด๋„ˆ

 

 

0๏ธโƒฃ ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ

docker container create
root@master:~# docker container create -it --name testos centos:8
root@master:~# docker ps -a
CONTAINER ID   IMAGE           COMMAND                  CREATED         STATUS                      PORTS     NAMES
66307471d0b0   centos:8        "/bin/bash"              5 seconds ago   Created                               testos

 

 

 

 

 

1๏ธโƒฃ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ๋ฐ ์žฌ์‹คํ–‰, ์ค‘๋‹จ

 

์‹คํ–‰

# centos 8๋ฒ„์ ผ ์ด๋ฏธ์ง€๋กœ testos๋ผ๋Š” ์ด๋ฆ„์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰
docker container run -it --name testos centos:8

 

 

์˜ต์…˜ ์˜๋ฏธ
docker container run ์ƒˆ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰
-i interactive ๋ชจ๋“œ: ์‚ฌ์šฉ์ž ์ž…๋ ฅ(STDIN)์„ ๋ฐ›๊ฒ ๋‹ค๋Š” ์˜๋ฏธ
-t pseudo-TTY ํ• ๋‹น: ํ„ฐ๋ฏธ๋„๊ณผ ์—ฐ๊ฒฐ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋„๋ก ํ•จ
--name testos ์ปจํ…Œ์ด๋„ˆ์— testos๋ผ๋Š” ์ด๋ฆ„ ๋ถ€์—ฌ (์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ž„์˜๋กœ ์ด๋ฆ„ ์ƒ์„ฑ)
centos:8 centos๋ผ๋Š” ์ด๋ฏธ์ง€์˜ 8 ๋ฒ„์ „(ํƒœ๊ทธ)์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ฌ

 

 

root@master:~# docker container run -it --name testos centos:8
Unable to find image 'centos:8' locally
8: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:8

[root@30ef4585d468 /]# ps
    PID TTY          TIME CMD
      1 pts/0    00:00:00 bash
     15 pts/0    00:00:00 ps

[root@30ef4585d468 /]# exit
exit

 

  • ํ˜„์žฌ ๋กœ์ปฌ์— centos:8 ์ด๋ฏธ์ง€๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ
  • ๋„์ปค๋Š” ๋จผ์ € ๋กœ์ปฌ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์ฐพ๊ณ , ์—†์œผ๋ฉด ์ž๋™์œผ๋กœ Docker Hub์—์„œ ๋‹ค์šด๋กœ๋“œ
  • ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ํ›„ root@master โžก๏ธ [root@30ef4585d468 /]# ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ”๋€œ. ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ์‰˜๋กœ ๋“ค์–ด์˜จ ์ƒํƒœ
  • [root@30ef4585d468 /]# ์—ฌ๊ธฐ์„œ 30ef4585d468 ๋Š” ์ปจํ…Œ์ด๋„ˆ ID์˜ ์•ž์ž๋ฆฌ
  • exit๋กœ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์Œ. ์‹คํ–‰ํ•  ๊ฒฝ์šฐ bash ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด์„œ ์ปจํ…Œ์ด๋„ˆ๋„ ํ•จ๊ป˜ ์ •์ง€๋จ
    (์ปจํ…Œ์ด๋„ˆ๋Š” PID 1 ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ์ž์ฒด๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค)
  • ctrl +pq ๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋ฐฐ์‰ฌ๊ฐ€ ์‹คํ–‰๋œ ์ƒํƒœ๋กœ ๋น ์ ธ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค

 

 

 

ํ•ด๋‹น๋˜๋Š” ์ด๋ฏธ์ง€ ๋ฐ ๋ฒ„์ ผ, ํƒœ๊ทธ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ์•„๋ž˜์ฒ˜๋Ÿผ ์ด๋ฏธ์ง€ ๋‹ค์šด์ด ์•ˆ๋จ

์ •ํ™•ํ•œ ์ด๋ฏธ์ง€ ๋ฐ ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”

root@master:~# docker container run -it --name testos centos
Unable to find image 'centos:latest' locally
docker: Error response from daemon: manifest for centos:latest not found: manifest unknown: manifest unknown

 

 

 

 

 

 

์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ vs ์‹คํ–‰

docker container create -it --name testcentos centos
docker container start -ai testcentos

 

์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰๊ณผ ๋‹ค๋ฅธ ์ ์ด ์žˆ๋‹ค๋ฉด run์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒƒ๊ณผ create๋ฅผ ๋งŒ๋“  ๊ฒƒ์€ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์—ฌ๋ถ€์˜ ์ฐจ์ด

create๋Š” ์ •๋ง ๋งŒ๋“ค๊ธฐ๋งŒ ํ•˜๊ณ  ๋๋‚จ

๊ทธ๋ž˜์„œ ๋ชฉ๋ก์—์„œ๋„ STATUS๊ฐ€ Created๋กœ ํ‘œ๊ธฐ๋˜์–ด ์žˆ๊ณ  ์‹คํ–‰๋˜์ง€๋Š” ์•Š๋Š”๋‹ค

 

  • run์€ create + start
  • ๊ฐœ๋ณ„ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ

 

 

 

์ค‘๋‹จ

# testping์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ์ค‘๋‹จ
docker stop testping

 

# ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก
root@master:~# docker ps
CONTAINER ID   IMAGE      COMMAND                 CREATED          STATUS          PORTS     NAMES
485e8b3d6df3   centos:8   "/bin/ping localhost"   23 minutes ago   Up 23 minutes             testping

root@master:~# docker stop testping
testping

root@master:~# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

 

์‹คํ–‰ ์ค‘์ด๋˜ testping์ด๋ผ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰ ๋ชฉ๋ก์—์„œ ์‚ฌ๋ผ์ง์„ ํ™•์ธ

 

 

์žฌ์‹คํ–‰

docker container start -ai testos

 

  • ์œ„์—์„œ ๋งŒ๋“  testos ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰
  • -a : attach (์ถœ๋ ฅ ์—ฐ๊ฒฐ), -i: interactive
  • run์„ ๋ฐ˜๋ณตํ•˜๋ฉด testos๋ผ๋Š” ์ด๋ฆ„์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•จ

 

 

 

 

 

๐Ÿง  ์š”์•ฝ ์ •๋ฆฌ: run vs start

 

ํ•ญ๋ชฉ docker run docker start
์—ญํ•  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ ์ด๋ฏธ ์ƒ์„ฑ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰
์‹คํ–‰ ๋Œ€์ƒ ์ด๋ฏธ์ง€ ์ค‘์ง€๋œ ์ปจํ…Œ์ด๋„ˆ
์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„ ํ•„์š” ์—ฌ๋ถ€ ์ƒ๋žต ๊ฐ€๋Šฅํ•˜์ง€๋งŒ --name์œผ๋กœ ์ง€์ • ๊ฐ€๋Šฅ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„ ํ•„์ˆ˜
์…ธ ์ ‘์† ์—ฌ๋ถ€ ๊ฐ€๋Šฅ (-it ์‚ฌ์šฉ ์‹œ ์ž๋™ ์ ‘์†) ๊ธฐ๋ณธ์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰, ์ ‘์†ํ•˜๋ ค๋ฉด -ai ํ•„์š”
์‹ค๋ฌด ์‚ฌ์šฉ ์‹œ์  ์ปจํ…Œ์ด๋„ˆ ์ฒ˜์Œ ๋งŒ๋“ค ๋•Œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ๋•Œ
์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ์„ฑ โŒ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ๋จ โœ… ๋™์ผ ์ปจํ…Œ์ด๋„ˆ ์žฌ์‚ฌ์šฉ

 

 

 

 

 

 

 

2๏ธโƒฃ ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก ๋ฐ ์ƒํƒœ ํ™•์ธ

docker container ps -a

 

 

  • STATUS๊ฐ€ Up, Exited๋กœ ๋‚˜๋‰จ
  • ps๋กœ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๊ฒƒ๋งŒ ๋ณด๋ ค๋ฉด -a ์˜ต์…˜ ์ƒ๋žต
  • ๋ช…๋ น์–ด์—์„œ container๋ฅผ ๋นผ๊ณ  ์‹คํ–‰ํ•ด๋„ ๋™์ผํ•œ ๊ฒฐ๊ณผ ๋‚˜์˜ด

 

 

root@master:~# docker ps
CONTAINER ID   IMAGE      COMMAND                 CREATED          STATUS          PORTS     NAMES
485e8b3d6df3   centos:8   "/bin/ping localhost"   11 seconds ago   Up 10 seconds             testping


root@master:~# docker ps -a
CONTAINER ID   IMAGE           COMMAND                  CREATED              STATUS                      PORTS     NAMES
485e8b3d6df3   centos:8        "/bin/ping localhost"    About a minute ago   Up About a minute                     testping
47ba93a0865a   centos:8        "/bin/bash"              13 minutes ago       Exited (0) 2 minutes ago              testos
3b45b7e120ec   web-nginx:2.0   "nginx -g 'daemon of…"   2 days ago           Exited (0) 40 minutes ago             web-nginx
0f62c7865ccc   nginx           "/docker-entrypoint.…"   2 days ago           Exited (0) 39 minutes ago             web00

 

 

 

 

 

 

 

 

 

3๏ธโƒฃ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•˜๊ธฐ

docker container run -d --name testping centos:8 /bin/ping localhost

 

 

์˜ต์…˜ ์„ค๋ช…
run ์ƒˆ๋กœ์šด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑ + ์‹คํ–‰
-d detached ๋ชจ๋“œ — ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰ (ํ„ฐ๋ฏธ๋„์„ ์ฐจ์ง€ํ•˜์ง€ ์•Š์Œ)
--name testping ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์„ testping์œผ๋กœ ์ง€์ •
centos:8 ์‹คํ–‰ํ•  ์ด๋ฏธ์ง€ (CentOS 8)
/bin/ping localhost ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰ํ•  ์ฃผ ํ”„๋กœ์„ธ์Šค (PID 1)

 

 

 

๋กœ๊ทธ ํ™•์ธ: ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์˜ ์ถœ๋ ฅ ํ™•์ธ ๊ฐ€๋Šฅ

 

docker container logs testping
root@master:~# docker logs testping
PING localhost(localhost (::1)) 56 data bytes
64 bytes from localhost (::1): icmp_seq=1 ttl=64 time=0.091 ms
64 bytes from localhost (::1): icmp_seq=2 ttl=64 time=0.068 ms
64 bytes from localhost (::1): icmp_seq=3 ttl=64 time=0.053 ms
64 bytes from localhost (::1): icmp_seq=4 ttl=64 time=0.041 ms
64 bytes from localhost (::1): icmp_seq=5 ttl=64 time=0.053 ms
64 bytes from localhost (::1): icmp_seq=6 ttl=64 time=0.042 ms

 

 

 

 

 

 

4๏ธโƒฃ ์ปจํ…Œ์ด๋„ˆ์™€ ํŒŒ์ผ ๊ตํ™˜

# ํ˜ธ์ŠคํŠธ → ์ปจํ…Œ์ด๋„ˆ
echo "hello docker" > hello.txt
docker container cp hello.txt testping:/root/hello.txt

# ์ปจํ…Œ์ด๋„ˆ → ํ˜ธ์ŠคํŠธ
docker container cp testping:/root/hello.txt ./hello_from_container.txt

 

๋กœ์ปฌ์—์„œ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ œ๋Œ€๋กœ ๋ณต์‚ฌ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์•„๋ž˜์˜ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค

  • ์ง์ ‘ ์ปจํ…Œ์ด๋„ˆ์— ์ ‘์†ํ•ด์„œ ํ™•์ธํ•˜๊ธฐ
  • ์™ธ๋ถ€์—์„œ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ถœ๋ ฅํ•˜๊ธฐ

 

 

root@master:~# cat hello.txt
hello docker

root@master:~# docker ps
CONTAINER ID   IMAGE      COMMAND                 CREATED          STATUS          PORTS     NAMES
343499dcd3a3   centos:8   "/bin/ping localhost"   28 minutes ago   Up 28 minutes             testping

root@master:~# docker cp hello.txt testping:/root/hello.txt
Successfully copied 2.05kB to testping:/root/hello.txt

 

 

๐Ÿ” ๋ณต์‚ฌ ํ™•์ธ ๋ฐฉ๋ฒ• (์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ):

docker exec -it testping /bin/bash
cat /root/hello.txt

 

 

์…ธ์— ๋“ค์–ด๊ฐ€์ง€ ์•Š๊ณ  ํŒŒ์ผ ๋‚ด์šฉ๋งŒ ํ™•์ธ

docker exec testping cat /root/hello.txt

 

 

 

++ ์ปจํ…Œ์ด๋„ˆ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค

docker container diff

 

root@master:~# docker diff testping
C /root
A /root/hello.txt
  • C : Change
  • A : Add
  • ๋กœ์ปฌ์—์„œ ์ปจํ…Œ์ด๋„ˆ๋กœ hello.txt๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ Add๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค

 

 

 

5๏ธโƒฃ ์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ

# ์ค‘์ง€ ํ›„ ์‚ญ์ œ
docker container stop testping
docker container rm testping

# ๊ฐ•์ œ ์‚ญ์ œ
docker container rm -f testping

 

  • ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ญ์ œํ•˜๋ ค๋ฉด ๋จผ์ € ์ค‘์ง€ ํ›„ ์‚ญ์ œํ•ด์•ผํ•œ๋‹ค
  • ๋ฌด์‹œํ•˜๊ณ  ๊ฐ•์ œ๋กœ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅ.. ๊ทธ๋Ÿฌ๋‚˜ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ฆฌ๊ณ  ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ๊น”๋”
root@master:~# docker ps
CONTAINER ID   IMAGE      COMMAND                 CREATED          STATUS          PORTS     NAMES
343499dcd3a3   centos:8   "/bin/ping localhost"   38 minutes ago   Up 38 minutes             testping

root@master:~# docker rm testping
Error response from daemon: cannot remove container "testping": container is running: stop the container before removing or force remove

 

 

 

 

 

 

 

 


 

 

 

 

๋„์ปค ๋„คํŠธ์›Œํฌ

 

 

Docker์˜ ๊ธฐ๋ณธ ๋„คํŠธ์›Œํฌ ๊ตฌ์กฐ

 

๋„์ปค๋ฅผ ์„ค์น˜ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ bridge๋ผ๋Š” ์ด๋ฆ„์˜ ๊ฐ€์ƒ ๋„คํŠธ์›Œํฌ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค

  • ์ด๋ฆ„: bridge
  • ์žฅ์น˜๋ช…: docker0
  • ์—ญํ• : ๊ฐ€์ƒ์˜ ์Šค์œ„์น˜. ์ปจํ…Œ์ด๋„ˆ๋“ค์€ ์—ฌ๊ธฐ์— ์ž๋™ ์—ฐ๊ฒฐ๋จ
  • IP ๋Œ€์—ญ: ๋ณดํ†ต 172.17.0.0/16

 

 

# ๋„์ปค์˜ ๊ธฐ๋ณธ ๋„คํŠธ์›Œํฌ ํ™•์ธ
docker network ls
docker network inspect bridge
root@master:~# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
60d2ca38db82   bridge    bridge    local
d43edfb4c844   host      host      local
cad2e5d0b284   none      null      local
---

root@master:~# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "60d2ca38db8291bdc68f6f5f8a9709246d2041e6dfdb5740d9d7623073022b8d",
        "Created": "2025-06-17T00:03:53.711452532Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv4": true,
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "343499dcd3a33037d67e23983b78fdf0a068d07656ab347f47ad76cf8db96417": {
                "Name": "testping",
                "EndpointID": "610003609a9ec7c8af34ec1fe39c26cafc3d4f8b36001fcc14a675952c60422f",
                "MacAddress": "4a:93:89:5f:9f:9d",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

 

 

 

 

๐Ÿงช ์‹ค์Šต 1. ์ปจํ…Œ์ด๋„ˆ IP ๊ตฌ์กฐ ์ดํ•ดํ•˜๊ธฐ

docker run -itd --name test01 centos:8

 

# ์ปจํ…Œ์ด๋„ˆ์™€ ํ˜ธ์ŠคํŠธ ๊ฐ๊ฐ์˜ IP ํ™•์ธ
ip a                             # ํ˜ธ์ŠคํŠธ์˜ docker0 ํ™•์ธ
docker exec test01 ip a         # ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ IP ํ™•์ธ

 

 

ip a                             
=> 4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 1a:58:0f:2f:2a:b0 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::1858:fff:fe2f:2ab0/64 scope link
       valid_lft forever preferred_lft forever
       
docker exec test07 ip a    
=> 2: eth0@if62: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 1e:d6:38:bc:ce:97 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.5/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

 

  • docker0 ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ 172.17.0.1์ด๋ผ๋Š” IP๋ฅผ ๊ฐ–๊ณ  ์žˆ์Œ
  • ์ปจํ…Œ์ด๋„ˆ test01์€ 172.17.0.x ํ˜•์‹์˜ IP๋ฅผ ํ• ๋‹น๋ฐ›์Œ
  • ์ด IP๋Š” ํ˜ธ์ŠคํŠธ ์•ˆ์—์„œ๋งŒ ํ†ต์‹  ๊ฐ€๋Šฅ, ์™ธ๋ถ€์—์„œ๋Š” ์ง์ ‘ ์ ‘๊ทผ ๋ถˆ๊ฐ€
  • ์„œ๋น„์Šค๋กœ ์ œ๊ณต์‹œ ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ์™€ ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•จ

 

์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์˜ฌ๋ฆฌ๋ฉด?

=> 172.17.0.2/16,   172.17.0.3/16,  172.17.0.4/16 ์ด๋ ‡๊ฒŒ ๋น„์–ด์žˆ๋Š” ip๋ฅผ ํ• ๋‹น๋ฐ›๋Š”๋‹ค

๋„์ปค๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ IP๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ํ• ๋‹นํ•˜๋ฉฐ, ํ• ๋‹น๋œ IP๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•  ๋•Œ๋งˆ๋‹ค ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•จ

 

 

 

 

๐Ÿงช ์‹ค์Šต 2. ํฌํŠธ ํฌ์›Œ๋”ฉ๊ณผ NAT ํ™•์ธ

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ํ˜ธ์ŠคํŠธ์˜ ํฌํŠธ๋ฅผ ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ๋กœ ํฌ์›Œ๋”ฉํ•ด์•ผ ํ•œ๋‹ค

# ๊ธฐ์กด ์ปจํ…Œ์ด๋„ˆ ์ •๋ฆฌ
docker rm -f $(docker ps -aq)

# nginx ์›น ์„œ๋ฒ„ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ (8080 → 80 ํฌํŠธ ํฌ์›Œ๋”ฉ)
docker run -d --name netbr00 -p 8080:80 nginx

 

์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ํ™•์ธ

docker ps
docker inspect netbr00 | grep -i ipa
root@master:~# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                     NAMES
5e222e832af1   nginx     "/docker-entrypoint.…"   3 seconds ago   Up 2 seconds   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   netbr00

root@master:~# docker inspect netbr00 | grep -i ipa
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAMConfig": null,
                    "IPAddress": "172.17.0.2",

 

IPAddress ํ•ญ๋ชฉ ํ™•์ธ → 172.17.0.2๋กœ ํ• ๋‹น๋˜์—ˆ์„ ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ

 

 

๐Ÿ” ์‹ค์Šต 3. ์ ‘์† ํ…Œ์ŠคํŠธ

# ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ IP๋กœ ์ ‘๊ทผ
curl 172.17.0.2       # ํ˜ธ์ŠคํŠธ์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

# ํ˜ธ์ŠคํŠธ์˜ 8080 ํฌํŠธ๋กœ ์ ‘๊ทผ (ํฌํŠธ ํฌ์›Œ๋”ฉ ํ™•์ธ)
curl localhost:8080   # ํฌ์›Œ๋”ฉ๋œ ์š”์ฒญ → ์ปจํ…Œ์ด๋„ˆ๋กœ ์ „๋‹ฌ๋จ

 

 

root@master:~# curl 172.17.0.2 (curl localhost:8080)

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

 

 

 

๐Ÿ” ์‹ค์Šต 4. iptables ํ™•์ธ

๐Ÿ” Docker์™€ iptables: ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ๊ฐ€ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š”๊ฐ€?

๋„์ปค๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์™ธ๋ถ€์™€ ํ†ต์‹ ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ iptables๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค
ํŠนํžˆ nat ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ํฌํŠธ ํฌ์›Œ๋”ฉ๊ณผ IP ๋ณ€ํ™˜(NAT) ๊ทœ์น™์„ ์ž๋™์œผ๋กœ ์„ค์ • ํ›„ ์ฒ˜๋ฆฌํ•œ๋‹ค

 

iptables -t nat -vnL

 

๊ด€์ฐฐ ํฌ์ธํŠธ

  • DNAT ๊ทœ์น™์ด ์ƒ๊ฒผ๋Š”์ง€ ํ™•์ธ
    ์˜ˆ: tcp dpt:8080 to:172.17.0.2:80
  • MASQUERADE ๊ทœ์น™์ด ์žˆ๋Š”์ง€ ํ™•์ธ (NAT ํ›„ IP ๋ณ€ํ™˜ ์ฒ˜๋ฆฌ)

 

 

์•„๋ž˜๋Š” iptables -t nat -vnL ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ์˜ ๊ฒฐ๊ณผ์ด๋‹ค

root@master:~# iptables -t nat -vnL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
 4014  236K DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DOCKER     all  --  *      *       0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    6   373 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0
    0     0 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:172.17.0.2:80

 

 

1. DOCKER ์ฒด์ธ

  • DNAT (Destination NAT) ๊ทœ์น™:
    ์™ธ๋ถ€์—์„œ ํ˜ธ์ŠคํŠธ์˜ 8080 ํฌํŠธ๋กœ ์˜ค๋Š” ์š”์ฒญ์„ 172.17.0.2:80์œผ๋กœ ์ „๋‹ฌ
  • !docker0: docker0 ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•˜์ง€ ์•Š๋Š” ์™ธ๋ถ€ ์š”์ฒญ๋งŒ ๋Œ€์ƒ์œผ๋กœ ํ•จ
  • 172.17.0.2๋Š” ์ปจํ…Œ์ด๋„ˆ netbr00์˜ ๋‚ด๋ถ€ IP (์•ž์„œ ์‹ค์Šตํ–ˆ๋˜ nginx ์ปจํ…Œ์ด๋„ˆ)

๐Ÿ“Œ ์š”์•ฝ: "localhost:8080 → ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ 80๋ฒˆ ํฌํŠธ"๋กœ ์—ฐ๊ฒฐ๋จ

 

 

2. POSTROUTING ์ฒด์ธ

  • MASQUERADE๋Š” ์ถœ๋ฐœ์ง€ IP๋ฅผ ํ˜ธ์ŠคํŠธ์˜ IP๋กœ ๋ณ€ํ™˜
  • ์ฆ‰, ์ปจํ…Œ์ด๋„ˆ์—์„œ ์™ธ๋ถ€๋กœ ๋‚˜๊ฐ€๋Š” ํŒจํ‚ท์— ๋Œ€ํ•ด ์ถœ๋ฐœ์ง€ IP๋ฅผ ๊ฐ€๋ฆผ
  • ์ผ๋ฐ˜์ ์ธ NAT ๊ธฐ๋Šฅ

๐Ÿ“Œ ์š”์•ฝ: ์ปจํ…Œ์ด๋„ˆ → ์™ธ๋ถ€ ์š”์ฒญ ์‹œ IP๊ฐ€ ํ˜ธ์ŠคํŠธ IP๋กœ ๋ณ€์กฐ๋จ

 

 

3. PREROUTING ์ฒด์ธ

  • ๋ชจ๋“  ํŒจํ‚ท ์ค‘ ๋ชฉ์ ์ง€๊ฐ€ ๋กœ์ปฌ์ธ ๊ฒฝ์šฐ, DOCKER ์ฒด์ธ์œผ๋กœ ์ „๋‹ฌ
  • ๋„์ปค์—์„œ ์„ค์ •ํ•œ ํฌํŠธ ํฌ์›Œ๋”ฉ ๊ทœ์น™๋“ค์ด ์ ์šฉ๋จ

 

 

 

[ ์™ธ๋ถ€ ์š”์ฒญ: localhost:8080 ]
        ↓
→ iptables PREROUTING
        ↓
→ DOCKER ์ฒด์ธ (DNAT: 8080 → 172.17.0.2:80)
        ↓
→ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ nginx ์„œ๋น„์Šค ์‘๋‹ต
        ↓
→ iptables POSTROUTING (MASQUERADE๋กœ IP ๋ณ€์กฐ)
        ↓
→ ์‘๋‹ต ๋ฐ˜ํ™˜

 

 

 

๊ฐœ๋… ์—ญํ• 
DNAT ์™ธ๋ถ€ ํฌํŠธ๋ฅผ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ํฌํŠธ๋กœ ํฌ์›Œ๋”ฉ
MASQUERADE ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋‚˜๊ฐ€๋Š” IP๋ฅผ ํ˜ธ์ŠคํŠธ IP๋กœ ๋ฐ”๊ฟˆ
docker0 ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ€์ƒ ๋ธŒ๋ฆฌ์ง€
iptables ๋„์ปค ๋„คํŠธ์›Œํฌ์˜ ํ•ต์‹ฌ ๊ธฐ๋ฐ˜ (์ž๋™ ์„ค์ •๋จ)

 

 

 

 

 

 

 


 

 

 

 

 

 

์ด๋ฏธ์ง€

 

๐Ÿ“ฆ ๋„์ปค ์ด๋ฏธ์ง€๋ž€?

๋„์ปค ์ด๋ฏธ์ง€(Docker Image)๋Š” ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰์„ ์œ„ํ•œ ์ฝ๊ธฐ ์ „์šฉ(READ-ONLY) ํŒŒ์ผ ์‹œ์Šคํ…œ
์ด๋ฏธ์ง€๋Š” OS, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์„ค์ • ๋“ฑ ์‹คํ–‰ ํ™˜๊ฒฝ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ํฌํ•จํ•œ๋‹ค

์ปจํ…Œ์ด๋„ˆ๋Š” ์ด ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ, ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์—ฌ๊ธฐ์— ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ๋ ˆ์ด์–ด๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค

 

 

๐Ÿ“ฆ ์ด๋ฏธ์ง€์˜ ๊ณ„์ธต ๊ตฌ์กฐ(Layer)

 

๋„์ปค ์ด๋ฏธ์ง€๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ ˆ์ด์–ด(layer) ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค

  • ๊ฐ ๋ ˆ์ด์–ด๋Š” ์ด์ „ ๋ ˆ์ด์–ด์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์Œ“์•„์˜ฌ๋ฆฐ ๊ฒƒ
  • Dockerfile์˜ ๊ฐ ๋ช…๋ น์–ด(FROM, RUN, COPY ๋“ฑ)๋Š” ์ƒˆ๋กœ์šด ๋ ˆ์ด์–ด๋ฅผ ์ƒ์„ฑ
  • ๊ฐ™์€ ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€๋ฅผ ๊ณต์œ ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋“ค์€ ์ค‘๋ณต ์—†์ด ๋ ˆ์ด์–ด๋ฅผ ๊ณต์œ ํ•จ์œผ๋กœ์จ ์ €์žฅ ๊ณต๊ฐ„์„ ์ ˆ์•ฝ

 

 

๐Ÿ” ๋„์ปค ์ด๋ฏธ์ง€ ์ด๋ฆ„ ๊ตฌ์กฐ

docker.io/lbh1224/web:1.0
๊ตฌ์„ฑ ์š”์†Œ ์„ค๋ช…
โ‘  ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ (docker.io) ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•˜๊ณ  ๋‹ค์šด๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„. ๊ธฐ๋ณธ๊ฐ’์€ ๋„์ปค ํ—ˆ๋ธŒ(Docker Hub)
โ‘ก ์ €์žฅ์†Œ (lbh1224) ์ด๋ฏธ์ง€๊ฐ€ ์ €์žฅ๋œ 'ํด๋”' ๊ฐœ๋…. ๊นƒํ—™์˜ ์ €์žฅ์†Œ(Repo)์™€ ๋น„์Šทํ•œ ๊ฐœ๋…. ์‚ฌ์šฉ์ž ๋˜๋Š” ์กฐ์ง ์ด๋ฆ„์ด ๋“ค์–ด๊ฐ
โ‘ข ์ด๋ฏธ์ง€ (web) ์ปจํ…Œ์ด๋„ˆ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ด๋ฏธ์ง€์˜ ์ด๋ฆ„. ์ฃผ๋กœ ์ด๋ฏธ์ง€์˜ ์—ญํ• ๊ณผ ๊ด€๋ จ๋œ ์ด๋ฆ„์œผ๋กœ ๋ถ™์ž„
โ‘ฃ ํƒœ๊ทธ (1.0) ์ด๋ฏธ์ง€ ๋ฒ„์ „. ์ƒ๋žตํ•˜๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ latest

 

 

 

 

๐Ÿ” ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ์™€ ํ™•์ธ, ์‚ญ์ œ

 

# ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ
docker pull centos:8

# ์ด๋ฏธ์ง€ ๋ชฉ๋ก ํ™•์ธ
docker images

# ์ด๋ฏธ์ง€ ์ƒ์„ธ ์ •๋ณด ํ™•์ธ
docker inspect centos:8

 

 

์ด๋ฏธ์ง€๋ฅผ pull ํ•˜๊ธฐ ์ „, ๋„์ปค ํ—ˆ๋ธŒ์— ๊ณต๊ฐœ๋œ ๊ณต์‹ ์ด๋ฏธ์ง€๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ search๋ฅผ ํ†ตํ•ด ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค

docker search ubuntu

 

 

 

 

# ์ด๋ฏธ์ง€ ์‚ญ์ œ
docker image rm centos:7
docker rmi centos:7

# ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—†๋Š” ๋ชจ๋“  ์ด๋ฏธ์ง€๋“ค ์‚ญ์ œ
docker image prune -a

 

  • ์ด๋ฏธ์ง€๋ฅผ ์‚ญ์ œํ•˜๋ ค๋ฉด ๋จผ์ € ํ•ด๋‹น ์ด๋ฏธ์ง€๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋“ค์ด ์‚ญ์ œ๋˜์–ด์•ผ ํ•œ๋‹ค
  • ๋ฌผ๋ก  ๊ฐ•์ œ๋กœ ์‚ญ์ œ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜๋Š” ์žˆ์œผ๋‚˜.. ์‹ค์ œ๋กœ ์ด๋ฏธ์ง€๊ฐ€ ์‚ญ์ œ๋˜์ง„ ์•Š๋Š”๋‹ค

 

root@master:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    1e5f3c5b981a   2 months ago   192MB
centos       8         5d0da3dc9764   3 years ago    231MB

root@master:~# docker rmi -f centos:8
Untagged: centos:8
Untagged: centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177

root@master:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    1e5f3c5b981a   2 months ago   192MB
<none>       <none>    5d0da3dc9764   3 years ago    231MB
  • ์œ„์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ, ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์กด์žฌํ•˜๋Š” ์ด๋ฏธ์ง€๋ฅผ ๊ฐ•์ œ๋กœ ์‚ญ์ œํ•˜๋ ค๋ฉด ์‹ค์ œ ์ด๋ฏธ์ง€ ์‚ญ์ œ๊ฐ€ ์•„๋‹Œ ์–ธํƒœ๊ทธ๋งŒ ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค
    ์ด๋ฏธ์ง€์˜ ID๋„ ๊ทธ๋Œ€๋กœ ๋™์ผํ•˜๋‹ค

 

 

 

 

๐Ÿ” ์ด๋ฏธ์ง€์™€ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ด€๊ณ„

  • ์ด๋ฏธ์ง€๋Š” ์ฝ๊ธฐ ์ „์šฉ
  • ์ปจํ…Œ์ด๋„ˆ๋Š” ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ, ์œ„์— ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ๋ ˆ์ด์–ด๊ฐ€ ์ถ”๊ฐ€๋จ
  • ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋™์ผ ์ด๋ฏธ์ง€๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Œ
docker run -it --name test1 centos:8
docker run -it --name test2 centos:8
 

→ ๋‘ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋™์ผํ•œ centos:8 ์ด๋ฏธ์ง€ ๋ ˆ์ด์–ด๋ฅผ ๊ณต์œ ํ•˜์ง€๋งŒ,
→ ๊ฐ๊ฐ์˜ ๊ฐœ๋ณ„์ ์ธ ์“ฐ๊ธฐ ๋ ˆ์ด์–ด(๋ณ€๊ฒฝ ์‚ฌํ•ญ) ๋ฅผ ๊ฐ–๋Š”๋‹ค

 

 

 

 

 

 

 

 

๐Ÿ‹ ๋„์ปค ํ—ˆ๋ธŒ์— ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ

 

๋„์ปค ํ—ˆ๋ธŒ ๋กœ๊ทธ์ธ

# ๋„์ปค ํ—ˆ๋ธŒ ๋กœ๊ทธ์ธ
docker login

 

  • ๋จผ์ € ๋„์ปค ํ—ˆ๋ธŒ ๊ณ„์ • ๋งŒ๋“ค๊ธฐ
  • ํ•ด๋‹น ๋ช…๋ น์–ด ์‹คํ–‰ ํ›„ ์•„์ด๋”” ์ž…๋ ฅ, ์‚ฌ์ดํŠธ์— ๋“ค์–ด๊ฐ€์„œ ์ฝ”๋“œ ์ž…๋ ฅํ•˜๋ฉด ๋กœ๊ทธ์ธ ์™„๋ฃŒ

 

 

 

 

์ด๋ฏธ์ง€ ํƒœ๊ทธ ๋ณ€๊ฒฝ

 

# ์ด๋ฏธ์ง€ ํƒœ๊ทธ ๋ณ€๊ฒฝ
docker image tag nginx lbh1224/web

 

root@master:~# docker image tag nginx lbh1224/web
root@master:~# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
lbh1224/web   latest    1e5f3c5b981a   2 months ago   192MB
nginx         latest    1e5f3c5b981a   2 months ago   192MB
centos        8         5d0da3dc9764   3 years ago    231MB

 

  • ๊ธฐ์กด ์ด๋ฏธ์ง€์˜ ํƒœ๊ทธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๋™์ผํ•œ ์ด๋ฏธ์ง€ ID์˜ ์ƒˆ๋กœ์šด ํƒœ๊ทธ์˜ ์ด๋ฏธ์ง€๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค
  • ํƒœ๊ทธ๋งŒ ๋ฐ”๋€Œ์—ˆ์„ ๋ฟ, ๊ธฐ์กด์˜ ์ด๋ฏธ์ง€์™€ ๋ชจ๋“  ๊ฒƒ์ด ๋™์ผํ•˜๋‹ค

 

 

 

์ด๋ฏธ์ง€ ๋„์ปค ํ—ˆ๋ธŒ์— ์—…๋กœ๋“œ

# ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ
docker image push

 

root@master:~# docker image push lbh1224/web:latest
The push refers to repository [docker.io/lbh1224/web]
7e893c1b6ee8: Layer already exists
463308bed0c9: Layer already exists
4197a611afec: Layer already exists
3e96162769d5: Layer already exists
892e805f6f4f: Layer already exists
626ab8a5d57b: Layer already exists
7fb72a7d1a8e: Layer already exists
latest: digest: sha256:784f317e7068b3b5af6a44851c39cb9e927b6425d5c634197b2899fc8551293d size: 1778

 

 

 

์š”๋ ‡๊ฒŒ ๋„์ปค ํ—ˆ๋ธŒ์˜ ๊ฐœ์ธ ๋ ˆํฌ์— ์—…๋กœ๋“œ ๋œ๋‹ค

 

 

 

 

 

๐Ÿ‹ ์ด๋ฏธ์ง€ ๋งŒ๋“ค๊ธฐ

 

๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์—๋Š” 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค

1. commit์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ๊ทธ๋Œ€๋กœ ์ด๋ฏธ์ง€ ์ €์žฅ

2. Dockerfile๋กœ ์ด๋ฏธ์ง€ ๋นŒ๋“œ

์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ํ•˜๋ฉด ์ฃผ๋กœ Dockerfile๋กœ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•˜๋ฉด๋จ

 

 

 

์ปจํ…Œ์ด๋„ˆ๋กœ ์ด๋ฏธ์ง€ ๋งŒ๋“ค๊ธฐ (commit)

 

์ปจํ…Œ์ด๋„ˆ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ด๋ฏธ์ง€๋กœ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒํƒœ ๊ทธ๋Œ€๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค

ํฌ๊ธฐ๊ฐ€ ์ž‘๊ฑฐ๋‚˜ ๊ฐ„๋‹จํ•œ ์„œ๋น„์Šค, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์˜ฌ๋ฆฐ ์ปจํ…Œ์ด๋„ˆ๋ผ๋ฉด ๊ทธ๋Œ€๋กœ ๋ถˆ์•ˆ์ •์„ฑ์„ ์ตœ์†Œํ™”ํ•˜๊ณ ์ž ๊ทธ๋Œ€๋กœ ์ด๋ฏธ์ง€๋กœ ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ... nginx ๊ณต์‹ ์ด๋ฏธ์ง€๋งŒ ํ•ด๋„ ์šฉ๋Ÿ‰์ด 192MB์ด๊ณ  centos:8 ์ด 231MB์ธ ๊ฒƒ์„ ์ƒ๊ฐํ•˜๋ฉด ์—ฌ๋Ÿฌ๋ชจ๋กœ ๋น„ํšจ์œจ์ ์ด๋‹ค

์•„๋ž˜์„œ ์‚ฌ์šฉํ•ด๋ณผ Dockerfile์„ ๋ฟŒ๋ ค์„œ ์ด๋ฏธ์ง€ ๋นŒ๋“œํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ๋“ค์„ ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ด๊ณ  ์ข‹๋‹ค

docker run -it --name base centos:8
# (์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์ž‘์—…)
exit

docker commit base mycentos:v1

 

  • base ์ปจํ…Œ์ด๋„ˆ์—์„œ ํ•œ ์ž‘์—…์„ mycentos:v1 ์ด๋ฏธ์ง€๋กœ ์ €์žฅ
  • ๋น„์ถ”์ฒœ ์ด์œ : ๋ณ€๊ฒฝ ๋‚ด์—ญ์ด ๋ถˆํˆฌ๋ช…, ์žฌํ˜„ ๋ถˆ๊ฐ€ → Dockerfile์„ ์‚ฌ์šฉํ•˜์ž

 

 

 

 

Dockerfile๋กœ ์ด๋ฏธ์ง€ ๋งŒ๋“ค๊ธฐ

 

Dockerfile์ด๋ž€?

Dockerfile์€ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ช…๋ น์–ด ์ง‘ํ•ฉ์ด์ž ์ •์˜์„œ
์ฆ‰, ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ํ™˜๊ฒฝ์„ ์ฝ”๋“œ๋กœ ์ •์˜ํ•ด์„œ ๋ฐ˜๋ณต ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์„ค๊ณ„๋„

  • Dockerfile์„ ์ž‘์„ฑํ•˜๊ณ  → docker build ๋ช…๋ น์–ด๋กœ ์ด๋ฏธ์ง€ ์ƒ์„ฑ
  • ์‹ค๋ฌด์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์ˆ˜์ž‘์—…์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ  Dockerfile๋กœ ์ž๋™ํ™”ํ•˜๋Š” ์ด์œ 

 

๐Ÿ“ฆ ๊ธฐ๋ณธ ๊ตฌ์กฐ

# 1. ์–ด๋–ค ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•  ๊ฒƒ์ธ๊ฐ€?
FROM ubuntu:20.04

# 2. ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— ์–ด๋–ค ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ๊ฒƒ์ธ๊ฐ€?
RUN apt-get update && apt-get install -y nginx

# 3. ํ˜ธ์ŠคํŠธ์˜ ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ์— ๋ณต์‚ฌํ•  ๊ฒƒ์ธ๊ฐ€?
COPY index.html /var/www/html/index.html

# 4. ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์‹œ ์–ด๋–ค ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ๊ฒƒ์ธ๊ฐ€?
CMD ["nginx", "-g", "daemon off;"]

 

 

๐Ÿ”จ ์ฃผ์š” ๋ช…๋ น์–ด ์ •๋ฆฌ

๋ช…๋ น์–ด ์„ค๋ช…
FROM ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ์„ค์ • (ํ•„์ˆ˜)
RUN ์…ธ ๋ช…๋ น์–ด ์‹คํ–‰ (์ด๋ฏธ์ง€ ๋นŒ๋“œ ์ค‘์— ์‹คํ–‰)
COPY ํ˜ธ์ŠคํŠธ ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ณต์‚ฌ
CMD ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์‹œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด (1๊ฐœ๋งŒ ๊ฐ€๋Šฅ)
EXPOSE ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—ด ํฌํŠธ ์ง€์ • (๊ธฐ๋Šฅ์  ์˜๋ฏธ๋งŒ ์žˆ์Œ)
WORKDIR ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ •
ENV ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

 

์ด ์™ธ์—๋„ ADD, VOLUME, USER ๋“ฑ๋“ฑ ์—ฌ๋Ÿฌ ๋ช…๋ น์–ด๋“ค์ด ์กด์žฌ

 

 

 

 

์‹ค์Šต: ๊ฐ„๋‹จํ•œ ์›น ์„œ๋ฒ„ ์ด๋ฏธ์ง€ ๋งŒ๋“ค๊ธฐ

 

๐Ÿ“ ๋””๋ ‰ํ† ๋ฆฌ ๋ฐ ์ƒ˜ํ”Œ ์…‹ํŒ…

 

๊ฐ„๋‹จํ•˜๊ฒŒ ์›น์—์„œ ๋„์šธ html ํŒŒ์ผ ์ƒ์„ฑ

mkdir dockerfile-web && cd dockerfile-web
echo "<h1>Hello Dockerfile</h1>" > index.html
dockerfile-web/
โ”œโ”€โ”€ Dockerfile
โ””โ”€โ”€ index.html

 

 

โœ๏ธ Dockerfile ์ž‘์„ฑ

FROM ubuntu:20.04

RUN apt-get update && apt-get install -y nginx

COPY index.html /var/www/html/index.html

CMD ["nginx", "-g", "daemon off;"]

 

 

๐Ÿ— ์ด๋ฏธ์ง€ ๋นŒ๋“œ

 

docker build -t myweb:v1 .

 

  • -t : ์ด๋ฏธ์ง€ ์ด๋ฆ„๊ณผ ํƒœ๊ทธ
  • .  : ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” Dockerfile ์‚ฌ์šฉ. ์  ๋นผ๋จน์œผ๋ฉด ์—๋Ÿฌ๋‚จ. ์ž˜ ์•ˆ๋ณด๊ณ  ๋„˜์–ด๊ฐ€๊ธฐ ์‰ฌ์šฐ๋‹ˆ ์ฃผ์˜ํ•˜๊ธฐ

 

ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— ๋„์ปค ํŒŒ์ผ์ด ์—ฌ๋Ÿฌ๊ฐœ ์žˆ๋‹ค๋ฉด? โžก๏ธ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๋„์ปค ํŒŒ์ผ ์ง€์ •ํ•˜๊ธฐ

docker build -t myweb:v1 -f MyDockerfile .

 

 

  • -f : ์‚ฌ์šฉํ•  Dockerfile์˜ ํŒŒ์ผ๋ช… ์ง€์ • 
  • .  :  ํ•ด๋‹น ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ (context) ์ง€์ •

 

 

 

root@master:~# docker build -t myweb:v1 -f Dockerfile .
[+] Building 38.0s (9/9) FINISHED                                                      docker:default
 => [internal] load build definition from Dockerfile                                             0.0s
 => => transferring dockerfile: 184B                                                             0.0s
 => [internal] load metadata for docker.io/library/ubuntu:20.04                                  2.3s
 => [auth] library/ubuntu:pull token for registry-1.docker.io                                    0.0s
 => [internal] load .dockerignore                                                                0.0s
 => => transferring context: 2B                                                                  0.0s
 => [1/3] FROM docker.io/library/ubuntu:20.04@sha256:8feb4d8ca5354def3d8fce243717141ce31e2c4287  3.7s
 => => resolve docker.io/library/ubuntu:20.04@sha256:8feb4d8ca5354def3d8fce243717141ce31e2c4287  0.1s
 => => sha256:8feb4d8ca5354def3d8fce243717141ce31e2c428701f6682bd2fafe15388214 6.69kB / 6.69kB   0.0s
 => => sha256:c664f8f86ed5a386b0a340d981b8f81714e21a8b9c73f658c4bea56aa179d54a 424B / 424B       0.0s
 => => sha256:b7bab04fd9aa0c771e5720bf0cc7cbf993fd6946645983d9096126e5af45d713 2.30kB / 2.30kB   0.0s
 => => sha256:13b7e930469f6d3575a320709035c6acf6f5485a76abcf03d1b92a64c09c247 27.51MB / 27.51MB  0.8s
 => => extracting sha256:13b7e930469f6d3575a320709035c6acf6f5485a76abcf03d1b92a64c09c2476        2.6s
 => [internal] load build context                                                                0.1s
 => => transferring context: 31B                                                                 0.0s
 => [2/3] RUN apt-get update && apt-get install -y nginx                                        28.9s
 => [3/3] COPY index.html /var/www/html/index.html                                               0.3s
 => exporting to image                                                                           2.5s
 => => exporting layers                                                                          2.5s
 => => writing image sha256:b3eb28b80a3c113d2c460cdef15af46e8640b214e297e3884678f9bbf2232bc0     0.0s
 => => naming to docker.io/library/myweb:v1                                                      0.0s

root@master:~# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
myweb         v1        b3eb28b80a3c   7 seconds ago   190MB
nginx         latest    1e5f3c5b981a   2 months ago    192MB
centos        8         5d0da3dc9764   3 years ago     231MB

 

์ด๋ฏธ์ง€ ๋ชฉ๋ก์„ ํ™•์ธํ•ด๋ณด๋ฉด myweb:v1 ์ด ์ •์ƒ์ ์œผ๋กœ ๋นŒ๋“œ๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค

 

๐Ÿš€ ์ด๋ฏธ์ง€ ์‹คํ–‰ ๋ฐ ์ ‘์† ํ…Œ์ŠคํŠธ

docker run -d -p 8080:80 --name webtest myweb:v1
curl localhost:8080

 

 

root@master:~# docker run -d -p 8080:80 --name webtest myweb:v1
d3168f15e0ea59c57f0e38dd2626c81c1cc28357054fc6ce52cdae657503f728

root@master:~# curl localhost:8080
hello world

 

Dockerfile๋กœ ์ง์ ‘ ๋นŒ๋“œํ•œ ์ด๋ฏธ์ง€๋กœ ์›น์ด ์ •์ƒ ์ž‘๋™ํ•จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค