首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
【架构师(第一篇)】整体需求分析和架构设计
2
【架构师(第二篇)】脚手架架构设计和框架搭建
3
【架构师(第三篇)】脚手架开发之掌握Lerna操作流程
4
【架构师(第四篇)】脚手架开发之Lerna源码分析
5
【架构师(第五篇)】脚手架之import-local执行流程及简历设计
6
【架构师(第六篇)】脚手架之需求分析和架构设计
7
【架构师(第七篇)】脚手架之准备阶段编写
8
【架构师(第八篇)】脚手架之 commander 框架使用方法
9
【架构师(第九篇)】如何让 Node 环境支持 ES Module
10
【架构师(第十篇)】脚手架之注册命令及架构优化
11
【架构师(第十一篇)】脚手架之命令注册和执行过程开发
12
【架构师(第十二篇)】脚手架之命令行交互工具 inquirer.js 使用方法
13
【架构师(第十三篇)】脚手架之创建项目准备阶段开发
14
【架构师(第十四篇)】脚手架之 egg.js 和 mongodb 的使用
15
【架构师(第十五篇)】脚手架之创建项目模板开发
16
【架构师(第十六篇)】脚手架之创建项目模板的下载与更新
17
【架构师(第十七篇)】脚手架之 ejs 和 glob 的使用
18
【架构师(第十八篇)】脚手架之项目模板的安装
19
【架构师(第十九篇)】脚手架之组件库模板开发
20
【架构师(第二十篇)】脚手架之自定义模板及第一阶段总结
21
【架构师(第二十一篇)】编辑器开发之需求分析和架构设计
22
【架构师(第二十二篇)】编辑器开发之项目整体搭建
23
【架构师(第二十三篇)】编辑器开发之画布区域组件的渲染
24
【架构师(第二十四篇)】编辑器开发之添加模版到画布
25
【架构师(第二十五篇)】编辑器开发之属性编辑区域表单渲染
26
【架构师(第二十六篇)】编辑器开发之属性编辑同步渲染
27
【架构师(第二十七篇)】前端单元测试框架 Jest 基础知识入门
28
【架构师(第二十八篇)】 测试工具 Vue-Test-Utils 基础语法
29
【架构师(第二十九篇)】Vue-Test-Utils 触发事件和异步请求
30
【架构师(第三十篇)】Vue-Test-Utils 全局组件和第三方库 vuex | vue-router
31
【架构师(第三十一篇)】前端测试之 TDD 的开发方式
32
【架构师(第三十二篇)】 通用上传组件开发及测试用例
33
【架构师(第三十三篇)】 Vue 中的实例及本地图片预览
34
【架构师(第三十四篇)】 业务组件库开发之 vue3 的插件系统
35
【架构师(第三十五篇)】 业务组件库开发之使用 Rollup 进行打包
36
【架构师(第三十六篇)】 业务组件库开发之发布到 NPM
37
【架构师(第三十七篇)】 服务端开发之后端框架与数据库技术选型
38
【架构师(第三十八篇)】 服务端开发之本地安装最新版 MySQL 数据库
39
【架构师(第三十九篇)】 服务端开发之连接 MySQL 数据库
40
【架构师(第四十篇)】 服务端开发之连接 Mongodb 数据库
41
【架构师(第四十一篇)】 服务端开发之安装并连接 Redis数据库
42
【架构师(第四十二篇)】 服务端开发之常用的登录鉴权方式
43
【架构师(第四十三篇)】 服务端开发之单元测试和接口测试
44
【架构师(第四十四篇)】 服务端开发之 pm2 和 nginx 介绍
45
【架构师(第四十五篇)】 服务端开发之认识 Github actions
46
【架构师(第四十六篇)】 服务端开发之安装 Docker
47
【架构师(第四十七篇)】 服务端开发之认识 Docker
48
【架构师(第四十八篇)】 服务端开发之 Dockerfile
49
【架构师(第四十九篇)】 服务端开发之认识 Docker-compose
50
【架构师(第五十篇)】 服务端开发之自动发布到测试机
清单首页架构文章详情

【架构师(第四十九篇)】 服务端开发之认识 Docker-compose


本文正在参加「金石计划 . 瓜分6万现金大奖」

Docker-compose

介绍

通过一个配置文件,可以让系统一键启动所有的运行环境,nodejsmysqlredismongodb 等。

如果开发环境需要多个服务,就需要启动多个 Docker 容器。

要连通多个 Docker 容器,就需要 Docker-compose

安装

Docker Desktop for Windows 自带 docker-compose

代码语言:javascript
复制
# 查看 docker-compose 版本
docker-compose --version

配置文件

代码语言:javascript
复制
# 统一的版本号
version: '3'
# 服务
services:
    # service name, 自定义, 不能重复
    editor-server:
        build:
            # 当前目录
            context: .
            # 基于 Dockerfile 构建
            dockerfile: Dockerfile
        # 依赖于当前 Dockerfile 创建出来的镜像名称
        image: editor-server
        # 容器名称
        container_name: editor-server
        # 端口映射 宿主机通过 8081 访问
        ports:
            - 8081:3000
    # service name
    editor-redis:
        # 引用官方 redis 镜像
        image: redis
        # 容器名称
        container_name: editor-redis
        # 端口映射
        ports:
            # 宿主机,可以用 127.0.0.1:6378 即可连接容器中的数据库  'redis-cli -h 127.0.0.1 -p 6378'
            # 6379 可能被宿主机的 redis 所占用, 防止冲突使用 6378
            # 但是, 其它 docker 容器不能, 因为此时 127.0.0.1 是 docker 容器本身, 而不是宿主机
            - 6378:6379
            # 环境变量
        environment:
            # 设置时区
            - TZ=Asia/Shanghai
    # service name
    editor-mysql:
        # 引用官网 mysql 镜像
        image: mysql
        container_name: editor-mysql
        # 出错重启
        restart: always
        # 高权限,执行下面的 mysql/init
        privileged: true
        # 解决无法远程访问的问题
        command: --default-authentication-plugin=mysql_native_password
        ports:
            # 宿主机可以用 127.0.0.1:3305 即可连接容器中的数据库
            - 3305:3306
        volumes:
            # 记录日志
            - .docker-volumes/mysql/log:/var/log/mysql
            # 数据持久化
            - .docker-volumes/mysql/data:/var/lib/mysql
            # 初始化 sql
            - ./mysql/init:/docker-entrypoint-initdb.d/
        environment:
            # 初始化容器时创建数据库
            # - MYSQL_USER=shuangyue #创建 test 用户
            # - MYSQL_PASSWORD=shuangyue #设置 test 用户的密码
            - MYSQL_DATABASE=imooc_lego_course
            - MYSQL_ROOT_PASSWORD=xiaowei123
            # 设置时区
            - TZ=Asia/Shanghai
    # service name
    editor-mongo:
        # 引用官网 mongo 镜像
        image: mongo
        # 容器名称
        container_name: editor-mongo
        # 出错重启
        restart: always
        # 文件映射
        volumes:
            # 数据持久化
            - '.docker-volumes/mongo/data:/data/db'
        environment:
            # - MONGO_INITDB_ROOT_USERNAME=root
            # - MONGO_INITDB_ROOT_PASSWORD=123456
            - MONGO_INITDB_DATABASE=imooc_lego_course
            # 设置时区
            - TZ=Asia/Shanghai
        ports:
            # 宿主机可以用 127.0.0.1:27016 即可连接容器中的数据库
            - '27016:27017'

命令

  • 构建容器 :docker-compose build
  • 启动所有服务器:docker-compose up -d, 后台启动
  • 停止所有服务:docker-compose down
  • 查看服务:docker-compose ps

docker-compose psdocker ps 的区别是:docker 显示所有的服务,docker-compose 只显示docker-compose.yml 文件中声明过的服务。

连接 Redis

端口还是 6379host 要和 docker-compose.yml 中的服务名称对应

代码语言:javascript
复制
  redisConf: {
    port: "6379",
    host: 'editor-redis'
  },    

mysql, mongodb 和 redis 的区别

  • redis 无数据库 , 而 mysqlmongodb 需要创建数据库
  • redis 是缓存,无需数据持久化,而 mysqlmongodb 需要

连接 mysql

根目录下新建 mysql\init.sql 文件,可以做一些初始化的事情,比如解除安全模式,供外网访问

代码语言:javascript
复制
-- mysql\init.sql
-- docker-compose 启动 mysql 时的初始化代码

select "init start...";

-- 设置 root 用户可外网访问
use mysql;
SET SQL_SAFE_UPDATES=0; -- 解除安全模式,测试环境,没关系
update user set host='%' where user='root';
flush privileges;
-- 密码参考 docker-compose.yml
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xiaowei123'; 
flush privileges;

select "init end...";   

host 要和 docker-compose.yml 中的服务名称对应

代码语言:javascript
复制
  mysqlConfig: {
    host: 'editor-mysql'
    user: "root",
    password: "xiaowei123",
    port: "3306",
    database: "imooc_lego_course",
  },

连接 mongodb

host 要和 docker-compose.yml 中的服务名称对应

代码语言:javascript
复制
  mongodbConf: {
    host: 'editor-mongo'
    port: "27017",
    dbName: "imooc_lego_course",
  },    

操作

构建镜像

启动容器

查看服务日志

没有报错,说明我们的几个容器都正常启动,并且可以互相关联了。

下一篇
举报
领券