Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

https://docs.microsoft.com/ko-kr/virtualization/windowscontainers/about/containers-vs-vm

기능

가상 머신

컨테이너

격리

호스트 운영 체제와 기타 VM으로부터 완벽하게 격리합니다. 동일한 서버 또는 클러스터에 있는 경쟁 회사의 호스팅 앱처럼 강력한 보안 경계가 필요할 때 유용합니다.

일반적으로 호스트 및 기타 컨테이너로부터 어느 정도 격리하지만, VM처럼 강력한 보안 경계를 제공하지는 않습니다. Hyper-V 격리 모드를 사용하여 경량 VM의 각 컨테이너를 분리하는 방식으로 보안을 높일 수 있습니다.

운영 체제

커널을 포함하여 완전한 운영 체제를 실행하므로 더 많은 시스템 리소스(CPU, 메모리 및 스토리지)가 필요합니다.

운영 체제의 사용자 모드 부분을 실행하며, 앱에 필요한 서비스만 포함하도록 조정하여 시스템 리소스 사용을 줄일 수 있습니다.

게스트 호환성

가상 머신 내의 운영 체제에 대해서만 실행됩니다.

호스트와 동일한 운영 체제 버전에서 실행됩니다(Hyper-V 격리를 사용하면 경량 VM 환경에서 동일한 OS의 이전 버전을 실행할 수 있음).

배포

Windows Admin Center 또는 Hyper-V 관리자를 사용하여 개별 VM을 배포합니다. PowerShell 또는 System Center Virtual Machine Manager를 사용하여 여러 VM을 배포합니다.

명령줄을 통해 Docker를 사용하여 개별 컨테이너를 배포합니다. Azure Kubernetes Service 같은 오케스트레이터를 사용하여 여러 컨테이너를 배포합니다.

운영 체제 업데이트 및 업그레이드

각 VM에 운영 체제 업데이트를 다운로드하여 설치합니다. 새 운영 체제 버전을 설치하려면 업그레이드가 필요하거나 경우에 따라 완전히 새로운 VM을 만들어야 합니다. 이렇게 하면 시간이 오래 걸리며, 특히 VM 수가 많으면 매우 긴 시간이 걸립니다.

컨테이너 내의 운영 체제 파일을 업데이트 또는 업그레이드하는 방법은 다음과 같이 동일합니다.

  1. 최신 버전의 Windows 기본 이미지를 가리키도록 컨테이너 이미지의 빌드 파일(Dockerfile이라고도 함)을 편집합니다.

  2. 이 새로운 기본 이미지를 사용하여 컨테이너 이미지를 다시 빌드합니다.

  3. 컨테이너 레지스트리에 컨테이너 이미지를 푸시합니다.

  4. 오케스트레이터를 사용하여 다시 배포합니다.
    오케스트레이터는 이 작업을 대규모로 수행할 수 있는 강력한 자동화 기능을 제공합니다. 자세한 내용은 자습서: Azure Kubernetes Service에서 애플리케이션 업데이트를 참조하세요.

영구 스토리지

단일 VM의 경우 로컬 스토리지에 VHD(가상 하드 디스크)를 사용하고, 여러 서버에서 공유하는 스토리지에는 SMB 파일 공유를 사용합니다.

단일 노드에는 로컬 스토리지용 Azure 디스크를 사용하고, 여러 노드나 서버에서 공유하는 스토리지에는 Azure Files(SMB 공유)를 사용합니다.

부하 분산

가상 머신 부하 분산은 실행 중인 VM을 장애 조치(failover) 클러스터의 다른 서버로 이동합니다.

컨테이너 자체는 이동하지 않습니다. 대신 오케스트레이터는 클러스터 노드의 컨테이너를 자동으로 시작하거나 중지하여 부하 및 가용성의 변화를 관리할 수 있습니다.

내결함성

VM은 클러스터의 다른 서버로 장애 조치할 수 있으며, 새 서버에서 VM의 운영 체제가 다시 시작됩니다.

클러스터 노드에서 오류가 발생하면 오케스트레이터는 해당 노드에서 실행되는 모든 컨테이너를 신속하게 다른 클러스터 노드에 다시 만듭니다.

네트워킹

가상 네트워크 어댑터를 사용합니다.

가상 네트워크 어댑터의 격리된 보기를 사용하며, 약간 적은 가상화를 제공합니다. 리소스를 적게 사용하지만 호스트의 방화벽을 컨테이너와 공유합니다 자세한 내용은 Windows 컨테이너 네트워킹을 참조하세요.

여러 머신에서 코드가 제대로 작동하도록 하는 것은 여러 가지 이유로 어려울 수 있습니다.

...

컨테이너는 컨테이너 런타임과 함께 작동하여 이러한 속성을 구성합니다. 컨테이너는 하드웨어를 에뮬레이션하지 않습니다. 컨테이너는 머신의 다른 앱과 동일한 하드웨어를 사용합니다. 따라서 컨테이너는 잠재적으로 호스트와 상호 작용할 수 있지만, 컨테이너가 호스트와 상호 작용하는 방식을 제어할 수 있다는 것입니다.

<출처> https://github.com/docker/labs/blob/master/beginner/chapters/alpine.md

1. 첫 컨테이너 실행하기

 Alpine Linux(경량 리눅스 배포판)를 실행하고 도커 실행 명령어를 사용해 보겠습니다.

Code Block
202310-DockerBasic# docker pull alpine
Using default tag: latest
latest: Pulling from library/alpine
96526aa774ef: Pull complete
Digest: sha256:eece025e432126ce23f223450a0326fbebde39cdf496a85d8c016293fc851978
Status: Downloaded newer image for alpine:latest
202310-DockerBasic# docker images
REPOSITORY                              TAG       IMAGE ID       CREATED        SIZE
alpine                                  latest    8ca4688f4f35   2 weeks ago    7.34MB
zeroacrdemo.azurecr.io/appmod-contapp   latest    8629e2fcf972   7 months ago   121MB
zeroacrtf.azurecr.io/appmod-contapp     latest    8629e2fcf972   7 months ago   121MB

pull 명령은 Docker 레지스트리에서 알파인 이미지를 가져와 시스템에 저장합니다. docker images 명령을 사용하여 시스템의 모든 이미지 목록을 볼 수 있습니다.

...

이제 이 이미지를 기반으로 Docker 컨테이너를 실행해 보겠습니다. 이를 위해 docker 실행 명령을 사용합니다.

Code Block
202310-DockerBasic# docker run alpine ls -l
total 56
drwxr-xr-x    2 root     root          4096 Sep 28 11:18 bin
drwxr-xr-x    5 root     root           340 Oct 19 01:51 dev
drwxr-xr-x    1 root     root          4096 Oct 19 01:51 etc
drwxr-xr-x    2 root     root          4096 Sep 28 11:18 home
drwxr-xr-x    7 root     root          4096 Sep 28 11:18 lib
drwxr-xr-x    5 root     root          4096 Sep 28 11:18 media
drwxr-xr-x    2 root     root          4096 Sep 28 11:18 mnt
drwxr-xr-x    2 root     root          4096 Sep 28 11:18 opt
dr-xr-xr-x  245 root     root             0 Oct 19 01:51 proc
drwx------    2 root     root          4096 Sep 28 11:18 root
drwxr-xr-x    2 root     root          4096 Sep 28 11:18 run
drwxr-xr-x    2 root     root          4096 Sep 28 11:18 sbin
drwxr-xr-x    2 root     root          4096 Sep 28 11:18 srv
dr-xr-xr-x   11 root     root             0 Oct 19 01:51 sys
drwxrwxrwt    2 root     root          4096 Sep 28 11:18 tmp
drwxr-xr-x    7 root     root          4096 Sep 28 11:18 usr
drwxr-xr-x   12 root     root          4096 Sep 28 11:18 var

  1. Docker 클라이언트가 Docker 데몬에 연결합니다.

...

docker run alpine을 실행할 때 명령(ls -l)을 제공했으므로 Docker가 지정된 명령을 시작하고 목록을 볼 수 있습니다.

좀 더 흥미로운 것을 시도해 봅시다.

Code Block
202310-DockerBasic# docker run alpine echo "hello from alpine"
hello from alpine

이 경우, Docker 클라이언트는 알파인 컨테이너에서 echo 명령을 실행한 다음 종료했습니다. 이 모든 일이 매우 빠르게 진행되었습니다. 가상 머신을 부팅하고 명령을 실행한 다음 종료한다고 상상해 보세요. 이제 컨테이너가 빠르다고 말하는 이유를 알 수 있습니다!

다른 명령을 시도합니다.

Code Block
202310-DockerBasic# docker run -it alpine /bin/sh
/ # uname -a
Linux 1a10657f46f6 5.10.16.3-microsoft-standard-WSL2 #1 SMP Fri Apr 2 22:23:49 UTC 2021 x86_64 Linux
/ # exit
202310-DockerBasic#

it 플래그를 사용하여 실행 명령을 실행하면 컨테이너의 대화형 tty에 연결됩니다. \

실행에 대해 자세히 알아보려면 docker run --help를 사용하여 지원하는 모든 플래그 목록을 확인하세요. 더 진행하면서 도커 실행의 몇 가지 변형을 더 보게 될 것입니다.

Code Block
202310-DockerBasic# docker --help

Usage:  docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Options:
      --config string      Location of client config files (default "/home/zerobig/.docker")
  -c, --context string     Name of the context to use to connect to the daemon (overrides
                           DOCKER_HOST env var and default context set with "docker context use")
  -D, --debug              Enable debug mode
  -H, --host list          Daemon socket(s) to connect to
  -l, --log-level string   Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default
                           "info")
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default "/home/zerobig/.docker/ca.pem")
      --tlscert string     Path to TLS certificate file (default "/home/zerobig/.docker/cert.pem")
      --tlskey string      Path to TLS key file (default "/home/zerobig/.docker/key.pem")
      --tlsverify          Use TLS and verify the remote
  -v, --version            Print version information and quit

Management Commands:
  builder     Manage builds
  buildx*     Docker Buildx (Docker Inc., v0.9.1)
  compose*    Docker Compose (Docker Inc., v2.10.2)
  config      Manage Docker configs
  container   Manage containers
  context     Manage contexts
  extension*  Manages Docker extensions (Docker Inc., v0.2.9)
  image       Manage images
  manifest    Manage Docker image manifests and manifest lists
  network     Manage networks
  node        Manage Swarm nodes
  plugin      Manage plugins
  sbom*       View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc., 0.6.0)
  scan*       Docker Scan (Docker Inc., v0.19.0)
  secret      Manage Docker secrets
  service     Manage services
  stack       Manage Docker stacks
  swarm       Manage Swarm
  system      Manage Docker
  trust       Manage trust on Docker images
  volume      Manage volumes

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

Run 'docker COMMAND --help' for more information on a command.

To get more help with docker, check out our guides at https://docs.docker.com/go/guides/
202310-DockerBasic#

2. 정적 웹 컨테이너 실행하기

Dockerfile 작성

Code Block
202310-DockerBasic# mkdir docker-demo
202310-DockerBasic# cd docker-demo/
202310-DockerBasic# vi Dockerfile
FROM dockersamples/static-site
ENV AUTHOR=“zerobig”
Code Block

Docker 빌드

Code Block
202310-DockerBasic# docker build -t static-site .
[+] Building 0.0s (1/2)
 => [internal] load build definition from Dockerfile                                               0.0s
 => => transferring dockerfile: 2B                                                                 0.0s
failed to solve with frontend dockerfile.v0: failed to read dockerfile: open /var/lib/docker/tmp/buildkit-mount3777101455/Dockerfile: no such file or directory
202310-DockerBasic# ls
Dockerfie
202310-DockerBasic# mv Dockerfie Dockerfile
202310-DockerBasic# docker build -t static-site .
[+] Building 34.0s (5/5) FINISHED
 => [internal] load build definition from Dockerfile                                               0.0s
 => => transferring dockerfile: 99B                                                                0.0s
 => [internal] load .dockerignore                                                                  0.0s
 => => transferring context: 2B                                                                    0.0s
 => [internal] load metadata for docker.io/dockersamples/static-site:latest                       13.5s
 => [1/1] FROM docker.io/dockersamples/static-site@sha256:daa686c61d7d239b7977e72157997489db49f3  20.3s
 => => resolve docker.io/dockersamples/static-site@sha256:daa686c61d7d239b7977e72157997489db49f31  0.0s
 => => sha256:daa686c61d7d239b7977e72157997489db49f316b9b9af3909d9f10fd28b2dec 2.19kB / 2.19kB     0.0s
 => => sha256:f589ccde7957fa3ddf76a2eeee4d2f5d687b32176f559b703b6b8cacf6d36bc4 4.56kB / 4.56kB     0.0s
 => => sha256:fdd5d7827f33ef075f45262a0f74ac96ec8a5e687faeb40135319764963dcb42 51.37MB / 51.37MB  14.0s
 => => sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4 32B / 32B           0.5s
 => => sha256:716f7a5f3082a52923e6b276061d3d52a14c781e0c276dee79879ca3a186f6a9 23.51MB / 23.51MB  10.2s
 => => sha256:7b10f03a030928818d8b6639c189f9c270dfe8226af57868477633883c8b883f 196B / 196B         1.2s
 => => sha256:aff3ab7e9c3968160f3472c574dfc8f5d679724d14a5781110b50acad15124f8 3.08kB / 3.08kB     1.8s
 => => extracting sha256:fdd5d7827f33ef075f45262a0f74ac96ec8a5e687faeb40135319764963dcb42          3.2s
 => => extracting sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4          0.0s
 => => extracting sha256:716f7a5f3082a52923e6b276061d3d52a14c781e0c276dee79879ca3a186f6a9          1.4s
 => => extracting sha256:7b10f03a030928818d8b6639c189f9c270dfe8226af57868477633883c8b883f          0.0s
 => => extracting sha256:aff3ab7e9c3968160f3472c574dfc8f5d679724d14a5781110b50acad15124f8          0.0s
 => exporting to image                                                                             0.0s
 => => exporting layers                                                                            0.0s
 => => writing image sha256:782feb0ebf7acd2f41b40bb2cdce4de3adb8983d44c64281e56c815f918ddd10       0.0s
 => => naming to docker.io/library/static-site                                                     0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
202310-DockerBasic#
202310-DockerBasic# docker images
REPOSITORY                              TAG       IMAGE ID       CREATED        SIZE
alpine                                  latest    8ca4688f4f35   2 weeks ago    7.34MB
zeroacrdemo.azurecr.io/appmod-contapp   latest    8629e2fcf972   7 months ago   121MB
zeroacrtf.azurecr.io/appmod-contapp     latest    8629e2fcf972   7 months ago   121MB
static-site

Docker 실행

Code Block
202310-DockerBasic# docker run -d -p 8888:80 static-site
80379edd20aeba0c6ba6448dd6a32b7c7a4438a83cc688724843da135837f2b9
202310-DockerBasic# docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS          PORTS
               NAMES
80379edd20ae   static-site   "/bin/sh -c 'cd /usr…"   58 seconds ago   Up 57 seconds   443/tcp, 0.0.0.0:8888->80/tcp   exciting_brown
202310-DockerBasic#

결과 확인

...

Docker 로그 확인

Code Block
202310-DockerBasic# docker logs -f 80379edd20ae
172.17.0.1 - - [19/Oct/2023:02:25:51 +0000] "GET / HTTP/1.1" 200 8756 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36" "-"
2023/10/19 02:25:52 [error] 9#9: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "localhost:8888", referrer: "http://localhost:8888/"
172.17.0.1 - - [19/Oct/2023:02:25:52 +0000] "GET /favicon.ico HTTP/1.1" 404 571 "http://localhost:8888/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36" "-"





172.17.0.1 - - [19/Oct/2023:02:27:34 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36" "-"
172.17.0.1 - - [19/Oct/2023:02:27:35 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36" "-"
172.17.0.1 - - [19/Oct/2023:02:27:35 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36" "-"
2023/10/19 02:27:40 [error] 9#9: *3 open() "/usr/share/nginx/html/ㅇㅇ" failed (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /%E3%85%87%E3%85%87 HTTP/1.1", host: "localhost:8888"
172.17.0.1 - - [19/Oct/2023:02:27:40 +0000] "GET /%E3%85%87%E3%85%87 HTTP/1.1" 404 571 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36" "-"

Docker 종료

Code Block
202310-DockerBasic# docker stop 80379edd20ae
80379edd20ae
202310-DockerBasic# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
202310-DockerBasic# docker ps -a
CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS                        PORTS     NAMES
80379edd20ae   static-site   "/bin/sh -c 'cd /usr…"   8 minutes ago    Exited (137) 15 seconds ago             exciting_brown
f934566eefc3   alpine        "/bin/sh"                26 minutes ago   Exited (0) 26 minutes ago               charming_lumiere
1a10657f46f6   alpine        "/bin/sh"                40 minutes ago   Exited (0) 40 minutes ago               frosty_chaplygin
52f5a21d516e   alpine        "echo 'hello from al…"   41 minutes ago   Exited (0) 41 minutes ago               serene_swartz
9c54c2d5e035   alpine        "ls -l"                  41 minutes ago   Exited (0) 41 minutes ago               vigorous_nash
202310-DockerBasic#