Docker for Windows 설치 및 문제 해결



Docker for Windows를 사용하면서 경험한 문제를 공유한다.
해결 방법을 정리하니 문제가 많지도 않고 해결 방법도 간단하지만 문제를 해결하는 과정은 쉽지 않았다.

목차

1. Docker 설치
2. Docker 삭제
3. Docker Toolbox부터 제거하자.
4. 메서드를 호출할 수 없습니다.
5. 컴퓨터의 vmms 서비스를 열 수 없습니다.
6. 컴퓨터의 개체에 액세스하는 동안 오류가 발생
7. Git Bash에서 docker exec 명령어 실행이 안되는 경우
8. 컨테이너 실행 시 권한 오류
9. 컨테이너 실행 시 마운트 오류
10. 컨테이너 실행 시 권한 오류
11. DockerNet 가상 네트워크
마무리
함께보기

1. Docker 설치


Docker 공식 사이트에서 설치 파일 다운로드가 가능하지만 Docker 로그인 후 가능하다.
직접 다운로드 링크는 https://download.docker.com/win/stable/Docker for Windows Installer.exe 주소다.

설치 파일을 다운로드 후 더블 클릭하여 쉽게 설치가 가능하므로 추가 설명은 생략한다.

2. Docker 삭제

Windows Key + X 누른 후 N를 눌러 "설정(N)" 실행하고 "앱" 클릭하여 프로그램을 삭제한다.
(혹은 Windows Key + S 누른 후 "프로그램 추가/제거" 입력한 결과로 "앱" 실행이 가능하다.)

3. Docker Toolbox부터 제거하자.

Docker for Windows 사용 전에 Docker Toolbox를 사용했다면 충돌이 발생한다.
반드시 프로그램 제거를 통해 제거 후 아래 2가지를 추가로 수행하여 깔끔하게 제거되도록 한다.

만약 제거하지 않는다면 아래와 같은 문제가 발생한다.
docker images
could not read CA certificate "C:\\Users\\PC_이름\\.docker\\machine\\machines\\default\\ca.pem": open C:\Users\PC_이름\.docker\machine\machines\default\ca.pem:
The system cannot find the path specified.

아래 방법으로 해결하자.
1️⃣ C:\Users\PC_이름\.docker 디렉토리를 삭제
2️⃣ 환경변수 삭제
Docker Toolbox를 제거했어도 환경변수는 직접 제거해야 한다.
Windows Key + X 누른 후 A를 눌러 "명령 프롬프트(관리자)"를 실행하여 아래 명령어로 Docker Toolbox에서 사용하는 환경변수를 모두 제거 후 PC 재부팅하자.
powershell [Environment]::SetEnvironmentVariable('DOCKER_CERT_PATH', $null, 'User')
powershell [Environment]::SetEnvironmentVariable('DOCKER_HOST', $null, 'User')
powershell [Environment]::SetEnvironmentVariable('DOCKER_MACHINE_NAME', $null, 'User')
powershell [Environment]::SetEnvironmentVariable('DOCKER_TLS_VERIFY', $null, 'User')
powershell [Environment]::SetEnvironmentVariable('DOCKER_TOOLBOX_INSTALL_PATH', $null, 'User')

4. 메서드를 호출할 수 없습니다.

Docker가 실행되지 않고 "메서드를 호출할 수 없습니다. 메서드 호출은 이 언어 모드의 핵심 유형에 대해서만 지원됩니다." 오류가 발생했다면 참고하자.

4.1. 오류 메시지 샘플

[NamedPipeServer][Error  ] Unable to execute Start: Unable to stop: 메서드를 호출할 수 없습니다. 메서드 호출은 이 언어 모드의 핵심 유형에 대해서만 지원됩니다.
위치: , <파일 없음>: 72번째 줄    위치: Docker.Backend.HyperV.RunScript(String action, Dictionary`2 parameters) 파일 C:\workspaces\stable-18.09.x\src\github.com\docker\pinata\win\src\Docker.Backend\HyperV.cs:줄 195
   위치: Docker.Backend.ContainerEngine.Linux.DoStop() 파일 C:\workspaces\stable-18.09.x\src\github.com\docker\pinata\win\src\Docker.Backend\ContainerEngine\Linux.cs:줄 351
   위치: Docker.Backend.ContainerEngine.Linux.Start(Settings settings, String daemonOptions) 파일 C:\workspaces\stable-18.09.x\src\github.com\docker\pinata\win\src\Docker.Backend\ContainerEngine\Linux.cs:줄 115
[09:21:25.646][NamedPipeClient][Error  ] Unable to send Start: Unable to stop: 메서드를 호출할 수 없습니다. 메서드 호출은 이 언어 모드의 핵심 유형에 대해서만 지원됩니다.
위치: , <파일 없음>: 72번째 줄
[09:21:25.646][Notifications  ][Error  ] Unable to stop: 메서드를 호출할 수 없습니다. 메서드 호출은 이 언어 모드의 핵심 유형에 대해서만 지원됩니다.
위치: , <파일 없음>: 72번째 줄

Docker for Windows 실행 과정에서 PowerShell를 이용하는 부분이 문제다.
PowerShell 보안 설정으로 스크립트를 실행 못하는 것으로 아래 방법을 통해서 해결하자.

4.2. PowerShell 설정 확인 방법

1️⃣ 설정 확인 첫번째
PowerShell 명령어: $ExecutionContext.SessionState.LanguageMode
기대 결과: FullLanguage
오류 메시지: ConstrainedLanguage

2️⃣ 설정 확인 두번째
PowerShell 명령어: [System.Console]::WriteLine("Hello")
기대 결과: Hello
오류 메시지:
Cannot invoke method. Method invocation is supported only on core types in this language mode.
At line:1 char:1 + [System.Console]::WriteLine("Hello")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    
+ CategoryInfo          : InvalidOperation: (:) [], RuntimeException    
+ FullyQualifiedErrorId : MethodInvocationNotSupportedInConstrainedLanguage

4.3. PowerShell를 이용한 해결

1️⃣ Windows Key + X 누른 후 A를 눌러 "명령 프롬프트(관리자)"를 실행하여 아래 명령어 입력
powershell [Environment]::SetEnvironmentVariable('__PSLockdownPolicy', $null,'Machine')

4.4. 레지스트리 편집기를 이용한 해결

1️⃣ Windows Key + R 누른 후 실행 창에 regedit 입력하여 "레지스트리 편집기"를 실행
2️⃣ "레지스트리 편집기"에서 아래 위치로 이동
컴퓨터\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
3️⃣ __PSLockdownPolicy이름의 데이터를 0으로 변경

4.5. 위 방법으로 처리가 안되면

아래 명령어를 추가로 실행하자.
1️⃣ Windows Key + X 누른 후 A를 눌러 "명령 프롬프트(관리자)"를 실행
2️⃣ powershell enable-WindowsOptionalFeature -Online -FeatureName MicrosoftWindowsPowerShellV2 실행

관련 정보는 PowerShell Constrained Language Mode를 확인하자.

5. 컴퓨터의 vmms 서비스를 열 수 없습니다.


An error occurred
'.' 컴퓨터의 vmms 서비스를 열 수 없습니다.
If you just enabled Hyper-V, please restart now.

Hyper-V가 실행되고 있지 않았거나 문제가 발생한 경우로 Hyper-V를 재시작하면 해결된다.

6. 컴퓨터의 개체에 액세스하는 동안 오류가 발생

이 문제는 Windows 업데이트 후에도 빈번하게 발생한다.


Unable to create: 기본 설정 변수 "ErrorActionPreference" 또는 일반 매개 변수가 Stop으로 설정되어 있으므로 실행 중인 명령이 중지되었습니다.
개체를 찾을 수 없어서 Hyper-V가 'PC_이름' 컴퓨터의 개체에 액세스하는 동안 오류가 발생했습니다.
개체가 삭제되었을 수 있습니다. 컴퓨터에서 가상 컴퓨터 관리 서비스가 실행되고 있는지 검증하십시오.

Hyper-V 가상 컴퓨터 객체가 없는 문제로 Windows Key + R 누른 후 실행 창에서 virtmgmt.msc 입력하여 "Hyper-V 관리자"를 실행한다.

위 이미지 처럼 왼쪽에 "Hyper-V 관리자" 밑에 "PC_이름"이 없다면 아래 방법으로 "PC_이름"를 추가하자.

1️⃣ Windows Key + X 누른 후 N를 눌러 "설정(N)"를 실행 후 "업데이트 및 보안" 클릭
2️⃣ "업데이트 및 보안" 화면에서 "Windows 보안" 클릭 후 "앱 및 브라우저 컨트롤" 클릭
3️⃣ "앱 및 브라우저 컨트롤" 화면에서 "Exploit Protection 설정" 클릭
4️⃣ "Exploit Protection" 화면에서 "프로그램 설정" → "프로그램을 추가해 사용자 지정" → "정확한 파일 경로 선택" 순서로 클릭
5️⃣ "열기" 화면에서 "파일 이름(N)" 입력 항목에 C:\Windows\System32\vmcompute.exe 입력 후 "열기(O)" 클릭
6️⃣ "프로그램 설정: vmcompute.exe" 화면에서 "흐름 제어 보호 (CFG)" 항목의 "시스템 설정 재정의" 체크 해제 후 "적용" 클릭
7️⃣ Windows Key + X 누른 후 A를 눌러 "명령 프롬프트(관리자)"를 실행 후 net start vmcompute 명령어 입력
8️⃣ PC 재부팅 후 Hyper-V 관리자에서 확인

관련 정보는 Windows 10에 Hyper-V 설치/삭제 및 문제 해결 링크를 확인하자.

7. Git Bash에서 docker exec 명령어 실행이 안되는 경우

$ docker exec -it mall sh
the input device is not a TTY.  If you are using mintty, try prefixing the command with 'winpty'
위 메시지가 출력된다면 대화형 터미널 접근이 안되는 것으로 Docker 명령어 앞에 winpty 추가하여 아래와 같이 입력하면 해결된다.
$ docker exec -it mall sh

원인은 Git 설치 시 터미널 설정을 MinTTY를 선택하여 설치한 경우로 cmd 혹은 PowerShell 에서는 문제가 없다.
Git를 재설치하여 콘설 설정을 윈도우 기본으로 선택하여 설치하면 winpty 없어도 해결된다.

8. 컨테이너 실행 시 네트워크 오류

Creating network "frontend" with driver "bridge"
ERROR: Pool overlaps with other one on this address space

현재 실행하려는 컨테이너가 사용하려는 네트워크가 이미 존재하는 경우 발생한다.
docker network ls 명령어로 네트워크 목록을 확인하여 불필요하면 docker network {네트워크_아이디}로 삭제 후 실행하면 해결된다.

9. 컨테이너 실행 시 마운트 오류

ERROR: for xx Cannot start service xxxx: error while creating mount source path '/host_mnt/d/workspace/xxxx': mkdir /host_mnt/d: file exists

"mount source ...." 문구가 포함된 메시지는 대부분 공유 드라이브 권한 문제다.
Docker 설정의 "Shared Drives"에 연결하려는 드라이브가 체크되어 있지 않다면 체크 후 "Apply"를 통하여 권한을 얻은 후 실행하자.

만약 체크되어 있는 상태라면 "Reset credentials"를 눌러 초기화 후 다시 체크하여 적용하자. 이 문제는 Windows에서 주기적으로 권한을 박탈하는 문제로 해결 방법은 "Windows에서 Docker 공유 드라이브가 끊어지는 문제 해결 방법" 링크를 확인하자.

10. 컨테이너 실행 시 권한 오류

ERROR: for xx  Cannot start service xxxx: error while creating mount source path '/host_mnt/d/workspace/xxxx': mkdir /host_mnt/d/workspace/: permission denied

위 "7. 컨테이너 실행 시 마운트 오류"와 비슷하지만 오류 문구에 "permission denied"가 출력되면 현재 공유 드라이브로 인증한 사용자로 접근이 불가능하다는 문구다.
Docker 설정의 "Shared Drives"에서 "Reset credentials"를 눌러 초기화 후 접근 가능한 사용자로 인증하면 해결된다.

11. DockerNet 가상 네트워크

네트워크 카드:  NIC 4개 설치됨
  [01]: Hyper-V Virtual Ethernet Adapter
        연결 이름: vEthernet (DockerNAT)
        DHCP 사용: 아니요
        IP 주소
        [01]: 10.0.75.1
        [02]: xxxx::xxxx:xxxx:xxxx:xxxx

Docker 가 Windows 와 통신하기 위한 것으로 삭제되면 "공유 드라이브" 연결 등이 안될 수 있다.
삭제해도 Docker 를 재시작하면 재생성되니 걱정하지 않아도 된다.

마무리

Docker Toolbox는 Virtual Box 업데이트를 하지 않는다면 큰 문제없다.
Docker for Windows는 Windows 업데이트를 하지 않는다면 큰 문제없다.

아직 일부 PC에서 블루스크린이 빈번하게 발생하는 문제가 있는데, Docker 문제보다는 Hyper-V 문제일 듯하고 해결하기 위해 노력 중이다.

함께보기