当前位置: 首页 > article >正文

从0开始学docker (每日更新 24-11-10)

容器之间的网络通信

容器之间的网络通信的解决方案

默认情况下,在同一个docker网络上的所有容器的所有端口都可以相互连接

host模式让所有容器都位于同一个主机网络空间,并共用主机的IP地址栈,该主机上的所有容器都可以通过主机的接口相互通信

在用户自定义桥接网络中,容器之间可以通过名称或别名互相访问

默认桥接网络不支持基于名称的服务发现和用户指定的IP地址,所连接的容器只能通过IP地址相互访问,除非创建容器时使用--link选项建立容器连接

容器之间可以通过挂载主机目录实现相互通信

容器通过端口映射对外提供连接。容器本身由内部网络分配IP地址,创建容器时可以使用以项-P或-p指定要映射(对外发布)的端口

container网络模式让容器共用一个IP网络,两个容器之间可以通过localhost相互通信

创建容器时使用--link 是Docker传统的容器互联解决方案,可能会被弃用。应尽可能通过用户自定义网络实现容器之间的通信,而不要使用传统方式。值得注意的是,用户自定义网络并不支持使用--link在容器之间共享环境变量,不过可以使用像卷这样的其他机制以更可控的方式在容器之间共享环境变量

以传统方式建立容器连接

端口映射不是Docker容器之间通信的唯一方式,Docker还提供一种连接系统,用来将多个容器连接在一起,并在容器之间发送连接信息。当容器被连接时,源容器的信息能够被发送到接收容器(也就是目的容器),让接收容器可以访问源容器所指定的数据。本节讲解Docker默认桥接网络中的传统容器连接方式

容器的名称信息

要以传统方式建立容器连接,Docker需要依赖容器的名称信息。每个容器创建时会默认分配个名称,但是为容器设置自定义名称可提供以下两个重要功能:

为容器自定义表示特定用途的名称更容易判断容器的功能等,如将一个Web应用的容器命名web

便于Docker 引用其他容器,例如,可以指定将容器web连接到容器db

下面是一个使用--name选项为容器命名的例子:

docker run -d -P --name web training/webapp python app.py

这将启动一个新的容器,并使用选项--name将容器命名为 web。可以使用 docker  ps命令查看该
容器的名称信息,也可以使用 docker inspect 命令来查看容器的名称

通过容器连接进行通信

容器连接可以在源容器和接收容器之间建立一个安全通道,接收容器可访问源容器的数据。创建容器连接需要使用--link选项,首先执行以下命令创建一个新的容器,这里创建一个包含数据库的容器:

docker run -d --name db training/postgres

上例将基于 training/postgres 镜像创建一个名为db的容器,它包含PostgreSQL数据库。然后执行如下命令创建一个 web 容器并将它连接到 db 容器:

docker run -d -P --name web --link db:db training/webapp python app.py

--link 选项的基本用法如下:

--link <name or id>:alias

其中,参数name或id是源容器的名称或ID,alias参数是这个连接名称的别名。--link选项也可采用以下格式:

--link  <name or id>

可以使用docker inspect查看被连接容器的详细信息

容器连接让一个源容器将它自身的信息提供给接收容器。例中接收容器web可以族取源容器 db
的信息。要实现这一点,Docker需要在容器之间建立一个安全隧道,并且不用对外暴露任何口。启动 db 容器时也不用使用P或p选项。这就是容器连接最大的好处,不必将源容器暴露在网络上。
Docker通过以下两种方式将源容器的连接信息暴露给接收容器

环境变量(Environment Variables)

更新/etc/hosts文件

环境变量

连接容器时Docker会根据--link选项的参数在接收容器中创建环境变量,这些环境变量的来源如下

源容器的 Dockerfile 中的ENV指令

源容器启动时docker run命令的-e、-env 和--env-file 选项

这些环境变量支持通过编程从接收容器中发现与源容器相关的信息

注意:在容器中源自Docker的所有环境变量对连接到它的任何容器都是可用的,理解这一点很重要。如果这些环境变量带有敏感数据,则会有严重的安全问题

Docker为--link参数中列出的每个接收容器设置一个名为“<alias> _NAME”的环境变量。例如,一个名为 web 的新容器通过link db:webdb 连接到容器db时,则 Docker 在 web 容器中创建一个变量:WEBDB_NAME=/web/webdb

Docker 也为由源容器暴露的每个端口定义一组环境变量。每个变量有唯一的前缀,格式如下:
<name>_PORT_<port>_<protocol>

<name>是--link参数中定义的别名,如 webdb

<port>是暴露的端口号

<protocol>是指协议类型(TCP或 UDP)

Docker使用这个前缀格式来定义以下3个不同的环境变量

prefix_ADDR:地址前缀,包含来自URL的IP 地址,如 WEBDB_PORT_5432_ TCP ADDR=
172.17.0.82

prefix_PORT:端口前缀,包含来自URL的端口号,如WEBDB_PORT_5432_TCP_PORT=5432 

prefix_PROTO:协议前缀,包括来自URL的协议类型,如 WEBDB_PORT_S432_TCP_PROTO=tcp

如果容器暴露多个端口,则为每个端口定义3个环境变量。这就意味着,假如一个容器暴露4个端口,Docker 将创建12个环境变量,另外,Docker会创建一个名为“<alias>_PORT”的环境变量,这个变量包含源容器暴露的第1个端口的URL,第1个端口定义为暴露端口的最低值,例如,对于变量 WEBDB_PORT_tcp://172.17.0.82:5432,如果端口用于tcp和udp,则指定tcp


http://www.kler.cn/a/390877.html

相关文章:

  • macOS解决U盘装完系统容量变小的问题
  • 在 Ubuntu 上安装 `.deb` 软件包有几种方法
  • DHCP与FTP
  • 大数据面试题--kafka夺命连环问(后10问)
  • 《AI 使生活更美好》
  • 计算机的错误计算(一百五十二)
  • Qt 项目架构设计
  • 11/12Linux实验2
  • 【快捷入门笔记】mysql基本操作大全-SQL数据库
  • webpack loader全解析,从入门到精通(10)
  • NVR设备ONVIF接入平台EasyCVR私有化部署视频平台如何安装欧拉OpenEuler 20.3 MySQL
  • 微服务容器化部署实践(FontConfiguration.getVersion)
  • kafka面试题part-3
  • 发包人一直恶意拖延审计,施工人如何破局?
  • 信息安全工程师(82)操作系统安全概述
  • MVVM前端开发模型,怎么快速定位问题
  • 库打包工具 rollup
  • Chromium127编译指南 Linux篇 - 编译前环境搭建(一)
  • 基于深度卷积二元分解网络的齿轮和轴承故障特征提取方法
  • 【LeetCode】【算法】11. 盛最多水的容器
  • C 语言学习-03【输入与输出】
  • 使用 Umami 部署博客分析工具
  • 达梦数据库配置本地守护
  • Execution failed for task ‘:app:compileDebugKotlin‘. 问题解决。
  • java数据结构与算法:栈
  • Unity3D UI 双击和长按