Docker 部署
1913字约6分钟
注意
默认端口冲突:8000,3306,6379,5672
建议在部署前关闭本地服务:mysql,redis,rabbitmq...
本机部署
警告
部署 意味着你的所有代码已经准备就绪,可以用于生产,而本机部署则是为了能够快捷的提供本地 API 服务,所以,此教程仅提供 API 本机部署教程
后端
env
进入
deploy/backend/docker-compose
目录,创建环境变量文件.env
touch .env.server ../../../backend/.env
将初始化环境变量配置拷贝到环境变量文件中
cp .env.server ../../../backend/.env
按需修改配置文件
backend/core/conf.py
和.env
执行一键启动命令
相关信息
命令执行期间遇到镜像拉取问题请自行 Google
docker-compose up -d --build
等待命令执行完成
前端
警告
此教程不提供前端本机部署方案,对于前后端本地开发或联调,你不应该进行部署,请转至文档:本地开发
服务器部署
提示
此教程以 https 为例,如果你没有相关经验,请自行 Google 进行了解
后端
拉取代码到服务器
将代码拉取到服务器通常采用 ssh 方式(更安全),但是你也可以选择使用 https 方式,具体方式请根据个人自行决定,如果使用 ssh 方式拉取代码, 请自行 Google 拉取教程,如果使用 https 方式,你可以查看 后端步骤2
env
进入
deploy/backend/docker-compose
目录,创建环境变量文件.env
touch .env.server ../../../backend/.env
将初始化环境变量配置拷贝到环境变量文件中
cp .env.server ../../../backend/.env
按需修改配置文件
backend/core/conf.py
和.env
建议修改
.env
中的ENVIRONMENT
为pro
更新脚本文件
仓库内的
docker-compose.yml
文件默认为后端独立部署,如果你没有前端需求,而只需调用后端 API,请查看 本机部署详情
version: "3.10" networks: fba_network: name: fba_network driver: bridge ipam: driver: default config: - subnet: 172.10.10.0/24 volumes: fba_mysql: name: fba_mysql fba_redis: name: fba_redis fba_static: name: fba_static fba_rabbitmq: name: fba_rabbitmq services: fba_server: build: context: ../../../ dockerfile: backend/backend.dockerfile image: fba_server:latest container_name: fba_server restart: always depends_on: - fba_mysql - fba_redis - fba_celery volumes: - fba_static:/fba/backend/app/static networks: - fba_network command: - bash - -c - | wait-for-it -s fba_mysql:3306 -s fba_redis:6379 -t 300 mkdir -p /var/log/supervisor/ supervisord -c /fba/deploy/backend/supervisor.conf supervisorctl restart fastapi_server fba_mysql: image: mysql:8.0.29 ports: - "${DOCKER_MYSQL_MAP_PORT:-3306}:3306" container_name: fba_mysql restart: always environment: MYSQL_DATABASE: fba MYSQL_ROOT_PASSWORD: 123456 TZ: Asia/Shanghai volumes: - fba_mysql:/var/lib/mysql networks: - fba_network command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --lower_case_table_names=1 fba_redis: image: redis:6.2.7 ports: - "${DOCKER_REDIS_MAP_PORT:-6379}:6379" container_name: fba_redis restart: always environment: - TZ=Asia/Shanghai volumes: - fba_redis:/var/lib/redis networks: - fba_network # 后端专用,这与 fba_ui 冲突,如果你选择使用 fba_ui, # 你应该注释或删除 fba_nginx 容器脚本,并使用 fba_ui 容器 fba_nginx: image: nginx ports: - "8000:80" container_name: fba_nginx restart: always depends_on: - fba_server volumes: - ../nginx.conf:/etc/nginx/nginx.conf:ro - fba_static:/www/fba_server/backend/static networks: - fba_network # 如果服务器内存小于 4GB,CPU 小于四个内核 # 建议进入 fba_ui 项目单独构建这个容器(参考下方前端部署教程) # 如果你不选择单独构建,务必在执行下面步骤前根据前端部署教程更新前端配置文件 # 如果你选择单独构建,务必注释或删除此容器脚本 fba_ui: build: context: /root/fastapi_best_architecture_ui # 根据 fba_ui 项目存放目录修改此路径 dockerfile: Dockerfile image: fba_ui:latest ports: - "80:80" - "443:443" container_name: fba_ui restart: always depends_on: - fba_server command: - nginx - -g - daemon off; volumes: # nginx https conf # 通过 docker 进行部署时,需要打开此配置项并确保<挂载到容器内的证书文件路径>配置 # 与 nginx conf 中的 ssl 证书文件路径配置一致,如果你直接将 ssl 证书文件 cp # 到了 docker 容器内,则无需挂载证书文件,直接将它们注释或删除即可 # local_ssl_pem_path:你在服务器存放 ssl pem 证书文件的路径,自行修改 # local_ssl_key_path: 你在服务器存放 ssl key 证书文件的路径,自行修改 # /etc/ssl/xxx.pem:挂载到容器内 ssl pem 证书文件的路径,自行修改 # /etc/ssl/xxx.key:挂载到容器内 ssl key 证书文件的路径,自行修改 - local_ssl_pem_path:/etc/ssl/xxx.pem - local_ssl_key_path:/etc/ssl/xxx.key - fba_static:/www/fba_server/backend/static networks: - fba_network fba_rabbitmq: hostname: fba_rabbitmq image: rabbitmq:3.12.7 ports: - "15672:15672" - "5672:5672" container_name: fba_rabbitmq restart: always environment: - RABBITMQ_DEFAULT_USER=guest - RABBITMQ_DEFAULT_PASS=guest volumes: - fba_rabbitmq:/var/lib/rabbitmq networks: - fba_network fba_celery: build: context: ../../../ dockerfile: backend/celery.dockerfile image: fba_celery:latest ports: - "8555:8555" container_name: fba_celery restart: always depends_on: - fba_rabbitmq networks: - fba_network command: - bash - -c - | wait-for-it -s fba_rabbitmq:5672 -t 300 mkdir -p /var/log/supervisor/ supervisord -c /fba/deploy/backend/supervisor.conf supervisorctl restart celery_worker supervisorctl restart celery_beat supervisorctl restart celery_flower
执行一键启动命令
相关信息
命令执行期间遇到镜像拉取问题请自行 Google
docker-compose up -d --build
等待命令执行完成
前端
警告
我们提供此前端部署教程的目的是为你提供前端 Docker 部署解决方案,请记住我们的声明,此前端项目仅作为效果演示,而不是用于生产!
拉取代码到服务器
env
修改
.env.production
中的VITE_API_BASE_URL
为域名地址更新 nginx
进入 deploy 目录,编辑 nginx.conf 文件
详情
# For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; client_max_body_size 5M; client_body_buffer_size 5M; gzip on; gzip_comp_level 2; gzip_types text/plain text/css text/javascript application/javascript application/x-javascript application/xml application/x-httpd-php image/jpeg image/gif image/png; gzip_vary on; keepalive_timeout 300; server { listen 80 default_server; listen [::]:80 default_server; server_name 127.0.0.1; listen 443 ssl; # docker ssl 证书文件路径配置应该与 docker-compose 中的保持一致 # /etc/ssl/xxx.pem:挂载到容器内 ssl pem 证书文件的路径,自行修改 # /etc/ssl/xxx.key:挂载到容器内 ssl key 证书文件的路径,自行修改 ssl_certificate /etc/ssl/xxx.pem; ssl_certificate_key /etc/ssl/xxx.key; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; # xxx.com 应该与 .env.production 中的配置保持一致 server_name xxx.com; client_max_body_size 10m; root /www/fba_ui; location / { try_files $uri $uri/ /index.html; } location /api/v1/ { proxy_pass http://fba_server:8001; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_connect_timeout 300s; proxy_send_timeout 300s; proxy_read_timeout 300s; } location /static/ { alias /www/fba_server/backend/static; } } server { listen 80; # xxx.com 应该与 .env.production 中的配置保持一致 server_name xxx.com; rewrite ^(.*)$ https://$host$1 permanent; } }
更新脚本文件
注意
如果已通过后端 docker-compose 构建前端项目,此步骤和后面的剩余步骤直接跳过即可
详情
networks: fba_network: external: true volumes: fba_static: external: true services: fba_ui: build: context: ../ dockerfile: Dockerfile image: fba_ui:latest ports: - "80:80" - "443:443" container_name: fba_ui restart: always command: - nginx - -g - daemon off; volumes: # nginx https conf # 通过 docker 进行部署时,需要打开此配置项并确保<挂载到容器内的证书文件路径>配置 # 与 nginx conf 中的 ssl 证书文件路径配置一致,如果你直接将 ssl 证书文件 cp # 到了 docker 容器内,则无需挂载证书文件,直接将它们注释或删除即可 # local_ssl_pem_path:你在服务器存放 ssl pem 证书文件的路径,自行修改 # local_ssl_key_path: 你在服务器存放 ssl key 证书文件的路径,自行修改 # /etc/ssl/xxx.pem:挂载到容器内 ssl pem 证书文件的路径,自行修改 # /etc/ssl/xxx.key:挂载到容器内 ssl key 证书文件的路径,自行修改 - local_ssl_pem_path:/etc/ssl/xxx.pem - local_ssl_key_path:/etc/ssl/xxx.key - fba_static:/www/fba_server/backend/static networks: - fba_network
构建并启动容器
创建网络
docker network create fba_network
构建
docker-compose build fba_ui
启动
docker-compose run fba_ui
注意事项
注意
请不要频繁使用 docker-compose up -d --build
命令,每次执行,此命令都会构建容器,并将原容器自动进行本地备份保留,这会导致硬盘空间迅速递减
清理未使用的镜像
docker image prune
清理未使用的容器
docker container prune
清理所有未使用的镜像、容器、网络和构建缓存
docker system prune
清理所有悬空的镜像和卷
docker system prune -a --volumes