English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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 会自动对它进行命名。另外,我们也可以使用 --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
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.
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.
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。