Nie jestem pewien, czy coś tu źle zrozumiałem, ale wydaje się, że można ustawić mapowanie portów tylko poprzez utworzenie nowego kontenera z obrazu. Czy istnieje sposób przypisania mapowania portów do istniejącego kontenera Docker?
docker
port
lxc
linux-containers
thasmo
źródło
źródło
Odpowiedzi:
Możesz zmienić mapowanie portów, bezpośrednio edytując
hostconfig.json
plik na/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
Możesz określić [hash_of_the_container] za pomocą
docker inspect <container_name>
polecenia, a wartością pola „Id” jest skrót.Dzięki temu nie musisz tworzyć obrazu z takim podejściem. Możesz także zmienić tutaj flagę restartu.
PS Możesz odwiedzić https://docs.docker.com/engine/admin/, aby dowiedzieć się, jak poprawnie zrestartować silnik dokera zgodnie z maszyną hosta. Kiedyś
sudo systemctl restart docker
, aby ponownie uruchomić Döcker silnik, który jest uruchomiony na Ubuntu 16.04źródło
hostconfig.json
iconfig.v2.json
do tej pracy. Użyj linku podanego przez @rohitmohta, aby zobaczyć szczegóły.screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
Po uruchomieniu tty możesz przejdź do / var / lib /Interesuje mnie również ten problem.
Jak wspomniano w @Thasmo , przekierowanie portów można określić TYLKO za pomocą polecenia
docker run
(idocker create
).Inne polecenia,
docker start
nie ma-p
opcji idocker port
wyświetla tylko bieżące przekazywanie.Aby dodać przekierowanie portów, zawsze wykonuję następujące kroki,
przestań działać pojemnik
zatwierdzić kontener
UWAGA: Powyższe
test02
jest nowym obrazem, który tworzę ztest01
kontenera.ponownie uruchomić z zatwierdzonego obrazu
Gdzie pierwszy 8080 to port lokalny, a drugi 8080 to port kontenerowy.
źródło
docker start
?Jeśli przez „istniejące” masz na myśli „uruchamianie”, nie jest możliwe (obecnie) dodanie mapowania portów.
Możesz jednak dynamicznie dodawać nowy interfejs sieciowy, np. Pipework , jeśli chcesz udostępnić usługę w działającym kontenerze bez jej zatrzymywania / restartowania.
źródło
Nie jestem pewien, czy możesz zastosować mapowanie portów działającego kontenera. Możesz zastosować przekierowanie portów podczas uruchamiania kontenera, który różni się od tworzenia nowego kontenera.
zacznie działać kontener. W tym samouczku opisano przekierowanie portów.
źródło
docker run
tworzy i uruchamia nowy kontener. Jest to równoważne z działaniem,docker create
po którym następujedocker start
.Wydaje się, że edycja pliku hostconfig.json nie działa teraz. Kończy się to tylko ujawnieniem tego portu, ale nie opublikowaniem go na hoście. Zatwierdzanie i odtwarzanie kontenerów nie jest dla mnie najlepszym podejściem. Nikt nie wspomniał
docker network
?Najlepszym rozwiązaniem byłoby użycie odwróconego proxy w tej samej sieci
Utwórz nową sieć, jeśli poprzedniego kontenera nie ma w żadnej z nazwanych.
docker network create my_network
Dołącz istniejący kontener do utworzonej sieci
docker network connect my_network my_existing_container
Uruchom odwróconą usługę proxy (np. Nginx), publikując potrzebne porty, dołączając do tej samej sieci
docker run -d --name nginx --network my_network -p 9000:9000 nginx
Opcjonalnie usuń default.conf z nginx
docker exec nginx rm /etc/nginx/conf.d/default.conf
Utwórz nową konfigurację nginx
Skopiuj config do kontenera nginx.
docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf
Uruchom ponownie nginx
docker restart nginx
Zalety : Aby opublikować nowe porty, możesz bezpiecznie zatrzymać / zaktualizować / odtworzyć kontener nginx, jak chcesz, bez dotykania kontenera biznesowego. Jeśli potrzebujesz zerowego czasu przestoju dla nginx, możesz dodać więcej odwróconych usług proxy dołączających do tej samej sieci. Poza tym kontener może dołączyć do więcej niż jednej sieci.
Edytować:
Aby odwrócić usługi proxy inne niż HTTP, plik konfiguracyjny jest nieco inny. Oto prosty przykład:
źródło
W przykładzie Fujimoto Youichi
test01
jest kontenerem, atest02
obrazem.Zanim to
docker run
zrobisz, możesz usunąć oryginalny pojemnik, a następnie ponownie przypisać kontenerowi tę samą nazwę:(Używanie
-P
do wystawiania portów losowym portom zamiast ręcznego przypisywania).źródło
Jeśli uruchomisz
docker run <NAME>
, pojawi się nowy obraz, który najprawdopodobniej nie jest tym, czego chcesz.Jeśli chcesz zmienić bieżący obraz, wykonaj następujące czynności:
docker ps -a
Weź identyfikator docelowego kontenera i przejdź do:
Zatrzymaj pojemnik:
Zmień pliki
I zmień plik
Uruchom ponownie dokera i powinno działać.
źródło
Odwrotnie, jeśli nie czujesz się dobrze z konfiguracją głębokości Docker, IPtables będzie twoim przyjacielem.
To tylko sztuczka, a nie zalecany sposób, który działa w moim scenariuszu, ponieważ nie mogłem zatrzymać kontenera, mam nadzieję, że również ci pomoże.
źródło
DOCKER_PORT
doMACHINE_PORT
, które elementy powinny zostać zmienione?używamy przydatnych narzędzi, takich jak ssh, aby łatwo to osiągnąć.
Korzystałem z hosta Ubuntu i obrazu dokera opartego na ubuntu.
gdy trzeba zmapować nowy port,
w oknie dokowanym uruchom następujące polecenie
172.17.0.1 to adres IP interfejsu dokera (można go uzyskać, uruchamiając go
ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" "
na hoście).tutaj miałem lokalny port 8888 zmapowany z powrotem na hosty 8888. Możesz zmienić port w razie potrzeby.
jeśli potrzebujesz jeszcze jednego portu, możesz zabić ssh i dodać do niego jeszcze jedną linię -R za pomocą nowego portu.
Testowałem to z netcat.
źródło
/var/lib/docker/containers/${container_id}
katalogu i edytujhostconfig.json
PortBindings.HostPort
, że chcesz zmienić.źródło
Dla użytkowników Windows i Mac istnieje inny dość łatwy i przyjazny sposób na zmianę portu mapowania:
źródło
Krótka odpowiedź: Nie można przypisać mapowania portów do istniejącego kontenera Docker
Potrzebujesz nowego pojemnika ... poradzisz sobie z tym.
źródło
Jeśli chcesz po prostu zmienić port działającego kontenera, wykonaj następujące czynności:
natomiast:
źródło
docker run
poleceniuNAME
znajduje się nazwa obrazu, z którego ma być uruchamiany kontener, natomiast wdocker stop
poleceniuNAME
określa nazwę kontenera, który ma się zatrzymać.