本文正在参加「金石计划 . 瓜分6万现金大奖」。
Docker-compose
介绍
通过一个配置文件,可以让系统一键启动所有的运行环境,nodejs
,mysql
,redis
,mongodb
等。
如果开发环境需要多个服务,就需要启动多个 Docker
容器。
要连通多个 Docker
容器,就需要 Docker-compose
。
安装
Docker Desktop for Windows
自带 docker-compose
# 查看 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 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
根目录下新建 mysqlinit.sql
文件,可以做一些初始化的事情,比如解除安全模式,供外网访问
-- mysqlinit.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",
},
操作
构建镜像
启动容器
查看服务日志
没有报错,说明我们的几个容器都正常启动,并且可以互相关联了。