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