[翻译]Compose中的网络

发表于 2019-05-02  249 次阅读


文章目录

本文翻译自docker-compose文档Networking in Compose

默认地Compose为你的应用设置一个单一的网络。每一个容器为一个服务加入这个默认网络并且它们在那个网络中对于其它容器彼此都是可达的,通过它们的容器名作为主机名。

注:你的应用的网络名是基于"project name", "project name"就是docker-compose.yml所在文件夹的名称。你可以重写"project name"通过--project-name标记或者环境变量COMPOSE_PROJECT_NAME

例如,假设你的应用在一个名为myapp的文件夹,你的docker-compose.yml看起来是这样的:

version: "3"
services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres
    ports:
      - "8001:5432"

当你运行命令docker-compose up, 会发生以下几件事件:
1. 一个名为myapp_default的网络被创建
2. 一个使用web配置的容器被创建。它加入网络myapp_default, 通过主机名web可以访问到它
3. 一个使用db配置的容器被创建。它加入网络myapp_default, 通过主机名db可以访问到它

在v2.1+,overlay网络一直都是attachable的
从Compose配置文件版本2.1开始,overlay网络一直被创建为attachabled的,并且这是不可配置的特性。这意味着独立的容器可以连接到overlay网络上。
在Compose配置文件版本3.x,你可以可选地设置attachable属性为false关闭该特性。

现在每个容器都可以通过主机名web或者db来回溯它们的容器ip地址,web应用代码可以连接URL postgres://db:5432来开始使用postgres数据库

注意HOST_PORT(主机端口)和CONTAINER_PORT(容器端口)之间的区别是很重要的。在上面的例子的,对于db容器,8001是主机端口, 而容器端口是5432(postgres默认)。网络服务之间的交流使用的是容器端口。当主机端口被定义,服务也可以在群外访问。

在web容器里,你连接数据库的代码看起来是这样的postgres://db:5432,而在docker宿主机器,连接数据库看起来是这样的postgres://{DOCKER_IP}:8001。

更新容器

如果你修改了配置文件并且运行docker-compose up命令重新启动,旧的容器将会被删除,新的容器会以不同的ip地址和相同的主机名加入网络,运行的容器可以通过主机名连接新的地址,但是旧的地址将不再工作。

如果有容器正在连接旧的容器,它们将关闭,容器会检测此条件,再次查找名称并重新连接新的容器。

本站文章基于国际协议BY-NA-SA 4.0协议共享;
如未特殊说明,本站文章皆为原创文章,请规范转载。

0

眼前解决不了的问题, 都可交付未来, 时间是一个伟大的作者, 他必将写出, 最完美的答案。