如何设置 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 环境进行连接
我有 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 环境进行连接