这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战
前端需要知道的CI / CD知识不完全指北(五)
Docker-compose
基于Docker 和 Docker-compose
通过一个配置文件,就可以让你的系统意见启动所有的运行环境: nodejs mysql mongodb redis
Docker 容器的组合
本文目标
通过Docker-compose搭建开发环境
- 介绍Docker-compose
- Docker-compose 配置 Redis
- Docker-compose 配置 Mysql
- Docker-compose 配置 Mongodb
注意
预先 docker pull 用到的镜像, 否则 docker-compose 初次启动会很慢
介绍
软件设计和开发, 有单一职责
原则。Docker 也一样,每个容器都只负责一个服务。
如果开发环境需要多个服务(比如 nodejs mysql mongodb redis),就需要启动多个Docker容器
要连通多个docker容器,就需要Docker-compose
安装Docker-compose
# 安装依赖
$ yum install -y py-pip python3-dev libffi-dev openssl-dev gcc libc-dev rust cargo make
# 下载当前稳定版的docker compose
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 开启执行权限
$ sudo chmod +x /usr/local/bin/docker-compose
# 创建docker-compose软链接
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 测试安装结果
$ docker-compose --version
# 更新
$ docker-compose migrate-to-labels
# 卸载
$ sudo rm /usr/local/bin/docker-compose
# 或
$ pip uninstall docker-compose
配置文件
Redis Docker-compose
# docker-compose.yml
version: '3'
services:
editor-server: # service name
build:
context: . # 当前目录
dockerfile: Dockerfile # 基于 Dockerfile 构建
image: editor-server # 依赖于当前 Dockerfile 创建出来的镜像
container_name: editor-server
ports:
- 8081:3000 # 宿主机通过8081访问
editor-redis: # service name , 重要!
image: redis # 使用官网 redis 镜像
container_name: editor-redis
ports:
# 宿主机,可以用127.0.0.1:6378 即可连接容器中的数据库 `redis-cli -h 127.0.0.1 -p 6378`
# 但是, 其他 docker 容器不能, 因为此时 127.0.0.1 是 docker 容器本身 而不是宿主机
- 6378:6379
enviroment:
- TZ=Asia/Shanghai # 设置时区
命令
构建容器
docker-compose build <service-name>
启动所有服务器
docker-compose up -d
后台启动
停止所有服务
docker-compose down
查看服务
docker-compose ps
配置 Mysql 和 Mongodb
修改 docker-compose.yml
editor-mysql:
image: mysql # 引用官网 mysql 镜像
container_name: editor-mysql
restart: always # 出错则重启
privileged: true # 高权限, 执行下面的 mysql/init
command: --default-authentication-plugin=mysql_native_password # 远程访问
ports:
- 3305:3306
volumes:
- .docker-volumes/mysql/log:/var/log/mysql # 记录日志
- .docker-volumes/mysql/data:/var/lib/mysql # 数据持久化
- ./mysql/init:/docker-entrypoint-initdb.d # 初始化 sql
enviroment:
- MYSQL_DATABASE=colion_sso
- MYSQL_ROOT_PASSWORD=Mysql_2019
- TZ=Asia/Shanghai # 设置时区
editor-mongo
image: mongo # 引用官网 mongo 奖项
container_name: editor-mongo
restart: always
volumes:
- '.docker-volumes/mongo/data:/data/db' # 数据持久化
enviroment:
- MONGO_INITDB_DATABASE=colion_sso
- TZ=Asia/Shanghai # 设置时区
ports:
- 27015:27017 # 宿主机可以用 127.0.0.1:27016 即可连接容器中的数据库
增加 mysql/init/init.sql 初始化 mysql
-- docker-compose 启动 mysql 时初始化代码
select "init start...";
-- 设置 root 用户可外网访问
use mysql
SET SQL_SAFE_UPDATES=0; --解除安全模式,测试环境没关系
update user set host='%' where user='root';
flush privileges;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxxxx'
flush privileges;
select "init end ...";
修改 config/envs/prd-dev.js 增加 mysql 和 mongodb的配置
修改 .gitignore 文件. 增加一行 .docker-volumes/ 重要!
流程
- Docker 镜像。 Run => 容器
- DockerFile 构建镜像 => 服务打包
- docker-compose 启动项目 => 编排多个微服务/环境
- Docker 网络