我会尽可能简单,例如,我将开始。想象一下,我们必须配置 postgresql 复制和一些将使用它的 Web 应用程序。docker-compose.yml 可能看起来像这样
web:
build: ./webapp/web
ports:
- "7000:7000"
links:
- pgpool2
pgpool2:
build: ./pgpool2
ports:
- "9999:9999"
links:
- master
- slave
master:
build: ./master
ports:
- "5432:5432"
slave:
build: ./slave
links:
- master
在 dockerfiles(master, slave) 中,我们需要将 ip 地址相互放置,例如(master)
来自 Ubuntu
....
RUN echo "host replication repuser 172.17.0.3/0 md5" >> /etc/postgresql/9.3/main/pg_hba.conf
RUN echo "host all all 172.17.0.2/0 md5" >> /etc/postgresql/9.3/main/pg_hba.conf
RUN echo "host all all 172.17.0.2/0 trust" >> /etc/postgresql/9.3/main/pg_hba.conf
RUN echo "host all pgpool 172.17.0.4/0 trust" >> /etc/postgresql/9.3/main/pg_hba.conf
RUN echo "host all all 172.17.0.4/0 md5" >> /etc/postgresql/9.3/main/pg_hba.conf
.....
这个解决方案很难看,但即使我输入一些变量而不是自己输入 IP 地址,也会出现问题。docker swarm 为所有可用主机放置容器(每个容器的 IP 地址都在变化)。唯一可行的解决方案是放置一些具有有效 IP 地址的变量。例如,如果我们有这条线
RUN echo "host all all 172.17.0.2/0 md5" >> /etc/postgresql/9.3/main/pg_hba.conf
我需要一些与服务名称相同的变量,因此在此示例中,主服务器和此值需要具有有效的 IP 地址。否则,这不可能起作用,因为每个服务的 IP 地址将由 swarm 动态更改(容器由 swarm 随机放置)。如果我错了,请纠正我。