web-dev-qa-db-fra.com

Comment montez-vous le socket Docker sous Windows?

J'essaie de faire fonctionner une application sur Windows qui a été développée uniquement sur Unices. Tout est docké et utilise l'équilibreur de charge traefik. Les volumes du docker pour exécuter traefik ressemblent à ceci:

volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro,delegated
- ${PWD}/load_balancer/traefik.toml:/etc/traefik/traefik.toml:ro,delegated

Le premier volume fonctionne bien sur Mac ou Linux, mais fonctionne-t-il sur Windows? L'application échoue (l'équilibreur de charge donne un 404) et il peut être lié à ce volume. Lorsque je démarre l'image, la prise ressemble à une prise:

/ # ls -laF /var/run/docker.sock
srw-rw----    1 root     root             0 Sep  2 11:04 /var/run/docker.sock=

Est-ce que ça marche? Une façon de le tester? Quelle est la bonne façon de procéder?

En essayant de comprendre cela, j'ai essayé de le remplacer par ceci:

volumes:
- //./pipe/docker_engine:/var/run/docker.sock

basé sur divers articles et rapports de bogues que j'ai trouvés en ligne. L'image docker démarre mais elle échoue de la même manière et maintenant dans le conteneur docker elle ressemble à un répertoire:

/ # ls -laF /var/run/docker.sock
total 4
drwxr-xr-x    2 root     root            40 Sep  3 14:52 ./
drwxr-xr-x    1 root     root          4096 Sep  3 14:57 ../

Suite aux réponses de Marc ABOUCHACRA, j'ai essayé:

volumes:
- type: npipe
  source: ////./pipe/docker_engine
  target: /var/run/docker.sock
  consistency: delegated

mais cela ressemble aussi à un répertoire:

/ # ls -laF /var/run/docker.sock
total 4
drwxr-xr-x    2 root     root            40 Sep  3 14:52 ./
drwxr-xr-x    1 root     root          4096 Sep  3 14:57 ../

J'ai également essayé ceci:

volumes:
- npipe:////./pipe/docker_engine:/var/run/docker.sock:ro,delegated

mais cela échoue avec cette erreur:

ERROR: Volume npipe:////./pipe/docker_engine:/var/run/docker.sock:ro,delegated has incorrect format, should be external:internal[:mode]

La totalité docker-compose.yml la section ressemble à ceci:

  lb:
    image: load-balancer
    build: ${WORKSPACE}/go-home/load_balancer
    ports:
    - 80:80
    - 443:443
    links:
    - wifi-ui-dev
    - wifi-ui-prod
    - portal
    - wifi-api
    env_file:
    - .env
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock:ro,delegated
    - ${PWD}/load_balancer/traefik.toml:/etc/traefik/traefik.toml:ro,delegated

Ma question concerne spécifiquement l'exécution de cette image Docker, qui est un Linux, sur un hôte Windows, exécutant Docker pour Windows. Je comprends que je peux l'exécuter sur un hôte Linux en installant Linux sur une autre machine ou un VM sur la machine Windows, c'est équivalent. Exécuter des invités Windows n'est pas ce que je recherche non plus au cas où il existe un moyen d'exposer les sockets de Windows à Windows uniquement.

7
pupeno

L'utilisation d'une syntaxe courte avec le type de montage de liaison n'est pas possible: npipe:////./pipe/docker_engine:/var/run/docker.sock:ro,delegated

Vous devez utiliser la longue syntaxe dans votre fichier de composition:

volumes:
  - type: npipe
    source: ////./pipe/docker_engine
    target: /var/run/docker.sock
    consistency: delegated

Vous pouvez trouver de la documentation sur la longue syntaxe dans la documentation officielle . Cette syntaxe provient de v3.2

Gardez également à l'esprit ce que @ lucas-ramage a dit à propos de en utilisant le conteneur Windows uniquement lors de l'utilisation de npipe .

1
Marc ABOUCHACRA

Par Docker pour Windows FAQ ,

Sur Docker Desktop pour Windows, les clients peuvent se connecter au Docker Engine via un canal nommé: npipe:////./pipe/docker_engine

Voir aussi ceci problème sur GitHub ,

La version Windows de Docker n'utilise pas de socket Unix (/var/run/docker.sock) mais npipe (npipe:////./pipe/docker_engine). Vous avez donc soit

  • passer au conteneur linux qui exécute docker dans un linux virtualisé complet avec socket unix
  • pour passer le npipe au lieu du socket unix au conteneur (conteneur windows uniquement)
  • utiliser un socket réseau (devrait fonctionner avec linux et le conteneur windows)

Cependant, comme il s'agit d'un conteneur Linux, vos options sont soit A) Exécuter le docker dans une machine virtuelle (premier choix ci-dessus), soit B) Utilisez une prise réseau (le troisième choix).

0
rage