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


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é une beta d'un Ubuntu linux mode utilisateur fonctionnant en mode natif sur Windows 10. Cela peut exécuter des fichiers binaires compilés au format ELF sous Windows (contrairement à cygwin qui nécessite une compilation.)

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


121
2018-04-04 10:16


origine


Ce n'est pas "juste" un bash l'espace utilisateur. C’est un véritable espace utilisateur Linux assez complet, mais sans X Windows i.e. text. Dire "bash" communique assez bien la limitation text-only. - MSalters
Ai-je manqué quelque chose? Cela at-il réellement été distribué? Pour le moment, je ne le connais que comme un vaporware. - Michael Hampton♦
Je pense que ce ne sera pas clair tant qu'ils n'auront pas publié cette version (d'après ce que je sais, ce n'est pas encore disponible pour les initiés de Windows), mais il est intéressant de noter que Microsoft et Docker travaillent actuellement à la mise en place native de Docker vers Windows, qui sera publié parallèlement au serveur Windows 2016 - Rоry McCune
@ RоryMcCune: Intéressant. Cependant, selon cette entrée de blog Docker à partir d'août 2015, ce sera un port permettant à Docker de fonctionner les fenêtres images sous Windows, pas d'images Linux sous Windows. - sleske
En effet, c’est l’objet du menu fixe Windows natif. La nature de la conteneurisation est qu'il est impossible d'exécuter des 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:


Pour l'instant (avril 2016), la réponse est la suivante:

On ne sait pas encore (mais probablement pas).

Les faits

  • Windows 10 peut maintenant exécuter divers 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), elles sont le même Binaires ELF qui fonctionnent sur un système Linux typique. Dans 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; sur 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 chroot et namespaces, 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 peu probable 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 y a 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 ceci Entrée de blog Docker à partir d'août 2015. Toutefois, contrairement au port FreBSD ci-dessus, il s'agira d'un port qui permettra à Docker d'exécuter des images Windows sous Windows, et non des images Linux sous Windows. Merci à Rryry McCune pour l'avoir signalé.

50
2018-04-05 07:15



Mise à jour: Il existe maintenant un article sur le sujet sur un blog MSDN: Présentation du sous-système Windows pour Linux. - 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 à vote élevé est plus utile que la spéculation sur ce qui peut être, elle couvre ce qui est. - James


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

Installez Docker pour Windows: https://docs.docker.com/docker-for-windows/ Si vous souhaitez utiliser les conteneurs Windows à la place, les conteneurs Linux 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 Exposer le démon sur tcp: // localhost: 2375 sans TLS pour que le client Linux Docker continue à communiquer avec le démon Windows Docker par TCP

Suivez ces étapes:

cd
wget https://download.docker.com/linux/static/stable/x86_64/docker-18.06.1-ce.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.22.0/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 18.06.0-ce-win59 (19098) de Docker pour Windows utilisant Hyper-V:

~$ docker version
Client:
 Version:           18.06.0-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        0ffa825
 Built:             Wed Jul 18 19:04:39 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.0-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       0ffa825
  Built:            Wed Jul 18 19:13:46 2018
  OS/Arch:          linux/amd64
  Experimental:     true

Regardez le client et le serveur dire OS / Arch: linux / amd64

Les volumes

Faites attention lorsque vous ajoutez des volumes. Le chemin C:\dir sera visible comme /mnt/c/dir sur WSL et comme /c/dir/ par moteur de docker. 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.

METTRE À JOUR

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

Sockets Unix   Les sockets Unix 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.

Cordialement


99
2017-07-19 22:05



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 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
Je viens de le tester et cela fonctionne pour moi sur la version 1.12 :) Super heureux de pouvoir maintenant faire du développement sérieux sur Windows. - Zach Russell
J'ai essayé vos instructions dans Bash sur Ubuntu sous Windows. Vous avez obtenu 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? - mpen
En février 2017, c'est toujours le seul moyen. - hdave
Après juin 2017, vous pouvez lancer le docker pour windows les exécutables du shell bash. Au lieu d’installer le client Docker, vous pouvez utiliser le docker.exe directement pour interroger / interagir avec le sous-système de menu fixe. Toutefois, notez que le menu fixe pour Windows utilisera les variables et les configurations Windows. - Jaime


Le premier aperçu d'initié a été publié hier. J'ai essayé d'installer le menu fixe, mais il échoue avec les problèmes suivants: docker fail

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.


12
2018-04-07 10:29



Cool - merci d'essayer! - Hawkeye
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 faire un 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? - kumar_harsh
On dirait que cela fonctionne maintenant: tutorials.ubuntu.com/tutorial/… - Nick Sweeting


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.


11
2018-04-04 10:21



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 de 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
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 signifie pas que vous avez toutes les infrastructures requises, mais la plupart des éléments sont présents. Pour ce qui est de chroot, réalisez que l’environnement Ubuntu a déjà une racine différente de celle de WIN32. - MSalters
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 maintenant 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 pas d'information définitive dans les deux cas, pour autant que je sache. - sleske
@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
Je ne sais pas assez pour affirmer avec certitude que cette réponse est totalement fausse, mais sa formulation me rend 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", ce qui donne l’impression que cette réponse est basée sur la fausse hypothèse totalement fausse était 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 sur le noyau Windows: msdn.microsoft.com/en-us/commandline/wsl/about - Ajedi32


À partir de Mise à jour du créateur (publié publiquement 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 invoquer le docker binaires installés sous C:\Program Files. Puisqu'ils se terminent par .exe L'option la plus simple est de créer des alias. Quelque chose comme ce qui suit dans votre .bashrc devrait marcher:

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 de la DOCKER_BINannuaire:

$ 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é depuis un répertoire Linux. Juste cd dans un répertoire Windows (par exemple, /mnt/c/Users/YourUsername) et vous devriez être bon.


6
2018-06-22 06:02



Cela ne semble pas prendre en compte les variables d’environnement bash dans les fichiers YML composés avec docker. Une idée pour ça? - Rüdiger Schulz
Cela a du sens, puisque vous appelez Windows docker binaire, et juste à travers le shell Linux. Je ne sais pas s'il existe un bon moyen d'y parvenir. - dimo414


Une fois que Docker 1.12 est publié et que le client Linux Docker est séparé, vous devriez pouvoir exécuter le menu fixe. client 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.


5
2018-04-29 09:31





Dans Windows 10 Version 1607 Build 1493.10, vous pouvez l’installer avec succès sur Ubuntu Bash, mais ça ne marche 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

3
2017-08-12 21:38





À partir 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


2
2017-09-05 13:15





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

1
2018-04-12 20:47



Impressionnant! Continuez s'il vous plaît d'essayer. - Hawkeye
Il semble que cela puisse ê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


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!)

0
2017-08-03 12:20



Ceci est complété par le fait que vous pouvez maintenant exécuter le client Docker pour Linux sous bash, évitant ainsi d’utiliser PowerShell si vous n’êtes pas habitué à utiliser - Carlos Rafael Ramirez
Il sera intéressant de voir s’ils s’adaptent à l’essaim de dockers. - Hawkeye