场景
若依前后端分离版手把手教你本地搭建环境并运行项目:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662
上面在搭建起来前后端分离版的项目后。
如果想通过Dockerfile的方式部署项目可以参考如下。
Docker中使用Dockerfile的方式部署SpringBoot+Vue前后端分离的项目(若依前后端分离框架为例):
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/120210424
除此之外,还可以使用docker-compose的方式去编排部署各个服务。
docker-compose
简介
https://docs.docker.com/compose/
docker-compose是基于docker的开源项目,托管于github上,由python实现,
调用 docker服务的API负责实现对docker容器集群的快速编排,即通过一个单独的yaml文件,
来定义一组相关的容器来为一个项目服务。
Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分类似。
快速编排:站在项目角度将一组相关联容器整合在一起,对这组容器按照指定顺序进行启动。
Compose 允许用户通过一个单独的 docker-compose.yml 模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)。这里涉及2个重要的概念:
服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
项目名称
Compose 用项目名称来隔离不同的环境,在没有设置项目名称的情况下,
Compose 会用 docker-compose.yml 文件所在根目录名称做为项目名称。
每个项目有自己的 Docker network,不同项目的 Docker network 彼此不通。
在单个主机上建立多个隔离环境,Compose 使用项目名称将环境彼此隔离。
您可以在多个不同的上下文中使用此项目名称。默认项目名称是项目目录的基本名称。
您可以使用-p 命令行选项或 COMPOSE_PROJECT_NAME 环境变量设置自定义项目名称 。
默认项目目录是 Compose 文件的基本目录。可以使用–project-directory 命令行选项自定义项目目录。
Compose与Docker的兼容性
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
实现
1、确保服务器已经安装Docker以及Compose,可通过
docker --version
docker-compose --version
2、在服务器上新建如下目录
首先新建fzysShow目录,作为项目所在目录以及项目名称,然后进入该目录,创建如下目录以及文件
docker-compose.yml文件
java目录,目录下存放后台服务fzys.jar包
mysql目录,目录下新建data目录,作为数据挂载目录
nginx目录,目录下新建config目录,config目录下新建nginx.conf配置文件;新建font目录,目录下存放dist前端打的包;新建log目录,映射挂载日志目录。
redis目录,目录下新建data目录和redis.conf配置文件。
3、修改docker-compose.yml的内容为
version: "3.8" services: redis: image: redis:latest restart: always ports: - "36379:6379" volumes: - ./redis/redis.conf:/etc/redis/redis.conf - ./redis/data:/data command: redis-server /etc/redis/redis.conf mysql: image: mysql:latest restart: always ports: - "33306:3306" command: --lower_case_table_names=1 environment: MYSQL_DATABASE: fzys-show MYSQL_ROOT_PASSWORD: Fzys@123! MYSQL_ROOT_HOST: '%' TZ: Asia/Shanghai volumes: - ./mysql/data:/var/lib/mysql kkfileview: image: zjblovewl/kkfile:4.9 ports: - "38012:8012" nginx: image: nginx:latest ports: - "390:390" volumes: - ./nginx/font/dist:/usr/share/nginx/dist - ./nginx/log:/var/log/nginx - ./nginx/config/nginx.conf:/etc/nginx/nginx.conf java: image: openjdk:8u342-oracle restart: always volumes: - ./java:/home working_dir: /home/ ports: - "39090:39090" - "38901:8901" environment: TZ: Asia/Shanghai depends_on: - redis - mysql command: [ 'java', '-jar', '/home/fzys.jar' ]
配置讲解:
首先声明compose的版本为3.8
然后声明各服务
redis服务:
镜像为redis:latest,端口映射宿主机36379映射到容器6379,数据卷挂载宿主机当前目录下./redis/redis.conf
映射到容器内/etc/redis/redis.conf的配置文件以及数据data目录挂载。执行命令redis-server /etc/redis/redis.conf
使redis通过读取配置文件的方式启动。这里需要注意redis的版本与redis.conf配置文件的版本对应问题,以及
需要赋予宿主机./redis/redis.conf的权限问题。进入到./redis目录下执行
chmod -R 777 redis.conf
DockerCompose编排Redis6.2.6以及遇到的那些坑:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/128361840
mysql服务:
这里mysql为版本8,所以需要执行command使其忽略表名大小写。然后配置初始化需要的库以及root用户密码和限制访问的
ip等相关环境变量。
kkfileview服务:
这个为系统中用到的文件预览服务,如果用不到可以去掉这个。
nginx服务:
端口映射以及数据卷映射。映射宿主机当前目录下./nginx/font/dist至容器内usr/share/nginx/dist目录,这个就是用来存放前端包的;映射配置文件./nginx/config/nginx.conf:/etc/nginx/nginx.conf。
修改配置文件nginx.conf的内容为:
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 390; server_name localhost; client_max_body_size 300M; location / { root /usr/share/nginx/dist; try_files $uri $uri/ /index.html; index index.html index.htm; } location /prod-api/ { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://你的服务器ip:39090/; } location /websocket/ { proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_pass http://你的服务器ip:39090; proxy_http_version 1.1; proxy_set_header Upgrade "websocket"; proxy_set_header Connection "Upgrade"; proxy_read_timeout 5s; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
注意:
这里在配置文件中添加了websockt的代理的相关配置,如果不需要可以去掉,只关注反向代理的部分。
注意这里映射的目录,前端是容器内的/usr/share/nginx/dist目录,已经在yml中将其映射到宿主机
./nginx/font/dist目录,所以需要将前端项目打包,并上传至宿主机./nginx/font/dist,注意dist目录就是打包后
的目录,不要在dist下再有一层dist目录。
可通过本地dist压缩并上传至服务器解压的方式。
java服务:
这里用的jdk的镜像,映射当前目录下./java到容器内home目录下。然后将当前工作目录切换至home目录下,这里端口映射
根据自己的后台服务需要的接口进行映射。depends_on指定java需要依赖redis和mysql这两个服务,避免启动顺序问题。然后
command执行命令,启动jar包。
所以需要将后台jar包上传至宿主机java目录下。
4、yml文件编排完成,需要启动项目并查看日志
来到docker-compose.yml所在的目录下,输入
docker-compose up
启动项目,不加-d参数可以使其不要后台启动,可以直接查看各服务的日志。
此时mysql只是初始化了库并没有导入sql,所以后台java会进行包括,可以先忽略,待mysql启动成功之后
使用客户端工具,将需要的表进行同步结构和数据到服务器上即可。
当然mysql还可以通过dockerfile以及脚本的方式导入sql文件,但是这里需要将部分表的接口以及部分表的数据
同步到服务器上,所以没有初始化sql,而是选择手动传输数据库表和数据的方式。
同步完数据库之后,按ctrl+c可以结束所有服务,停掉整个项目,再输入一遍
docker-compose up
此时后台不再报错,各服务均启动正常。
也可以单独针对一个项目中某个服务进行重启,比如需要更新前端dist包,只要将原来宿主机下
./nginx/font/dist的dist删除并上传最新的dist包,然后重启nginx服务。
docker-compose restart nginx
5、docker-compose常用命令
docker compose ps
可以列出「当前项目」下所有的服务
docker compose build
格式:docker compose build [SERVICE...] 构建 docker-compose.yml文件中的服务,生成镜像。
docker compose up
启动的容器都在前台,控制台将实时打印所有容器的输出信息(以不同的颜色标识不同的服务),
可以很方便进行调试。当按下 Ctrl+C 时,所有容器都会被停止。
如果使用 docker compose up -d,则所有服务将在后台启动。
docker compose stop
停止项目中的所有服务容器。
docker compose start
启动项目中的所有服务容器。
docker compose restart
重启项目中的所有服务容器。
注意上面的启动、停止、重启都可以后面跟具体的服务名,进而对单个服务进行操作。
docker compose down
此命令将会『停止并删除』docker-compose.yml中定义的所有服务容器和网络,但保留数据卷。
docker compose logs
查看当前项目下所有服务容器的日志输出。也可跟具体服务名。
6、查看当前项目服务运行状态是否正常
状态均为Up,各服务启动成功
然后访问服务器的390端口,显示系统页面并出现验证码,则部署成功。