...
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 수가 많으면 매우 긴 시간이 걸립니다. | 컨테이너 내의 운영 체제 파일을 업데이트 또는 업그레이드하는 방법은 다음과 같이 동일합니다. 최신 버전의 Windows 기본 이미지를 가리키도록 컨테이너 이미지의 빌드 파일(Dockerfile이라고도 함)을 편집합니다. 이 새로운 기본 이미지를 사용하여 컨테이너 이미지를 다시 빌드합니다. 컨테이너 레지스트리에 컨테이너 이미지를 푸시합니다. 오케스트레이터를 사용하여 다시 배포합니다. 오케스트레이터는 이 작업을 대규모로 수행할 수 있는 강력한 자동화 기능을 제공합니다. 자세한 내용은 자습서: 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 |
|
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” |
|
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# |
|