我想设置一个小型 Web 服务器,运行多个 Web 应用程序,例如 OpenProject 和 GitLab,以及用于用户管理的 OpenLDAP。为了封装单个应用程序,应该使用 docker。
现在我已经阅读了几种允许应用程序使用其主机名相互通信的方法(例如,Web 应用程序到 slapd)。大多数解决方案使用 DNS 服务器,要么在 docker 主机上运行像这儿或者在单独的docker容器中。
然而阅读Docker 用户指南,我还发现自定义 docker 网络也允许在网络中的容器之间进行名称解析。
当然,我更喜欢使用 docker 网络的第二种方法,因为它需要的工具和配置较少。但是,我现在有点困惑 docker 网络和自定义 DNS 服务器有什么不同。我是否忽略了任何细节?
在最后一段中添加了一些小的说明。
答案1
我目前正在做类似的事情。我使用 Docker 链接功能。通过将两个容器链接在一起,您可以设置一个 DN,链接的容器可通过该 DN 访问。我个人使用docker-compose获得比普通命令更好的配置。您甚至可以设置网络并让容器访问该网络。但每次访问都通过 docker 创建的 DN 进行,因为容器的 IP 可以在重新启动时更改。
作为示例,我将其用于 owncloud 和 nginx 作为 ssl 卸载代理。
version: '2'
services:
nginx:
container_name: nginx_proxy
image: nginx
links:
- owncloud:owncloud
networks:
- owncloud_web
ports:
- 80:80
- 443:443
volumes:
- ...
owncloud:
container_name: owncloud
links:
- owncloud_db:postgresql
networks:
- gitlab_web
volumes:
- ...
owncloud_db:
container_name: owncloud_db
image: postgres:9.4
networks:
- owncloud_db
volumes:
- ...
networks:
owncloud_web:
owncloud_db:
这样,nginx 可以在 owncloud 下访问 owncloud,而 owncloud 可以在 postgresql 下访问其数据库。我设置了单独的网络,因此 nginx 无法直接访问数据库。
使用外部 DNS 服务器时,您必须知道容器的 IP 地址,这些地址在每次重启时都可能发生变化。甚至整个子网都可能发生变化。因此,您要么实施动态 DNS 系统,要么希望 IP 不会改变。
当使用 docker 内部时,您不必运行任何附加服务,也不必依赖 IP 地址。