web-dev-qa-db-fra.com

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

Ma compréhension était que la principale limitation de l'exécution de docker sur d'autres systèmes d'exploitation était les conteneurs du réseau Linux qui rendaient cela possible. (Certainement pour les Mac).

Récemment Microsoft a annoncé une version bêta d'un bunt linux mode utilisateur fonctionnant nativement sur Windows 10. Cela peut exécuter des binaires compilés au format ELF sur 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 de Windows 10 (Ubuntu)?

127
Hawkeye

Vous pouvez utiliser Docker Desktop pour Windows comme moteur et Docker pour Linux comme client dans WSL sur Ubuntu/Debian sur 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é par le client docker Linux dans l'espace utilisateur bash.

Depuis la version 17.03.1-ce-win12 (12058), vous devez cocher Exposer le démon sur tcp: // localhost: 2375 sans TLS pour autoriser Linux Docker client pour continuer à communiquer avec le démon Windows Docker par 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

Ajoutez 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 l'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é en utilisant 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**

Volumes

Soyez prudent lors de l'ajout de volumes. Le chemin C:\dir sera visible comme /mnt/c/dir sur WSL et comme /c/dir/ par moteur docker. Vous pouvez le surmonter de façon permanente:

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

Vous devez quitter et recharger WSL après avoir apporté la modification à wsl.conf afin que WSL lise vos modifications au lancement.

[~ # ~] mise à jour [~ # ~]

de: Quoi de neuf pour la ligne de commande dans Windows 10 version 18

Sockets Unix Les sockets Unix n'étaient pas pris en charge sous Windows, et maintenant ils le sont! Vous pouvez également communiquer sur des sockets Unix entre Windows et WSL. L'une des grandes choses à ce sujet est qu'il permet à WSL d'exécuter le client Docker Linux pour interagir avec le démon Docker exécuté sur Windows.

[~ # ~] mise à jour [~ # ~]

Ce script et l'utilisation des sockets Unix ont été inclus dans la configuration pengwin de Pengwin .

Cordialement

104

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

Nous ne savons pas encore (mais probablement pas).

Les faits

  • Windows 10 peut désormais exécuter une variété de programmes Linux (dont le Bash Shell 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 fonctionnent sur un système Linux typique. Dans ce cas, ils ont été extraits d'Ubuntu.
  • Pour rendre cela possible, Windows 10 a été modifié pour accepter les appels système Linux (syscalls), et pour pouvoir charger et exécuter les binaires ELF ( commentaire de Scott Hanselman ). Cela signifie que les exécutables Linux non modifiés peuvent être exécutés, ils chargeront leurs bibliothèques partagées non modifiées selon les besoins, et Windows les exécutera en tant que processus Windows.
  • Chaque fois qu'un tel programme Linux veut interagir avec le noyau, il émet un appel système (ou laisse une bibliothèque le faire). C'est (vraisemblablement) la seule différence par rapport à l'exécution sous Linux: lors de l'exécution 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 le chroot et les espaces de noms, entre autres) ont été implémentés ou non. La réponse est probablement "non". Docker nécessite des fonctionnalités assez sophistiquées (et spécifiques à Linux) pour la gestion des processus et des ressources et l'isolement des processus. Bien qu'il soit probablement possible de répliquer tout cela sur Windows, ce serait beaucoup de travail, et puisque l'objectif de cette fonctionnalité Windows semble exécuter des programmes d'espace utilisateur Linux, il semble peu probable qu'ils aient fait tout le travail (et l'ont gardé secret) .

Cependant, il n'y a aucune information définitive de toute façon, pour autant que je sache.

Ports Docker existants

Bien sûr, si Microsoft décide de vouloir la prise en charge de Docker dans Windows 10, il sera probablement en mesure de l'offrir. Il existe un précédent 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 vers Windows (en particulier, Windows Server 2016) - voir ceci entrée du blog Docker d'août 2015. Cependant, contrairement au port FreBSD ci-dessus, ce sera un port qui permet à Docker pour exécuter des images Windows sur Windows, pas des images Linux sur Windows. Merci à Rоry McCune de l'avoir signalé.
51
sleske

Le premier aperçu d'initié a été publié hier. J'ai essayé d'installer Docker mais il échoue avec les éléments 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 prochaine version.

13
CodedBeard

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 dans Windows à utiliser en remplacement (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.

13
Florin Asăvoaie

Depuis le Creator Update (publié publiquement le 13 juin 2017), vous pouvez exécuter l'exécutable Windows natif directement dans WSL. Cela signifie que si vous avez déjà installé Docker pour Windows vous pouvez simplement appeler les binaires docker 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 dans le DOCKER_BIN ré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 comme " Impossible de traduire le répertoire de travail actuel " s'il est exécuté à partir d'un répertoire Linux. Il suffit de cd dans un répertoire Windows (par exemple /mnt/c/Users/YourUsername) et vous devriez être bon.

7
dimo414

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

Cela peut ne pas sembler beaucoup étant donné que vous avez un client Docker Windows, mais c'est utile si vous avez des chaînes d'outils Linux qui incluent Docker pour ses fonctionnalités côté client.

6
mixja

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

C'est donc définitivement 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
4
Bruno Medina

En septembre 2016, non.

Toutes les implémentations actuelles de Docker sur Windows utilisent la virtualisation, Docker 1.12 utilise un hyperviseur dans Windows, supprimant ainsi l'avantage de la conteneurisation sur la virtualisation.

Docker a besoin de plus que de simples appels aux 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 les cgroups ni les 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 ne fonctionnera que certains services Windows, par exemple IIS, et non Ubuntu

3
Graham

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

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

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