Docker-compose常用的解决方法

前言
我们常常见到很多比较棒的开源项目,但在本地安装运行的话就会很复杂,要配置不同的环境,安装不同的依赖,好一点的会用docker直接拉取,或者打包好。
这些无疑都会增加初学者上手的成本,所以这篇文章总结了下目前比较常用的解决方法之一:
使用docker-compose同时管理多个服务,只需要一行命令docker compose up -d,就可以启动一个包含后端项目、前端项目、数据库的完整服务。
而docker-compose作为docker容器的编排工具,可以帮助我们实现管理多个docker容器。
其实整体的过程并不难,但要配置完成,也要很多步骤,这篇文章主要是从实战的角度,将整个过程串起来。涉及的知识点包括:nginx、docker、docker-compose、node、mysql也需要了解下。
适合读下去的朋友:
对docker有基本的了解
同时需要部署多个项目
需要开源项目或者自建项目的整体部署
需要打包部署一整个网站
需要提前准备的
docker安装并启动(演示版本如下)
docker-compose(安装docker同时会自动安装,如果没有可以自行安装,也很简单)
一个前端项目(这里演示使用react spa)
一个后端项目(这里使用express)
如图所示,通过docker-componse.yml文件一次启动不同的容器,然后他们都可以对外提供服务。
前端项目构建
前端项目处理
首先我们通过cra下载一个项目模版,为了可以模拟实际的项目需要,对下载的模版做一些处理,让这个项目可以
1、区分当前项目是预发环境还是生产环境
2、引入axios可以请求接口
接着我们打包yarn build:prod,打包后的文件夹build就是我们要部署的静态资源。
拉取nginx镜像部署
我们通过docker部署前面打包的静态资源,当前项目的路径是
/users/user/desktop/mine/fronted-demo2/build  
直接运行下面命令行,启动前端服务
docker run -d -p 80:80 -v /users/user/desktop/mine/fronted-demo2/build:/usr/share/nginx/html --name frontend-test nginx
通过本机80端口访问,发现当前服务是生产环境,并且由于后端服务没有部署,此时数据库拿到的数据为空。
测试,我们切换路由,发现页面404了,是因为单页面应用路由在前端,需要nginx转发下,接着我们用项目中的nginx配置覆盖容器中的配置
提取nginx配置到项目中
首先,我们进入上一步的docker容器,可以看到nginx的路径。
docker exec -it frontend-test /bin/bash
在项目根目录下新建nginx/default.conf
server {    listen  80;    server_name  localhost;    underscores_in_headers  on;    root /home/frontend;    location / {      try_files $uri $uri/ @router;      index index.html;    }    location @router {      rewrite ^.*$ /index.html last;    }}  
然后通过挂载的方式,启动容器,发现访问正常。
编写dockerfile文件
from nginxworkdir /home/frontendcopy build .copy ./nginx/default.conf /etc/nginx/conf.d/default.confexpose 80  
在项目根目录下,新建dockerfile文件,其中包括基础镜像、工作目录、将项目copy到镜像,将nginx配置文件复制到镜像中。
构建前端服务镜像并启动
docker build -t frontend .docker imagesdocker run -d -p 80:80 --name frontend-v1 frontend  
可以发现前端服务的镜像已经打包完成并启动,打开本地80端口访问,测试完毕可以删除,然后留镜像frontend备用。也可以将镜像推送镜像仓库,后面直接通过远程来拉取也可以。
主意:如果之前的docker容器启动,需要先关掉,否则会报端口被占用,如果不删除,就需要修改重新启动容器的名字。
数据库启动
拉取并启动数据库、连接数据库
docker run -p 3306:3306 --restart=always --privileged=true --name mysql -v /users/user/desktop/mysql/data:/var/lib/mysql -v /users/user/desktop/mysql/my.cnf:/etc/mysql/my.cnf -e mysql_root_password=123456 -d mariadb  
一行命令启动mariadb,这里选择mariadb是由于我m1的电脑,不支持mysql镜像,所以改成了mariadb,使用是一样。上面的命令除了启动数据库服务,还设置了数据的一些配置,密码,将数据库的数据放在了本地。
[mysqld]skip-name-resolveuser=rootcharacter-set-server=utf8default_authentication_plugin=mysql_native_passwordsql_mode=only_full_group_by,strict_trans_tables,error_for_division_by_zero,no_auto_create_user,no_engine_substitutionlower_case_table_names=1 #忽略表名大小写[client]default-character-set=utf8[mysql]default-character-set=utf8  
新建库和表
这里可以进入容器中操作数据库,还可以使用客户端连接数据库
后端项目启动
下载express项目模版并连接数据库
这里配置数据库,写好项目接口,确保本地启动服务正常。
拉起镜像,部署镜像
部署服务,我们选择使用pm2,为了区分生产环境和预发环境,我们在根目录下新建pm2.config.js,然后通过传入不同的参数,启动对应的环境
module.exports = {  apps : [      {        name: myapp,        script: ./bin/www,        watch: true,        env: {            node_env: development        },        env_production: {            node_env: production,        }      }  ]}  
启动预发环境pm2 start pm2.config.js --env development
启动生产环境pm2 start pm2.config.js --env production
再项目中通过process.env.node_env读取
编写dockerfile并构建新的镜像
from keymetrics/pm2run mkdir -p /home/backendworkdir /home/backendcopy ./ /home/backendrun yarn installenv npm_config_loglevel warnexpose 9000cmd [pm2-runtime, start, pm2.config.js, --env, production]  
然后构建镜像docker build -t backend .
docker-compose.yml 配置
截止目前,我们有了三个docker镜像,分别是前端服务的镜像,后端服务的镜像和数据库的镜像。然后我们编写docker-compose.yml来同时启动这三个服务,并且保证三者的启动顺序。
编写docker-compose配置文件
新建一个目录,然后再目录下新建docker-compose.yml和目录mysql,mysql中包含了mysql的数据和日志信息,这样就不用重启服务导致数据库信息丢失
version: '3'networks:  app-web:   driver: bridgeservices:  mysql:    image: mariadb    ports:     - 3306:3306    command: --default-authentication-plugin=mysql_native_password    restart: always    networks:     - app-web    environment:     - tz=asia/shanghai     - mysql_user=root     - mysql_root_password=123456    volumes:     - ./mysql/data:/var/lib/mysql     - ./mysql/my.cnf:/etc/mysql/my.cnf     - /etc/localtime:/etc/localtime  backend:    image: backend    ports:     - 9000:9000    depends_on:     - mysql    networks:     - app-web  frontend:    image: frontend    ports:     - 80:80    depends_on:     - backend  
看到这个配置不要怕,拆分开,其实很简单,整个配置文件就是一个完整的项目,包括了mysql、backend、frontend,每个部分和配置dockerfile差不多,增加了depends_on,很好理解,前置的服务需要提前部署,networks,让不同的容器在相同的网络中运行。当然这只是提供了最基础的配置,更复杂的配置需要根据使用场景来完善。
启动服务
docker compose up -d-d #是以守护进程的方式运行,通过docker ps可以查看当前所有运行中的服务。
docker compose down#停止当前集群下的所有服务,并删除容器。  
到这里,我们的docker-compose整体打包部署一个网站已经完成了,过程中可能存在各种各样的坑,但只要配置报错日志进行查询,就能一一解决。
如果需要重新部署一套,或者发布新版本,只需要更新docker-compose.yml就可以了
注意点
1、mysql配置
数据库和项目的一些信息需要灵活配置,根据自己的需要。
自动迁移数据库
我们发现,一些新的数据库表,没有进行初始化,导致需要手动处理,在项目中我们可以用脚本去,或者使用一些数据库封装的orm进行自动迁移。
一些报错信息
解决办法,修改mysql配置host为mysql
1、docker拉取镜慢的话,可以考虑国内镜像
2、前端、后端项目可以使用任意的语言,只要构架不同的镜像就可以了。


昆仑芯科技 × OpenI/O启智开发者大会看点多多
耐辐射产品系列如何应对近地轨道应用中的挑战
中购联铱星云商携手瑞为技术打造数智时代的商业新范式
LED恒流驱动芯片的滞环控制电路
液晶面板TN的和TFT的区别
Docker-compose常用的解决方法
100MHz至40GHz RMS功率检波器 具1dB准确度和35dB动态范围
低轨星座互联网商业化运营能否取得成功?
苏州市人民政府与华为举行了全面战略合作协议签约仪式
怎样快速制造基于3D打印的微流控芯片模块
广州将深化穗港澳台合作 力争到2022年打造出千亿元级集成电路产业集群
其域创新利用 NVIDIA Omniverse 加速工作流整合,大幅缩短 3D 工厂项目的周期
vivo NEX零界全面屏面世,坚持走出自己的风格
NI推出用于机器人控制系统的LabVIEW Robotics
运维工程师是干什么的 前景又如何
关于利用传统图像处理方法瑕疵检测总结
美国太空探索技术公司正在开发下一代重型运载火箭星舟
佳铭士MAXAIR尹国洪:锂电行业气动元件难点对应及国产化剖析
MTK XY6785CD 4G 核心板
大规模IC设计中ASIC、COT和COPD模型的选择策略