如何将 Docker 网络应用程序容器连接到 Docker PostgreSQL 容器?
How to connect Docker web app container to Docker PostgreSQL container?
我正在练习制作一个与 PostgreSQL 数据库交互的 Golang 网络应用程序,每个 运行 在它们自己的容器上。
我是 运行 容器 docker-compose up
但我似乎无法正确设置 postgres 容器。
为简洁起见,指向 Dockerfile
s 和其他设置文件的链接是 on this gist(如果您需要,请在此处告诉我)。
version: '2'
services:
web_app:
build: dockerfiles/web_app
ports:
- "9000:9000"
volumes:
- .:/go/src/gitlab.com/repo/web_app
# links might be replaced by depends_on.
# links:
# - db
depends_on:
- db
# tty and stdin_open cause docker-compose to disconnect from docker-machine after 60sec.
# A fix is on the way.
# tty: true
# stdin_open: true
db:
build: dockerfiles/db
volumes:
- data:/var/lib/postgresql/data
volumes:
data: {}
docker-compose up
工作正常。但是当应用程序尝试打开数据库连接时:
var pgConf string = "user=web_app dbname=web_app sslmode=verify-full password=password"
db, err := sql.Open("postgres", pgConf)
我从 docker compose 得到以下错误:
Error creating new user: dial tcp [::1]:5432: getsockopt: connection refused
如何让两个容器相互通信?
提前致谢。
使用 docker-compose v2 时,不需要在服务之间创建链接。 Docker 1.9 和 1.10 允许您通过它们的名称连接到同一(自定义)网络上的其他容器。
您应该能够使用 服务 的名称或 容器 的名称作为主机名进行连接。由于容器的名字是由docker-compose生成的,使用起来不是很方便,所以docker-compose也加了一个alias 与每个容器的服务名称。
举这个非常简单的例子。为了方便起见,我使用了 Nginx 容器,但同样适用于您的情况;
version: '2'
services:
web_app:
image: nginx
db:
image: nginx
首先启动项目(假设;
$ docker-compose --project-name=test up -d
Creating network "test_default" with the default driver
Creating test_db_1
Creating test_web_app_1
然后从 test_web_app_1
容器内 ping "db" 服务:
$ docker exec -it test_web_app_1 ping -c 2 db
PING db (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: icmp_seq=0 ttl=64 time=0.108 ms
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.243 ms
--- db ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.108/0.175/0.243/0.068 ms
如果您检查 test_db_1
容器,您可以看到 docker-compose 自动为 test_db_1
容器添加了一个 "db" 别名;
$ docker inspect test_db_1
给出:(只是 NetworkSettings.Networks
部分)
"Networks": {
"test_default": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"db",
"002b1875e61f"
],
"NetworkID": "0f9e2cddeca79e5a46c08294ed61dee273828607f99014f6410bda887626be70",
"EndpointID": "a941ab95586a8fdafc5075f9c5c44d745f974e5790ef6048b9e90115a22fb31f",
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:12:00:02"
}
}
我正在练习制作一个与 PostgreSQL 数据库交互的 Golang 网络应用程序,每个 运行 在它们自己的容器上。
我是 运行 容器 docker-compose up
但我似乎无法正确设置 postgres 容器。
为简洁起见,指向 Dockerfile
s 和其他设置文件的链接是 on this gist(如果您需要,请在此处告诉我)。
version: '2'
services:
web_app:
build: dockerfiles/web_app
ports:
- "9000:9000"
volumes:
- .:/go/src/gitlab.com/repo/web_app
# links might be replaced by depends_on.
# links:
# - db
depends_on:
- db
# tty and stdin_open cause docker-compose to disconnect from docker-machine after 60sec.
# A fix is on the way.
# tty: true
# stdin_open: true
db:
build: dockerfiles/db
volumes:
- data:/var/lib/postgresql/data
volumes:
data: {}
docker-compose up
工作正常。但是当应用程序尝试打开数据库连接时:
var pgConf string = "user=web_app dbname=web_app sslmode=verify-full password=password"
db, err := sql.Open("postgres", pgConf)
我从 docker compose 得到以下错误:
Error creating new user: dial tcp [::1]:5432: getsockopt: connection refused
如何让两个容器相互通信?
提前致谢。
使用 docker-compose v2 时,不需要在服务之间创建链接。 Docker 1.9 和 1.10 允许您通过它们的名称连接到同一(自定义)网络上的其他容器。
您应该能够使用 服务 的名称或 容器 的名称作为主机名进行连接。由于容器的名字是由docker-compose生成的,使用起来不是很方便,所以docker-compose也加了一个alias 与每个容器的服务名称。
举这个非常简单的例子。为了方便起见,我使用了 Nginx 容器,但同样适用于您的情况;
version: '2'
services:
web_app:
image: nginx
db:
image: nginx
首先启动项目(假设;
$ docker-compose --project-name=test up -d
Creating network "test_default" with the default driver
Creating test_db_1
Creating test_web_app_1
然后从 test_web_app_1
容器内 ping "db" 服务:
$ docker exec -it test_web_app_1 ping -c 2 db
PING db (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: icmp_seq=0 ttl=64 time=0.108 ms
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.243 ms
--- db ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.108/0.175/0.243/0.068 ms
如果您检查 test_db_1
容器,您可以看到 docker-compose 自动为 test_db_1
容器添加了一个 "db" 别名;
$ docker inspect test_db_1
给出:(只是 NetworkSettings.Networks
部分)
"Networks": {
"test_default": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"db",
"002b1875e61f"
],
"NetworkID": "0f9e2cddeca79e5a46c08294ed61dee273828607f99014f6410bda887626be70",
"EndpointID": "a941ab95586a8fdafc5075f9c5c44d745f974e5790ef6048b9e90115a22fb31f",
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:12:00:02"
}
}