Docker Compose部署vue+node+mysql项目

1、生产环境配置

项目中连接mysql文件如下:

const mysql = require('mysql2')
//mysql链接信息
const msg = {
    host: process.env.NODE_ENV === 'docker' ? 'mysql' : 'localhost',
    user: 'root',
    password: 'root',
    database: 'sing'
}
//建立链接
const con = mysql.createConnection(msg)
con.connect()
//链接类
class Database {
    constructor() {
        this.mysql = con
    }
}
module.exports = Database

每个容器都在我们主机网络里,但是容器之间是需要通过对方的 IP 地址来交流和访问的,通过 Container Name 就可得知对方容器的 IP。

其中mysql的host: “mysql” 代表mysql镜像构建的容器名。下面在/node/Dockerfile中用环境变量 NODE_ENV来区分是否以 Docker 启动 App。

2、nginx镜像

Dockerfile文件如下:

FROM nginx
COPY default.conf /etc/nginx/conf.d/default.conf
ADD dist/ /usr/share/nginx/build

其中default.conf即为nginx的配置文件,/etc/nginx/conf.d/为配置文件目录,/usr/share/nginx/build为静态文件目录,同时将打包编译的dist文件拷贝到静态目录下。
default.conf文件如下:

server {
  listen 80;
  listen [::]:80;
  server_name 192.168.137.4;
  location / {
    root   /usr/share/nginx/build;
    index  index.html index.htm;
    try_files $uri $uri/ /index.html;
  }
}

修改静态文件目录为/usr/share/nginx/build,增加代理/api到node容器的3000端口。

3、node镜像

Dockerfile文件如下:

FROM node
RUN mkdir -p /app/server
WORKDIR /app/server
COPY serve/ /app/server/
ENV NODE_ENV=docker
RUN npm install
CMD ["npm","start"]

将后台相关文件放在server文件,并拷贝至镜像/app/server目录下,然后设置 npm start 为容器启动时的命令。
官方的node镜像很大,这里通过alpine来构建nodejs环境。

FROM alpine
RUN mkdir -p /app/server
WORKDIR /app/server
ADD serve/ /app/server/
ENV NODE_ENV=docker
RUN apk add nodejs npm && npm install -g cnpm --registry=https://registry.npm.taobao.org && cnpm i
CMD ["npm","start"]
4、mysql镜像

Dockerfile文件如下:

FROM mysql:5.7
WORKDIR /docker-entrypoint-initdb.d
COPY sing.sql /docker-entrypoint-initdb.d

在启动MySQL容器时自动创建我们需要的数据库和表,对应的sql文件为sing.sql,并移动到容器/docker-entrypoint-initdb.d下。
sing.sql文件如下:

CREATE DATABASE sing;
USE sing;

CREATE TABLE users  (
  id int(11) NOT NULL AUTO_INCREMENT,
  username char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  password char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  PRIMARY KEY (id, username, password) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ROW_FORMAT = Dynamic;

INSERT INTO users VALUES (1, 'arly', '123456');
INSERT INTO users VALUES (2, 'admin', '123456');
INSERT INTO users VALUES (3, 'linda', '123456');

CREATE TABLE resources (
  id int(11) NOT NULL AUTO_INCREMENT,
  audioUrl varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  videoUrl varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  userId int(11) NOT NULL,
  createTime datetime(0) NULL DEFAULT NULL,
  title varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  describeStr varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (id, userId, audioUrl, title) USING BTREE,
  INDEX fk_resource_1_idx(userId) USING BTREE,
  CONSTRAINT fk_resource_1 FOREIGN KEY (userId) REFERENCES users (id) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 22 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

INSERT INTO resources VALUES (17, 'http://192.168.137.4:3000/resources/audios/消愁.mp3', 'http://192.168.137.4:3000/resources/videos/晚会.mp4', 1, '2022-10-16 18:11:14', '消愁', '消愁');
INSERT INTO resources VALUES (20, 'http://192.168.137.4:3000/resources/audios/凉凉(三生三世十里桃花片尾曲).mp3', 'http://192.168.137.4:3000/resources/videos/晚会.mp4', 2, '2022-10-16 18:38:28', '凉凉', '凉凉(三生三世片尾曲)');
INSERT INTO resources VALUES (21, 'http://192.168.137.4:3000/resources/audios/病变(温柔男声,敲好听).mp3', 'http://192.168.137.4:3000/resources/videos/晚会.mp4', 3, '2022-10-16 20:53:06', '病变', '病变');

启动mysql容器。

docker exec -it 容器ID /bin/bash

进入mysql。

mysql -u root -p

设置mysql用户权限。

grant all on *.* to root@'%' identified by 'root'; 
flush privileges;
5、docker-compose

在使用容器编排前,需要先整理下我们的目录结构:

docker-compose.yml:docker-compose的配置文件

mysql

  • Dockefile:mysql镜像的Dockefile文件
  • sing.sql:mysql镜像的sql文件

nginx

  • Dockefile:nginx镜像的Dockefile文件
  • dist:前端打包后的静态文件
  • default.conf nginx镜像的配置文件

node

  • Dockefile:node镜像的Dockefile文件
  • server:项目后台文件目录,提供后台服务

在这里插入图片描述

docker-compose.yml文件如下:

version: "3.0"
services:    
  mysql: 
      container_name: mysql        
      build:            
        context: ./mysql            
        dockerfile: Dockerfile        
      ports: 
        - "3306:3306"        
      restart:  always   
      environment: 
        - MYSQL_ROOT_HOST='%'
        - MYSQL_ROOT_PASSWORD=root
        - MYSQL_DATABASE=sing        
      networks: 
        - my-net
  node:
      container_name: node      
      build:            
        context: ./node           
        dockerfile: Dockerfile
      expose:
        - 3000        
      ports: 
        - "3000:3000"        
      restart: always        
      networks: 
        - my-net
      depends_on: 
        - mysql
  nginx:
      container_name: nginx         
      build:            
        context: ./nginx            
        dockerfile: Dockerfile
      expose:
        - 8080        
      ports: 
        - "8080:80"        
      restart: always        
      networks: 
        - my-net 
      links:
        - node
      depends_on: 
        - node
networks:
  my-net:

mysql为自己编译的mysql镜像,其中MYSQL_ROOT_PASSWORD为root的用户密码,build里指定了Dockerfile目录,使用专属网桥my-net。

node为自己编译的node服务镜像,build里指定了Dockerfile目录,使用专属网桥my-net,node服务依赖于mysql。

nginx为自己编译的前端服务镜像,build里指定了Dockerfile目录,使用专属网桥my-net。

最后声明一下网桥my-net,将所有服务都挂载在同一网桥即可通过容器名来互相通信了

至此docker-compose配置文件编写完成,直接后台启动即可。

docker-compose up -d

启动完成,查看容器是否都正常运行。

在这里插入图片描述

访问192.168.137.4:8080。

在这里插入图片描述

关闭容器。

docker-compose stop

删除所有停止的容器。

docker container prune
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值