English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Anteriormente, implementamos o acesso a serviços executados em contêineres Docker através de portas de rede.
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。
下面我们来实现通过端口连接到一个 docker 容器。
我们创建了一个 python 应用的容器。
w3codebox@w3codebox:~$ docker run -d -P training/webapp python app.py fce072cc88cee71b1cdceb57c2821d054a4a59f67da6b416fceb5593f059fc6d
另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。
我们使用 -P 参数创建一个容器,使用 docker ps 可以看到容器端口 5000 绑定主机端口 32768。
w3codebox@w3codebox:~$ docker ps CONTAINER ID IMAGE COMMAND ... PORTS NAMES fce072cc88ce training/webapp "python app.py" ... 0.0.0.0:32768->5000/tcp grave_hopper
我们也可以使用 -p 标识来指定容器端口绑定到主机端口。
两种方式的区别是:
-P :是容器内部端口随机映射到主机的高端口。
-p : 是容器内部端口绑定到指定的主机端口。
w3codebox@w3codebox:~$ docker run -d -p 5000:5000 training/webapp python app.py 33e4523d30aaf0258915c368e66e03b49535de0ef20317d3f639d40222ba6bc0
w3codebox@w3codebox:~$ docker ps CONTAINER ID IMAGE COMMAND ... PORTS NAMES 33e4523d30aa training/webapp "python app.py" ... 0.0.0.0:5000->5000/tcp berserk_bartik fce072cc88ce training/webapp "python app.py" ... 0.0.0.0:32768->5000/tcp grave_hopper
另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。
w3codebox@w3codebox:~$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py 95c6ceef88ca3e71eaf303c2833fd6701d8d1b2572b5613b5a932dfdfe8a857c w3codebox@w3codebox:~$ docker ps CONTAINER ID IMAGE COMMAND ... PORTS NAMES 95c6ceef88ca training/webapp "python app.py" ... 5000/tcp, 127.0.0.1:5001->5000/tcp adoring_stonebraker 33e4523d30aa training/webapp "python app.py" ... 0.0.0.0:5000->5000/tcp berserk_bartik fce072cc88ce training/webapp "python app.py" ... 0.0.0.0:32768->5000/tcp grave_hopper
Desta forma, podemos acessar 127.0.0.1:5001 para acessar o container 5porta 000.
No exemplo acima, o padrão é sempre ligar ao porta TCP, se você quiser ligar ao porta UDP, pode adicionar /udp。
w3codebox@w3codebox:~$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py 6779686f06f6204579c1d655dd8b2b31e8e809b245a97b2d3a8e35abe9dcd22a w3codebox@w3codebox:~$ docker ps CONTAINER ID IMAGE COMMAND ... PORTS NAMES 6779686f06f6 training/webapp "python app.py" ... 5000/tcp, 127.0.0.1:5000->5000/udp drunk_visvesvaraya 95c6ceef88ca training/webapp "python app.py" ... 5000/tcp, 127.0.0.1:5001->5000/tcp adoring_stonebraker 33e4523d30aa training/webapp "python app.py" ... 0.0.0.0:5000->5000/tcp berserk_bartik fce072cc88ce training/webapp "python app.py" ... 0.0.0.0:32768->5000/tcp grave_hopper
docker port 此命令可以让我们快速查看端口的绑定情况。
w3codebox@w3codebox:~$ docker port adoring_stonebraker 5000 127.0.0.1:5001
端口映射并不是唯一将 docker 连接到另一个容器的方法。
docker 有一个连接系统允许将多个容器连接在一起,共享连接信息。
docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息。
当我们创建一个容器时,docker 会自动对其进行命名。另外,我们也可以使用 --name 使用标识来命名容器,例如:
w3codebox@w3codebox:~$ docker run -d -P --name w3codebox training/webapp python app.py 43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441
我们可以使用 docker ps 使用命令来查看容器名称。
w3codebox@w3codebox:~$ docker ps -l CONTAINER ID IMAGE ... COMANDO ... PORTAS NOMES 43780a6eabaa training/webapp "python app.py" ... 0.0.0.0:32769->5000/tcp w3codebox
Primeiro, vamos criar uma nova rede Docker.
$ docker network create -d bridge test-net
Descrição dos parâmetros:
-d:O parâmetro especifica o tipo de rede Docker, existem bridge e overlay.
O tipo de rede overlay é usado no modo Swarm, pode ser ignorado neste capítulo.
Execute um contêiner e conecte-se ao novo test-net rede:
$ docker run -itd --name test1 --network test-net ubuntu /bin/bash
Abra um novo terminal e execute um contêiner e adicione-o a test-net rede:
$ docker run -itd --name test2 --network test-net ubuntu /bin/bash
Clique na imagem para ver a versão ampla:
A seguir, usaremos ping para provar que test1 contêiner e test2 O contêiner estabeleceu uma conexão de rede.
Se test1、test2 Se não houver o comando ping no contêiner, execute os seguintes comandos para instalar ping (aprendizado imediato: pode instalar em um contêiner, commitar o contêiner para o ícone e executar os dois contêineres novamente com o novo ícone).
apt-get update apt install iputils-ping
No test1 O contêiner deve executar o seguinte comando:
Clique na imagem para ver a versão ampla:
Da mesma forma em test2 O contêiner também se conectou com sucesso a:
Clique na imagem para ver a versão ampla:
Desta forma, test1 contêiner e test2 O contêiner estabeleceu uma conexão de rede.
Se houver múltiplos contêineres que precisam se conectar entre si, recomenda-se usar o Docker Compose, que será介绍的 mais tarde.
Podemos configurar o DNS no host. /etc/docker/Adicione o seguinte conteúdo ao arquivo daemon.json para configurar o DNS de todos os contêineres:
{ "dns" : [ "114.114.114.114", "8.8.8.8" ] }
Após a configuração, o DNS do contêiner será configurado automaticamente para 114.114.114.114 e 8.8.8.8。
Após a configuração, é necessário reiniciar o docker para que ela entre em vigor.
Para verificar se o DNS do contêiner está funcionando, pode usar o seguinte comando, que exibirá as informações de DNS do contêiner:
$ docker run -it --rm ubuntu cat etc/resolv.conf
Clique na imagem para ver a versão ampla:
Configuração manual do contêiner
Se desejar configurar o DNS apenas no contêiner especificado, pode usar o seguinte comando:
$ docker run -it --rm -h host_ubuntu --dns=114.114.114.114 --dns-search=test.com ubuntu
Descrição dos parâmetros:
--rmLimpador automático do sistema de arquivos interno do contêiner ao sair.
-h NOME_HOSTNAME ou --hostname=NOME_HOSTNAMEDefina o nome do host do contêiner, que será gravado no sistema de arquivos do contêiner /etc/hostname e /etc/hosts.
--dns=ENDEREÇO_IPAdicione o servidor DNS ao contêiner /etc/no resolv.conf, faça com que o contêiner use este servidor para resolver todos os domínios que não estão /etc/no nome do host nos arquivos hosts.
--dns-search=DOMÍNIODefina o domínio de pesquisa do contêiner, quando o domínio de pesquisa for .example.com, ao procurar um host chamado host, o DNS não apenas procurará host, mas também host.example.com.
Clique na imagem para ver a versão ampla:
Se não for especificado ao iniciar o contêiner --dns e --dns-searchDocker usará o host do sistema anfitrião por padrão /etc/Configure o DNS do contêiner usando resolv.conf.