【架构师(第四十九篇)】 服务端开发之认识 Docker-compose
Docker-compose
介绍
通过一个配置文件,可以让系统一键启动所有的运行环境,nodejs
,mysql
,redis
,mongodb
等。
如果开发环境需要多个服务,就需要启动多个 Docker
容器。
要连通多个 Docker
容器,就需要 Docker-compose
。
安装
Docker Desktop for Windows
自带 docker-compose
# 查看 docker-compose 版本
docker-compose --version
配置文件
# 统一的版本号
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 nameeditor-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 nameeditor-mysql:# 引用官网 mysql 镜像image: mysqlcontainer_name: editor-mysql# 出错重启restart: always# 高权限,执行下面的 mysql/initprivileged: true# 解决无法远程访问的问题command: --default-authentication-plugin=mysql_native_passwordports:# 宿主机可以用 127.0.0.1:3305 即可连接容器中的数据库- 3305:3306volumes:# 记录日志- .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 nameeditor-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/Shanghaiports:# 宿主机可以用 127.0.0.1:27016 即可连接容器中的数据库- '27016:27017'
命令
- 构建容器 :docker-compose build
- 启动所有服务器:docker-compose up -d, 后台启动
- 停止所有服务:docker-compose down
- 查看服务:docker-compose ps
docker-compose ps 和 docker ps 的区别是:docker
显示所有的服务,docker-compose
只显示docker-compose.yml
文件中声明过的服务。
连接 Redis
端口还是 6379
,host
要和 docker-compose.yml
中的服务名称对应
redisConf: {port: "6379",host: 'editor-redis'},
mysql, mongodb 和 redis 的区别
redis
无数据库 , 而mysql
,mongodb
需要创建数据库redis
是缓存,无需数据持久化,而mysql
,mongodb
需要
连接 mysql
根目录下新建 mysql\init.sql
文件,可以做一些初始化的事情,比如解除安全模式,供外网访问
-- 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
中的服务名称对应
mysqlConfig: {host: 'editor-mysql'user: "root",password: "xiaowei123",port: "3306",database: "imooc_lego_course",},
连接 mongodb
host
要和 docker-compose.yml
中的服务名称对应
mongodbConf: {host: 'editor-mongo'port: "27017",dbName: "imooc_lego_course",},
操作
构建镜像
启动容器
查看服务日志
没有报错,说明我们的几个容器都正常启动,并且可以互相关联了。
最后
为大家准备了一个前端资料包。包含54本,2.57G的前端相关电子书,《前端面试宝典(附答案和解析)》,难点、重点知识视频教程(全套)。
有需要的小伙伴,可以点击下方卡片领取,无偿分享