주희아빠의 헝그리 라이딩

Docker vs VM 개념 새롭게 정리해 드립니다. 본문

나름 IT 이야기

Docker vs VM 개념 새롭게 정리해 드립니다.

도림천 버섯돌이 2024. 1. 19. 17:46

2024.1.19

docker 를 아시는 분들은 이 이미지가 익숙하시지요.

네모 반듯한 컨테이너가 차곡차곡 쌓여 있습니다. 그래서 보통은 docker 를 이용해 패키징하면 컨테이너처럼 네모 반듯한 모양으로 구성될 거라는 생각이 들게됩니다.

하지만 사실 docker 의 개념은 고래위에 쌓인 컨테이너가 아닙니다. 그 컨테이너 안이 어떻게 생겼냐가 뽀인트입니다.

실제로 보면 docker 의 개념은 다음이 더 정확하지 않나 싶습니다.

방은 하나 뿐인데 그 방에 철망이나 천조각을 막아서 칸을 잘게 나눈 것이지요.

그래서 화장실이나 부엌은 하나 뿐인데 나눠써야 하고 그나마 잠자리만 겨우 독립을 시켜 놓은 모습이라고 생각합니다. 

저 작은 칸 중 하나에 apache 가 돌고 있는 프로세스가 자리잡고 또 다른 한 곳에는 tomcat 이 도는 프로세스가 자리 잡습니다. 하지만 서로의 존재를 모르고 열심히 일하고 있습니다.

'화장실이나 부엌'은 '네트웍이나 IO' 처럼 외부와 연결되는 커널 영역이라고 비유할 수 있습니다.

 

사실 리눅스에서 컨테이너라고 불리우는 docker 가 등장하기 한참 전인 2010년 정도에 Yahoo 에서 사용하는 FreeBSD 에는 Jail 이라는 환경 격리툴이 있었습니다.

namespace, cgroup, chroot 같은 기술을 통해 프로세스와 디스크에 대해 격리시켜서 마치 혼자만 실행되고 있는 것처럼 구성이 가능했습니다. 사실 이때도 사용하면서 이건 vm 의 일종인가 하고 헛갈려 했습니다.

그러다 몇년뒤 리눅스 진영에서 컨테이너라는 이름과 함께 docker 가 등장을 하였는데 이때는 왠지 환경 격리의 의미보다는 배포툴의 한 형태로 소개가 되고 있었습니다. 

아무래도 CI/ CD 가 유행하며 docker 를 사용하면 깔끔하게 패키징과 배포, 운영이 가능하다는 점이 어필을 한 모양입니다.

어쨌든 vm 같은 완전한 머신이 아니라 평범하던 프로세스에게 칸막이 하나 쳐주고 '이제부터 너는 독립된 머신이야' 라고 구분을 해준 것입니다. 

 

다음은 ps -ef 명령으로 보는 전체 프로세스 현황입니다. 이렇게 보면 docker 내부의 프로세스들도 포함되어 있습니다. 밖에서 보면 그냥 일반적인 프로세스와 같을 뿐입니다. (ubuntu 22.04 LTS. 리스트 뒷쪽에서 vim 과 top 을 찾아보십시오.)

multitab@multitab-Aspire:~/tmp$ ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 19:36 ?        00:00:13 /sbin/init splash
root           2       0  0 19:36 ?        00:00:00 [kthreadd]
root           3       2  0 19:36 ?        00:00:00 [rcu_gp]
root           4       2  0 19:36 ?        00:00:00 [rcu_par_gp]
root           5       2  0 19:36 ?        00:00:00 [slub_flushwq]
root           6       2  0 19:36 ?        00:00:00 [netns]
root           8       2  0 19:36 ?        00:00:00 [kworker/0:0H-events_highpri]
root          11       2  0 19:36 ?        00:00:00 [mm_percpu_wq]
root          12       2  0 19:36 ?        00:00:00 [rcu_tasks_kthread]
root          13       2  0 19:36 ?        00:00:00 [rcu_tasks_rude_kthread]
root          14       2  0 19:36 ?        00:00:00 [rcu_tasks_trace_kthread]
root          15       2  0 19:36 ?        00:00:04 [ksoftirqd/0]
root          16       2  0 19:36 ?        00:00:01 [rcu_preempt]
root          17       2  0 19:36 ?        00:00:00 [migration/0]
root          18       2  0 19:36 ?        00:00:00 [idle_inject/0]
root          19       2  0 19:36 ?        00:00:00 [cpuhp/0]
root          20       2  0 19:36 ?        00:00:00 [cpuhp/1]
root          21       2  0 19:36 ?        00:00:00 [idle_inject/1]
root          22       2  0 19:36 ?        00:00:00 [migration/1]
root          23       2  0 19:36 ?        00:00:03 [ksoftirqd/1]
root          25       2  0 19:36 ?        00:00:00 [kworker/1:0H-events_highpri]
root          26       2  0 19:36 ?        00:00:00 [kdevtmpfs]
root          27       2  0 19:36 ?        00:00:00 [inet_frag_wq]
root          28       2  0 19:36 ?        00:00:03 [kworker/u8:1-events_unbound]
root          29       2  0 19:36 ?        00:00:00 [kauditd]
root          30       2  0 19:36 ?        00:00:00 [khungtaskd]
root          32       2  0 19:36 ?        00:00:00 [oom_reaper]
root          33       2  0 19:36 ?        00:00:00 [writeback]
root          34       2  0 19:36 ?        00:00:00 [kcompactd0]
root          35       2  0 19:36 ?        00:00:00 [ksmd]
root          37       2  0 19:36 ?        00:00:00 [khugepaged]
root          38       2  0 19:36 ?        00:00:00 [kintegrityd]
root          39       2  0 19:36 ?        00:00:00 [kblockd]
root          40       2  0 19:36 ?        00:00:00 [blkcg_punt_bio]
root          41       2  0 19:36 ?        00:00:00 [tpm_dev_wq]
root          42       2  0 19:36 ?        00:00:00 [ata_sff]
root          43       2  0 19:36 ?        00:00:00 [md]
root          44       2  0 19:36 ?        00:00:00 [md_bitmap]
root          45       2  0 19:36 ?        00:00:00 [edac-poller]
root          46       2  0 19:36 ?        00:00:00 [devfreq_wq]
root          47       2  0 19:36 ?        00:00:00 [watchdogd]
root          48       2  0 19:36 ?        00:00:00 [kworker/0:1H-events_highpri]
root          49       2  0 19:36 ?        00:00:00 [kswapd0]
root          50       2  0 19:36 ?        00:00:00 [ecryptfs-kthread]
root          51       2  0 19:36 ?        00:00:00 [kthrotld]
root          52       2  0 19:36 ?        00:00:00 [acpi_thermal_pm]
root          54       2  0 19:36 ?        00:00:00 [mld]
root          55       2  0 19:36 ?        00:00:00 [ipv6_addrconf]
root          56       2  0 19:36 ?        00:00:00 [kworker/1:1H-kblockd]
root          65       2  0 19:36 ?        00:00:00 [kstrp]
root          71       2  0 19:36 ?        00:00:00 [charger_manager]
root         117       2  0 19:36 ?        00:00:00 [napi/eth%d-8193]
root         118       2  0 19:36 ?        00:00:00 [napi/eth%d-0]
root         119       2  0 19:36 ?        00:00:00 [scsi_eh_0]
root         120       2  0 19:36 ?        00:00:00 [scsi_tmf_0]
root         121       2  0 19:36 ?        00:00:00 [scsi_eh_1]
root         122       2  0 19:36 ?        00:00:00 [scsi_tmf_1]
root         123       2  0 19:36 ?        00:00:00 [scsi_eh_2]
root         124       2  0 19:36 ?        00:00:00 [scsi_tmf_2]
root         125       2  0 19:36 ?        00:00:00 [scsi_eh_3]
root         126       2  0 19:36 ?        00:00:00 [scsi_tmf_3]
root         127       2  0 19:36 ?        00:00:00 [scsi_eh_4]
root         129       2  0 19:36 ?        00:00:00 [scsi_tmf_4]
root         130       2  0 19:36 ?        00:00:00 [scsi_eh_5]
root         132       2  0 19:36 ?        00:00:00 [scsi_tmf_5]
root         164       2  0 19:36 ?        00:00:00 [jbd2/sda6-8]
root         165       2  0 19:36 ?        00:00:00 [ext4-rsv-conver]
root         204       1  0 19:36 ?        00:00:01 /lib/systemd/systemd-journald
root         244       1  0 19:36 ?        00:00:00 /lib/systemd/systemd-udevd
root         304       2  0 19:36 ?        00:00:00 [cfg80211]
root         309       2  0 19:36 ?        00:00:03 [kworker/u9:2-rtw_tx_wq]
systemd+     349       1  0 19:36 ?        00:00:05 /lib/systemd/systemd-oomd
systemd+     350       1  0 19:36 ?        00:00:00 /lib/systemd/systemd-resolved
systemd+     354       1  0 19:36 ?        00:00:00 /lib/systemd/systemd-timesyncd
root         416       2  0 19:36 ?        00:00:00 [ttm]
root         417       2  0 19:36 ?        00:00:00 [card0-crtc0]
root         420       2  0 19:36 ?        00:00:00 [card0-crtc1]
root         421       2  0 19:36 ?        00:00:00 [rtw88_usb: tx w]
root         422       2  0 19:36 ?        00:00:00 [rtw88_usb: rx w]
root         426       1  0 19:36 ?        00:00:00 /usr/libexec/accounts-daemon
root         427       1  0 19:36 ?        00:00:00 /usr/sbin/acpid
avahi        430       1  0 19:36 ?        00:00:00 avahi-daemon: running [multitab-Aspire.local]
root         431       1  0 19:36 ?        00:00:00 /usr/lib/bluetooth/bluetoothd
root         432       1  0 19:36 ?        00:00:00 /usr/sbin/cron -f -P
message+     433       1  0 19:36 ?        00:00:04 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-
root         436       1  0 19:36 ?        00:00:02 /usr/sbin/NetworkManager --no-daemon
root         444       1  0 19:36 ?        00:00:00 /usr/sbin/irqbalance --foreground
root         447       1  0 19:36 ?        00:00:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
root         448       1  0 19:36 ?        00:00:05 /usr/libexec/polkitd --no-debug
root         453       1  0 19:36 ?        00:00:00 /usr/libexec/power-profiles-daemon
syslog       457       1  0 19:36 ?        00:00:00 /usr/sbin/rsyslogd -n -iNONE
root         464       1  0 19:36 ?        00:00:11 /usr/lib/snapd/snapd
root         466       1  0 19:36 ?        00:00:00 /usr/libexec/switcheroo-control
root         477       1  0 19:36 ?        00:00:00 /lib/systemd/systemd-logind
root         538       1  0 19:36 ?        00:00:01 /usr/libexec/udisks2/udisksd
root         539       1  0 19:36 ?        00:00:00 /sbin/wpa_supplicant -u -s -O /run/wpa_supplicant
avahi        558     430  0 19:36 ?        00:00:00 avahi-daemon: chroot helper
root         573       1  0 19:36 ?        00:00:00 /usr/sbin/ModemManager
root         578       1  0 19:36 ?        00:00:00 /usr/sbin/cupsd -l
root         590       1  0 19:36 ?        00:00:00 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signa
root         619       1  0 19:36 ?        00:00:00 /usr/sbin/gdm3
rtkit        794       1  0 19:36 ?        00:00:00 /usr/libexec/rtkit-daemon
root         901       1  0 19:36 ?        00:00:00 /usr/libexec/upowerd
root         907       1  0 19:36 ?        00:00:00 /usr/libexec/packagekitd
root        1058       1  0 19:36 ?        00:00:00 /usr/sbin/cups-browsed
kernoops    1072       1  0 19:36 ?        00:00:00 /usr/sbin/kerneloops --test
kernoops    1082       1  0 19:36 ?        00:00:00 /usr/sbin/kerneloops
colord      1106       1  0 19:36 ?        00:00:00 /usr/libexec/colord
root        1186     619  0 19:39 ?        00:00:00 gdm-session-worker [pam/gdm-password]
multitab    1201       1  0 19:39 ?        00:00:02 /lib/systemd/systemd --user
multitab    1202    1201  0 19:39 ?        00:00:00 (sd-pam)
multitab    1208    1201  0 19:39 ?        00:00:00 /usr/bin/pipewire
multitab    1209    1201  0 19:39 ?        00:00:00 /usr/bin/pipewire-media-session
multitab    1210    1201  0 19:39 ?        00:00:00 /usr/bin/pulseaudio --daemonize=no --log-target=journal
multitab    1214       1  0 19:39 ?        00:00:00 /usr/bin/gnome-keyring-daemon --daemonize --login
multitab    1228    1201  0 19:39 ?        00:00:01 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation
multitab    1229    1201  0 19:39 ?        00:00:00 /usr/libexec/xdg-document-portal
multitab    1232    1201  0 19:40 ?        00:00:00 /usr/libexec/xdg-permission-store
root        1238    1229  0 19:40 ?        00:00:00 fusermount3 -o rw,nosuid,nodev,fsname=portal,auto_unmount,subtype=portal -- /run/user/1000/d
multitab    1252    1186  0 19:40 tty2     00:00:00 /usr/libexec/gdm-wayland-session env GNOME_SHELL_SESSION_MODE=ubuntu /usr/bin/gnome-session
multitab    1258    1252  0 19:40 tty2     00:00:00 /usr/libexec/gnome-session-binary --session=ubuntu
multitab    1301    1201  0 19:40 ?        00:00:00 /usr/libexec/gnome-session-ctl --monitor
multitab    1319    1201  0 19:40 ?        00:00:00 /usr/libexec/gvfsd
multitab    1329    1201  0 19:40 ?        00:00:00 /usr/libexec/gvfsd-fuse /run/user/1000/gvfs -f
multitab    1330    1201  0 19:40 ?        00:00:00 /usr/libexec/gnome-session-binary --systemd-service --session=ubuntu
root        1372       2  0 19:40 ?        00:00:00 [krfcommd]
multitab    1379    1330  0 19:40 ?        00:00:00 /usr/libexec/at-spi-bus-launcher --launch-immediately
multitab    1381    1201  3 19:40 ?        00:02:20 /usr/bin/gnome-shell
multitab    1387    1379  0 19:40 ?        00:00:00 /usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork -
multitab    1409    1201  0 19:40 ?        00:00:00 /usr/libexec/gnome-shell-calendar-server
multitab    1415    1201  0 19:40 ?        00:00:00 /usr/libexec/evolution-source-registry
multitab    1422    1201  0 19:40 ?        00:00:00 /usr/libexec/goa-daemon
multitab    1423    1201  0 19:40 ?        00:00:00 /snap/snapd-desktop-integration/83/usr/bin/snapd-desktop-integration
multitab    1437    1201  0 19:40 ?        00:00:00 /usr/libexec/evolution-calendar-factory
multitab    1449    1201  0 19:40 ?        00:00:01 /usr/libexec/gvfs-udisks2-volume-monitor
multitab    1471    1201  0 19:40 ?        00:00:00 /usr/libexec/goa-identity-service
multitab    1481    1201  0 19:40 ?        00:00:00 /usr/libexec/gvfs-goa-volume-monitor
multitab    1493    1201  0 19:40 ?        00:00:00 /usr/libexec/gvfs-gphoto2-volume-monitor
multitab    1512    1201  0 19:40 ?        00:00:00 /usr/libexec/dconf-service
multitab    1513    1201  0 19:40 ?        00:00:00 /usr/libexec/evolution-addressbook-factory
multitab    1517    1201  0 19:40 ?        00:00:00 /usr/libexec/gvfs-mtp-volume-monitor
multitab    1533    1201  0 19:40 ?        00:00:00 /usr/libexec/gvfs-afc-volume-monitor
multitab    1542    1423  0 19:40 ?        00:00:00 /snap/snapd-desktop-integration/83/usr/bin/snapd-desktop-integration
multitab    1547    1201  0 19:40 ?        00:00:00 /usr/libexec/xdg-desktop-portal
multitab    1554    1201  0 19:40 ?        00:00:00 /usr/libexec/xdg-desktop-portal-gnome
multitab    1561    1319  0 19:40 ?        00:00:00 /usr/libexec/gvfsd-trash --spawner :1.15 /org/gtk/gvfs/exec_spaw/0
multitab    1571    1201  0 19:40 ?        00:00:00 /usr/bin/gjs /usr/share/gnome-shell/org.gnome.Shell.Notifications
multitab    1575    1201  0 19:40 ?        00:00:00 /usr/libexec/at-spi2-registryd --use-gnome-session
multitab    1585    1201  0 19:40 ?        00:00:00 sh -c /usr/bin/ibus-daemon --panel disable $([ "$XDG_SESSION_TYPE" = "x11" ] && echo "--xim"
multitab    1587    1585  0 19:40 ?        00:00:08 /usr/bin/ibus-daemon --panel disable
multitab    1588    1201  0 19:40 ?        00:00:00 /usr/libexec/gsd-a11y-settings
multitab    1591    1201  0 19:40 ?        00:00:00 /usr/libexec/gsd-color
multitab    1599    1201  0 19:40 ?        00:00:00 /usr/libexec/gsd-datetime
multitab    1601    1201  0 19:40 ?        00:00:00 /usr/libexec/gsd-housekeeping
multitab    1602    1201  0 19:40 ?        00:00:00 /usr/libexec/gsd-keyboard
multitab    1604    1201  0 19:40 ?        00:00:00 /usr/libexec/gsd-media-keys
multitab    1608    1201  0 19:40 ?        00:00:00 /usr/libexec/gsd-power
multitab    1610    1201  0 19:40 ?        00:00:00 /usr/libexec/gsd-print-notifications
multitab    1611    1201  0 19:40 ?        00:00:00 /usr/libexec/gsd-rfkill
multitab    1613    1201  0 19:40 ?        00:00:00 /usr/libexec/gsd-screensaver-proxy
multitab    1616    1201  0 19:40 ?        00:00:00 /usr/libexec/gsd-sharing
multitab    1619    1201  0 19:40 ?        00:00:00 /usr/libexec/gsd-smartcard
multitab    1623    1201  0 19:40 ?        00:00:00 /usr/libexec/gsd-sound
multitab    1627    1201  0 19:40 ?        00:00:00 /usr/libexec/gsd-wacom
multitab    1647    1201  0 19:40 ?        00:00:00 /usr/libexec/gsd-printer
multitab    1649    1330  0 19:40 ?        00:00:00 /usr/libexec/gsd-disk-utility-notify
multitab    1662    1587  0 19:40 ?        00:00:00 /usr/libexec/ibus-memconf
multitab    1663    1587  0 19:40 ?        00:00:05 /usr/libexec/ibus-extension-gtk3
multitab    1676    1201  0 19:40 ?        00:00:00 /usr/libexec/ibus-portal
multitab    1689    1330  0 19:40 ?        00:00:00 /usr/libexec/evolution-data-server/evolution-alarm-notify
multitab    1756    1587  0 19:40 ?        00:00:02 /usr/libexec/ibus-engine-hangul --ibus
multitab    1761    1201  0 19:40 ?        00:00:00 /usr/libexec/xdg-desktop-portal-gtk
multitab    1776    1201  0 19:40 ?        00:00:02 /usr/libexec/tracker-miner-fs-3
multitab    1796    1201  0 19:40 ?        00:00:00 /usr/bin/gjs /usr/share/gnome-shell/org.gnome.ScreenSaver
multitab    1844    1201  0 19:40 ?        00:00:00 /usr/libexec/gvfsd-metadata
multitab    1861    1201  0 19:40 ?        00:00:00 /usr/bin/python3 /usr/bin/gnome-terminal --wait
multitab    1862    1861  0 19:40 ?        00:00:00 /usr/bin/gnome-terminal.real --wait
multitab    1867    1201  1 19:40 ?        00:01:01 /usr/libexec/gnome-terminal-server
multitab    1885    1867  0 19:40 pts/0    00:00:00 bash
multitab    1917    1330  0 19:41 ?        00:00:00 update-notifier
multitab    2019    1867  0 19:42 pts/2    00:00:00 bash
root        2307       1  0 19:45 ?        00:00:04 /usr/bin/containerd
root        2465       1  0 19:46 ?        00:00:11 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
multitab    2813    1381  0 20:00 ?        00:00:03 gjs /usr/share/gnome-shell/extensions/ding@rastersoft.com/ding.js -E -P /usr/share/gnome-she
root        3098       2  0 20:02 ?        00:00:02 [kworker/u8:4-events_power_efficient]
root        3415       2  0 20:06 ?        00:00:01 [kworker/0:1-events]
multitab    3530    1867  0 20:09 pts/3    00:00:00 bash
root        3675       2  0 20:09 ?        00:00:02 [kworker/u8:3-events_power_efficient]
root        3692    1885  0 20:10 pts/0    00:00:00 sudo docker run -it ubuntu bash
root        3693    3692  0 20:10 pts/1    00:00:00 sudo docker run -it ubuntu bash
root        3694    3693  0 20:10 pts/1    00:00:00 docker run -it ubuntu bash
root        3729       1  0 20:10 ?        00:00:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id fc7fe321ed1c94f8f042ca8875c9c016b4276fe
root        3752    3729  0 20:10 pts/0    00:00:00 bash
root        3811    3530  0 20:14 pts/3    00:00:00 sudo docker run -it ubuntu bash
root        3812    3811  0 20:14 pts/4    00:00:00 sudo docker run -it ubuntu bash
root        3813    3812  0 20:14 pts/4    00:00:00 docker run -it ubuntu bash
root        3850       1  0 20:14 ?        00:00:01 /usr/bin/containerd-shim-runc-v2 -namespace moby -id a492ed5dfa0a2d072ecac21f118a9a86d2e8801
root        3873    3850  0 20:14 pts/0    00:00:00 bash
root        4315    3873  0 20:20 pts/0    00:00:00 vim
root        4565       2  0 20:25 ?        00:00:00 [kworker/u8:2-rtw88_usb: tx wq]
multitab    4659    1201  0 20:25 ?        00:00:00 /usr/bin/snap userd
root        4935       2  0 20:25 ?        00:00:00 [kworker/u9:3-rtw_tx_wq]
root        5424       1  0 20:25 ?        00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
multitab    5674    1319  0 20:28 ?        00:00:00 /usr/libexec/gvfsd-network --spawner :1.15 /org/gtk/gvfs/exec_spaw/1
multitab    5686    1319  0 20:28 ?        00:00:00 /usr/libexec/gvfsd-dnssd --spawner :1.15 /org/gtk/gvfs/exec_spaw/3
root        5739       2  0 20:28 ?        00:00:00 [kworker/1:3-events]
root        5875    5424  0 20:28 ?        00:00:00 sshd: multitab [priv]
multitab    5950    5875  0 20:29 ?        00:00:00 sshd: multitab@pts/5
multitab    5951    5950  0 20:29 pts/5    00:00:00 -bash
root        5977       2  0 20:29 ?        00:00:00 [tls-strp]
root        5997       2  0 20:30 ?        00:00:00 [kworker/u9:0]
root        6010       2  0 20:31 ?        00:00:00 [kworker/0:2-i915-unordered]
root        6028       2  0 20:33 ?        00:00:00 [kworker/1:1-mm_percpu_wq]
root        6045       2  0 20:37 ?        00:00:00 [kworker/0:0-events]
root        6053    3752  0 20:37 pts/0    00:00:00 top
root        6057       2  0 20:38 ?        00:00:00 [kworker/1:0-mm_percpu_wq]
multitab    6098    5951  0 20:41 pts/5    00:00:00 ps -ef
multitab@multitab-Aspire:~/tmp$

 

하지만 docker 내부에서 보면 다음처럼 자기 컨테이너의 프로세스 밖에 볼 수 없습니다.

-- docker 내부에서 보이는 프로세스 현황
root@fc7fe321ed1c:/# ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  3 11:10 pts/0    00:00:00 bash
root           9       1  0 11:10 pts/0    00:00:00 ps -ef

-- top 명령어로 봐도 비슷하게 보입니다.
    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1 root      20   0    4588   3968   3456 S   0.0   0.1   0:00.08 bash
     10 root      20   0    8876   5120   3072 R   0.0   0.1   0:00.03 top

 

현재 동작 프로세스를 좀 더 예쁘게 보기 위해 'systemctl status' 명령을 사용했습니다. docker 부분은 찾기 쉽게 살짝 위로 올렸습니다. 아래 보이는 docker 옆의 긴 글자는 docker container id 입니다. 

-- systemctl status 명령어로 보는 프로세스 정보 중 일부.

...생략...
           ├─init.scope
           │ └─1 /sbin/init splash
           └─system.slice
             ├─docker-fc7fe321ed1c94f8f042ca8875c9c016b4276fe91567a034ce2185ee77f6dc62.scope
             │ └─3752 bash
             │ └─6053 top
             ├─docker-a492ed5dfa0a2d072ecac21f118a9a86d2e8801d1a27141a9a182468f1f8891e.scope
             │ ├─3873 bash
             │ └─4315 vim
             ├─irqbalance.service
             │ └─444 /usr/sbin/irqbalance --foreground
             ├─containerd.service
             │ ├─2307 /usr/bin/containerd
             │ ├─3729 /usr/bin/containerd-shim-runc-v2 -namespace moby -id fc7fe321ed1c94f8f042ca8875c9c016b4276fe91567a034ce2185ee77f6dc62 -address /run/containerd/containerd.sock
             │ └─3850 /usr/bin/containerd-shim-runc-v2 -namespace moby -id a492ed5dfa0a2d072ecac21f118a9a86d2e8801d1a27141a9a182468f1f8891e -address /run/containerd/containerd.sock
             ├─packagekit.service
             │ └─907 /usr/libexec/packagekitd
             ├─systemd-udevd.service
             │ └─244 /lib/systemd/systemd-udevd
             ├─cron.service
             │ └─432 /usr/sbin/cron -f -P
             ├─docker.service
             │ └─2465 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
             ├─polkit.service
             │ └─448 /usr/libexec/polkitd --no-debug
             ├─networkd-dispatcher.service
             │ └─447 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
             ├─rtkit-daemon.service
             │ └─794 /usr/libexec/rtkit-daemon
             ├─bluetooth.service
             │ └─431 /usr/lib/bluetooth/bluetoothd
             ├─accounts-daemon.service
             │ └─426 /usr/libexec/accounts-daemon
             ├─wpa_supplicant.service
             │ └─539 /sbin/wpa_supplicant -u -s -O /run/wpa_supplicant
             ├─ModemManager.service
             │ └─573 /usr/sbin/ModemManager
             ├─systemd-journald.service
             │ └─204 /lib/systemd/systemd-journald
             ├─power-profiles-daemon.service
             │ └─453 /usr/libexec/power-profiles-daemon
             ├─unattended-upgrades.service
             │ └─590 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
             ├─colord.service
             │ └─1106 /usr/libexec/colord
             ├─NetworkManager.service
             │ └─436 /usr/sbin/NetworkManager --no-daemon
             ├─snapd.service
             │ └─464 /usr/lib/snapd/snapd
             ├─gdm.service
             │ └─619 /usr/sbin/gdm3
             ├─switcheroo-control.service
             │ └─466 /usr/libexec/switcheroo-control
             ├─rsyslog.service
             │ └─457 /usr/sbin/rsyslogd -n -iNONE
             ├─kerneloops.service
             │ ├─1072 /usr/sbin/kerneloops --test
             │ └─1082 /usr/sbin/kerneloops
             ├─cups-browsed.service
             │ └─1058 /usr/sbin/cups-browsed
             ├─cups.service
             │ └─578 /usr/sbin/cupsd -l
             ├─upower.service
             │ └─901 /usr/libexec/upowerd
             ├─systemd-oomd.service
             │ └─349 /lib/systemd/systemd-oomd
             ├─systemd-resolved.service
             │ └─350 /lib/systemd/systemd-resolved
             ├─udisks2.service
             │ └─538 /usr/libexec/udisks2/udisksd
             ├─acpid.service
             │ └─427 /usr/sbin/acpid
             ├─dbus.service
             │ └─433 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
             ├─systemd-timesyncd.service
             │ └─354 /lib/systemd/systemd-timesyncd
             ├─avahi-daemon.service
             │ ├─430 avahi-daemon: running [multitab-Aspire.local]
             │ └─558 avahi-daemon: chroot helper
             └─systemd-logind.service
               └─477 /lib/systemd/systemd-logind

 

 

그에 비해 vm 은 별도의 살림방을 만들어 놓은 것입니다. 작긴하지만 별도의 독립된 화장실과 부엌을 가지고 있습니다.

이런 개념으로 보면 vm 은 화장실과 부엌이 딸린 원룸 이거나 조금더 양보해서 고시원 정도라고 비교할 수 있겠군요. 부엌대신 작은 싱크대와 부르스타로 대체.

위에 있는 쪽방에 비교하면 훨씬 더 독립된 집다운 면모를 갖추고 있지만 사실은 이것도 일종의 방 쪼개기입니다. 원래는 좀 더 넓었던 공간을 벽으로 구분한 것입니다.

 

하지만 완전히 독립된 또 하나의 컴퓨터 환경이기 때문에 리눅스 호스트에 Windows 나 MacOS 를 설치할 수도 있고 그 반대도 가능합니다.

vm 의 경우 ps -ef 로 본다면 OS 를 구성하는 전체 프로세스의 리스트가 다 나옵니다. 

 

다음은 VM 을 많이 만들어 놓은 모습니다. 저희 동네가 신림동이라 근처에서 많이 볼 수 있습니다.

 

그렇다면 이건 데이터 센터일 수 있겠군요. 저 안에 수 많은 vm 이나 docker 컨테이너가 구성되어 있을 수 있습니다.

 

자 이제 다들 Docker vs VM 설명하실 땐 쪽방과 원룸을 생각하시면 됩니다.

 

반응형