새로운 Windows 10 (Ubuntu) bash 사용자 공간에서 Docker를 기본적으로 실행할 수 있습니까?


126

다른 OS에서 도커를 실행할 때의 주요 제한 사항은 Linux 네트워크 컨테이너가 가능하다는 것입니다. (확실히 Mac의 경우).

최근 Microsoft는 Windows 10에서 기본적으로 실행 되는 Ubuntu Linux 사용자 모드 의 베타 버전을 발표 했습니다 . 이는 컴파일이 필요한 cygwin과 달리 Windows에서 ELF 형식으로 컴파일 된 바이너리를 실행할 수 있습니다.

내 질문은 : 새로운 Windows 10 (Ubuntu) bash 사용자 공간에서 Docker를 기본적으로 실행할 수 있습니까?


4
bash사용자 공간을 "단지"하지 않습니다 . 그것은 실제적이고 상당히 완전한 Linux 사용자 공간이지만 X Windows 즉 텍스트 만 없습니다. "bash"는 텍스트 전용 제한을 아주 잘 전달합니다.
MSalters

내가 뭘 놓 쳤니? 이것이 실제로 배포 되었습니까? 현재로서는 증기로만 알고 있습니다.
Michael Hampton

2
나는 그러나 마이크로 소프트와 부두 노동자는 윈도우 서버 2016과 함께 출시 될, 기본적으로 윈도우에 부두 노동자를 데려에 노력하고 있음을 주목할 필요가 그들이이 (AFAIK는 아직 윈도우 내부로도 사용할 수없는) 해제 때까지 명확하지 않을 것이라고 생각
Rоry을 McCune

1
@ RоryMcCune : 흥미 롭습니다. 그러나 2015 년 8 월 의이 Docker 블로그 항목 에 따르면 Docker가 Windows의 Linux 이미지가 아닌 Windows에서 Windows 이미지 를 실행할 수있는 포트가 될 것 입니다.
sleske

2
실제로 이것이 Windows 기본 도커의 목적입니다.
컨테이너화의 특성

답변:


103

Windows 용 Docker Desktop을 엔진으로, Linux 용 Docker를 Ubuntu / Debian (Windows)의 WSL에서 클라이언트로 사용할 수 있습니다. TCP를 통해 연결하십시오.

Windows 용 Docker Desktop을 설치하십시오. https://hub.docker.com/editions/community/docker-ce-desktop-windows Linux 컨테이너 대신 Windows 컨테이너를 사용하려는 경우 두 유형 컨테이너는 Linux Docker 클라이언트에서 관리 할 수 ​​있습니다. bash 사용자 공간.

버전 17.03.1-ce-win12 (12058) 부터 Linux Docker 클라이언트가 TCP를 통해 Windows Docker 데몬과 계속 통신 할 수 있도록 TLS없이 tcp : // localhost : 2375에서 Expose 데몬을 확인해야합니다 .

이 단계를 따르세요:

cd
wget https://download.docker.com/linux/static/stable/`uname -m`/docker-19.03.1.tgz
tar -xzvf docker-*.tgz
cd docker
./docker -H tcp://0.0.0.0:2375 ps

또는

env DOCKER_HOST=tcp://0.0.0.0:2375 ./docker ps

영구적으로 만들려면

mkdir ~/bin
mv ~/docker/docker ~/bin

해당 변수를 .bashrc에 추가하십시오.

export DOCKER_HOST=tcp://0.0.0.0:2375
export PATH=$PATH:~/bin

물론 docker-compose를 설치할 수 있습니다

sudo -i
curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

또는 파이썬 핍 사용

sudo apt-get install python-pip bash-completion
sudo pip install docker-compose

그리고 배쉬 완성. 가장 좋은 부분:

sudo -i
apt-get install bash-completion
curl -L https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker > /etc/bash_completion.d/docker
curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

Hyper-V를 사용하는 2.1.0.1 (37199) 버전의 Docker Desktop을 사용하여 테스트했습니다.

$ docker version
Client: Docker Engine - Community
 Version:           19.03.1
 API version:       1.40
 Go version:        go1.12.5
 Git commit:        74b1e89e8a
 Built:             Thu Jul 25 21:17:37 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.1
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.5
  Git commit:       74b1e89
  Built:            Thu Jul 25 21:17:52 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
Look both client and server say **OS/Arch: linux/amd64**

볼륨

볼륨을 추가 할 때주의하십시오. 경로 C:\dir/mnt/c/dirWSL과 /c/dir/도커 엔진으로 표시됩니다. 영구적으로 극복 할 수 있습니다.

sudo bash -c "echo -e '[automount] \nroot = /'>/etc/wsl.conf"

wsl.conf를 변경 한 후 WSL이 시작시 변경 사항을 읽도록 WSL을 종료했다가 다시로드해야합니다.

최신 정보

from : Windows 10 버전 1803의 명령 줄의 새로운 기능

유닉스 소켓 유닉스 소켓은 Windows에서 지원되지 않았으며 이제는 지원됩니다! Windows와 WSL간에 Unix 소켓을 통해 통신 할 수도 있습니다. 이것에 대한 가장 큰 장점 중 하나는 WSL이 Linux Docker Client를 실행하여 Windows에서 실행되는 Docker Daemon과 상호 작용할 수 있다는 것입니다.

최신 정보

이 스크립트와 유닉스 소켓 사용은 Pengwin 의 pengwin-setup 에 포함되었습니다 .

문안 인사


3
안녕하세요 @ joel-pearson, docker에는 엔진과 클라이언트의 두 부분이 있습니다. 엔진은 Docker 팀이 공식적으로 지원하는 Docker Toolbox (VirtualBox 기반) 또는 Windows 용 Docker (Hyper-V 기반)를 사용하여 Windows에서 실행됩니다. Docker 엔진은 아직 bash 사용자 공간에서 실행되지 않습니다. Windows의 Docker 클라이언트는 cmd, powershell 또는 cygwin에서 실행할 수 있습니다. 이 대답은 bash 사용자 공간에서 도커 클라이언트를 실행하는 방법입니다. 왜? 개인적으로 나는 bash를 선호한다. 나는 도커 엔진에 관한 질문에 동의하지만 클라이언트를 찾을 때 그것을 발견했으며 많은 사람들이 똑같이했습니다.
카를로스 라파엘 라미레즈

1
방금 테스트 한 결과 1.12에서 작동합니다. :) 이제 Windows에서 심각한 발전을 이룰 수있어서 매우 기쁩니다.
Zach Russell

2
Windows에서 Ubuntu의 Bash에서 지침을 시도했지만 "Docker 데몬에 연결할 수 없습니다.이 호스트에서 docker 데몬이 실행되고 있습니까?" 몇 가지 단계가 누락 되었습니까?
mpen

5
2017 년 2 월 현재, 이것이 유일한 방법입니다.
hdave

3
2017 년 6 월 이후 에는 bash 쉘에서 Windows 실행 파일에 대한 도커를 실행할 수 있습니다 . 도커 클라이언트를 설치하는 대신 docker.exe직접을 사용 하여 도커 하위 시스템을 쿼리 / 상호 작용할 수 있습니다 . 그러나 windows 용 docker는 windows 변수 및 구성을 사용합니다.
Jaime

51

현재 (2016 년 4 월) 현재 답변은 다음과 같습니다.

우리는 아직 알지 못합니다 (아마도).

사실

  • Windows 10은 이제 다양한 Linux 프로그램 (Bash 셸 및 다양한 텍스트 유틸리티)을 실행할 수 있습니다. 이들은 포트가 아니며 (예 : Cygwin 과 같이 재 컴파일 된 버전 ) 일반적인 Linux 시스템에서 실행 되는 것과 동일한 ELF 바이너리 입니다. 이 경우 우분투에서 가져 왔습니다.
  • 이를 가능하게하기 위해 Windows 10은 Linux 시스템 호출 (syscall)을 허용하고 ELF 바이너리 ( Scott Hanselman의 설명 ) 를로드하고 실행할 수 있도록 수정되었습니다 . 즉, 수정되지 않은 Linux 실행 파일을 실행할 수 있으며 필요에 따라 수정되지 않은 공유 라이브러리를로드하며 Windows는이를 Windows 프로세스로 실행합니다.
  • 그러한 Linux 프로그램이 커널과 상호 작용하려고 할 때마다 시스템 호출을 발행하거나 라이브러리가이를 수행하게합니다. 이것은 아마도 Linux에서 실행하는 것과의 유일한 차이점 일 것입니다. Linux에서 실행할 때 Linux 커널은 이러한 호출을 처리합니다. Windows 10에서는 Windows 10 커널이 대신 수행합니다.

투기

따라서 문제는 Docker가 필요로하는 syscalls (chroot 및 네임 스페이스 등)가 구현되었는지 여부입니다. 그 대답은 "아니오"일 것입니다. Docker는 프로세스 및 리소스 관리 및 프로세스 격리를 위해 상당히 정교하고 Linux 별 기능이 필요합니다. 이 모든 것을 Windows에서 복제하는 것이 가능할 수도 있지만 많은 작업이 필요할 것입니다.이 Windows 기능의 목표는 Linux 사용자 공간 프로그램을 실행하는 것으로 보이므로 모든 작업을 수행하지는 않았을 것입니다. .

그러나 내가 알 수있는 한 확실한 정보는 없습니다.

기존 도커 포트

물론, Microsoft가 Windows 10에서 Docker를 지원하기로 결정한 경우이를 제공 할 수 있습니다. Docker를 다른 커널로 이식하기위한 선례가 있습니다.

  • FreeBSD를위한 도커 포트 . "실험적"이라고 표시되어 있지만 원칙적으로 작동하는 것 같습니다. Docker 저장소에서 수정되지 않은 Docker 컨테이너를 사용할 수 있습니다. 즉, 실제로 이미지에 Linux와 같은 호스트 환경을 제공합니다.
  • Docker를 Windows (특히 Windows Server 2016)로 이식하는 프로젝트가 진행 중입니다 . 2015 년 8 월부터이 Docker 블로그 항목 을 참조하십시오 . 그러나 위의 FreBSD 포트와 달리 Docker는 Windows에서 Windows 이미지를 실행할 수있는 포트가됩니다. Windows에서 Linux 이미지가 아닙니다. 이것을 지적 해준 Rоry McCune에게 감사합니다.

1
업데이트 : MSDN 블로그에 대한 주제에 대한 기사가 있습니다 . Linux 용 Windows 하위 시스템 개요
sleske

오늘 현재 Hyper-V에서 가능합니다 : tutorials.ubuntu.com/tutorial/…
Nick Sweeting

나는 투표율이 높을수록 답이 더 유용하기 때문에 더 유용하다고 생각합니다.
James

13

첫 번째 내부자 미리보기가 어제 발표되었습니다. 도커를 설치하려고 시도했지만 다음과 같이 실패합니다. 도커 실패

따라서 첫 번째 미리보기에서는 현재 작동하지 않는 것처럼 보입니다. 그러나 많은 사람들이 추측했듯이 향후 릴리스에서 작동 할 수 있습니다.


5
실제로 시도해 보는 것이 좋습니다. 한 가지 : 스크린 샷의 텍스트를 실제 텍스트로 추가 할 수 있습니까 (우분투 터미널은 복사 및 붙여 넣기를 지원합니다). "실제"텍스트는 많은 장점이 있습니다 (읽기 쉬움, 화면 판독기 지원, 검색 엔진으로 크롤링 가능)
sleske

일부 업데이트 : 최종 기념일 업데이트를 실행하는 컴퓨터에 도커를 완전히 설치할 수있었습니다. 그러나 docker ps실패와 함께 :Get http:///var/run/docker.sock/v1.18/containers/json: dial unix /var/run/docker.sock: setsockopt: invalid argument. Are you trying to connect to a TLS-enabled daemon without TLS?
kumarharsh

그것이 지금 작동하는 것 같습니다 : tutorials.ubuntu.com/tutorial/…
Nick Sweeting

13

아니요, 불가능합니다.

Docker는 컨테이너를 실행하기 위해 여러 가지가 필요합니다.

  • chroot
  • 네임 스페이스 :
    • PID
    • 사용자
    • 회로망
    • 마운트
    • UTS
    • IPC

이것들은 모두 리눅스에서 구현 된 커널 기능입니다. 불행히도, 대부분은 Windows에서 대체 기능으로 사용할 유사한 기능을 가지고 있지 않습니다 (Microsoft가 Windows 커널에서 구현 한 Linux 하위 시스템에서도). 이 모든 것은 OS에서 제공해야합니다.


4
실제로 Windows에는 Users, Mounts 및 IPC에 대한 네임 스페이스가 있습니다. Active Directory에는 사용자 네임 스페이스가 필요하고 다중 사용자 작업에는 마운트 네임 스페이스 및 IPC 네임 스페이스가 필요합니다. 기본적으로 Windows의 커널 개체 관리자는 최초 Windows NT 릴리스의 네임 스페이스를 항상 가지고 있었으므로 그렇게 이상하지는 않습니다.
MSalters

3
또한 원격 데스크톱 서비스를 통해 세션 개체는 이러한 네임 스페이스를 적극적으로 사용하여 동시 작업을 제공합니다. 그렇다고 모든 필수 인프라가 있음을 의미하지는 않지만 주요 부분이 있습니다. 에 관해서는 chroot, 우분투 환경은 이미 WIN32와 다른 루트를 가지고 있습니다.
MSalters

6
실제로, 나는이 방법으로 대답하기에는 너무 이르다고 생각합니다. Scott Hanselman의 의견 에서 설명한 것처럼 Windows 10 커널은 이제 Linux syscall을 허용합니다. 따라서 문제는 Docker에 필요한 syscall (chroot 및 네임 스페이스 용)이 구현되었는지 여부입니다. 대답은 "아니오"일 가능성이 있지만, 내가 알 수있는 한 확실한 정보는 없습니다.
sleske

1
@sleske는 옳습니다.이 질문은 현재 대답 할 수 없으며, 과부의 리눅스 공간에서 일하는 개발자가 실제로 무엇인지에 대한 실제 표시가 없으면 "할 수 없습니다"라고 말하는 것은 꽤 어려울 것입니다.
Ryan

2
나는이 답변이 완전히 틀렸다는 확신을 가지고 충분히 말할 수는 없지만, 그 표현 방식은 그 유효성에 대해 약간 회의적입니다. 특히 "Bash는 간단한 사용자 공간 프로그램이며 이들 중 어느 것도 제공 할 수 없습니다"라고 말하고 Linux 용 Window Subsystem을 "새로운 Bash 기능"이라고 언급하면이 대답은 모든 Microsoft가 수행 한 완전히 잘못된 가정에 기반한 것처럼 들립니다. Windows의 포트 bash였습니다. 그런 일이 아니에요 이들은 Windows 커널에서 실행되는 전체 Linux 커널 인터페이스를 개발했습니다. msdn.microsoft.com/en-us/commandline/wsl/about
Ajedi32

7

의로서 창조주 업데이트 (2017년 6월 13일에 공개적으로 발표) 당신은 WSL에서 직접 실행 기본 Windows를 실행할 수 있습니다. 이것은 Windows 용 Docker를 이미 설치 한 경우 docker아래에 설치된 바이너리 를 호출하기 만하면 됩니다 C:\Program Files. .exe가장 쉬운 옵션으로 끝나기 때문에 별칭을 만드는 것입니다. 다음과 같은 .bashrc것이 작동해야합니다.

DOCKER_BIN='/mnt/c/Program Files/Docker/Docker/resources/bin'
for f in "$DOCKER_BIN"/*; do
  alias "$(basename "$f" | sed 's/.exe$//')"'="'"$f"'"'
done

이것은 모든 파일에 대한 별칭 생성 DOCKER_BIN디렉토리를 :

$ type docker
docker is aliased to `"/mnt/c/Program Files/Docker/Docker/resources/bin/docker.exe"'

$ docker --version
Docker version 17.03.1-ce, build c6d412e

한 가지주의 사항 : Linux 디렉토리에서 실행할 경우 " 현재 작업 디렉토리를 번역 할 수 없습니다 "와 같은 오류 메시지가 표시 됩니다. cdWindows 디렉토리 (예 :)에 들어가면 /mnt/c/Users/YourUsername좋을 것입니다.


이것은 bash 환경 변수를 docker-compose YML 파일로 선택하지 않는 것 같습니다. 그것에 대한 아이디어가 있습니까?
Rüdiger Schulz

1
Windows docker바이너리 를 호출 하고 Linux 셸을 통해 그렇게하기 때문에 의미가 있습니다. 그것을 달성하는 좋은 방법이 있는지 확실하지 않습니다.
dimo414

6

Docker 1.12가 릴리스되고 Linux Docker 클라이언트가 분리되면 Windows 10 bash에서 docker 클라이언트 를 실행할 수 있습니다 .

Docker Windows 클라이언트가있는 경우별로 들리지 않지만 클라이언트 측 기능을 위해 docker가 포함 된 Linux 도구 체인이있는 경우 유용합니다.


4

Windows 10 버전 1607 빌드 1493.10에서는 Ubuntu Bash에 성공적으로 설치할 수 있지만 작동하지 않습니다. (

간단한 "도커 버전"은 다음을 알려줍니다.

Client version: 1.6.2
Client API version: 1.18
Go version (client): go1.2.1
Git commit (client): 7c8fca2
OS/Arch (client): linux/amd64
FATA[0000] Get http:///var/run/docker.sock/v1.18/version: dial unix /var/run/docker.sock: setsockopt: invalid argument. Are you trying to connect to a TLS-enabled daemon without TLS?

"sudo docker -d"를 실행하면 다음 오류가 발생합니다.

FATA[0000] ERROR: You are running Linux kernel version 3.4.0+, which is unsupported for running Docker. Please upgrade your kernel to 3.8+.

따라서 이것은 분명히 bash 쪽의 스토퍼입니다.

그럼에도 불구하고 Docker for Windows를 설치할 수 있으며 매력처럼 작동하며 Linux 서버 및 필요한 모든 것을 분명히 배치 할 수 있습니다.

> docker version
Client:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 21:15:28 2016
 OS/Arch:      windows/amd64

Server:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 21:15:28 2016
 OS/Arch:      linux/amd64

3

2016 년 9 월 현재

Windows에서 Docker의 모든 현재 구현은 가상화를 사용하고 Docker 1.12는 Windows에서 하이퍼 바이저를 사용하므로 가상화에 비해 컨테이너화의 이점을 제거합니다.

Docker는 Linux 시스템 호출을 사용하는 것 이상을 필요로합니다.

프로세스 제어 그룹 (cgroup), 스택 가능 파일 시스템 (aufs) 및 커널 외부의 다른 Linux 기반 시스템이 필요합니다.

cgroup이나 auf는 기본적으로 Windows 10 커널에 없습니다.

: 여기에 윈도우 서버 2016의 구현이 있습니다 https://msdn.microsoft.com/en-gb/virtualization/windowscontainers/quick_start/quick_start_windows_server ..하지만 이것은 단지 실행 일부 Windows 서비스, 예를 들어, IIS, 그리고 우분투


2

Docker는 현재 빌드 (14316)에서 작동하지 않습니다. 설치 할 수 있다고 가정합니다.

root@localhost:~# docker --help
runtime: address space conflict: map(0x7ff5ddbb0000) = 0x7ff5ffd20000
fatal error: runtime: address space conflict

대박! 계속 노력하십시오.
Hawkeye

이것은 golang (Docker가 작성한)에서 메모리 할당이 작동하는 방식과 관련이있는 것 같습니다 : groups.google.com/forum/#!msg/golang-dev/EpUlHQXWykg/…
Timothy Meade

명령 후 광산은 영원히 중단됩니다.
wieczorek1990

1

보낸 사람 : https://blog.docker.com/2016/07/docker-for-mac-and-windows-production-ready/

Faster and more reliable – native development environment using
hypervisors built into each operating system. (No more VirtualBox!)

2
이것은 이제 bash에서 리눅스 용 도커 클라이언트를 실행할 수 있다는 사실로 보완됩니다. 따라서 사용하지 않을 경우 PowerShell을 사용하지 마십시오
Carlos Rafael Ramirez

1
그들이 이것을 도커 떼로 확장하는지 보는 것은 흥미로울 것입니다.
Hawkeye
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.