如何设置 docker 容器以通过主机名相互引用?

How do I set up docker containters to refer to each other by host name?

我有 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 地址选项可能是我最好的选择,一旦我可以测试它就会确认答案。

这是示例 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 网络上,我的数据库和应用程序在数据库网络上。所以我的客户只能通过 nginx 访问我的应用程序来访问我的数据库。并且不需要为数据库打开主机端口,因为容器到容器的连接不需要打开端口。

好的,所以我想出了一个解决方法。我可以调用我的容器 database.mycompany.com 因为 docker 自动为每个容器名称创建 dns 映射。由于代码引用 database.mycompany.com 已经一切正常,无需更改代码。

您可以 运行 同一网络中的容器,并使用其他容器的名称调用每个容器。

创建网络:

docker network create my-network

运行 第一个容器:

docker run --name mydb -d --expose <some_port> --network=my-network mydbimage

运行 将连接的第二个容器:

docker run --name myserver -d -e DB_HOST=mydb --network=my-network myserverimage

对于此示例,您可以使用 DB_HOST 环境进行连接