我会尽我所能,我会以此为例。想象一下,我们必须配置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
我需要一些名称与服务相同的变量,因此在此示例中,master和此值需要具有有效的IP地址。否则这不可能,因为每个服务的IP地址将由swarm动态改变(容器由swarm随机放置)。如果我错了,请纠正我。