Pouvez-vous exécuter Docker en mode natif sur le nouvel espace utilisateur bash Windows 10 (Ubuntu)?

126

D'après ce que j'avais compris, l'exécution de docker sur d'autres systèmes d'exploitation constituait la principale limitation, à savoir les conteneurs réseau Linux qui le rendaient possible. (Certainement pour les Mac).

Récemment, Microsoft a annoncé la version bêta d'un mode utilisateur Linux Ubuntu s'exécutant de manière native sur Windows 10. Ce programme peut exécuter des fichiers binaires compilés au format ELF sous Windows (contrairement à cygwin qui nécessite une compilation.)

Ma question est la suivante: pouvez-vous exécuter Docker en mode natif sur le nouvel espace utilisateur bash Windows 10 (Ubuntu)?

Oeil de faucon
la source
4
Ce n'est pas "juste" un bashespace utilisateur. C’est un véritable espace utilisateur Linux assez complet, mais sans X Windows, c’est-à-dire du texte uniquement. Dire "bash" communique assez bien la limitation de texte seulement.
MSalters
Ai-je oublié quelque chose? Cela at-il réellement été distribué? Pour le moment, je ne le connais que comme un vaporware.
Michael Hampton
2
Je pense que ce ne sera pas clair jusqu'à ce qu'ils publient cela (pour autant que je sache, AFAIK n'est pas encore disponible pour les initiés Windows), mais il est intéressant de noter que Microsoft et Docker travaillent à amener Docker à Windows en mode natif, qui sera publié aux côtés du serveur Windows 2016
Rоry McCune
1
@ RоryMcCune: Intéressant. Toutefois, d' après cette entrée de blog Docker d'Août 2015, ce sera un port qui permet d'exécuter Docker de Windows images sous Windows, pas des images Linux sous Windows.
Sleske
2
En effet, c’est l’objet du menu fixe Windows natif. La nature de la conteneurisation est que vous ne pouvez pas exécuter de systèmes avec d'autres noyaux sans ajouter de la virtualisation ou (éventuellement) ce nouveau sous-système développé par Microsoft
Rоry McCune

Réponses:

103

Vous pouvez utiliser Docker Desktop pour Windows en tant que moteur et Docker pour Linux en tant que client dans WSL sous Ubuntu / Debian sous Windows. Connectez-les via TCP.

Installez Docker Desktop pour Windows: https://hub.docker.com/editions/community/docker-ce-desktop-windows Si vous souhaitez utiliser des conteneurs Windows au lieu de conteneurs Linux, les deux types de conteneurs peuvent être gérés par le client docker Linux dans l'espace utilisateur bash.

Depuis la version 17.03.1-ce-win12 (12058), vous devez vérifier le démon Expose sur tcp: // localhost: 2375 sans TLS pour permettre au client Linux Docker de continuer à communiquer avec le démon Windows Docker via TCP.

Suivez ces étapes:

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

Pour le rendre permanent:

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

Ajouter les variables correspondantes à .bashrc

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

Bien sûr, vous pouvez installer 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 en utilisant python pip

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

Et achèvement de Bash. La meilleure partie:

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

Je l'ai testé avec la version 2.1.0.1 (37199) de Docker Desktop avec 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**

Les volumes

Faites attention lorsque vous ajoutez des volumes. Le chemin C:\dirsera visible comme /mnt/c/dirsur le WSL et /c/dir/par le moteur de menu fixe. Vous pouvez le surmonter en permanence:

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

Vous devez quitter et recharger WSL après avoir modifié wsl.conf pour que WSL lise vos modifications au lancement.

MISE À JOUR

de: Nouveautés de la ligne de commande dans Windows 10 version 1803

Unix Sockets Unix Sockets n'étaient pas supportés sous Windows, et maintenant ils le sont! Vous pouvez également communiquer via des sockets Unix entre Windows et WSL. L’un des avantages de cette solution est qu’il permet à WSL d’exécuter le client Docker Linux pour interagir avec le démon Docker exécuté sous Windows.

MISE À JOUR

Ce script et l'utilisation de Unix Sockets étaient inclus dans la configuration de pengwin de Pengwin.

Cordialement

Carlos Rafael Ramirez
la source
3
Bonjour @ joel-pearson, docker ont deux parties: le moteur et le client. Le moteur tourne sous Windows en utilisant Docker Toolbox (basé sur VirtualBox) ou Docker pour Windows (basé sur Hyper-V), tous deux officiellement pris en charge par l'équipe de docker. Le moteur Docker ne fonctionne pas encore dans l'espace utilisateur bash. Le client Docker dans Windows peut être exécuté dans cmd, powershell ou cygwin. Cette réponse indique comment exécuter le client Docker dans l'espace utilisateur bash. Pourquoi? Personnellement, je préfère bash, l'achèvement des travaux. Je conviens que la question concerne le moteur Docker, mais je l’ai trouvée lorsque je cherchais le client, et de nombreuses personnes font de même.
Carlos Rafael Ramirez
1
Je viens de le tester et ça marche pour moi sur la version 1.12 :) Super heureux de pouvoir maintenant faire du développement sérieux sur Windows.
Zach Russell
2
Vous avez essayé vos instructions dans Bash sur Ubuntu sous Windows. Vous avez le message "Connexion au démon Docker impossible. Le démon docker est-il actif sur cet hôte?". Vous manque-t-il des marches?
MPfr
5
En février 2017, c'est toujours le seul moyen.
hdave
3
Après juin 2017, vous pourrez exécuter le menu fixe pour les exécutables Windows à partir du shell bash . Au lieu d'installer le client docker, vous pouvez utiliser docker.exedirectement le sous-système docker. Toutefois, notez que le menu fixe pour Windows utilisera les variables et les configurations Windows.
Jaime
51

En ce moment (avril 2016), la réponse est la suivante:

Nous ne savons pas encore (mais probablement pas).

Les faits

  • Windows 10 peut maintenant exécuter une variété de programmes Linux (parmi lesquels le shell Bash et divers utilitaires de texte). Ce ne sont pas des ports (c'est-à-dire des versions recompilées, comme par exemple dans Cygwin ), ce sont les mêmes binaires ELF qui s'exécutent sur un système Linux typique. Dans ce cas, ils ont été pris à Ubuntu.
  • Pour rendre cela possible, Windows 10 a été modifié pour accepter les appels système Linux (appels système) et pour pouvoir charger et exécuter des fichiers binaires ELF ( commentaire de Scott Hanselman ). Cela signifie que des exécutables Linux non modifiés peuvent être exécutés, ils chargeront leurs bibliothèques partagées non modifiées si nécessaire et Windows les exécutera en tant que processus Windows.
  • Chaque fois qu'un programme Linux souhaite interagir avec le noyau, il émet un appel système (ou laisse une bibliothèque le faire). C’est (vraisemblablement) la seule différence avec Linux: lorsqu’il est sous Linux, le noyau Linux gère ces appels; sous Windows 10, le noyau Windows 10 le fait à la place.

La spéculation

La question est donc de savoir si les appels système dont Docker a besoin (pour le chroot et les espaces de noms, entre autres) ont été implémentés ou non. La réponse à cette question est probablement "non". Docker nécessite des fonctionnalités relativement sophistiquées (et spécifiques à Linux) pour la gestion des processus et des ressources, ainsi que pour l'isolation des processus. Bien qu'il soit probablement possible de répliquer tout cela sous Windows, cela demanderait beaucoup de travail. Et puisque l'objectif de cette fonctionnalité de Windows semble être d'exécuter des programmes d'espace utilisateur Linux, il semble improbable qu'ils aient effectué tout le travail (et l'ont gardé secret). .

Cependant, il n'y a aucune information définitive dans les deux cas, autant que je sache.

Ports Docker existants

Bien entendu, si Microsoft décide de demander la prise en charge de Docker dans Windows 10, il sera probablement en mesure de l’offrir. Il existe des précédents pour le portage de Docker vers un autre noyau:

  • Il existe un port Docker pour FreeBSD . Il est étiqueté "expérimental", mais semble fonctionner en principe. Il peut utiliser des conteneurs Docker non modifiés du référentiel Docker, ce qui signifie qu'il fournit en fait un environnement hôte de type Linux pour les images.
  • Un projet est en cours pour le portage de Docker sur Windows (en particulier Windows Server 2016) - voir cette entrée de blog Docker à partir d'août 2015. Toutefois, contrairement au port FreBSD ci-dessus, ce port permettra à Docker d'exécuter des images Windows sous Windows. pas d'images Linux sous Windows. Merci à Rryry McCune pour l'avoir signalé.
sleske
la source
1
Mise à jour: Un article sur le sujet figure maintenant sur un blog MSDN: Windows Subsystem for Linux Overview .
Sleske
À partir d'aujourd'hui, c'est possible avec Hyper-V: tutorials.ubuntu.com/tutorial/…
Nick Sweeting
J'ai voté contre parce que la réponse la plus votée est plus utile que la spéculation sur ce qui peut être, elle couvre ce qui est.
James
13

Le premier aperçu d'initié a été publié hier. J'ai essayé d'installer Docker mais cela échoue avec les problèmes suivants: échec du docker

Il semblerait donc que pour le premier aperçu, cela ne fonctionne pas actuellement. Cependant, comme beaucoup de gens l’ont spéculé, cela pourrait fonctionner dans une version ultérieure.

CodedBeard
la source
5
Bonne idée d'essayer cela. Une chose: pourriez-vous s'il vous plaît ajouter le texte de la capture d'écran en tant que texte réel (le terminal Ubuntu prend en charge le copier-coller). Le texte "réel" présente de nombreux avantages (plus facile à lire, supporte les lecteurs d'écran, explorable par les moteurs de recherche)
sleske
Quelques mises à jour: J'ai pu installer complètement docker sur ma machine exécutant la dernière mise à jour anniversaire. Mais cela docker pséchoue avec: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
On dirait que cela fonctionne maintenant: tutorials.ubuntu.com/tutorial/…
Nick Sweeting
13

Non, ce n'est pas possible.

Docker a besoin de plusieurs choses pour exécuter des conteneurs:

  • chroot
  • Espaces de noms pour:
    • PID
    • Utilisateurs
    • Réseau
    • Montures
    • UTS
    • IPC

Ce sont toutes les fonctionnalités du noyau qui sont implémentées sous Linux. Malheureusement, la plupart d’entre eux n’ont pas de fonctionnalité similaire à utiliser en remplacement de Windows (ni dans le sous-système Linux que Microsoft a implémenté dans le noyau Windows). Tous ces éléments doivent être fournis par le système d'exploitation.

Florin Asăvoaie
la source
4
En réalité, Windows possède des espaces de noms pour les utilisateurs, les montages et IPC. Les espaces de noms d'utilisateurs sont requis pour Active Directory, les espaces de noms de montage et les espaces de noms IPC sont requis pour les opérations multi-utilisateurs. Fondamentalement, le gestionnaire d’objets du noyau dans Windows a toujours eu des espaces de noms, depuis la toute première version de Windows NT, ce n’est donc pas si étrange.
MSalters
3
Et avec les services de bureau à distance, les objets de session utilisent activement ces espaces de noms pour permettre des opérations simultanées. Cela ne veut pas dire que vous avez toute l'infrastructure requise, mais la plupart des éléments sont là. En ce qui concerne chroot, sachez que l’environnement Ubuntu a déjà une racine différente de celle de WIN32.
MSalters
6
En fait, je pense qu'il est trop tôt pour répondre à cette question. Comme décrit dans un commentaire de Scott Hanselman , le noyau Windows 10 accepte désormais les appels système Linux. La question est donc de savoir si les appels système dont Docker a besoin (pour le chroot et les espaces de noms) ont été implémentés ou non. Bien que la réponse soit probablement "non", il n'y a aucune information définitive dans les deux cas, pour autant que je sache.
jeudi
1
@sleske a raison, cette question n'est pas répondable pour le moment, et dire "non, ça ne peut pas" sans une réelle indication de ce que les développeurs travaillant sur l'espace linux sont en train de faire, c'est assez présomptueux.
Ryan
2
Je ne sais pas assez pour affirmer avec certitude que cette réponse est totalement fausse, mais sa formulation me laisse un peu sceptique quant à sa validité. En particulier, indiquant que "Bash est un simple programme d’espace utilisateur et ne peut en fournir aucun", le sous-système de fenêtre pour Linux est considéré comme "la nouvelle fonctionnalité de Bash". était le port bash à Windows. Ce n'est pas ce qui s'est passé Ils ont développé une interface de noyau Linux complète s'exécutant au-dessus du noyau Windows: msdn.microsoft.com/en-us/commandline/wsl/about
Ajedi32 le
7

À partir de la mise à jour du créateur (publiée le 13 juin 2017), vous pouvez exécuter un exécutable Windows natif directement dans WSL. Cela signifie que si vous avez déjà installé Docker pour Windows, vous pouvez simplement appeler les dockerfichiers binaires installés sous C:\Program Files. Comme ils se terminent par .exel'option la plus simple, il faut créer des alias. Quelque chose comme ce qui suit dans votre .bashrctravail devrait:

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

Cela crée des alias pour tous les fichiers du DOCKER_BINrépertoire:

$ 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

Une mise en garde: vous obtiendrez un message d'erreur du type " Impossible de traduire le répertoire de travail actuel " si exécuté à partir d'un répertoire Linux. Juste cddans un répertoire Windows (par exemple /mnt/c/Users/YourUsername) et vous devriez être bon.

dimo414
la source
Cela ne semble pas prendre en compte les variables d’environnement bash dans les fichiers YML composés par Docker. Une idée pour ça?
Rüdiger Schulz
1
Cela a du sens, puisque vous appelez le dockerbinaire Windows et que vous le faites uniquement via le shell Linux. Je ne sais pas s'il existe un bon moyen d'y parvenir.
dimo414
6

Une fois que Docker 1.12 est publié et que le client Linux Docker est séparé, vous devriez pouvoir exécuter le client Docker dans Windows 10 bash.

Cela peut sembler peu compte tenu du fait que vous avez un client Windows Docker, mais cela est utile si vous avez des chaînes d’outils Linux qui incluent docker pour ses fonctionnalités côté client.

mixja
la source
4

Dans Windows 10 Version 1607 Build 1493.10, vous pouvez l'installer avec succès sur Ubuntu Bash, mais cela ne fonctionne pas :(

Une simple "version docker" vous dira:

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?

Si vous exécutez ensuite "sudo docker -d", vous obtenez l'erreur suivante:

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

Donc, c'est vraiment un bouchon du côté bash.

Néanmoins, vous pouvez installer Docker pour Windows et cela fonctionne comme un charme, vous pouvez évidemment déployer des serveurs Linux et tout ce dont vous avez besoin.

> 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
Bruno Medina
la source
3

À compter de septembre 2016, n °

Toutes les implémentations actuelles de Docker sur Windows utilisent la virtualisation. Docker 1.12 utilise un hyperviseur dans Windows, ce qui supprime l'avantage de la conteneurisation par rapport à la virtualisation.

Docker a besoin de plus que simplement utiliser des appels systèmes Linux.

Il a besoin de groupes de contrôle de processus (cgroups), d'un système de fichiers empilable (aufs), ainsi que d'autres systèmes basés sur Linux en dehors du noyau.

Ni cgroups ni aufs ne sont nativement dans le noyau Windows 10.

Il existe une implémentation de Windows Server 2016 ici: https://msdn.microsoft.com/en-gb/virtualization/windowscontainers/quick_start/quick_start_windows_server ..mais cela n'exécutera que certains services Windows, par exemple IIS et non Ubuntu.

Graham
la source
2

Docker ne fonctionne pas actuellement dans la version actuelle (14316) - en supposant que vous puissiez le faire installer.

root@localhost:~# docker --help
runtime: address space conflict: map(0x7ff5ddbb0000) = 0x7ff5ffd20000
fatal error: runtime: address space conflict
lgj
la source
Impressionnant! Continuez s'il vous plaît d'essayer.
Hawkeye
Il semble que cela pourrait être lié au fonctionnement de l'allocation de mémoire dans golang (dans lequel Docker est écrit): groups.google.com/forum/#!msg/golang-dev/EpUlHQXWykg/…
Timothy Meade
Le mien est bloqué pour toujours après la commande.
wieczorek1990
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!)
Gavenkoa
la source
2
Ceci est complété par le fait que maintenant vous pouvez exécuter le client docker pour linux en bash, évitant ainsi d’utiliser PowerShell si vous n’êtes pas habitué
Carlos Rafael Ramirez Le
1
Il sera intéressant de voir s’ils s’adaptent à l’essaim de dockers.
Hawkeye