Non sono sicuro di aver frainteso qualcosa qui, ma sembra che sia possibile impostare i mapping delle porte solo creando un nuovo contenitore da un'immagine. Esiste un modo per assegnare un mapping delle porte a un contenitore Docker esistente?
Non sono sicuro di aver frainteso qualcosa qui, ma sembra che sia possibile impostare i mapping delle porte solo creando un nuovo contenitore da un'immagine. Esiste un modo per assegnare un mapping delle porte a un contenitore Docker esistente?
Risposte:
È possibile modificare il mapping delle porte modificando direttamente il hostconfig.json
file in
/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
È possibile determinare [hash_of_the_container] tramite il docker inspect <container_name>
comando e il valore del campo "Id" è l'hash.
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
Quindi non è necessario creare un'immagine con questo approccio. Puoi anche cambiare il flag di riavvio qui.
PS È possibile visitare https://docs.docker.com/engine/admin/ per informazioni su come riavviare correttamente il motore docker secondo il computer host. Ho usato sudo systemctl restart docker
per riavviare il mio motore docker che è in esecuzione su Ubuntu 16.04
hostconfig.json
e config.v2.json
far funzionare tutto questo. Usa il link fornito da @rohitmohta per vedere i dettagli.
screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
Una volta che tty è in esecuzione è possibile vai a / var / lib / docker
Sono anche interessato a questo problema.
Come menzionato @Thasmo , i port forwarding possono essere specificati SOLO con il comando docker run
(e docker create
).
Altri comandi, docker start
non ha -p
opzione e docker port
visualizza solo gli inoltri correnti.
Per aggiungere il port forwarding, seguo sempre questi passaggi,
interrompere l' esecuzione del contenitore
docker stop test01
impegnare il contenitore
docker commit test01 test02
NOTA: quanto sopra test02
è una nuova immagine che sto costruendo dal test01
contenitore.
ri correre dall'immagine Commited
docker run -p 8080:8080 -td test02
Dove il primo 8080 è la porta locale e il secondo 8080 è la porta del contenitore.
docker start
?
Se per "esistente" intendi "in esecuzione", allora non è (attualmente) possibile aggiungere un mapping delle porte.
Tuttavia, è possibile aggiungere dinamicamente una nuova interfaccia di rete con ad esempio Pipework , se è necessario esporre un servizio in un container in esecuzione senza arrestarlo / riavviarlo.
Non sono sicuro se è possibile applicare il mapping delle porte a un contenitore in esecuzione. È possibile applicare il port forwarding mentre si esegue un contenitore diverso dalla creazione di un nuovo contenitore.
$ docker run -p <public_port>:<private_port> -d <image>
inizierà l'esecuzione del contenitore. Questo tutorial spiega il reindirizzamento delle porte.
docker run
crea e avvia un nuovo contenitore. È equivalente a fare docker create
seguito da docker start
.
La modifica di hostconfig.json sembra non funzionare ora. Termina solo con quella porta esposta ma non pubblicata per ospitare. Commettere e ricreare contenitori non è l'approccio migliore per me. Nessuno menzionato docker network
?
La soluzione migliore sarebbe utilizzare il proxy inverso all'interno della stessa rete
Crea una nuova rete se il tuo contenitore precedente non si trova in quelli con nome.
docker network create my_network
Unisci il tuo contenitore esistente alla rete creata
docker network connect my_network my_existing_container
Avvia un servizio proxy inverso (ad es. Nginx) pubblicando le porte necessarie, unendoti alla stessa rete
docker run -d --name nginx --network my_network -p 9000:9000 nginx
Facoltativamente, rimuovere default.conf in nginx
docker exec nginx rm /etc/nginx/conf.d/default.conf
Crea una nuova configurazione 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;
}
}
Copia la configurazione nel contenitore nginx.
docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf
Riavvia nginx
docker restart nginx
vantaggi : per pubblicare nuove porte, è possibile arrestare / aggiornare / ricreare in sicurezza il contenitore nginx come desiderato senza toccare il contenitore aziendale. Se è necessario zero tempi di inattività per nginx, è possibile aggiungere altri servizi proxy invertiti unendosi alla stessa rete. Inoltre, un contenitore può unire più di una rete.
Modificare:
Per invertire i servizi proxy non http, il file di configurazione è leggermente diverso. Qui c'è un semplice esempio:
upstream my_service {
server my_existing_container:9000;
}
server {
listen 9000;
proxy_pass my_service;
}
Nell'esempio di Fujimoto Youichi test01
è un contenitore, mentre test02
è un'immagine.
Prima di fare docker run
è possibile rimuovere il contenitore originale e quindi assegnare nuovamente al contenitore lo stesso nome:
$ docker stop container01
$ docker commit container01 image01
$ docker rm container01
$ docker run -d -P --name container01 image01
(Utilizzo -P
per esporre le porte a porte casuali anziché assegnarle manualmente).
Se corri docker run <NAME>
, verrà generata una nuova immagine, che molto probabilmente non è ciò che desideri.
Se si desidera modificare un'immagine corrente, procedere come segue:
docker ps -a
Prendi l'id del tuo contenitore di destinazione e vai a:
cd /var/lib/docker/containers/<conainerID><and then some:)>
Ferma il contenitore:
docker stop <NAME>
Cambia i file
vi config.v2.json
"Config": {
....
"ExposedPorts": {
"80/tcp": {},
"8888/tcp": {}
},
....
},
"NetworkSettings": {
....
"Ports": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
E cambia file
vi hostconfig.json
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
"8888/tcp": [
{
"HostIp": "",
"HostPort": "8888"
}
]
}
Riavvia la finestra mobile e dovrebbe funzionare.
Al contrario, se non ti senti a tuo agio con la configurazione della profondità Docker, IPtables sarebbe tuo amico.
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}
Questo è solo un trucco non un modo raccomandato che funziona con il mio scenario perché non sono riuscito a fermare il contenitore, spero che possa aiutarti anche tu.
DOCKER_PORT
a MACHINE_PORT
, quali parti dovrebbe essere cambiato?
usiamo strumenti utili come ssh per farlo facilmente.
Stavo usando l'host di Ubuntu e l'immagine docker basata su Ubuntu.
quando è necessario mappare una nuova porta,
all'interno della finestra mobile eseguire il comando seguente
ssh -R8888:localhost:8888 <username>@172.17.0.1
172.17.0.1 era l'ip dell'interfaccia docker (puoi ottenerlo eseguendo
ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" "
sull'host).
qui avevo la porta 8888 locale mappata di nuovo agli host 8888. puoi cambiare la porta secondo necessità.
se hai bisogno di un'altra porta, puoi uccidere ssh e aggiungere un'altra linea di -R con la nuova porta.
Ho provato questo con netcat.
Per utenti Windows e Mac, esiste un altro modo abbastanza semplice e amichevole per cambiare la porta di mappatura:
scarica kitematic
vai alla pagina delle impostazioni del contenitore, nella scheda porte, puoi direttamente modificare la porta pubblicata lì.
riavviare il contenitore
Risposta breve: non è possibile assegnare un mapping delle porte a un contenitore Docker esistente
Hai bisogno di un nuovo contenitore ... affrontalo.
Se vuoi semplicemente cambiare la porta del container in esecuzione, fai:
sudo docker stop NAME
sudo docker run -d -p 81:80 NAME
mentre:
"-d" per mettere in background / deamon la finestra mobile
"-p" abilita il mapping delle porte
Porta "81" esterna (esposta) che usi per accedere con il tuo browser
Porta di ascolto del contenitore finestra mobile interna "80"
docker run
comando, NAME
è il nome dell'immagine per eseguire un contenitore da, mentre docker stop
la NAME
si riferisce al nome del contenitore di arresto.