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

Docker 容器连接

Anteriormente, implementamos el acceso a servicios ejecutándose en contenedores Docker a través de puertos de red.

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -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 grave_hopper
fce072cc88ce training/webapp "python app.py" ... 0.0.0.0:32768->5000/tcp grave_hopper

de esta manera, podemos acceder a 127.0.0.1:5001 para acceder al contenedor 5puerto 000.

En el ejemplo anterior, la conexión por defecto es al puerto tcp, si se desea conectar al puerto udp, se puede agregar /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 grave_hopper
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            COMMAND           ...    PORTS                     NAMES
43780a6eabaa     training/webapp   "python app.py"  ...       0.0.0.0:32769->5000/tcp   w3codebox

Red nueva

Primero creemos una nueva red Docker.

$ docker network create -d bridge test-net

参数说明:

-dEl parámetro especifica el tipo de red de Docker, que puede ser bridge, overlay.

Dentro de overlay, el tipo de red se utiliza para Swarm mode, aquí puede ignorarlo.

Conectar contenedor

Ejecute un contenedor y conecte a test recién creado-net red:

$ docker run -itd --name test1 --network test-net ubuntu /bin/bash

Abra una nueva terminal y ejecute otro contenedor y agréguelo a test-net red:

$ docker run -itd --name test2 --network test-net ubuntu /bin/bash

点击图片查看大图:

A continuación, utilice ping para probar test1 Contenedor y test2 Los contenedores han establecido una conexión entre sí.

Si test1、test2 Si no hay comando ping en el contenedor, ejecute los siguientes comandos en el contenedor para instalar ping (aprendizaje inmediato: puede instalarlo en un contenedor, submitir el contenedor a la imagen, y luego ejecutar los dos contenedores con la nueva imagen).

apt-get update
apt install iputils-ping

En test1 El contenedor debe ingresar el siguiente comando:

点击图片查看大图:

Del mismo modo en test2 El contenedor también se conectará con éxito a:

点击图片查看大图:

De esta manera, test1 Contenedor y test2 Los contenedores han establecido una conexión entre sí.

Si tiene varios contenedores que necesitan conectarse entre sí, se recomienda usar Docker Compose, lo que se presentará más adelante.

Configuración de DNS

Podemos configurar DNS en el anfitrión de la máquina, /etc/docker/Añada el siguiente contenido al archivo daemon.json para configurar el DNS de todos los contenedores:

{
  "dns" : [
    "114.114.114.114",
    "8.8.8.8"
  ]
}

Después de la configuración, el DNS del contenedor se configurará automáticamente como 114.114.114.114 和 8.8.8.8。

Después de la configuración, debe reiniciar Docker para que los cambios entren en vigor.

Para verificar si el DNS del contenedor se ha aplicado correctamente, puede usar el siguiente comando, que mostrará la información de DNS del contenedor:

$ docker run -it --rm  ubuntu  cat etc/resolv.conf

点击图片查看大图:

Configuración manual del contenedor

Si solo desea configurar DNS en contenedores específicos, puede usar el siguiente comando:

$ docker run -it --rm -h host_ubuntu  --dns=114.114.114.114 --dns-search=test.com ubuntu

参数说明:

--rm:容器退出时自动清理容器内部的文件系统。

-h HOSTNAME 或者 --hostname=HOSTNAME: 设定容器的主机名,它会被写入容器内的 /etc/hostname 和 /etc/hosts。

--dns=IP_ADDRESS: 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器使用这个服务器来解析所有不在 /etc/hosts 中的主机名。

--dns-search=DOMAIN: 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com。

点击图片查看大图:

如果在容器启动时没有指定 --dns--dns-search,Docker 会默认使用宿主主机上的 /etc/使用 resolv.conf 来配置容器的 DNS。