app:一个后端web服务
celery:异步服务队列
redis:消息中间件
db:数据持久化存储
nginx:web服务器,将请求代理到app
version: "3"
services:
app:
restart: always
build: . # 代表当前目录
# 容器启动时需要运行的命令
command: bash -c "python3 manage.py collectstatic --no-input && python3 manage.py migrate && gunicorn --timeout=30 --workers=4 --bind :8001 blog.wsgi:application"
volumes:
- ".:/code" # 将当前目录映射到容器中的code路径下,在宿主机修改文件相当于修改了容器内的文件,容器被删除了,宿主机的中文件也不会删除
- "static-volume:/code/static" # 由docker容器自动管理的静态文件卷,当容器删除后也会存在,在下次构建容器的时候可以指定,
- "media-volume:/code/media" # 由docker容器自动管理的静态文件卷,当容器删除后也会存在,在下次构建容器的时候可以指定,
expose: # expose 仅暴露给其他容器,而 ports 会暴露给其他容器和宿主机。
- "8001" # 绑定容器的端口和宿主机的端口,访问宿主机的端口就是访问容器的端口,实现访问
depends_on:
- db # 依赖数据库容器,db容器启动后app容器才能启动
- redis
networks:
- web_network # 指定可以通信的网络,类似容器之间的局域网,只有处于相同的网络中才能互相访问
- db_network
celery:
restart: always
build: .
command: bash -c "celery -A my_celery_task worker -l info"
volumes:
- ".:/code"
depends_on:
- db
- redis
networks:
- web_network
- db_network
redis:
image: redis:alpine
ports:
- "6379:6379"
restart: always
networks:
- db_network
db:
restart: always # 失败了自动重启
image: mysql:5.7 # 指定mysql的镜像文件和版本
volumes:
- "/root/data/mysql:/var/lib/mysql"
ports:
- "3306:3306"
environment:
- "MYSQL_ROOT_PASSWORD=123456" # 指定数据库root用户的密码为123456
- "MYSQL_DATABASE=blog" # 指定数据库名称
networks:
- db_network
nginx:
restart: always
image: nginx
ports:
- "80:8001"
- "443:8002"
volumes:
- static-volume:/code/static
- media-volume:/code/media
- ./config/nginx:/etc/nginx/conf.d
- ./config/nginx:/code/config/nginx
depends_on:
- app
networks:
- web_network
networks:
web_network:
driver: bridge
db_network:
driver: bridge
volumes:
static-volume:
media-volume: