Você pode executar o Docker nativamente no novo espaço de usuário do Windows 10 (Ubuntu)?


126

Meu entendimento era que a principal limitação da execução do docker em outros sistemas operacionais eram os contêineres da Rede Linux que tornavam isso possível. (Certamente para Macs).

Recentemente, a Microsoft anunciou uma versão beta do modo de usuário Ubuntu linux em execução nativamente no Windows 10. Isso pode executar binários compilados no formato ELF no Windows (ao contrário do cygwin, que requer uma compilação).

Minha pergunta é: Você pode executar o Docker nativamente no novo espaço de usuário do Windows 10 (Ubuntu)?


4
Não é "apenas" um bashespaço de usuário. É um espaço de usuário do Linux real e razoavelmente completo, mas sem o X Windows, ou seja, apenas texto. Dizer "bash" comunica a limitação só de texto muito bem ..
MSalters

Perdi algo? Isso realmente foi distribuído? No momento, eu o conheço apenas como vaporware.
Michael Hampton

2
Eu acho que não ficará claro até que eles divulguem isso (o AFAIK ainda não está disponível para os iniciantes do Windows), no entanto, vale ressaltar que a Microsoft e o Docker estão trabalhando para trazer o Docker para o Windows nativamente, para serem lançados junto com o servidor Windows 2016
Róry McCune

11
@ RоryMcCune: Interessante. No entanto, de acordo com esta entrada do blog Docker de Agosto de 2015, esta será uma porta que permite Docker para executar o Windows imagens no Windows, não imagens Linux no Windows.
fácil

2
de fato, esse é o objetivo da janela de encaixe nativa do Windows. A natureza da contentorização é que você não pode executar sistemas com outros kernels, sem adição de alguma virtualização ou (possivelmente), este novo subsistema de que a Microsoft está desenvolvendo
Rоry McCune

Respostas:


103

Você pode usar o Docker Desktop para Windows como o mecanismo e o Docker para Linux como o cliente na WSL no Ubuntu / Debian no Windows. Conecte-os via TCP.

Instale o Docker Desktop para Windows: https://hub.docker.com/editions/community/docker-ce-desktop-windows Se você deseja usar o Windows Containers em vez do Linux Containers, os dois contêineres de tipo podem ser gerenciados pelo cliente docker do Linux em o espaço do usuário bash.

Desde a versão 17.03.1-ce-win12 (12058), é necessário verificar o daemon Expose em tcp: // localhost: 2375 sem TLS para permitir que o cliente Linux Docker continue a se comunicar com o daemon do Windows Docker por TCP

Siga esses passos:

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

ou

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

Para torná-lo permanente:

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

Adicione as variáveis ​​correspondentes ao .bashrc

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

Obviamente, você pode instalar o 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

Ou usando python pip

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

E conclusão do Bash. A melhor parte:

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

Eu testei usando a versão 2.1.0.1 (37199) do Docker Desktop usando o Hyper-V:

$ 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**

Volumes

Tome cuidado ao adicionar volumes. O caminho C:\dirserá visível como /mnt/c/dirno WSL e no /c/dir/mecanismo do docker. Você pode superá-lo permanentemente:

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

Você deve sair e recarregar o WSL após fazer a alteração no wsl.conf para que o WSL leia suas alterações ao iniciar.

ATUALIZAR

from: O que há de novo para a linha de comando no Windows 10 versão 1803

Unix Sockets Os Unix Sockets não eram suportados no Windows e agora são! Você também pode se comunicar através de soquetes Unix entre Windows e WSL. Uma das grandes vantagens disso é que ele permite que a WSL execute o Linux Docker Client para interagir com o Docker Daemon em execução no Windows.

ATUALIZAR

Este script e o uso do Unix Sockets foram incluídos na configuração pengwin do Pengwin .

Saudações


3
Olá @ joel-pearson, o docker possui duas partes: o mecanismo e o cliente. O mecanismo é executado no Windows usando o Docker Toolbox (baseado no VirtualBox) ou o Docker for Windows (baseado no Hyper-V), ambos oficialmente suportados pela equipe do docker. O mecanismo do Docker ainda não roda no espaço do usuário do bash. O cliente Docker no Windows pode ser executado em cmd, powershell ou cygwin. O que esta resposta diz é a maneira de executar o cliente docker no espaço do usuário do bash. Por quê? Pessoalmente, eu prefiro bash, a conclusão funciona. Concordo que a pergunta é sobre o mecanismo do docker, mas eu o encontrei quando procurava o cliente e muitas pessoas fazem o mesmo.
Carlos Rafael Ramirez

11
Acabei de testar e funciona para mim no 1.12 :) Super empolgado por poder fazer um desenvolvimento sério no Windows.
Zach Russell

2
Tentei suas instruções no Bash no Ubuntu no Windows e obtive "Não é possível conectar-se ao daemon do Docker. O daemon do docker está em execução neste host?". Você está faltando alguns passos?
MPEN

5
Em fevereiro de 2017, esse ainda é o único caminho.
Hdave 17/02

3
Após junho de 2017, você pode executar a janela de encaixe para executáveis ​​do Windows a partir do shell bash . Em vez de instalar o cliente docker, você pode usá-lo docker.exediretamente para consultar / interagir com o subsistema docker. No entanto, observe que a janela de encaixe para janelas usará as variáveis ​​e configurações do Windows.
Jaime

51

A partir de agora (abril de 2016), a resposta é:

Ainda não sabemos (mas provavelmente não).

Os fatos

  • O Windows 10 agora pode executar uma variedade de programas Linux (entre eles o shell Bash e vários utilitários de texto). Essas não são portas (por exemplo, versões recompiladas, como por exemplo no Cygwin ), são os mesmos binários ELF que são executados em um sistema Linux típico. Nesse caso, eles foram retirados do Ubuntu.
  • Para tornar isso possível, o Windows 10 foi modificado para aceitar chamadas do sistema Linux (syscalls) e para carregar e executar binários ELF ( comentário de Scott Hanselman ). Isso significa que executáveis ​​Linux não modificados podem ser executados, eles carregarão suas bibliotecas compartilhadas não modificadas conforme necessário e o Windows os executará como processos do Windows.
  • Sempre que esse programa Linux deseja interagir com o kernel, ele emite uma chamada do sistema (ou permite que uma biblioteca o faça). Essa é (presumivelmente) a única diferença na execução no Linux: Ao executar no Linux, o kernel do Linux lida com essas chamadas; no Windows 10, o kernel do Windows 10 faz isso.

A especulação

Portanto, a questão é se os syscalls de que o Docker precisa (para chroot e namespaces, entre outras coisas) foram implementados ou não. A resposta é que provavelmente é "não". O Docker requer funcionalidade bastante sofisticada (e específica do Linux) para gerenciamento de processos e recursos e isolamento de processos. Embora provavelmente seja possível replicar tudo isso no Windows, seria muito trabalhoso, e como o objetivo desse recurso do Windows parece estar executando programas de espaço de usuário do Linux, parece improvável que eles tenham feito todo o trabalho (e mantido em segredo) .

No entanto, não há informações definitivas de qualquer maneira, pelo que sei.

Portas do Docker existentes

Obviamente, se a Microsoft decidir que deseja suporte ao Docker no Windows 10, provavelmente será capaz de oferecê-lo. Há algum precedente para transportar o Docker para um kernel diferente:

  • Existe uma porta Docker para FreeBSD . É rotulado como "experimental", mas parece funcionar em princípio. Ele pode usar contêineres do Docker não modificados no repositório do Docker, o que significa que realmente fornece um ambiente host do tipo Linux para as imagens.
  • Há um projeto em andamento para portar o Docker para o Windows (especificamente, Windows Server 2016) - consulte esta entrada do blog do Docker a partir de agosto de 2015. No entanto, diferente da porta do FreBSD acima, esta será uma porta que permite ao Docker executar imagens do Windows no Windows, não imagens do Linux no Windows. Agradecemos a Rоry McCune por apontar isso.

11
Atualização: agora há um artigo sobre o tópico em um blog do MSDN: Visão geral do Windows Subsystem for Linux .
sleske

A partir de hoje, é possível com o Hyper-V: tutorials.ubuntu.com/tutorial/…
Nick Sweeting

Eu votei simplesmente porque a resposta mais votada é mais útil do que a especulação do que pode ser, ela cobre o que é.
James

13

A primeira prévia foi divulgada ontem. Tentei instalar o docker, mas ele falhou com o seguinte: falha no docker

Parece que, para a primeira visualização, atualmente não funciona. No entanto, como muitas pessoas especularam, isso pode funcionar em uma versão futura.


5
Boa idéia para realmente tentar isso. Uma coisa: você poderia adicionar o texto da captura de tela como texto real (o terminal Ubuntu suporta copiar e colar). Texto "Real" tem inúmeras vantagens (mais fácil de ler, suporta leitores de tela, rastreáveis pelos motores de busca)
sleske

Alguma atualização: Consegui instalar completamente o docker na minha máquina executando a atualização final do aniversário. Mas fazendo uma docker psfalha com: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

Parece que ele funciona agora: tutorials.ubuntu.com/tutorial/...
Nick Sweeting

13

Não, isso não é possível.

O Docker precisa de várias coisas para executar contêineres:

  • chroot
  • Namespaces para:
    • PID
    • Comercial
    • Rede
    • Suportes
    • UTS
    • IPC

Esses são todos os recursos do kernel implementados no Linux. Infelizmente, a maioria deles não possui um recurso semelhante no Windows para substituir (nem no subsistema Linux que a Microsoft implementou no kernel do Windows). Tudo isso precisa ser fornecido pelo sistema operacional.


4
Na verdade, o Windows possui namespaces para usuários, montagens e IPC. Os namespaces de usuário são necessários para o Active Directory, os namespaces de montagem e os namespaces IPC são necessários para a operação multiusuário. Fundamentalmente, o Gerenciador de Objetos do kernel no Windows sempre teve espaços de nome, desde a primeira versão do Windows NT, portanto, não é tão estranho.
MSalters

3
E, com os Serviços de Área de Trabalho Remota, os objetos Session usam ativamente esses espaços para nome para fornecer operação simultânea. Isso não significa que você tenha toda a infraestrutura necessária, mas as principais partes estão lá. Quanto a chroot, perceba que o ambiente Ubuntu já possui uma raiz diferente da do WIN32.
precisa saber é o seguinte

6
Na verdade, acho que é muito cedo para responder a isso de qualquer maneira. Conforme descrito em um comentário por Scott Hanselman , o kernel do Windows 10 agora aceita syscalls Linux. Portanto, a questão é se os syscalls de que o Docker precisa (para chroot e namespaces) foram implementados ou não. Embora a resposta seja provavelmente "não", não há informações definitivas de qualquer maneira, pelo que sei.
simples

11
@sleske está certo, essa pergunta não é respondida no momento, e dizer "não, não pode" sem nenhuma indicação real do que os desenvolvedores que trabalham no espaço linux nas viúvas estão fazendo é bastante presunçoso.
Ryan

2
Não sei o suficiente para afirmar com confiança que esta resposta está totalmente errada, mas o modo como é formulada me deixa um pouco cético em relação à sua validade. Em particular, declarando "Bash é um programa simples de espaço para o usuário e não pode fornecer nenhum destes" e referindo-se ao Window Subsystem para Linux como "o novo recurso Bash" faz parecer que essa resposta se baseia na suposição totalmente falsa de que toda a Microsoft fez foi porta bash para Windows. Não foi isso que aconteceu. Eles desenvolveram uma interface toda Linux kernel em execução no topo do kernel do Windows: msdn.microsoft.com/en-us/commandline/wsl/about
Ajedi32

7

A partir da Atualização do Criador (lançada publicamente em 13 de junho de 2017), você pode executar o executável nativo do Windows diretamente na WSL. Isso significa que, se você já instalou o Docker for Windows, pode simplesmente chamar os dockerbinários instalados em C:\Program Files. Como eles terminam na .exeopção mais fácil, é necessário criar aliases. Algo como o seguinte no seu .bashrcdeve funcionar:

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

Isso cria aliases para todos os arquivos no DOCKER_BINdiretório:

$ 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

Uma ressalva: você receberá uma mensagem de erro como " Não é possível traduzir o diretório de trabalho atual ", se executado a partir de um diretório Linux. Apenas cdem um diretório do Windows (por exemplo /mnt/c/Users/YourUsername) e você deve ser bom.


Isso não parece capturar variáveis ​​de ambiente do bash nos arquivos YML de composição do docker. Alguma ideia para isso?
Rüdiger Schulz

11
Isso faz sentido, já que você está invocando o dockerbinário do Windows e apenas fazendo isso através do shell do Linux. Não tenho certeza se existe uma boa maneira de conseguir isso.
precisa saber é o seguinte

6

Depois que o Docker 1.12 for lançado e o cliente do Linux Docker estiver separado, você poderá executar o cliente do Docker no Windows 10 bash.

Isso pode não parecer muito, desde que você tenha um cliente Docker Windows, mas é útil se você tiver cadeias de ferramentas Linux que incluam docker para sua funcionalidade do lado do cliente.


4

No Windows 10, versão 1607 Build 1493.10, você pode instalá-lo com êxito no Ubuntu Bash, mas não funciona :(

Uma simples "versão docker" dirá:

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?

Se você executar "sudo docker -d", receberá o seguinte erro:

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+.

Então essa é definitivamente uma rolha do lado da festança.

No entanto, você pode instalar o Docker for Windows e ele funciona como um encanto; obviamente, você pode implantar servidores Linux e tudo o que precisa.

> 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

Em setembro de 2016, nº

Todas as implementações atuais do Docker no Windows usam virtualização, o Docker 1.12 usa um hipervisor no Windows, removendo a vantagem da conteinerização sobre a virtualização.

O Docker precisa mais do que apenas usar chamadas de sistemas Linux.

Ele precisa de grupos de controle de processos (cgroups), um sistema de arquivos empilhável (aufs) e outros sistemas baseados em Linux fora do kernel.

Nem cgroups nem aufs estão nativamente no kernel do Windows 10.

Há uma implementação do Windows Server 2016 aqui: https://msdn.microsoft.com/en-gb/virtualization/windowscontainers/quick_start/quick_start_windows_server ..mas isso só executará alguns serviços do Windows, por exemplo, IIS, e não o Ubuntu


2

No momento, o Docker não funciona na compilação atual (14316) - supondo que você possa instalá-lo.

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

Impressionante! Por favor, continue tentando.
precisa

Parece que isso pode estar relacionado à forma como alocação de memória funciona em golang (que Docker é escrito em): groups.google.com/forum/#!msg/golang-dev/EpUlHQXWykg/...
Timothy Meade

O meu fica pendurado para sempre após o comando.
precisa saber é o seguinte

1

De: 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
Isto é complementado com o fato de que agora você pode executar cliente janela de encaixe para Linux em bash, evitando usando PowerShell se você não usar para
Carlos Rafael Ramirez

11
Será interessante ver se eles escalam isso para o enxame de estivadores.
Hawkeye
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.