English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Conexão de contêineres Docker

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 连接会创建一个父子关系,其中父容器可以看到子容器的信息。

容器命名

当我们创建一个容器时,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

Nova rede

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.

Conectar contêiner

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.

Configuração de DNS

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.