Docker wewnątrz WSL2

0

Udało się komuś sprawić aby Docker bez problemów latał w WSL2, aby sam potrafił z automatu wystartować i aby nie trzeba było się męczyć z networkingiem aby dostać się z hosta/Windowsa do rzeczy latających na tym Dockerze?

2

Dobra, znalazłem że od niedawna dodali wsparcie dla Systemd.

Może teraz to będzie działać

https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/

0

Czy dobrze rozumiem, że chcesz postawić windows na tym linux z wsl2 na tym docker z kolejnym linuxem? eeeeeee?

1

A jaki masz problem? U mnie działa.

0

@ehhhhh:

wtf?

Chce odpalić Dockera (np. bazkę) w Linuxie w WSL2 i połączyć się do niego z hosta (Windowsa)

@jurek1980

Normalnie ci docker startuje po restarcie hosta i nie trzeba kombinować z IPkami aby się podłączyć?

Ty nie piszesz o Docker Desktop, prawda?

1

O Docker desktop zintegrowanym w WSL2. No ale to chyba do IP nie ma znaczenia. Nie wiem jak się łączysz dokładnie. Może masz podobne problemy do moich kiedyś Brak komunikacji między kontenerem a hostem Win11 WSL2
?

0

@jurek1980:

Ja nie pisze o Docker Desktop, ja chcę zainstalować tego Dockera w Linuxie w WSL2

To tak jakbyś miał na Windowsie maszynę wirtualną z Linuxem i w niej miał Dockera

0

@1a2b3c4d5e: no czyli chcesz zrobić to co ja napisałem :p virtualke na virtualce

1

z tego co rozumiem:

  • wsl2 jest linuksem w windowsie
  • docker nie jest żadną wirtualką
  • ergo, docker w wsl2 to nie jest żadna wirtualka w wirtualce
  • poziom wirtualizacji jest nadal taki sam jak samo wsl2, ale jest dodatkowo dockerowa izolacja
0

@Wibowit: tylko, że docker wsl2 stawiasz na windowsie a nie na linuxe zainstalowanym na windowsie jak chce @1a2b3c4d5e

0

@Wibowit:

Ale tu nie chodzi o żadną wirtualizacje, a jedynie podałem to jako przykład abyście mogli łatwiej zrozumieć co chcę zrobić.

Generalnie już to kiedyś zrobiłem, ale to było toporne (sieć i ręczne startowanie daemona dockerowego)

1

z tego co rozumiem wsl2 = linux, tzn. to jądro https://github.com/microsoft/WSL2-Linux-Kernel
do niego trzeba doinstalować userspace, np. ubuntu. userspace = większość systemu, ale np. bez jądra (bo przecież jądro już jest w wsl2 out of the box).
skoro już jest jądro linux to można instalować dockera bezpośrednio pod nim, bez dodatkowych wirtualek jak chce @ehhhhh czy inni.
potem chyba możesz poguglać np. "wsl2 ubuntu autostart" albo coś tego typu
https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units

to start a service at boot, use the enable command:
sudo systemctl enable application.service

@1a2b3c4d5e: próbowałeś odpalać tego typu polecenia w wsl2? skoro naprawili już systemd w wsl2 to powinno działać poprawnie.

ps:
a no i z tego artykułu co podlinkowałeś, trzeba włączyć systemd jawnie: https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/#set-the-systemd-flag-set-in-your-wsl-distro-settings

1

Chyba inaczej tego nie wytłumacze

Aktualnie gdy odpalam WSL2, to muszę wejść i wklepać m.in

sudo dockerd &

aby daemona dockera odpalić

a dodatkowo jeszcze muszę znaleźć IPka tego WSL2

więc robie

XD@XD:/mnt/c/Users/XD$ hostname -I | cut -f 1 -d ' '
172.25.115.54

i teraz mogę go użyć

weźmy sobie jakiegoś Docker fila

XD@XD:~/dotnet$ cat Dockerfile
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build-env
WORKDIR /App

# Copy everything
COPY . ./
# Restore as distinct layers
RUN dotnet restore
# Build and publish a release
RUN dotnet publish -c Release -o out

# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:7.0
WORKDIR /App
COPY --from=build-env /App/out .
ENTRYPOINT ["dotnet", "dotnet.dll"]

zbudujmy to

docker build -t test_webapp2 -f Dockerfile .

XD@XD:~/dotnet$ docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
test_webapp2                      latest              002b69a0ad98        2 minutes ago       220MB

odpalmy

XD@XD:~/dotnet$ docker run -p 5000:80 test_webapp2 &
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://[::]:80
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /App

i działa, łącze się do tego z Windowsa

screenshot-20221115204337.png

no ale przecież chyba nie chodzi o to, abym cały czas startował Daemona dockerowego ręcznie i wyciągał IPka ręcznie, co nie?

@Wibowit:

Z tym co jest w artykule to tez niezły cyrk, bo chyba mam jakąś starą wersję WSL2, a update z jakiegoś powodu nie mogę zrobić :D

This change is only available in the Microsoft Store version of WSL version 0.67.6 and higher. You can check your version number by running wsl --version.

a u mnie

wsl --version
Invalid command line option: --version

ale ok, może to się wyjaśni, a co z IPkiem? da się to jakoś na stałe ustawić?

2

Docker desktop robi dokładnie to co chcesz osiągnąć. Jego instalacja powoduje że zainstalowane jest dockerowe distro w wslu (linux) a sam docker desktop jest tylko interfejsem graficznym komunikującym się z tym distro w wslu. Jak startujesz docker desktopa na Windowsie to odpalany jest docker engine w distro dockerowym. Dockerowe cli na Windowsie komunikuje się po socketcie z docker enginem będącym w distro linuxowym.

1

@Inclouds:

Ja wiem, zdaje sobie sprawę, ale chciałem uzyskać ten sam efekt bez syfienia na hoście :P

0

Czaje. No to jak jesteś kumaty to polecam Ci odwiedzić repo container-desktop na gh. To darmowa alternatywa dla docker desktopa od którego odchodzą firmy. W tym repo masz instalke i skrypty bashowe/cmdkowe które są uruchamiane gdy się ten container-desktop instaluje. Możesz to przeanalizować i samemu sobie wyodrębnić to co chcesz (przerabiałem temat).

Nie rozumiem też o jakim syfieniu na hoscie mówisz. Tam się nie dzieje nic niezwykłego.

0
1a2b3c4d5e napisał(a):

Chyba inaczej tego nie wytłumacze

Aktualnie gdy odpalam WSL2, to muszę wejść i wklepać m.in

sudo dockerd &
sudo dockerd &

aby daemona dockera odpalić

zgaduję, że to da się załatwić tym systemd co napisałem wyżej, ale najpierw musisz sobie ten upgrade zrobić :)

a co z IPkiem? da się to jakoś na stałe ustawić?

chyba można go pobrać z zewnątrz:
powershellowy skrypt z https://superuser.com/a/1676054

wsl -- ip -o -4 -json addr list eth0 `
| ConvertFrom-Json `
| %{ $_.addr_info.local } `
| ?{ $_ }

może z użyciem tego kawałka kodu (czy czegoś podobnego) postawisz proxy lokalnie?
albo może da się jakoś zrobić przekierowanie ipków? netsh interface ip add address ??? - nie wiem jak to działa.

0

@1a2b3c4d5e Używam na codzien Win10+DockerDesktop+Wls2+Ubuntu i nie bardzo rozumiem po co Ci dodatkowy docker wewnątrz Wls-owego Linuxa. DockerDesktop jest tak zoptymalizowany z Wls2 że raczej lepiej nie zrobisz. Wiem że można zainstalować dockera wewnątrz Linuxa postawionego na Wls2 ale po co. Ogólnie ten Linux jest niby jak 'natywny' ale ciągle są z tym problemy przy różnych instalacjach... Ja używam bo corpo narzuca, lepsze to niż sam windows ale ogólnie polecam natywny Linux bo to to tylko namiastka...

1

@Rulon ale docker desktop właśnie to robi, instaluje distro linuxa w wslu a w linuxie jest docker engine.

A do czego Ci IP hosta? Jeżeli chcesz żeby twoje docker cli się łączyło do docker engine to musisz sobie zmountowac socket (.sock) i skonfigurować cli (daemon.json czy coś takiego) żeby po tym socketcie się łączył z docker enginem w linuchu.

Jeżeli chcesz sobie z hosta uderzyć do serwisu dockerowego wexposowanego na jakimś porcie to możesz to normalnie zrobić przez localhosta, bo Windows domyślnie przekierowuje flow na wsla jezeli nie znajdzie niczego nasłuchującego na danym porcie w windzie.

Jeżeli chcesz, żeby mieć dostęp z wnętrza kontenera do hosta, to musisz wyciągnąć IP twojego Network adaptera (domyślny eth) i po tym IP uderzać do hosta. Dla lepszego experience możesz to IP sobie do hostsow wpisać żeby je zastąpić czymś bardziej przejrzystym, np host.docker.internal

PS. A najlepiej po prostu przeanalizuj instalke container-desktopa.

0

Ja tak mam. Na starcie włącza mi się docker bo mam do bashrc dodane startowanie go po prostu. IP w serwerze/dockerze mam ustawione na 0.0.0.0 więc wyłapuje mi localhosta i nie muszę kombinować z IP jeśli chodzi o serwer.

Natomiast problem ze zmieniającym IP jest gdy chcesz się podłączyć do bazy danych jakimś narzędziem typu pgadmin czy odpowiednik z IDE

0

@Inclouds:

A do czego Ci IP hosta?

Potrzebuje IP guesta po to, aby połączyć się z np. redisem w dockerze.

Jeżeli chcesz sobie z hosta uderzyć do serwisu dockerowego wexposowanego na jakimś porcie to możesz to normalnie zrobić przez localhosta, bo Windows domyślnie przekierowuje flow na wsla jezeli nie znajdzie niczego nasłuchującego na danym porcie w windzie.

Ale zwała na Firefoxie mi nie działa, a z poziomu curla czy edge faktycznie http://localhost:5000 działa jak http://172.30.118.122:5000

co tu się odpi****la :D

screenshot-20221115215611.png
screenshot-20221115215623.png
screenshot-20221115215629.png

0

No co się odpitala, przecież pisałem, że jak Windows nic nie znajdzie nasłuchującego na danym porcie to przekierowuje domyślnie do wsla, magia 😁(pewnie skacze po wszystkich distro aż znajdzie takie, które ma serwis nasłuchujący na tym porcie)
A czemu Firefox nie ogarnia - nie mam pojęcia.

Ale niepotrzebnie się męczysz, zainstaluj sobie tego docker desktopa albo container-desktop/podmana/ranchera a nie kombinujesz xD

0

Jak się łączysz z tym redisem, że potrzebujesz IP?

0

@anonimowy:

hmm?

var redis = ConnectionMultiplexer.Connect("x.x.x.x:6379");
var db = redis.GetDatabase();

ale to tylko przykład, tam może być wszystko, jak w normalnym kontenerze.

0

Nie rozumiem nadal. Jeśli stawiasz redisa na dockerze to łączysz się do niego za pomocą np. 'redis://redis/0'

0

@anonimowy:

redis://redis/0

i... to przecież też jest normalny adres

nazwa opisowa: redis (tłumaczona pod spodem na ipka)
protokół: redis

niczym się to nie różni od ipka, czy się mylę?

tylko że skąd mój Windows "host" ma wiedzieć o tym "redis" który siedzi gdzieś w Linuxie w kontenerze?

0

Aplikacja jest w dockerze i łączy się z innym dockerem. Po co tutaj wychodzić do hosta?

1

@anonimowy: A kto powiedział, że apka jest w kontenerze? A poza tym gdyby nawet tak było, to zawsze jest potrzeba odpalić jakieś gui do przeglądania zawartości redisa, db itp.

I autorowi nie chodzi raczej o wychodzenie do hosta tylko o wchodzenie z hosta, przynajmniej ja tak to rozumiem.

0

@anonimowy

Załóż że masz bazke w kontenerze i u siebie chcesz odpalić jakiś np. SQL Management Studio czy PGAdmin

0

No to właśnie z tym mam problem. Ale do redisa nie łączysz się przez GUI tylko zazwyczaj przez konsole więc nie ma to znaczenia bo podłączasz się do kontenera.
Natomiast jak wcześniej pisałem z IP do WSL do podłączenia się do bazy przez GUI mam też problem i nie znalazłem rozwiązania. Pewnie dało by się zrobić jakiś skrypt, który sprawdza jakie jest IP i dodaje do np. hosts ale nie wiem czy nie szkoda zachodu

1 użytkowników online, w tym zalogowanych: 0, gości: 1