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?
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?
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.
1) stop the container
2) stop docker service (per Tacsiazuma's comment)
3) change the file
4) restart your docker engine (to flush/clear config caches)
5) start the container
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
hostconfig.json
i config.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
(i docker create
).
Inne polecenia, docker start
nie ma -p
opcji i docker port
wyświetla tylko bieżące przekazywanie.
Aby dodać przekierowanie portów, zawsze wykonuję następujące kroki,
przestań działać pojemnik
docker stop test01
zatwierdzić kontener
docker commit test01 test02
UWAGA: Powyższe test02
jest nowym obrazem, który tworzę z test01
kontenera.
ponownie uruchomić z zatwierdzonego obrazu
docker run -p 8080:8080 -td test02
Gdzie pierwszy 8080 to port lokalny, a drugi 8080 to port kontenerowy.
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.
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.
$ docker run -p <public_port>:<private_port> -d <image>
zacznie działać kontener. W tym samouczku opisano przekierowanie portów.
docker run
tworzy i uruchamia nowy kontener. Jest to równoważne z działaniem, docker create
po którym następuje docker 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
server
{
listen 9000;
location / {
proxy_pass http://my_existing_container:9000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
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:
upstream my_service {
server my_existing_container:9000;
}
server {
listen 9000;
proxy_pass my_service;
}
W przykładzie Fujimoto Youichi test01
jest kontenerem, a test02
obrazem.
Zanim to docker run
zrobisz, możesz usunąć oryginalny pojemnik, a następnie ponownie przypisać kontenerowi tę samą nazwę:
$ docker stop container01
$ docker commit container01 image01
$ docker rm container01
$ docker run -d -P --name container01 image01
(Używanie -P
do wystawiania portów losowym portom zamiast ręcznego przypisywania).
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:
cd /var/lib/docker/containers/<conainerID><and then some:)>
Zatrzymaj pojemnik:
docker stop <NAME>
Zmień pliki
vi config.v2.json
"Config": {
....
"ExposedPorts": {
"80/tcp": {},
"8888/tcp": {}
},
....
},
"NetworkSettings": {
....
"Ports": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
I zmień plik
vi hostconfig.json
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
"8888/tcp": [
{
"HostIp": "",
"HostPort": "8888"
}
]
}
Uruchom ponownie dokera i powinno działać.
Odwrotnie, jeśli nie czujesz się dobrze z konfiguracją głębokości Docker, IPtables będzie twoim przyjacielem.
iptables -t nat -A DOCKER -p tcp --dport ${YOURPORT} -j DNAT --to-destination ${CONTAINERIP}:${YOURPORT}
iptables -t nat -A POSTROUTING -j MASQUERADE -p tcp --source ${CONTAINERIP} --destination ${CONTAINERIP} --dport ${YOURPORT}
iptables -A DOCKER -j ACCEPT -p tcp --destination ${CONTAINERIP} --dport ${YOURPORT}
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.
DOCKER_PORT
do MACHINE_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
ssh -R8888:localhost:8888 <username>@172.17.0.1
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.
Dla użytkowników Windows i Mac istnieje inny dość łatwy i przyjazny sposób na zmianę portu mapowania:
pobierz kitematic
przejdź do strony ustawień kontenera, na karcie porty, możesz bezpośrednio zmodyfikować tam opublikowany port.
uruchom pojemnik ponownie
Krótka odpowiedź: Nie można przypisać mapowania portów do istniejącego kontenera Docker
Potrzebujesz nowego pojemnika ... poradzisz sobie z tym.
Jeśli chcesz po prostu zmienić port działającego kontenera, wykonaj następujące czynności:
sudo docker stop NAME
sudo docker run -d -p 81:80 NAZWA
natomiast:
„-d” do tła / demona dokera
„-p” włącza mapowanie portów
Zewnętrzny („odsłonięty”) port „81”, którego używasz do uzyskiwania dostępu za pomocą przeglądarki
Port nasłuchiwania wewnętrznego kontenera dokującego „80”
docker run
poleceniu NAME
znajduje się nazwa obrazu, z którego ma być uruchamiany kontener, natomiast w docker stop
poleceniu NAME
określa nazwę kontenera, który ma się zatrzymać.