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

간단하게 살펴보는 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/

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

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

C:\Users\Public\Documents\Hyper-V\Virtual hard disks\MobyLinuxVM.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

보는 바와 같이 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"




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

[연관 글]





[최초 등록일: ]
[최종 수정일: 3/8/2020 ]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer@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/DockerAndLinuxContainersOnWindowsWithOrWithoutHyperVVirtualMachines.aspx
정성태
2019-05-14 09시25분
Docker(container)의 작동 원리: namespaces and cgroups
; https://tech.ssut.me/what-even-is-a-container/
정성태

... [46]  47  48  49  50  51  52  53  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
11240정성태7/7/20176628.NET Framework: 665. ClickOnce를 웹 브라우저를 이용하지 않고 쿼리 문자열을 전달하면서 실행하는 방법 [3]파일 다운로드1
11239정성태8/3/20206448.NET Framework: 664. Protocol Handler - 웹 브라우저에서 데스크톱 응용 프로그램을 실행하는 방법파일 다운로드1
11238정성태7/6/20175858오류 유형: 405. NT 서비스 시작 시 "Error 1067: The process terminated unexpectedly." 오류 발생 [2]
11237정성태7/5/20175587.NET Framework: 663. C# - PDB 파일 경로를 PE 파일로부터 얻는 방법파일 다운로드1
11236정성태7/4/20175976.NET Framework: 662. C# - VHD/VHDX 가상 디스크를 마운트하지 않고 파일을 복사하는 방법파일 다운로드1
11235정성태6/29/20176216Math: 20. Matlab/Octave로 Gram-Schmidt 정규 직교 집합 구하는 방법
11234정성태6/29/20173949오류 유형: 404. SharePoint 2013 설치 과정에서 "The username is invalid The account must be a valid domain account" 오류 발생
11233정성태6/28/20174095오류 유형: 403. SharePoint Server 2013을 Windows Server 2016에 설치할 때 .NET 4.5 설치 오류 발생
11232정성태6/28/20174265Windows: 144. Windows Server 2016에 Windows Identity Extensions을 설치하는 방법
11231정성태6/28/20175476디버깅 기술: 86. windbg 의 mscordacwks DLL 로드 문제 - 세 번째 이야기 [1]
11230정성태6/28/20174241제니퍼 .NET: 26. 제니퍼 닷넷 적용 사례 (6) - 잦은 Recycle 문제
11229정성태6/27/20174391오류 유형: 402. Windows Server Backup 관리 콘솔이 없어진 경우
11228정성태6/26/20174521개발 환경 구성: 320. Visual Basic .NET 프로젝트에서 내장 Manifest 자원을 EXE 파일로부터 제거하는 방법파일 다운로드1
11227정성태9/21/20209211개발 환경 구성: 319. windbg에서 python 스크립트 실행하는 방법 - pykd [5]
11226정성태6/19/20174817오류 유형: 401. Microsoft Edge를 실행했는데 입력 반응이 없는 경우
11225정성태6/19/20174686오류 유형: 400. Outlook - The required file ExSec32.dll cannot be found in your path. Install Microsoft Outlook again.
11224정성태6/13/20174684.NET Framework: 661. Json.NET의 DeserializeObject 수행 시 속성 이름을 동적으로 바꾸는 방법파일 다운로드1
11223정성태8/2/20174212개발 환경 구성: 318. WCF Service Application과 WCFTestClient.exe
11222정성태6/10/20175723오류 유형: 399. WCF - A property with the name 'UriTemplateMatchResults' already exists.파일 다운로드1
11221정성태6/10/20174429오류 유형: 398. Fakes - Assembly 'Jennifer5.Fakes' with identity '[...].Fakes, [...]' uses '[...]' which has a higher version than referenced assembly '[...]' with identity '[...]'
11220정성태6/10/20176339.NET Framework: 660. Shallow Copy와 Deep Copy [1]파일 다운로드2
11219정성태6/7/20175110.NET Framework: 659. 닷넷 - TypeForwardedFrom / TypeForwardedTo 특성의 사용법
11218정성태6/1/20176658개발 환경 구성: 317. Hyper-V 내의 VM에서 다시 Hyper-V를 설치: Nested Virtualization
11217정성태6/1/20174539오류 유형: 397. initerrlog: Could not open error log file 'C:\...\MSSQL12.MSSQLSERVER\MSSQL\Log\ERRORLOG'
11216정성태6/1/20175327오류 유형: 396. Activation context generation failed
11215정성태6/1/20175617오류 유형: 395. 관리 콘솔을 실행하면 "This app has been blocked for your protection" 오류 발생 [1]
... [46]  47  48  49  50  51  52  53  54  55  56  57  58  59  60  ...