Postgresql 如何在构建时在Docker映像之间建立网络?
我有一个项目Postgresql 如何在构建时在Docker映像之间建立网络?,postgresql,docker,docker-compose,dockerfile,docker-networking,Postgresql,Docker,Docker Compose,Dockerfile,Docker Networking,我有一个项目sample,有两个服务,数据库和应用程序,在docker compose.yml中声明: version: "3.8" services: database: image: sample/database build: context: . dockerfile: database.Dockerfile network: sample_default ports: - "8001
sample
,有两个服务,数据库和应用程序,在docker compose.yml
中声明:
version: "3.8"
services:
database:
image: sample/database
build:
context: .
dockerfile: database.Dockerfile
network: sample_default
ports:
- "8001:5432"
app:
image: sample/app
build:
context: .
dockerfile: app.Dockerfile
network: sample_default
args:
- DATABASE_URL=postgresql://postgres:password@database:5432/cluster
depends_on:
- database
networks:
sample_default: {}
database.Dockerfile
负责下载和安装Postgre,以及启动Postgre集群和集群内的数据库。此数据库的表是在构建时通过CREATE TABLE
在RUN
命令下创建的
app.Dockerfile
负责下载和安装编译器,以及编译源代码
为了构建app.Dockerfile
的映像,必须首先构建数据库.Dockerfile
的映像。这是因为,在编译时,源代码中的SQL查询字符串会根据在database.Dockerfile
中创建的数据库进行验证
编译器使用数据库\u URL
连接到Postgre数据库,该数据库包含用于验证查询的表。在这个数据库\u URL
中,指定的地址是数据库:5432
,因为服务发现可以在非默认网桥网络上使用
我的问题是,在运行docker compose up
时,构建时的app
无法在构建时连接到数据库。应用程序中的运行ping数据库
。Dockerfile
失败,原因是ping:数据库:没有与主机名关联的地址
。然而,从sample\u default
网络上的两个图像启动容器(手动而不是通过docker compose
)并从app
的容器运行ping数据库
是成功的
我已经在docker compose.yml
中的build
下指定了network
,那么在此基础上我可以做些什么来允许构建时联网?在构建时,没有出现网络配置。因为Docker容器类似于VM。您无法通过VM的IP地址在启动时连接到VM。docker容器也一样。唯一的区别是容器的快速启动过程比虚拟机;因此,您需要等到它出现。启动容器后,它的生命周期就是运行时。添加取决于yml文件中的节。
例如
正如我已经看到的,您使用dependens\u,这已经是一个很好的开始;)
以下是我的另一个项目的docker-compose.yml,我建议使用不同的docker-compose版本:
- 你可能需要一个
- 您可以在其中为每个映像分配自定义ip地址
- 及
我需要设置数据库连接,以便在docker网络中通过服务器对mongo db运行量角器ui测试,因此,我还需要对服务器上的特定端口进行运行状况检查。如果UI测试没有成功,它将在失败时重新启动
version: "3" # docker-compose version: 1.21.1 for version 3 misleading I know: check out https://sreeninet.wordpress.com/2017/03/28/comparing-docker-compose-versions/
services:
server:
build: server # frontend code stored as static files in node server
ports:
- "4000:4000"
- "8443:8443"
links:
- mongo
depends_on:
- mongo
networks:
app_net:
ipv4_address: 192.17.1.3
healthcheck:
# test: ["CMD", "curl", "-k", "https://localhost:8443"]
# test: ifconfig
test: curl -k http://192.17.1.3:8443
# test: curl http://localhost:8443/bundle.js -k -s | grep -C 3 "window.pushNotification"
interval: 30s
timeout: 10s
retries: 3
mongo:
image: mongo # pulling on docker-compose up if image not available
# volumes: # TODO mongo2.6
# - /Users/yuqiuge/Downloads/mongodb-osx-x86_64-2.6.10/data/db:/data/db
# - /data/db:/data/db
ports:
- "27017:27017"
networks:
app_net:
# static different ip for mongo
ipv4_address: 192.17.1.2
protractor:
build: webapp
restart: on-failure
depends_on:
- server
links:
- server
networks:
app_net:
# static different ip for ui test on webapp
ipv4_address: 192.17.1.4
networks:
app_net:
driver: bridge
driver_opts:
com.docker.network.enable_ipv6: "false"
ipam:
driver: default
config:
- subnet: 192.17.1.0/24
我正在查看,我看到--network
允许我“在构建期间为运行指令设置网络模式”。这就是为什么我认为网络可以在构建期间完成,这指的是什么?你可以在构建期间附加网络配置,但你必须等到它成为运行时,才能通过构建期间完成的网络配置进行访问。啊,我忘了从我的实际docker compose文件中复制取决于
。编辑为包含问题中的依赖
,问题仍然存在。从docker compose文件中删除网络:示例默认值
,然后重试。默认情况下,它将创建自己的网络。只是一个想法,您应该尝试看看它是否有效:您可以在docker中使用docker,然后在docker中创建服务容器,并以与gitlag类似的方式构建容器。看看我是否理解正确,这是一个等待问题。应用程序需要等待数据库生成,因为正在运行?我说得对吗?是否有连接重试?我从未见过“网络”属性的用法,我见过“网络”。这是正确的吗?如果现在指定了网络,该服务将添加到默认网络。@mr.vea是的,应用程序需要等待数据库生成,因为应用程序编译器依赖于数据库。我认为您对默认网络的看法是正确的,但我的挑战是在docker映像构建时而不是运行时使用它。您是否尝试过多级构建dockerfile?
version: "3" # docker-compose version: 1.21.1 for version 3 misleading I know: check out https://sreeninet.wordpress.com/2017/03/28/comparing-docker-compose-versions/
services:
server:
build: server # frontend code stored as static files in node server
ports:
- "4000:4000"
- "8443:8443"
links:
- mongo
depends_on:
- mongo
networks:
app_net:
ipv4_address: 192.17.1.3
healthcheck:
# test: ["CMD", "curl", "-k", "https://localhost:8443"]
# test: ifconfig
test: curl -k http://192.17.1.3:8443
# test: curl http://localhost:8443/bundle.js -k -s | grep -C 3 "window.pushNotification"
interval: 30s
timeout: 10s
retries: 3
mongo:
image: mongo # pulling on docker-compose up if image not available
# volumes: # TODO mongo2.6
# - /Users/yuqiuge/Downloads/mongodb-osx-x86_64-2.6.10/data/db:/data/db
# - /data/db:/data/db
ports:
- "27017:27017"
networks:
app_net:
# static different ip for mongo
ipv4_address: 192.17.1.2
protractor:
build: webapp
restart: on-failure
depends_on:
- server
links:
- server
networks:
app_net:
# static different ip for ui test on webapp
ipv4_address: 192.17.1.4
networks:
app_net:
driver: bridge
driver_opts:
com.docker.network.enable_ipv6: "false"
ipam:
driver: default
config:
- subnet: 192.17.1.0/24