zl程序教程

您现在的位置是:首页 >  Java

当前栏目

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

2023-02-18 15:37:25 时间

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

Docker-compose

介绍

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

如果开发环境需要多个服务,就需要启动多个 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 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 中的服务名称对应

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

操作

构建镜像

启动容器

查看服务日志

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