我对docker来说还很陌生,所以我遵循了他们的官方教程,并尝试了适用于我的工作项目的“快捷方式”。我有以下docker-compose.yml:
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: my_image
deploy:
replicas: 5
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
ports:
- "4000:80"
networks:
- webnet
redis:
image: redis
ports:
- "6379:6379"
volumes:
- "/home/docker/data:/data"
command: redis-server --appendonly yes
networks:
- webnet
networks:
webnet:
my_image是一个简单的Flask应用程序,它可以启动Flask和Redis,然后显示访问次数:
from flask import Flask
from redis import Redis, RedisError
import os
import socket
# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)
app = Flask(__name__)
@app.route("/")
def hello():
try:
visits = redis.incr("counter")
except RedisError:
visits = "<i>cannot connect to Redis, counter disabled</i>"
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>" \
"<b>Visits:</b> {visits}"
return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
当我像这样开始蜂群时:
sudo docker swarm init --advertise-addr <ip>
sudo docker stack deploy -c docker-compose.yml flask_with_redis
my_image
图像可以正常启动,我可以看到它在127.0.0.1:4000上运行,但是Redis从未启动。
我怀疑我的docker-compose.yml
出问题了,尤其是redis
服务出问题了,因为my_image
运行良好。
还可以通过运行my_image
将Redis和Flask绝对添加到requirements.py
中。
有人经历过类似的事情吗?你能帮我吗?
答案 0 :(得分:0)
您的撰写看起来很正确,并且flask应用程序服务/图像与作为成功服务启动的redis图像无关。
docker stack ps flask_with_redis
和docker service logs flask_with_redis_redis
说什么?
我建议在部署堆栈时观察docker events
,并查看它对redis服务的作用。
答案 1 :(得分:0)
它为我工作,我对docker-compose文件进行了很少的更改,例如将my_image图像添加到私有注册表中,并且在我执行swarm模式时将redis的全局部署模式作为redis来执行( 1个管理员2个工作节点)。请找到以下步骤。
使用以下命令创建本地注册表。
docker service create registry --name registry --publish published=5003,target=5000 registry:2
如下所述更新图像并构建标签。还要将部署模式更新为全局以供Redis使用。
注意:如果您正在docker swarm上运行,请确保已在所有节点上创建路径/ home / docker / data。
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: 127.0.0.1:5003/my_image:latest
build: .
deploy:
replicas: 5
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
ports:
- "4000:80"
networks:
- webnet
redis:
image: redis
deploy:
mode: global
ports:
- "6379:6379"
volumes:
- "/home/docker/data:/data"
command: redis-server --appendonly yes
networks:
- webnet
networks:
webnet:
在存在所有工件(Dockerfile,docker-compose.yml,requirements.txt app.py)的位置执行以下命令。
运行以下命令来生成图像。
docker-compose up -d
运行以下命令删除容器。
docker-compose down
运行以下命令将创建的my_image映像推送到私有注册表。
docker-compose push
运行以下命令以使用相同的撰写文件创建堆栈。
docker stack deploy --compose-file docker-compose.yml redisapp
供您参考的屏幕截图。
希望它对您有帮助,如果您需要任何帮助,请告诉我。
答案 2 :(得分:0)
感谢您的帮助,Prathis和Bret Fisher。 事实证明,该解决方案更简单:我只需要“坚持” Docker教程,而只需离开
placement:
constraints: [node.role == manager]
因此完整的(正在运行的)docker-compile.yml如下所示:
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: my_image
deploy:
replicas: 5
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
ports:
- "4000:80"
networks:
- webnet
redis:
image: redis:latest
deploy:
placement:
constraints: [node.role == manager]
ports:
- "6379:6379"
command: redis-server --appendonly yes
networks:
- webnet
networks:
webnet:
此容器可以很好地运行Redis
答案 3 :(得分:0)
我的情况下,它不起作用,因为出于某种原因,我从networks: - webnet
中省略了docker-compose.yml
。我的理解是,这告诉服务使用与其他服务相同的网络,这就是将python代码中的“ host = redis”正确解析为redis服务器的方法。