前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【架构师(第四十九篇)】 服务端开发之认识 Docker-compose

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

作者头像
一尾流莺
发布2022-12-10 13:55:25
5030
发布2022-12-10 13:55:25
举报

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

Docker-compose

介绍

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

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

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

安装

Docker Desktop for Windows 自带 docker-compose

代码语言:javascript
复制
# 查看 docker-compose 版本
docker-compose --version
image.png
image.png

配置文件

代码语言: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 psdocker ps 的区别是:docker 显示所有的服务,docker-compose 只显示docker-compose.yml 文件中声明过的服务。

连接 Redis

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

代码语言:javascript
复制
  redisConf: {
    port: "6379",
    host: 'editor-redis'
  },    

mysql, mongodb 和 redis 的区别

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

连接 mysql

根目录下新建 mysql\init.sql 文件,可以做一些初始化的事情,比如解除安全模式,供外网访问

代码语言:javascript
复制
-- 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 中的服务名称对应

代码语言:javascript
复制
  mysqlConfig: {
    host: 'editor-mysql'
    user: "root",
    password: "xiaowei123",
    port: "3306",
    database: "imooc_lego_course",
  },

连接 mongodb

host 要和 docker-compose.yml 中的服务名称对应

代码语言:javascript
复制
  mongodbConf: {
    host: 'editor-mongo'
    port: "27017",
    dbName: "imooc_lego_course",
  },    

操作

构建镜像

image.png
image.png

启动容器

image.png
image.png

查看服务日志

image.png
image.png

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-11-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Docker-compose
    • 介绍
      • 安装
        • 配置文件
          • 命令
            • 连接 Redis
              • mysql, mongodb 和 redis 的区别
                • 连接 mysql
                  • 连接 mongodb
                    • 操作
                      • 构建镜像
                      • 启动容器
                      • 查看服务日志
                  相关产品与服务
                  容器镜像服务
                  容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档