这里是docker-compose.yml文件的内容,用于创建数据库映像。
version: '2'
services:
myerp.db:
image: postgres:10
当我启动命令docker-compose up时,我得到:
Pulling myerp.db (postgres:10)...
10: Pulling from library/postgres
802b00ed6f79: Already exists
4e0de21e2180: Already exists
58b06ac4cd84: Already exists
14e76b354b47: Already exists
0f0c9f244b65: Already exists
37117d8abb6d: Already exists
8b541f5d818a: Already exists
7cb4855fcd96: Already exists
5c7fe264586b: Already exists
64568a495c35: Already exists
283257efa745: Already exists
222b134fa51d: Already exists
e9a30e7f2a9f: Already exists
86bffc7855b0: Already exists
Digest: sha256:1d26fae6c056760ed5aa5bb5d65d155848f48046ae8cd95c5b26ea7ceabb37ad
Status: Downloaded newer image for postgres:10
Starting dev_myerp.db_1 ... done
Attaching to dev_myerp.db_1
myerp.db_1 | 2018-09-23 10:27:38.647 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
myerp.db_1 | 2018-09-23 10:27:38.647 UTC [1] LOG: listening on IPv6 address "::", port 5432
myerp.db_1 | 2018-09-23 10:27:38.653 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
myerp.db_1 | 2018-09-23 10:27:38.682 UTC [21] LOG: database system was shut down at 2018-09-23 10:16:13 UTC
myerp.db_1 | 2018-09-23 10:27:38.708 UTC [1] LOG: database system is ready to accept connections
我注意到当我将这些行添加到docker-compose.yml中时:
ports:
- "127.0.0.1:9432:5433"
volumes:
# - "./data/db:/var/lib/postgresql/data"
- "./init/db/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d"
environment:
- POSTGRES_DB=db_myerp
- POSTGRES_USER=user
- POSTGRES_PASSWORD=usr
我总是使用“ 0.0.0.0”而不是127.0.0.1。
Attaching to dev_myerp.db_1
myerp.db_1 | 2018-09-23 10:27:38.647 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
myerp.db_1 | 2018-09-23 10:27:38.647 UTC [1] LOG: listening on IPv6 address "::", port 5432
myerp.db_1 | 2018-09-23 10:27:38.653 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
myerp.db_1 | 2018-09-23 10:27:38.682 UTC [21] LOG: database system was shut down at 2018-09-23 10:16:13 UTC
myerp.db_1 | 2018-09-23 10:27:38.708 UTC [1] LOG: database system is ready to accept connections
请,您能解释一下为什么不考虑文件中添加的信息吗?
提前谢谢
答案 0 :(得分:0)
这里发生了两件事。
在容器内,服务器进程正在运行,docker-compose
日志是该服务器进程的输出。 服务器进程必须设置网络连接以侦听0.0.0.0,否则将无法访问。它至少了解Docker环境,并且不了解Compose YAML文件中的端口映射之类的内容;它通常由命令行选项或环境变量控制。 (因此,您引用的日志消息应该总是 说“ 0.0.0.0”,否则您的容器将无法工作。)
在容器外部,Docker将指定端口上的入站连接路由到特定容器。这就像在主机上运行的任何其他服务一样:您在此处提供的IP地址可以是主机具有的任何单个地址(在这种情况下,只能通过匹配的网络接口访问),也可以使用神奇的“随处监听”地址0.0。 0.0(默认)。
使用docker run -p 127.0.0.1:9432:5432
(请记住,第二个端口号必须与容器内服务器使用的端口相匹配),您应该找到的是主机上运行的进程可以到达容器,但是其他主机上运行的进程将无法。
答案 1 :(得分:0)
Docker文档非常善于解释内容,尤其是this post。
默认情况下,创建容器时,它不会将其任何端口发布到外界。要使端口可用于Docker外部的服务或未连接到容器网络的Docker容器,请使用
--publish
或-p
标志。这将创建一个防火墙规则,该规则将容器端口映射到Docker主机上的端口。
在ports
中使用docker-compose.yml
时,会发生相同的行为。因此,在设置127.0.0.1:9432:5433
时,它实际上是对Docker说的:“将容器中的TCP端口5433映射到Docker主机上的端口9432”。假设Docker不考虑您的设置,那您就错了。
如您所料,运行容器和运行容器中的东西是有区别的。您可以将pg设置为运行,以便监听127.0.0.1
。在这种情况下,它将拒绝来自任何地方(甚至其他容器)的所有传入连接。因此,它正在0.0.0.0
或所有接口上监听。
有一种方法可以让同一网络上的其他容器知道您的数据库,但可以从外部“隐藏”它。 expose
指令clearly says:
暴露端口而不将其发布到主机上-只有链接的服务才能访问它们。只能指定内部端口。