Docker-compose

介绍

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

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

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

安装

Docker Desktop for Windows 自带 docker-compose

# 查看 docker-compose 版本
docker-compose --version


一台服务安装 两个docker 一台服务器多个docker_一台服务安装 两个docker

配置文件

# 统一的版本号
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 psdocker ps 的区别是:docker 显示所有的服务,docker-compose 只显示docker-compose.yml 文件中声明过的服务。

连接 Redis

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

redisConf: {port: "6379",host: 'editor-redis'},

mysql, mongodb 和 redis 的区别

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

连接 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",},

操作

构建镜像


一台服务安装 两个docker 一台服务器多个docker_一台服务安装 两个docker_02

启动容器


一台服务安装 两个docker 一台服务器多个docker_容器_03

查看服务日志


一台服务安装 两个docker 一台服务器多个docker_mysql_04

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