从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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值