读《Docker从入门到实践》
https://yeasy.gitbooks.io/docker_practice/compose/usage.html

中的docker-compose一章,在遇到下面一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
from flask import Flask
from redis import Redis

app = Flask(__name__)
redis = Redis(host='redis', port=6379)

@app.route('/')
def hello():
count = redis.incr('hits')
return 'Hello World! 该页面已被访问 {} 次。\n'.format(count)

if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)

这是一段很简单的代码,但是我写的时候不小心用host='localhost'代替了,这段代码在本地运行的很好,打开http://localhost:5000时能正常计数,但是在用docker-compse up 启动之后会报

redis.exceptions.ConnectionError: Error 111 connecting to localhost:6379. Connection refused.

很明显是flask的应用无法访问redis的服务,但是我打开了本地的redis-cli也显示无法连接
docker-compose 日志中,很明显redis的服务是启动在了6379端口,所以肯定是hostname的问题,在docker服务内部无法找到locahost到底是谁,因为localhost是在宿主机里的host文件里面配置的,所以app里面访问locahost来连接redis失败了,这时候要找到redis启动的真正的hostname是redis

image.png

使用docker-compose ps命令发现在docker-compose up启动的时候,自动创建了2个镜像实例counter_web_1,counter_redis_1

1
2
3
4
5
➜ docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------------
counter_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
counter_web_1 python counter.py Up 0.0.0.0:5000->5000/tcp

由于我们在docker-compose.yml文件里面将counter_web_1从docker端口映射到外部网络的5000端口,因此我们才能通过localhost:5000来访问页面,所以加入
我们在redis里面也加上port

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: '2'

services:
web:
build: .
command: python counter.py
ports:
- "5000:5000"
volumes:
- .:/code
redis:
image: "redis:alpine"
ports:
- "6379:6379"

这样的话 我们就能从宿主机来访问docker里面的redis实例了。
image.png


本站由 Hank Zhao 使用 Stellar 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
本站总访问量