Não sei se entendi algo errado aqui, mas parece que só é possível definir mapeamentos de portas criando um novo contêiner a partir de uma imagem. Existe uma maneira de atribuir um mapeamento de porta a um contêiner Docker existente?
docker
port
lxc
linux-containers
thasmo
fonte
fonte
Respostas:
Você pode alterar o mapeamento de portas editando diretamente o
hostconfig.json
arquivo em/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
Você pode determinar o [hash_of_the_container] através do
docker inspect <container_name>
comando e o valor do campo "Id" é o hash.Portanto, você não precisa criar uma imagem com essa abordagem. Você também pode alterar o sinalizador de reinicialização aqui.
PS Você pode visitar https://docs.docker.com/engine/admin/ para saber como reiniciar corretamente o mecanismo do docker de acordo com a máquina host. Eu costumava
sudo systemctl restart docker
reiniciar o mecanismo do docker que está sendo executado no Ubuntu 16.04fonte
hostconfig.json
econfig.v2.json
fazer isso funcionar. Use o link fornecido por @rohitmohta para ver os detalhes.screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
Quando você obtiver o tty em execução, navegue para / var / lib / dockerTambém estou interessado neste problema.
Como o @Thasmo mencionou, o encaminhamento de porta pode ser especificado SOMENTE com o comando
docker run
(edocker create
).Outros comandos,
docker start
não possui-p
opção edocker port
exibe apenas os encaminhamentos atuais.Para adicionar encaminhamentos de porta, eu sempre sigo estas etapas,
parar de executar o contêiner
confirmar o contêiner
NOTA: A descrição acima
test02
é uma nova imagem que estou construindo a partir dotest01
contêiner.re- correr a partir da imagem commited
Onde o primeiro 8080 é a porta local e o segundo 8080 é a porta do contêiner.
fonte
docker start
?Se por "existente" você quer dizer "em execução", não é possível (atualmente) adicionar um mapeamento de porta.
No entanto, você pode adicionar dinamicamente uma nova interface de rede com, por exemplo , Pipework , se precisar expor um serviço em um contêiner em execução sem parar / reiniciá-lo.
fonte
Não tenho certeza se você pode aplicar o mapeamento de portas a um contêiner em execução. Você pode aplicar o encaminhamento de porta enquanto executa um contêiner diferente de criar um novo contêiner.
começará a executar o contêiner. Este tutorial explica o redirecionamento de porta.
fonte
docker run
cria e inicia um novo contêiner. É equivalente a fazerdocker create
seguido pordocker start
.A edição de hostconfig.json parece não estar funcionando agora. Ele termina apenas com essa porta sendo exposta, mas não publicada no host. Confirmar e recriar contêineres não é a melhor abordagem para mim. Ninguém mencionou
docker network
?A melhor solução seria usar proxy reverso na mesma rede
Crie uma nova rede se o contêiner anterior não estiver em nenhum nomeado.
docker network create my_network
Associe seu contêiner existente à rede criada
docker network connect my_network my_existing_container
Inicie um serviço de proxy reverso (por exemplo, nginx) publicando as portas necessárias, ingressando na mesma rede
docker run -d --name nginx --network my_network -p 9000:9000 nginx
Como opção, remova o default.conf no nginx
docker exec nginx rm /etc/nginx/conf.d/default.conf
Crie uma nova configuração nginx
Copie a configuração para o contêiner nginx.
docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf
Reinicie o nginx
docker restart nginx
Vantagens : Para publicar novas portas, você pode parar / atualizar / recriar com segurança o contêiner nginx como desejar, sem tocar no contêiner comercial. Se você precisar de um tempo de inatividade zero para o nginx, é possível adicionar mais serviços de proxy reverso ingressando na mesma rede. Além disso, um contêiner pode ingressar em mais de uma rede.
Editar:
Para inverter serviços proxy não-http, o arquivo de configuração é um pouco diferente. Aqui está um exemplo simples:
fonte
No exemplo de Fujimoto, Youichi
test01
é um contêiner, enquantotest02
é uma imagem.Antes de fazer,
docker run
você pode remover o contêiner original e atribuir ao contêiner o mesmo nome novamente:(Utilizando
-P
para expor portas a portas aleatórias, em vez de atribuir manualmente).fonte
Se você executar,
docker run <NAME>
ela gerará uma nova imagem, o que provavelmente não é o que você deseja.Se você deseja alterar uma imagem atual, faça o seguinte:
docker ps -a
Pegue o ID do seu container de destino e vá para:
Pare o recipiente:
Mude os arquivos
E mudar arquivo
Reinicie sua janela de encaixe e ela deve funcionar.
fonte
O contrário, se você não se sentir confortável com as tabelas de IP da configuração de profundidade do Docker, seria seu amigo.
Este é apenas um truque, não uma maneira recomendada de como isso funciona com o meu cenário, porque eu não conseguia parar o contêiner, espero que também o ajude.
fonte
DOCKER_PORT
paraMACHINE_PORT
que as peças devem ser alteradas?usamos ferramentas úteis como ssh para fazer isso facilmente.
Eu estava usando o host do ubuntu e a imagem do docker baseada no ubuntu.
quando uma nova porta é necessária para ser mapeada,
dentro da janela de encaixe, execute o seguinte comando
172.17.0.1 era o ip da interface do docker (você pode obtê-lo executando
ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" "
no host).aqui eu tinha a porta 8888 local mapeada de volta para os hosts 8888. você pode alterar a porta conforme necessário.
se você precisar de mais uma porta, poderá matar o ssh e adicionar mais uma linha de -R a essa nova porta.
Eu testei isso com o netcat.
fonte
/var/lib/docker/containers/${container_id}
diretório e editehostconfig.json
PortBindings.HostPort
que você deseja a alteração.fonte
Para usuários de Windows e Mac, existe outra maneira bastante fácil e amigável de alterar a porta de mapeamento:
fonte
Resposta curta: Você não pode atribuir um mapeamento de porta a um contêiner Docker existente
Você precisa de um novo contêiner ... lide com isso.
fonte
Se você simplesmente deseja alterar a porta do contêiner em execução, faça:
enquanto que:
fonte
docker run
comando,NAME
é o nome da imagem a ser executado a partir de um recipiente, enquanto que nadocker stop
oNAME
se refere ao nome do recipiente para paragem.