Microsoft MVP성태의 닷넷 이야기
개발 환경 구성: 316. 간단하게 살펴보는 Docker for Windows [링크 복사], [링크+제목 복사],
조회: 27434
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 6개 있습니다.)

간단하게 살펴보는 Docker for Windows

예전에 Windows Containers를 설명해 드렸는데요.

Windows 10에서 경험해 보는 Windows Containers와 docker
; https://www.sysnet.pe.kr/2/0/11013

사실, 순서상으로 보면 "Docker for Windows"를 먼저 살펴보는 것이 더 낫습니다. ^^

Docker for Windows
; https://www.docker.com/docker-windows

이를 설치하면 컴퓨터에 2가지 변화가 생깁니다.

  • "Docker for Windows Service" NT 서비스 설치 (서비스 명: com.docker.service)
  • Hyper-V에 "MobyLinuxVM" 이름의 Linux 가상 머신 설치

그러니까, "docker for windows"는 Hyper-V에 Linux 가상 머신을 설치하고, 기존의 리눅스용 docker 컨테이너들을 그 가상 머신 위에서 실행해 줍니다. 예를 들어, 다음과 같은 "hello-world" image를 Linux 내에 컨테이너로 실행할 수 있습니다.

C:\temp>docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
78445dd45222: Pull complete
Digest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

// 또는 간단하게 nginx 웹 응용 프로그램을 실행해 확인

$ docker run -d -p 8080:80 --name web nginx
$ curl localhost:8080
$ docker stop web
$ docker container rm web

"hello-world" 예제는 화면에 메시지만 출력하고 끝나는 것이 전부입니다. 그런데, "hello-world" image는 어디에 저장되어 있을까요? Linux용 컨테이너이기 때문에 이것은 "DockerDesktopVM(예전에는 MobyLinuxVM)" 가상 머신 내부에 저장됩니다. 따라서 docker 컨테이너 이미지에 대한 관리를 걱정할 필요가 없습니다.

덕분에 DockerDesktopVM 가상 머신이 저장되는 .vhdx 파일만 관리하면 되는데, 기본적으로 이것은 다음의 경로에 저장되어 있습니다.

C:\Users\Public\Documents\Hyper-V\Virtual hard disks\DockerDesktopVM.vhdx

이 .vhdx 파일의 경로는 작업 표시줄에 있는 docker 아이콘의 "Settings" 메뉴를 통해 "Advanced" / "Images and volumes VHD location"을 조정해 바꿀 수 있습니다.

그 외에, docker의 동작에 대한 로그 내용은 "%LOCALAPPDATA%\Docker\log.txt" 파일로 남으며, docker 관련 설정은 "%APPDATA%\Docker" 폴더에 json 파일로 저장이 됩니다.




사실, "docker for windows"는 Linux VM을 기반으로 기존의 Linux용 container image들을 사용할 수 있다는 것이 장점입니다. 이로 인해 .NET 개발자 입장에서는 "Full .NET Framework"용 응용 프로그램을 개발하는 경우에는 별로 사용할 일이 없습니다. 그런 상황에서는 오히려 Windows용 docker인 "Windows Containers"를 사용하는 것이 더 낫습니다.

반면, ".NET Core"를 위한 환경으로는 Linux용 docker도 꽤 괜찮은 환경을 제공합니다. 이에 대해서는 다음의 글에도 잘 나옵니다.

Building DockNetFiddle using Docker and .NET Core
; http://www.dotnetcurry.com/windows-azure/1339/docknetfiddle-using-docker-dotnet-core

실제로 "docker for windows"를 설치했다면 지금 바로 .NET Core가 설치된 linux용 container image를 다운로드해 실행하여 새로운 container를 띄울 수 있습니다.

C:\temp>docker run --rm -it microsoft/dotnet:latest
Unable to find image 'microsoft/dotnet:latest' locally
latest: Pulling from microsoft/dotnet
10a267c67f42: Pull complete
fb5937da9414: Pull complete
9021b2326a1e: Pull complete
fc4739726e6e: Pull complete
7ad61ea15136: Pull complete
04b0f5cf120e: Pull complete
Digest: sha256:530343cd483dc3e1f62315a3b2382462584d548dd2d936f0378e24310bd67d2a
Status: Downloaded newer image for microsoft/dotnet:latest
root@caa9d2c42574:/#

위의 명령어를 실행하면 linux 내에 활성화된 container가 종료되지 않은 체, 마지막에 보는 것처럼 "root@..."와 같은 shell prompt가 뜹니다.

이 상태에서 다음과 같이 ".NET Core"용 Console 프로그램을 container 안에서 생성해 실행해 볼 수 있습니다.

root@caa9d2c42574:/# mkdir helloworld
root@caa9d2c42574:/# cd helloworld/
root@caa9d2c42574:/helloworld# dotnet new console
Content generation time: 50.326 ms
The template "Console Application" created successfully.
root@caa9d2c42574:/helloworld# dotnet restore
  Restoring packages for /helloworld/helloworld.csproj...
  Generating MSBuild file /helloworld/obj/helloworld.csproj.nuget.g.props.
  Generating MSBuild file /helloworld/obj/helloworld.csproj.nuget.g.targets.
  Writing lock file to disk. Path: /helloworld/obj/project.assets.json
  Restore completed in 418.38 ms for /helloworld/helloworld.csproj.

  NuGet Config files used:
      /root/.nuget/NuGet/NuGet.Config

  Feeds used:
      https://api.nuget.org/v3/index.json
root@caa9d2c42574:/helloworld# ls
Program.cs  helloworld.csproj  obj
root@caa9d2c42574:/helloworld# dotnet run
Hello World!
root@caa9d2c42574:/helloworld#

보는 바와 같이, 호스트의 환경에 전혀 영향을 주지 않으면서 빠르게 .NET Core 환경을 자유롭게 사용자 정의해 테스트해볼 수 있습니다.




그런데, 위의 실습에서 "exit" 명령어로 shell을 빠져나오면,

root@caa9d2c42574:/helloworld# exit
exit

c:\temp>

실행 중에 변경된 사항들이 전부 없어지게 됩니다. 확인을 위해 다시 "microsoft/dotnet" image로부터 새로운 컨테이너를 실행하는 경우 "helloworld" 콘솔 프로그램이 안 보입니다.

C:\temp>docker run --rm -it microsoft/dotnet:latest
root@ec9ab85d404b:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

왜냐하면, "docker run"과 함께 "--rm" 옵션을 주었기 때문에 컨테이너 내부의 프로세스가 종료되면 컨테이너 자체도 삭제되기 때문입니다. 따라서 "--rm" 옵션을 빼고 실행하는 경우,

C:\temp>docker run -it --name test microsoft/dotnet /bin/bash
root@50fe6dd91068:/# mkdir helloworld
root@50fe6dd91068:/# ls
bin  boot  dev  etc  helloworld  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@50fe6dd91068:/# exit
exit

exit로 종료했지만 "docker ps -a" 명령어로 살펴보면,

C:\temp>docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
50fe6dd91068        microsoft/dotnet    "/bin/bash"         6 minutes ago       Exited (0) 6 minutes ago                       test

/*
// 만약 exited인 컨테이너를 모두 삭제하고 싶다면,
[리눅스]
docker rm $(docker ps -a -f "status=exited" -q)

[윈도우]
FOR /F %i IN ('docker ps -a -f "status=exited" -q') do docker rm %i

// 또는, 모든 컨테이너를 삭제하고 싶다면,
[리눅스]
docker rm $(docker ps -a -q)

[윈도우]
FOR /F %i IN ('docker ps -a -q') do docker rm %i
*/

보는 바와 같이 container가 (삭제되지 않고) 종료만 된 상태임을 알 수 있고, 이를 "docker start" 명령어로 다시 실행한 후 "docker attach"로 연결할 수 있습니다.

C:\temp>docker start test
test

C:\temp>docker attach test
root@50fe6dd91068:/#
root@50fe6dd91068:/# ls
bin  boot  dev  etc  helloworld  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@50fe6dd91068:/# exit
exit

동일한 container이기 때문에 이번에는 "helloworld" 디렉터리가 존재합니다. 즉, 변화는 container 단위로만 유효하고 그 원본 이미지(예제에서는 microsoft/dotnet)는 영향이 없는 것입니다.

물론, 이러한 변화를 container 단위에 종속시키지 않고 지속하는 방법이 있습니다.

가령, helloworld 응용 프로그램을 container가 아닌 호스트 측에 생성하고, container가 실행될 때 호스트 측의 파일 시스템을 연결해 주는 방법이 있습니다. 잠시 실습을 해보면, 호스트 측의 c:\temp\helloworld 폴더에 helloworld 콘솔 프로젝트를 만들고,

C:\temp\helloworld>dotnet new console
Content generation time: 51.336 ms
The template "Console Application" created successfully.

C:\temp\helloworld>dotnet restore
  Restoring packages for C:\temp\helloworld\helloworld.csproj...
  Generating MSBuild file C:\temp\helloworld\obj\helloworld.csproj.nuget.g.props.
  Generating MSBuild file C:\temp\helloworld\obj\helloworld.csproj.nuget.g.targets.
  Writing lock file to disk. Path: C:\temp\helloworld\obj\project.assets.json
  Restore completed in 853.51 ms for C:\temp\helloworld\helloworld.csproj.

  NuGet Config files used:
      C:\Users\kevin\AppData\Roaming\NuGet\NuGet.Config
      C:\Program Files (x86)\NuGet\Config\Microsoft.VisualStudio.Offline.config

  Feeds used:
      https://api.nuget.org/v3/index.json
      C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\

C:\temp\helloworld>dotnet run
Hello World!

"microsoft/dotnet" 컨테이너를 실행할 때 이렇게 연결해 줄 수 있는데,

C:\temp\helloworld>docker run --rm -it -v /c/temp/helloworld:/app microsoft/dotnet:latest
docker: Error response from daemon: C: drive is not shared. Please share it in Docker for Windows Settings.
See 'docker run --help'.

에러가 나는군요. ^^ 이것은 "docker for windows"에게 host 측의 폴더를 연결하기 위해 명시적으로 해당 폴더를 포함한 드라이브에 대해 공유를 하겠다고 사전에 Settings를 통해 설정해 주어야 하기 때문입니다.

docker_shared_drive_1.png

이후, 다시 실행해 보면 정상적으로 host 측의 c:\temp\helloworld 폴더를 /app 경로로 접근할 수 있습니다.

C:\temp\helloworld>docker run --rm -it -v /c/temp/helloworld:/app microsoft/dotnet:latest
root@633cb764e304:/# ls
app  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@633cb764e304:/# cd app
root@633cb764e304:/app# ls
Program.cs  bin  helloworld.csproj  obj
root@633cb764e304:/app# dotnet restore
  Restoring packages for /app/helloworld.csproj...
  Generating MSBuild file /app/obj/helloworld.csproj.nuget.g.props.
  Writing lock file to disk. Path: /app/obj/project.assets.json
  Restore completed in 483.38 ms for /app/helloworld.csproj.

  NuGet Config files used:
      /root/.nuget/NuGet/NuGet.Config

  Feeds used:
      https://api.nuget.org/v3/index.json
root@633cb764e304:/app# dotnet run
Hello World!
root@633cb764e304:/app#

또한 container 실행 환경에서 /app 디렉터리를 변경하는 경우 그것은 그대로 호스트 측의 c:\temp\helloworld 폴더에 반영됩니다.

이렇게 data를 저장할 수 있는 storage를 Data volume이라고 하며 좀 더 자세한 사항은 다음의 문서에서 찾아볼 수 있습니다.

Manage data in containers
; https://docs.docker.com/engine/tutorials/dockervolumes/




-v 옵션을 통해 호스트 측의 폴더를 공유하는 방법 외에, 아예 애당초 기존 container에 변화를 반영해 새롭게 업데이트된 container를 만들 수 있습니다. 이 방법 역시 그다지 어렵지 않습니다. 다음의 내용으로 ".dockerfile" 확장자를 가진 파일을 만들어 줍니다.

FROM microsoft/dotnet
COPY . /app

이 정도의 .dockerfile 내용은 매우 직관적이군요. ^^ 즉, "microsoft/dotnet" 컨테이너를 소스로 현재 폴더의 내용을 새롭게 만들어질 container image의 /app 디렉터리로 복사를 하라는 의미입니다. 이 파일을 이용해 "docker build"를 다음과 같이 실행하면 "microsoft/dotnet" image에 "COPY ..." 명령이 적용된 "helloworld"라는 이름의 새로운 image가 생성됩니다.

C:\temp\helloworld>docker build -t helloworld -f helloworld.dockerfile .
Sending build context to Docker daemon 241.7 kB
Step 1/2 : FROM microsoft/dotnet
 ---> 6ca1a97bf17b
Step 2/2 : COPY . /app
 ---> 0abaf687b8b9
Removing intermediate container ab3a20afa915
Successfully built 0abaf687b8b9
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

따라서, 이제 -v 옵션 없이도 새롭게 생성된 container에서 만들어 두었던 helloworld 콘솔 프로그램을 곧바로 사용할 수 있습니다.

C:\temp\helloworld>docker run --rm -it helloworld
root@d751a0b807b1:/# cd app
root@d751a0b807b1:/app# dotnet run
Hello World!
root@d751a0b807b1:/app#

이 정도면 대충 어떻게 돌아가는지 감 잡으시겠죠? ^^




마지막으로 유용한 "Kitematic" 도구를 잠시 살펴보겠습니다.

"Docker for Windows" 덕분에 사실 윈도우 10의 "Bash on Ubuntu on Windows"가 그다지 필요하지 않을 정도입니다. 게다가 Linux용으로 제작된 숱한 응용 프로그램들이 포함된 docker container image들이 널려 있기 때문에 개발 환경이 더욱 편해지게 됩니다.

작업 표시줄의 시스템 트레이에 있는 "docker" 아이콘을 우클릭해 "Kitematic" 메뉴를 선택하면 "Kitematic" 응용 프로그램을 다운로드할 수 있습니다. "Kitematic-Windows.zip" 파일의 압축을 풀고 그 안에 있는 "Kitematic.exe"를 실행하기만 하면 다음과 같은 공개된 container image 목록을 열람할 수 있습니다.

docker_shared_drive_2.png

보기만 해도 행복하군요. ^^

또한, 현재 설치된 이미지도 확인할 수 있습니다.

docker_shared_drive_3.png

위의 목록에서 각 이미지마다 붙어 있는 "CREATE" 버튼을 누르면 "docker run" 명령어를 내린 것이 되어 해당 image로부터 container가 인스턴스화되어 실행됩니다. 또한 실행 및 중지된 컨테이너 목록도 확인할 수 있고, 실행 중인 경우 "EXEC" 버튼을 통해 interactive shell 화면으로 진입할 수도 있습니다.

docker_shared_drive_4.png

한마디로, Kitematic 덕분에 별다르게 docker 명령어를 알지 못해도 손쉬운 관리가 가능합니다.




참고로, "Docker Desktop.exe"가 수행하는 작업은 "%LOCALAPPDATA%\Docker\log.txt" 파일에 기록되며, 아래는 정상적으로 수행된 경우의 로그 내용을 보여줍니다.

Version: 2.2.0.3 (42716)
Channel: stable
Sha1: e11f25edf9f955239c922a0251699b23aaf37984
Started on: 2020/03/03 12:31:46.239
Resources: C:\Program Files\Docker\Docker\resources
OS: Windows Server 2019 Datacenter
Edition: ServerDatacenter
Id: 1809
Build: 17763
BuildLabName: 17763.1.amd64fre.rs5_release.180914-1434
File: C:\ProgramData\DockerDesktop\service.txt
CommandLine: "C:\Program Files\Docker\Docker\com.docker.service"
You can send feedback, including this log file, at https://github.com/docker/for-win/issues
[12:31:46.349][DockerService     ][Info   ] Starting service
[12:31:46.364][ComponentVersions ][Info   ] Edition community
[12:31:46.396][ComponentVersions ][Info   ] Edition community
[12:31:46.427][Linux             ][Info   ] Setting container engine status to Stopped
[12:31:46.427][WslEngine         ][Info   ] Setting container engine status to Stopped
[12:31:46.427][BackendNamedPipeServer][Info   ] Started
[12:31:48.366][NamedPipeServer   ][Info   ] app/version()
[12:31:48.382][NamedPipeServer   ][Info   ] app/version done in 00:00:00.0156370.
[12:31:48.382][NamedPipeServer   ][Info   ] app/migrate()
[12:31:48.382][NamedPipeServer   ][Info   ] app/migrate done in 00:00:00.
[12:31:48.397][NamedPipeServer   ][Info   ] app/version()
[12:31:48.397][NamedPipeServer   ][Info   ] app/version done in 00:00:00.
[12:31:48.397][NamedPipeServer   ][Info   ] version-packs/enable(community, Docker.Core.Settings)
[12:31:48.397][NamedPipeServer   ][Info   ] version-packs/enable done in 00:00:00.
[12:31:48.397][NamedPipeServer   ][Info   ] app/version()
[12:31:48.397][NamedPipeServer   ][Info   ] app/version done in 00:00:00.
[12:31:48.397][NamedPipeServer   ][Info   ] engine/start(Linux, Docker.Core.Settings, Docker.Core.DaemonOptions, )
[12:31:48.444][Linux             ][Info   ] Setting container engine status to Starting
[12:31:48.460][PowerShell        ][Info   ] Creating a Runspace Pool...
[12:31:48.649][PowerShell        ][Info   ] Runspace Pool created (Min=1, Max=2)
[12:31:48.805][PowerMode         ][Info   ] Stop
[12:31:48.805][HyperV            ][Info   ] Stop
[12:31:48.805][PowerShell        ][Info   ] Run script with parameters: -Stop True -VmName DockerDesktopVM -SwitchName DockerNAT -Verbose True -ErrorAction Stop
[12:31:49.176][GoBackendProcess  ][Info   ] ??http server started on \\.\pipe\dockerVpnKitControl
[12:31:49.176][GoBackendProcess  ][Info   ] time="2020-03-03T12:31:49+09:00" msg="started port-forwarding control server on \\\\.\\pipe\\dockerVpnKitControl"
[12:31:49.176][GoBackendProcess  ][Info   ] time="2020-03-03T12:31:49+09:00" msg="listening on unix:\\\\.\\pipe\\dockerVpnkitData for data connection"
[12:31:49.176][GoBackendProcess  ][Info   ] time="2020-03-03T12:31:49+09:00" msg="grpcfuseV2 feature-flag set so enabling FUSE cache invalidation and event injection"
[12:31:49.178][GoBackendProcess  ][Info   ] ??http server started on \\.\pipe\dockerBackendApiServer
[12:31:49.179][GoBackendProcess  ][Info   ] ??http server started on \\.\pipe\dockerBackendApiServerForGuest
[12:31:49.259][GoBackendProcess  ][Info   ] time="2020-03-03T12:31:49+09:00" msg="Adding filesystem export C:\\"
[12:31:49.259][GoBackendProcess  ][Info   ] time="2020-03-03T12:31:49+09:00" msg="Adding filesystem export D:\\"
[12:31:49.259][GoBackendProcess  ][Info   ] time="2020-03-03T12:31:49+09:00" msg="Adding filesystem export E:\\"
[12:31:49.259][GoBackendProcess  ][Info   ] time="2020-03-03T12:31:49+09:00" msg="Adding filesystem export F:\\"
[12:31:49.259][GoBackendProcess  ][Info   ] time="2020-03-03T12:31:49+09:00" msg="Adding filesystem export G:\\"
[12:31:49.259][GoBackendProcess  ][Info   ] time="2020-03-03T12:31:49+09:00" msg="enabling filesystem caching"
[12:31:49.259][GoBackendProcess  ][Info   ] time="2020-03-03T12:31:49+09:00" msg="enabling inotify event injection"
[12:31:49.259][GoBackendProcess  ][Info   ] time="2020-03-03T12:31:49+09:00" msg="filesystem exports are: C:\\ (2),D:\\ (3),E:\\ (4),F:\\ (5),G:\\ (6)"
[12:31:49.259][GoBackendProcess  ][Info   ] time="2020-03-03T12:31:49+09:00" msg="volume control server listening on \\\\.\\pipe\\dockerVolume"
[12:31:49.262][GoBackendProcess  ][Info   ] time="2020-03-03T12:31:49+09:00" msg="filesystem server listening on 00000000-0000-0000-0000-000000000000:00001003-facb-11e6-bd58-64006a7986d3"
[12:31:49.262][GoBackendProcess  ][Info   ] time="2020-03-03T12:31:49+09:00" msg="file ownership will be determined by the calling user (\"fake owner\" mode)"
[12:31:49.262][GoBackendProcess  ][Info   ] time="2020-03-03T12:31:49+09:00" msg="using mfsymlinks"
[12:31:50.417][HyperV            ][Info   ] VM DockerDesktopVM is stopped
[12:31:50.417][HyperV            ][Debug  ] [stop] took 00:00:01.6117682 to run
[12:31:50.417][OptimizeDisk      ][Info   ] Optimize
[12:31:50.417][PowerShell        ][Info   ] Run script...
[12:31:51.747][APIRequestLogger  ][Info   ] [98a14d05] <GoBackendClient start> GET http://localhost/features
[12:31:51.810][GoBackendProcess  ][Info   ] time="2020-03-03T12:31:51+09:00" msg="external: GET /features 200 \"\" \"\""
[12:31:51.837][APIRequestLogger  ][Info   ] [98a14d05] <GoBackendClient end> GET http://localhost/features -> 200 OK (took 75ms)
[12:31:51.880][VpnKitBridge      ][Info   ] Starting C:\Program Files\Docker\Docker\resources\vpnkit-bridge.exe --addr listen://00000000-0000-0000-0000-000000000000/000007CF-FACB-11E6-BD58-64006A7986D3 host
[12:31:51.880][VpnKitBridge      ][Info   ] Started
[12:31:51.880][HyperVGuids       ][Info   ] Installing GUIDs...
[12:31:51.880][PowerMode         ][Info   ] Start
[12:31:51.880][HyperVGuids       ][Info   ] GUIDs installed
[12:31:51.896][Firewall          ][Info   ] Removing all existing rules...
[12:31:51.896][HyperV            ][Info   ] Create
[12:31:51.912][HyperV            ][Info   ] filesharing does not need a Hyper-V NIC so omitting it
[12:31:51.916][PowerShell        ][Info   ] Run script with parameters: -Create True -VmName DockerDesktopVM -VhdPathOverride D:\docker\DockerDesktop.vhdx -VhdSize 63999836160 -SwitchSubnetAddress 10.0.75.0 -SwitchSubnetMaskSize 24 -PreferredIPAddress  -CPUs 2 -Memory 2048 -IsoFile C:\Program Files\Docker\Docker\resources\docker-desktop.iso -SwitchName  -Verbose True -ErrorAction Stop
[12:31:51.925][Firewall          ][Info   ] All existing rules are removed.
[12:31:51.925][Firewall          ][Info   ] Opening ports for SMB...
[12:31:51.933][VpnKitBridge      ][Info   ] time="2020-03-03T12:31:51+09:00" msg="listening on listen://00000000-0000-0000-0000-000000000000/000007CF-FACB-11E6-BD58-64006A7986D3..."
[12:31:51.936][VpnKitBridge      ][Info   ] time="2020-03-03T12:31:51+09:00" msg="waiting for connection on listen://00000000-0000-0000-0000-000000000000/000007CF-FACB-11E6-BD58-64006A7986D3..."
[12:31:51.936][Firewall          ][Info   ] Ports are opened
[12:31:53.312][HyperV            ][Info   ] Setting CPUs to 2 and Memory to 2048 MB
[12:31:53.624][HyperV            ][Info   ] Remove existing DVDs
[12:31:54.780][HyperV            ][Info   ] Attach DVD C:\Program Files\Docker\Docker\resources\docker-desktop.iso
[12:31:55.538][HyperV            ][Info   ] Disabled Guest Service Interface
[12:31:55.553][HyperV            ][Info   ] Enabled Heartbeat
[12:31:55.585][HyperV            ][Info   ] Disabled Key-Value Pair Exchange
[12:31:55.600][HyperV            ][Info   ] Enabled Shutdown
[12:31:55.616][HyperV            ][Info   ] Enabled Time Synchronization
[12:31:55.631][HyperV            ][Info   ] Disabled VSS
[12:31:55.757][HyperV            ][Info   ] VM created.
[12:31:55.757][HyperV            ][Debug  ] [create] took 00:00:03.8449903 to run
[12:31:55.757][PowerShell        ][Info   ] Run script '(Hyper-V\Get-VM DockerDesktopVM).Id.Guid'...
[12:31:55.788][IsoConfig         ][Info   ] Generating CA Cert Bundle
[12:31:55.819][IsoConfig         ][Info   ] CA Cert Bundle Generated
[12:31:55.946][HyperV            ][Info   ] Start
[12:31:55.946][PowerShell        ][Info   ] Run script with parameters: -Start True -VmName DockerDesktopVM -IsoFile C:\Program Files\Docker\Docker\resources\docker-desktop.iso -confIsoFile C:\ProgramData\DockerDesktop\tmp-d4w\config.iso -VhdPathOverride D:\docker\DockerDesktop.vhdx -DockerIsoFile C:\Program Files\Docker\Docker\resources\docker.iso -Verbose True -ErrorAction Stop
[12:31:55.993][HyperV            ][Info   ] Starting VM DockerDesktopVM...
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: Setting handler to ignore all SIGPIPE signals
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: Version is 218f01482560cba2fa863f9ad872ad51d1e717fc
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: System SOMAXCONN is 2147483647
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: Will use a listen backlog of 32
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: No periodic Gc.compact enabled
[12:31:56.024][VpnKit            ][Error  ] vpnkit.exe: Starting to watch : EINVAL
[12:31:56.024][VpnKit            ][Error  ] vpnkit.exe: Failed to watch hosts file : invalid argument
[12:31:56.024][VpnKit            ][Warning] vpnkit.exe: There is no database: using hardcoded network configuration values
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: DNS server configured with no builtin DNS names; everything will be forwarded
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: 2 upstream DNS servers are configured
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: Disabling transparent HTTP redirection
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: Updating resolvers to use host resolver
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: Secure random number generator is available
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: Add(3): DNS configuration changed to: use host resolver
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: DNS server configured with builtin DNS names [ gateway.docker.internal -> 192.168.65.1, docker.for.win.gateway.internal -> 192.168.65.1, docker.for.win.http.internal -> 192.168.65.1, host.docker.internal -> 192.168.65.2, docker.for.win.host.internal -> 192.168.65.2, docker.for.win.localhost -> 192.168.65.2, vm.internal -> 192.168.65.3 ]
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: Will use the host's DNS resolver
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: Transparent HTTP redirection configuration file %USERPROFILE%\AppData\Roaming\Docker\http_proxy.json has changed
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: Reading transparent HTTP redirection from %USERPROFILE%\AppData\Roaming\Docker\http_proxy.json
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: Watching transparent HTTP redirection configuration file %USERPROFILE%\AppData\Roaming\Docker\http_proxy.json for changes
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: New Gateway forward configuration: []
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: Gateway forwards file %USERPROFILE%\AppData\Roaming\Docker\gateway_forwards.json has changed
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: Reading gateway forwards file from %USERPROFILE%\AppData\Roaming\Docker\gateway_forwards.json
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: Watching gateway forwards file %USERPROFILE%\AppData\Roaming\Docker\gateway_forwards.json for changes
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: Configuration server_macaddr = f6:16:36:bc:f9:c6; max_connection = None; dns_path = None; dns = ; resolver = Host; domain = None; allowed_bind_addresses = 0.0.0.0; gateway_ip = 192.168.65.1; host_ip = 192.168.65.2; lowest_ip = 192.168.65.3; highest_ip = 192.168.65.14; dhcp_json_path = None; dhcp_configuration = None; mtu = 1500; http_intercept = None; http_intercept_path = %USERPROFILE%\AppData\Roaming\Docker\http_proxy.json; port_max_idle_time = 300; host_names = host.docker.internal, docker.for.win.host.internal, docker.for.win.localhost; gateway_names = gateway.docker.internal, docker.for.win.gateway.internal, docker.for.win.http.internal; vm_names = vm.internal; udpv4_forwards = []; tcpv4_forwards = []; gateway_forwards_path = %USERPROFILE%\AppData\Roaming\Docker\gateway_forwards.json; pcap_snaplen = 128
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: Updating transparent HTTP redirection: {
[12:31:56.024][VpnKit            ][Info   ]   "exclude": "",
[12:31:56.024][VpnKit            ][Info   ]   "transparent_http_ports": [
[12:31:56.024][VpnKit            ][Info   ]     80
[12:31:56.024][VpnKit            ][Info   ]   ],
[12:31:56.024][VpnKit            ][Info   ]   "transparent_https_ports": [
[12:31:56.024][VpnKit            ][Info   ]     443
[12:31:56.024][VpnKit            ][Info   ]   ]
[12:31:56.024][VpnKit            ][Info   ] }
[12:31:56.024][VpnKit            ][Info   ] vpnkit.exe: New Gateway forward configuration: [{"protocol":"udp","external_port":53,"internal_ip":"127.0.0.1","internal_port":55786},{"protocol":"tcp","external_port":53,"internal_ip":"127.0.0.1","internal_port":20042}]
[12:31:56.043][VpnKit            ][Error  ] vpnkit.exe: While watching /etc/resolv.conf: ENOENT
[12:31:56.119][HyperV            ][Info   ] Remove existing DVDs
[12:31:56.477][HyperV            ][Info   ] Attach DVD C:\Program Files\Docker\Docker\resources\docker-desktop.iso
[12:31:56.743][HyperV            ][Info   ] Attach Config ISO C:\ProgramData\DockerDesktop\tmp-d4w\config.iso
[12:31:57.302][HyperV            ][Info   ] Attach Docker ISO C:\Program Files\Docker\Docker\resources\docker.iso
[12:31:58.505][HyperV            ][Debug  ] [start] took 00:00:02.5588752 to run
[12:31:58.536][LifecycleClient   ][Info   ] Waiting for lifecycle-server for up to 00:10:00
[12:31:58.536][APIRequestLogger  ][Info   ] [98a14d05] <LifecycleClient start> GET http://localhost/ping
[12:31:58.628][ApiProxy          ][Info   ] time="2020-03-03T12:31:58+09:00" msg="?? socket server listening : \\\\.\\pipe\\dockerGuiToDriver"
[12:31:58.631][ApiProxy          ][Info   ] time="2020-03-03T12:31:58+09:00" level=info msg=waitForDockerUp
[12:31:58.631][ApiProxy          ][Info   ] time="2020-03-03T12:31:58+09:00" msg="?? socket server starting : \\\\.\\pipe\\dockerGuiToDriver"
[12:31:58.631][ApiProxy          ][Info   ] time="2020-03-03T12:31:58+09:00" msg="Static DNS lookup table: map[docker-desktop.:192.168.65.3 docker-for-desktop.:192.168.65.3 docker.for.win.gateway.internal.:192.168.65.1 docker.for.win.host.internal.:192.168.65.2 docker.for.win.http.internal.:192.168.65.1 docker.for.win.localhost.:192.168.65.2 gateway.docker.internal.:192.168.65.1 host.docker.internal.:192.168.65.2 kubernetes.docker.internal.:192.168.65.3 vm.docker.internal.:192.168.65.3]"
[12:31:58.632][ApiProxy          ][Info   ] time="2020-03-03T12:31:58+09:00" msg="Writing %USERPROFILE%\\AppData\\Roaming\\Docker\\gateway_forwards.json"
[12:32:01.044][VpnKit            ][Info   ] vpnkit.exe: Gateway forwards file %USERPROFILE%\AppData\Roaming\Docker\gateway_forwards.json has changed
[12:32:01.044][VpnKit            ][Info   ] vpnkit.exe: Reading gateway forwards file from %USERPROFILE%\AppData\Roaming\Docker\gateway_forwards.json
[12:32:01.044][VpnKit            ][Info   ] vpnkit.exe: New Gateway forward configuration: [{"protocol":"udp","external_port":53,"internal_ip":"127.0.0.1","internal_port":64979},{"protocol":"tcp","external_port":53,"internal_ip":"127.0.0.1","internal_port":20136}]
[12:32:03.184][VpnKitBridge      ][Info   ] time="2020-03-03T12:32:03+09:00" msg="connected!"
[12:32:03.197][VpnKitBridge      ][Info   ] time="2020-03-03T12:32:03+09:00" msg="Proxy docker: waiting for remote service to be available"
[12:32:03.197][VpnKitBridge      ][Info   ] time="2020-03-03T12:32:03+09:00" msg="Proxy log: waiting for remote service to be available"
[12:32:03.197][VpnKitBridge      ][Info   ] time="2020-03-03T12:32:03+09:00" msg="Proxy lifecycle-server: waiting for remote service to be available"
[12:32:03.198][VpnKitBridge      ][Info   ] time="2020-03-03T12:32:03+09:00" msg="Proxy diagnosticd: waiting for remote service to be available"
[12:32:03.198][VpnKitBridge      ][Info   ] time="2020-03-03T12:32:03+09:00" msg="Proxy filesystem-event: waiting for remote service to be available"
[12:32:03.198][VpnKitBridge      ][Info   ] time="2020-03-03T12:32:03+09:00" msg="Proxy wsl2-bootstrap-expose-ports: waiting for remote service to be available"
[12:32:03.214][VpnKitBridge      ][Info   ] time="2020-03-03T12:32:03+09:00" msg="cannot find service \"ssh-auth\""
[12:32:03.222][VpnKitBridge      ][Info   ] time="2020-03-03T12:32:03+09:00" msg="received ack for service log, publishing locally"
[12:32:03.262][VpnKit            ][Error  ] vpnkit.exe: Pipe.listen: caught (Failure "Failed to connect vmnet device")
[12:32:03.288][GoBackendProcess  ][Info   ] time="2020-03-03T12:32:03+09:00" msg="accepted data connection on unix:\\\\.\\pipe\\dockerVpnkitData"
[12:32:03.288][GoBackendProcess  ][Error  ] time="2020-03-03T12:32:03+09:00" msg="error accepting multiplexer data connection: EOF"
[12:32:03.288][GoBackendProcess  ][Info   ] time="2020-03-03T12:32:03+09:00" msg="listening on unix:\\\\.\\pipe\\dockerVpnkitData for data connection"
[12:32:38.336][VpnKitBridge      ][Info   ] time="2020-03-03T12:32:38+09:00" msg="received ack for service diagnosticd, publishing locally"
[12:32:39.632][GoBackendProcess  ][Info   ] time="2020-03-03T12:32:39+09:00" msg="internal: GET /ping 200 \"Go-http-client/1.1\" \"\""
[12:32:39.634][GoBackendProcess  ][Info   ] time="2020-03-03T12:32:39+09:00" msg="internal: GET /goos 200 \"Go-http-client/1.1\" \"\""
[12:32:39.962][GoBackendProcess  ][Info   ] time="2020-03-03T12:32:39+09:00" msg="internal: POST /events 200 \"Go-http-client/1.1\" \"\""
[12:32:40.321][VpnKitBridge      ][Info   ] time="2020-03-03T12:32:40+09:00" msg="received ack for service filesystem-event, publishing locally"
[12:32:40.358][VpnKitBridge      ][Info   ] time="2020-03-03T12:32:40+09:00" msg="received ack for service lifecycle-server, publishing locally"
[12:32:40.384][APIRequestLogger  ][Info   ] [98a14d05] <LifecycleClient end> GET http://localhost/ping -> 200 OK (took 41842ms)
[12:32:40.411][LifecycleClient   ][Info   ] Lifecycle-server is responding.
[12:32:40.418][Linux             ][Info   ] All drives mounted, starting the Docker engine
[12:32:40.419][APIRequestLogger  ][Info   ] [98a14d05] <LifecycleClient start> GET http://localhost/docker/start
[12:32:40.433][GoBackendProcess  ][Info   ] time="2020-03-03T12:32:40+09:00" msg="internal: GET /engine/daemon.json 200 \"Go-http-client/1.1\" \"\""
[12:32:40.439][APIRequestLogger  ][Info   ] [98a14d05] <LifecycleClient end> GET http://localhost/docker/start -> 200 OK (took 20ms)
[12:32:40.439][Linux             ][Info   ] Docker engine is starting
[12:32:41.316][VpnKit            ][Info   ] vpnkit.exe: Vmnet.Server.negotiate: received { magic = VMN3T; version = 22; commit =                                          }
[12:32:41.318][VpnKit            ][Info   ] vpnkit.exe: Generated UUID on behalf of client: e0075240-54d7-4e3c-a775-099bfa0879f4
[12:32:41.318][VpnKit            ][Info   ] vpnkit.exe: Vmnet.Server.negotiate: received Ethernet e0075240-54d7-4e3c-a775-099bfa0879f4
[12:32:41.318][VpnKit            ][Info   ] vpnkit.exe: Vmnet.Server.negotiate: sending { mtu = 1500; max_packet_size = 1550; client_macaddr = 02:50:00:00:00:01 }
[12:32:41.318][VpnKit            ][Info   ] vpnkit.exe: Vmnet.Server.listen: rebinding the primary listen callback
[12:32:41.318][VpnKit            ][Info   ] vpnkit.exe: Vmnet.Server.listen: starting event loop
[12:32:41.318][VpnKit            ][Info   ] vpnkit.exe: Connected Ethernet interface f6:16:36:bc:f9:c6
[12:32:41.319][VpnKit            ][Info   ] vpnkit.exe: Client mac: 02:50:00:00:00:01 server mac: f6:16:36:bc:f9:c6
[12:32:41.319][VpnKit            ][Info   ] vpnkit.exe: TCP/IP ready
[12:32:41.319][VpnKit            ][Info   ] vpnkit.exe: TCP/IP stack connected
[12:32:41.319][VpnKit            ][Info   ] vpnkit.exe: Starting diagnostics server on: \\.\pipe\dockerVpnKitDiagnostics
[12:32:41.646][GoBackendProcess  ][Info   ] time="2020-03-03T12:32:41+09:00" msg="accepted data connection on unix:\\\\.\\pipe\\dockerVpnkitData"
[12:32:41.646][GoBackendProcess  ][Info   ] time="2020-03-03T12:32:41+09:00" msg="established connection to vpnkit-forwarder"
[12:32:42.016][GoBackendProcess  ][Info   ] time="2020-03-03T12:32:42+09:00" msg="internal: POST /events 200 \"Go-http-client/1.1\" \"\""
[12:32:44.790][VpnKitBridge      ][Info   ] time="2020-03-03T12:32:44+09:00" msg="received ack for service docker, publishing locally"
[12:32:48.836][VpnKit            ][Info   ] vpnkit.exe: Connected Ethernet interface f6:16:36:bc:f9:c6
[12:32:48.837][VpnKit            ][Info   ] vpnkit.exe: UDP interface connected on 192.168.65.1
[12:32:48.841][ApiProxy          ][Info   ] time="2020-03-03T12:32:48+09:00" msg="Docker is responding"
[12:32:48.855][NamedPipeServer   ][Info   ] app/version()
[12:32:48.855][NamedPipeServer   ][Info   ] app/version done in 00:00:00.
[12:32:48.856][NamedPipeServer   ][Info   ] engine/notify-linux-status(DaemonStarted)
[12:32:48.856][Linux             ][Info   ] Setting container engine status to DaemonStarted
[12:32:48.856][NamedPipeServer   ][Info   ] engine/notify-linux-status done in 00:00:00.
[12:32:48.857][GoBackendProcess  ][Info   ] time="2020-03-03T12:32:48+09:00" msg="internal: POST /events 200 \"Go-http-client/1.1\" \"\""
[12:32:48.955][ApiProxy          ][Info   ] time="2020-03-03T12:32:48+09:00" msg="proxy >> HEAD /_ping\n"
[12:32:48.957][ApiProxy          ][Info   ] time="2020-03-03T12:32:48+09:00" msg="proxy << HEAD /_ping (1.0038ms)\n"
[12:32:48.968][ApiProxy          ][Info   ] time="2020-03-03T12:32:48+09:00" msg="proxy >> GET /v1.40/containers/json\n"
[12:32:48.972][ApiProxy          ][Info   ] time="2020-03-03T12:32:48+09:00" msg="proxy << GET /v1.40/containers/json (3.9988ms)\n"
[12:32:48.976][DockerDaemonChecker][Info   ] Docker daemon is running
[12:32:48.976][Linux             ][Info   ] Setting container engine status to Started
[12:32:48.976][NamedPipeServer   ][Info   ] engine/start done in 00:01:00.5785086.
[12:32:49.104][ApiProxy          ][Info   ] time="2020-03-03T12:32:49+09:00" msg="proxy >> HEAD /_ping\n"
[12:32:49.105][ApiProxy          ][Info   ] time="2020-03-03T12:32:49+09:00" msg="proxy << HEAD /_ping (996.9μs)\n"
[12:32:49.129][ApiProxy          ][Info   ] time="2020-03-03T12:32:49+09:00" msg="proxy >> GET /v1.40/info\n"
[12:32:49.140][ApiProxy          ][Info   ] time="2020-03-03T12:32:49+09:00" msg="proxy << GET /v1.40/info (10.0008ms)\n"
[12:32:49.423][ApiProxy          ][Info   ] time="2020-03-03T12:32:49+09:00" msg="proxy >> HEAD /_ping\n"
[12:32:49.436][ApiProxy          ][Info   ] time="2020-03-03T12:32:49+09:00" msg="proxy << HEAD /_ping (13.1305ms)\n"
[12:32:49.456][ApiProxy          ][Info   ] time="2020-03-03T12:32:49+09:00" msg="proxy >> GET /v1.40/version\n"
[12:32:49.474][ApiProxy          ][Info   ] time="2020-03-03T12:32:49+09:00" msg="proxy << GET /v1.40/version (17.8667ms)\n"
[12:32:49.511][NamedPipeServer   ][Info   ] app/version()
[12:32:49.511][NamedPipeServer   ][Info   ] app/version done in 00:00:00.
[12:32:49.512][NamedPipeServer   ][Info   ] filesharing/get-protocol()
[12:32:49.512][APIRequestLogger  ][Info   ] [e7f71779] <GoBackendClient start> GET http://localhost/features
[12:32:49.513][GoBackendProcess  ][Info   ] time="2020-03-03T12:32:49+09:00" msg="external: GET /features 200 \"\" \"\""
[12:32:49.517][APIRequestLogger  ][Info   ] [e7f71779] <GoBackendClient end> GET http://localhost/features -> 200 OK (took 5ms)
[12:32:49.517][NamedPipeServer   ][Info   ] filesharing/get-protocol done in 00:00:00.0051065.
[12:32:49.610][ApiProxy          ][Info   ] time="2020-03-03T12:32:49+09:00" msg="proxy >> HEAD /_ping\n"
[12:32:49.612][ApiProxy          ][Info   ] time="2020-03-03T12:32:49+09:00" msg="proxy << HEAD /_ping (1.9974ms)\n"
[12:32:49.621][ApiProxy          ][Info   ] time="2020-03-03T12:32:49+09:00" msg="proxy >> GET /v1.40/info\n"
[12:32:49.635][ApiProxy          ][Info   ] time="2020-03-03T12:32:49+09:00" msg="proxy << GET /v1.40/info (13.9948ms)\n"
[12:32:49.920][ApiProxy          ][Info   ] time="2020-03-03T12:32:49+09:00" msg="proxy >> HEAD /_ping\n"
[12:32:49.922][ApiProxy          ][Info   ] time="2020-03-03T12:32:49+09:00" msg="proxy << HEAD /_ping (2.0121ms)\n"
[12:32:49.932][ApiProxy          ][Info   ] time="2020-03-03T12:32:49+09:00" msg="proxy >> GET /v1.40/version\n"
[12:32:49.941][ApiProxy          ][Info   ] time="2020-03-03T12:32:49+09:00" msg="proxy << GET /v1.40/version (8.9985ms)\n"




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 8/4/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2017-05-24 02시37분
docker 가 윈도우에서 사용 가능해져서 참 좋은 것 같습니다. MSSQL 같은 서비스를 바로 컨테이너 생성으로 가볍게 사용할 수 있...지는 않지만(이미지가 너무 커서 장난 아니죠^^) 가볍지는 않아도 독립적으로 컨테이너 구성하는 것의 편리함을 마이크로소프트 기반 플랫폼에서 누릴 수 있어서 다행이라고 생각합니다.
Beren Ko
2017-05-24 04시22분
아쉬운대로 다음의 이미지를 쓰면 되지 않을까요? ^^

Official images for Microsoft SQL Server on Linux for Docker Engine.
; https://hub.docker.com/r/microsoft/mssql-server-linux/
정성태
2017-05-24 04시52분
네. MSSQL은 리눅스용 정식버전을 기다리고 있습니다.
MSSQL 뿐만 아니라 윈도우 기반 이미지들은 어쩔 수 없이 Windows Core의 10 GiB 가량 되는 이미지를 기본으로 구성해야 해서 아쉽네요.
NANO는 1 GiB 정도의 상대적으로 가벼운 크기이지만 풀패키지가 아니라서 좀 아쉽기도 하네요.
MS가 이러한 부분을 개선을 할지 아니면 쭈욱 이렇게 진행될지 기다려봐야할 것 같습니다.
Beren Ko
2017-11-22 01시00분
(아직 베타 버전이지만) WSL의 지원으로 Windows 10에서는 Hyper-V를 통한 MobyLinuxVM이 아닌, 순수 "Linux Container"로써 동작시킬 수 있습니다.

Docker and Linux Containers on Windows, with or without Hyper-V Virtual Machines
; https://www.hanselman.com/blog/docker-and-linux-containers-on-windows-with-or-without-hyperv-virtual-machines
정성태
2019-05-14 09시25분
Docker(container)의 작동 원리: namespaces and cgroups
; https://tech.ssut.me/what-even-is-a-container/
정성태
2021-02-17 09시56분
Azure에서 k8s의 사용 환경을 얼마나 쉽게 구성했는지 다음의 동영상 강좌를 보시면 감이 오실 것입니다. ^^

AKS 활용법 101 | ep0. 인트로 | 애저듣보잡
; https://www.youtube.com/watch?v=q-x3k5W-duU

AKS 활용법 101 | ep1. Container 그리고 Docker | 애저듣보잡
; https://www.youtube.com/watch?v=fCVPp-g9Ti4

AKS 활용법 101 | ep2. Kubernetes | 애저듣보잡
; https://www.youtube.com/watch?v=JHtO3kKajhk

AKS 활용법 101 | ep3. Azure Kubernetes Service | 애저듣보잡
; https://www.youtube.com/watch?v=osSCQgWM4GQ

AKS 활용법 101 | ep4. Azure Container Registry 만들기 | 애저듣보잡
; https://www.youtube.com/watch?v=00zuAgVhTAQ

    일반적인 docker 이미지 만들듯이 만든 후, Azure Container Registry에 해당 이미지를 등록

    자습서: AKS(Azure Kubernetes Service)에 대한 애플리케이션 준비
    ; https://docs.microsoft.com/ko-kr/azure/aks/tutorial-kubernetes-prepare-app


    이때 ACR은 Azure에서 여타 다른 리소스 생성하듯이 리소스 그룹 하위에 만들어 주면 됨.
    그럼 해당 ACR에 "[사용자지정].azurecr.io"와 같은 식의 DNS로 접근 가능

    docker login "[사용자지정].azurecr.io" 명령을 내리면 /home/[user_name]/.docker/config.json 파일에 로그인 정보를 보관

    docker tag [이미지이름] [사용자지정].azurecr.io/[이미지이름]
    docker push [사용자지정].azurecr.io/[이미지이름]


AKS 활용법 101 | ep5. Azure Kubernetes Cluster 만들기 | 애저듣보잡
; https://www.youtube.com/watch?v=uXyDK2tZaPk
    Kubernetes Cluster 만들기로 여타 다른 리소스 생성하듯이 리소스 그룹 하위에 만들어 주면 됨.

    클러스터를 만들면서 워커 노드에 사용할 VM의 종류와 풀의 개수를 선택
    이때 노드 풀 역시 다중으로 추가 가능

AKS 활용법 101 | ep6. Application 배포하기 | 애저듣보잡
; https://www.youtube.com/watch?v=-kVXhaf_as8

    az account set --subscription [구독ID]
    az aks get-credentials --resource-group [리소스그룹이름] --name [클러스터이름]
        /home/[user_name]/.kube/config에 인증 정보 저장

    kubectl get nodes
    ...클러스터를 만들면서 지정한 워커 노드 수만큼 출력...

    AKS에 배포하기 위한 yaml 파일을 만들고, "kubectl apply -f [yaml파일명]" 명령어로 배포

    kubectl get pods
    ...[배포한컨테이너]...
    kubectl get svc
    ...[배포한서비스]...

    kubectl autoscale deployment --max=10 [컨테이너] --min=3

    az container create -g [리소스그룹이름] -n [로드테스트이름] --image azch/loadtest -e SERVICE_ENDPOINT=http://...[부하대상IP]... --restart-policy Never --no-wait

    kubectl get hpa

AKS 활용법 101 | ep7. 배포된 Application 모니터링하기 | 애저듣보잡
; https://www.youtube.com/watch?v=eG_Fbps4rnI

AKS 활용법 101 | ep8. 클로징 | 애저듣보잡
; https://www.youtube.com/watch?v=mN8jDFD5mas
정성태
2021-03-27 03시45분
정성태

[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13838정성태12/4/2024598오류 유형: 935. Windbg - Breakpoint 0's offset expression evaluation failed.
13837정성태12/3/2024595디버깅 기술: 204. Windbg - 윈도우 핸들 테이블 (3) - Windows 10 이상인 경우
13836정성태12/3/2024746디버깅 기술: 203. Windbg - x64 가상 주소를 물리 주소로 변환 (페이지 크기가 2MB인 경우)
13835정성태12/2/2024898오류 유형: 934. Azure - rm: cannot remove '...': Directory not empty
13834정성태11/29/20241043Windows: 275. C# - CUI 애플리케이션과 Console 윈도우 (Windows 10 미만의 Classic Console 모드인 경우)파일 다운로드1
13833정성태11/29/20241036개발 환경 구성: 737. Azure Web App에서 Scale-out으로 늘어난 리눅스 인스턴스에 SSH 접속하는 방법
13832정성태11/27/20241090Windows: 274. Windows 7부터 도입한 conhost.exe
13831정성태11/27/2024956Linux: 111. eBPF - BPF_MAP_TYPE_PERF_EVENT_ARRAY, BPF_MAP_TYPE_RINGBUF에 대한 다양한 용어들
13830정성태11/25/20241049개발 환경 구성: 736. 파이썬 웹 앱을 Azure App Service에 배포하기
13829정성태11/25/20241006스크립트: 67. 파이썬 - Windows 버전에서 함께 설치되는 py.exe
13828정성태11/25/20241026개발 환경 구성: 735. Azure - 압축 파일을 이용한 web app 배포 시 디렉터리 구분이 안 되는 문제파일 다운로드1
13827정성태11/25/20241096Windows: 273. Windows 환경의 파일 압축 방법 (tar, Compress-Archive)
13826정성태11/21/20241154닷넷: 2313. C# - (비밀번호 등의) Console로부터 입력받을 때 문자열 출력 숨기기(echo 끄기)파일 다운로드1
13825정성태11/21/20241124Linux: 110. eBPF / bpf2go - BPF_RINGBUF_OUTPUT / BPF_MAP_TYPE_RINGBUF 사용법
13824정성태11/20/20241063Linux: 109. eBPF / bpf2go - BPF_PERF_OUTPUT / BPF_MAP_TYPE_PERF_EVENT_ARRAY 사용법
13823정성태11/20/20241061개발 환경 구성: 734. Ubuntu에 docker, kubernetes (k3s) 설치
13822정성태11/20/20241024개발 환경 구성: 733. Windbg - VirtualBox VM의 커널 디버거 연결 시 COM 포트가 없는 경우
13821정성태11/18/20241149Linux: 108. Linux와 Windows의 프로세스/스레드 ID 관리 방식
13820정성태11/18/20241106VS.NET IDE: 195. Visual C++ - C# 프로젝트처럼 CopyToOutputDirectory 항목을 추가하는 방법
13819정성태11/15/20241101Linux: 107. eBPF - libbpf CO-RE의 CONFIG_DEBUG_INFO_BTF 빌드 여부에 대한 의존성
13818정성태11/15/20241194Windows: 272. Windows 11 24H2 - sudo 추가
13817정성태11/14/20241079Linux: 106. eBPF / bpf2go - (BPF_MAP_TYPE_HASH) Map을 이용한 전역 변수 구현
13816정성태11/14/20241137닷넷: 2312. C#, C++ - Windows / Linux 환경의 Thread Name 설정파일 다운로드1
13815정성태11/13/20241079Linux: 105. eBPF - bpf2go에서 전역 변수 설정 방법
13814정성태11/13/20241193닷넷: 2311. C# - Windows / Linux 환경에서 Native Thread ID 가져오기파일 다운로드1
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...