首页 > 解决方案 > 如何设置 docker 容器以通过主机名相互引用?

问题描述

我有 2 个 docker 容器(1 个用于数据库,1 个用于应用服务器)。应用程序代码在连接字符串中有数据库的主机。我希望能够在不修改任何代码(包括连接字符串/主机配置)的情况下运行该应用程序。

我的想法是在应用容器上的 /etc/hosts 文件中添加一些内容,以便数据库主机解析到另一个容器,但不确定我可以设置什么 IP 地址。每次我创建容器时,IP 都可能不同,对吗?下面的作品有点,但我需要一些更永久的东西。

172.23.0.2    database.mycompany.com

如果我可以在 /etc/hosts 中指定类似的内容会很酷

db-container-name  database.mycompany.com

编辑:很多非常有用的评论,但遗漏的一件事是我在代码库中有一个连接字符串,我不想更改代码:

<New class="oracle.jdbc.pool.OracleDataSource">
   <Set name="URL">jdbc:oracle:thin:@db.mycompany.com:1532:SVC</Set>
</New>

如果我想使用容器名称,我必须将上面的配置更改为容器名称。我已经测试过并且它可以工作,但我无法检查它所以我需要一些不会改变代码的东西。下面提到的静态 IP 地址选项可能是我最好的选择,一旦我可以测试它就会确认答案。

标签: dockerdevelopment-environment

解决方案


这是示例 docker-compose.yml。

检查下面的静态 IP 分配:

version: '3.8'
services:
  nginx: <- DNS Name
    image: nginx
    container_name: qs
    restart: always
    ports:
      - 80:80
    volumes:
      - ~/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - server01
    networks:
      nginx:
        ipv4_address: 10.1.1.10 <- Static IP

networks:
  nginx:
    driver: bridge
    ipam:
      config:
        - subnet: 10.1.1.0/24 <- Static IP subnet

这样就可以消除动态IP的问题

您可以创建多个网络并根据您的连接要求进行分配。

networks:
  nginx:
    driver: bridge
    ipam:
      config:
        - subnet: 10.1.1.0/24
  db:
    driver: bridge
    ipam:
      config:
        - subnet: 10.0.0.0/24

像这里你可以看到有 2 个网络,我如何使用这是我的应用程序容器和 nginx 在 nginx 网络上,我的 db 和应用程序在 db 网络上。所以我的客户只能通过 nginx 访问我的应用程序来访问我的数据库。并且不需要为 db 打开端口到主机,因为容器到容器的连接不需要打开端口。


推荐阅读