通过docker连接golang和redis
Connecting golang and redis through docker
我正在尝试使用 docker-compose 通过 Docker 连接 golang 和 reds,但我运气不佳。我已经在 https://github.com/davidwilde/docker-compose-golang-redis/tree/Whosebug_question 发布了我的尝试并在下面列出了日志。
Redis 说它已准备好接受连接,但我使用 gopkg.in/redis.v3 的 golang 应用程序说不。
~/workspace/composetest master ● docker-compose up
Starting composetest_db_1...
Starting composetest_web_1...
.
.
.
ur kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
db_1 | 1:M 20 Nov 05:58:33.371 * DB loaded from disk: 0.000 seconds
db_1 | 1:M 20 Nov 05:58:33.371 * The server is now ready to accept connections on port 6379
web_1 | panic: dial tcp [::1]:6379: getsockopt: connection refused
web_1 |
web_1 | goroutine 1 [running]:
web_1 | main.main()
web_1 | /go/src/app/app.go:19 +0x131
web_1 |
web_1 | goroutine 17 [syscall, locked to thread]:
web_1 | runtime.goexit()
web_1 | /usr/local/go/src/runtime/asm_amd64.s:1696 +0x1
web_1 | panic: dial tcp [::1]:6379: getsockopt: connection refused
web_1 |
web_1 | goroutine 1 [running]:
web_1 | main.main()
web_1 | /go/src/app/app.go:19 +0x131
web_1 |
web_1 | goroutine 17 [syscall, locked to thread]:
web_1 | runtime.goexit()
web_1 | /usr/local/go/src/runtime/asm_amd64.s:1696 +0x1
所以我们有两个不同的容器,这意味着在这种情况下有两个不同的"localhost"。
client := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
})
因此,您的应用正在向它自己的沙盒容器发出请求,而不是向您的 "other" 包含 redis 的沙盒容器发出请求。
您有两个选择;
在您的撰写文件中提供映射,例如 redisdb:db 并传递该信息而不是本地主机。
或者,使用“--net=host”选项以便在不更改代码的情况下为您的容器提供通用网络。
编辑:打字错误
@Gladmir 的回答很棒。只是为了扩展 his/her 答案,我不需要从我的 Golang 代码中删除 localhost
:
client := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
})
我更改了 Docker Compose 文件以使用 network_mode: "host"
:
version: "3.9"
services:
web:
build:
context: .
network_mode: "host"
redis:
container_name: "redis"
image: "redis:alpine"
command: redis-server /usr/local/etc/redis/redis.conf
ports:
- "6379:6379"
volumes:
- $PWD/configs/redis.conf:/usr/local/etc/redis/redis.conf
我正在尝试使用 docker-compose 通过 Docker 连接 golang 和 reds,但我运气不佳。我已经在 https://github.com/davidwilde/docker-compose-golang-redis/tree/Whosebug_question 发布了我的尝试并在下面列出了日志。
Redis 说它已准备好接受连接,但我使用 gopkg.in/redis.v3 的 golang 应用程序说不。
~/workspace/composetest master ● docker-compose up
Starting composetest_db_1...
Starting composetest_web_1...
.
.
.
ur kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
db_1 | 1:M 20 Nov 05:58:33.371 * DB loaded from disk: 0.000 seconds
db_1 | 1:M 20 Nov 05:58:33.371 * The server is now ready to accept connections on port 6379
web_1 | panic: dial tcp [::1]:6379: getsockopt: connection refused
web_1 |
web_1 | goroutine 1 [running]:
web_1 | main.main()
web_1 | /go/src/app/app.go:19 +0x131
web_1 |
web_1 | goroutine 17 [syscall, locked to thread]:
web_1 | runtime.goexit()
web_1 | /usr/local/go/src/runtime/asm_amd64.s:1696 +0x1
web_1 | panic: dial tcp [::1]:6379: getsockopt: connection refused
web_1 |
web_1 | goroutine 1 [running]:
web_1 | main.main()
web_1 | /go/src/app/app.go:19 +0x131
web_1 |
web_1 | goroutine 17 [syscall, locked to thread]:
web_1 | runtime.goexit()
web_1 | /usr/local/go/src/runtime/asm_amd64.s:1696 +0x1
所以我们有两个不同的容器,这意味着在这种情况下有两个不同的"localhost"。
client := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
})
因此,您的应用正在向它自己的沙盒容器发出请求,而不是向您的 "other" 包含 redis 的沙盒容器发出请求。
您有两个选择;
在您的撰写文件中提供映射,例如 redisdb:db 并传递该信息而不是本地主机。
或者,使用“--net=host”选项以便在不更改代码的情况下为您的容器提供通用网络。
编辑:打字错误
@Gladmir 的回答很棒。只是为了扩展 his/her 答案,我不需要从我的 Golang 代码中删除 localhost
:
client := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
})
我更改了 Docker Compose 文件以使用 network_mode: "host"
:
version: "3.9"
services:
web:
build:
context: .
network_mode: "host"
redis:
container_name: "redis"
image: "redis:alpine"
command: redis-server /usr/local/etc/redis/redis.conf
ports:
- "6379:6379"
volumes:
- $PWD/configs/redis.conf:/usr/local/etc/redis/redis.conf