docker-compose多容器服务创建

docker-compose 多容器服务

本文目的

  • 了解如何适用 docker-compose 编排多容器服务
  • 在容器中,如何访问其他容器网络

服务用例

下载项目:https://github.com/ddzyan/backend_docker-compose.git

项目文件夹结构

$ tree -L 2
.
├── docker-compose.yml
└── mysql
    ├── conf
    │   └── my.cnf
    └── init
        └── init.sql

配置文件介绍

my.cnf

mysql 数据库配置文件

[mysqld]
pid-file    = /var/run/mysqld/mysqld.pid
socket      = /var/run/mysqld/mysqld.sock
datadir     = /var/lib/mysql
#log-error  = /var/log/mysql/error.log
# By default we only accept connections from localhost
bind-address   = 0.0.0.0
# Disabling symbolic-links is recommended to prevent assorted security risks
#symbolic-links=0

init.sql

mysql 初始化 sql,目的如下

  • 创建远程连接账号并且赋予权限,给 back_end 服务连接使用
  • 创建 back_end 必需的数据库和表
use mysql;
CREATE USER 'test'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'test'@'%';
FLUSH PRIVILEGES;
create database backend;

use backend;

CREATE TABLE `classroom` (
  `id` bigint(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `classname` varchar(13) NOT NULL COMMENT '班级名称',
  `headTeacherId` bigint(10) unsigned DEFAULT NULL COMMENT '班主任ID',
  `createdAt` datetime DEFAULT NULL COMMENT '创建时间',
  `updatedAt` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `classname_index` (`classname`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

CREATE TABLE `user` (
  `id` bigint(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `username` varchar(13) NOT NULL COMMENT '账号名称',
  `age` int(2) NOT NULL COMMENT '年龄',
  `password` varchar(20) NOT NULL COMMENT '密码',
  `sex` enum('1','0') NOT NULL COMMENT '性别',
  `classroomId` bigint(10) unsigned NOT NULL COMMENT '班级ID',
  `createdAt` datetime DEFAULT NULL COMMENT '创建时间',
  `updatedAt` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `classroomId` (`classroomId`),
  KEY `username_index` (`username`) USING BTREE,
  CONSTRAINT `user_ibfk_1` FOREIGN KEY (`classroomId`) REFERENCES `classroom` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表'

docker-compose.yml

version: '3'

services:
  backend:
    container_name: ddz_backend
    image: registry.cn-hangzhou.aliyuncs.com/zmscode/backend:1.0.0
    environment:
      NODE_ENV: production
    ports:
      - 3000:3000
    volumes:
      - './back_end/logs:/usr/src/back_end/logs'
    command: pm2-runtime start ./start.config.js
    depends_on:
      - mysql
      - redis

  mysql:
    container_name: ddz_mysql
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    image: mysql:5.7
    ports:
      - '3306:3306'
    volumes:
      - './mysql/conf/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf'
      - './mysql/logs:/logs'
      - './mysql/data:/var/lib/mysql'
      - './mysql/init:/docker-entrypoint-initdb.d/'
    restart: always

  redis:
    container_name: ddz_redis
    image: redis:latest
    ports:
      - '6379:6379'
    volumes:
      - './redis/conf/redis.conf:/usr/local/etc/redis/redis.conf'
      - './redis/data:/data'
    restart: always
    command: redis-server /usr/local/etc/redis/redis.conf
参数说明
back_end
  • command 将覆盖 dockerfile 文件中的 CMD 指令
  • depends_on 设置 back_end 容器启动在 mysql 和 redis 之后,保证服务启动之前数据库和缓存容器已经创建成功
mysql
  • environment 系统变量设置,配置 root 账号密码
  • volumes 容器卷映射 ,其中 init 文件夹映射的目的,是在 mysql 容器创建成功之后,执行初始化 sql
  • restart 重启策略,出问题就重启

使用说明

back_end 项目中连接 mysql 和 redis ,将不采用 127.0.0.1 或者其他指定 IP 方式,将采用如下方式

url: 'redis://redis:6379/1';

原因是在服务创建的时候,docker-compose 会创建一个默认的网络,配置的所有容器都将在这个网络下创建和互相访问,访问的方式为 容器名称 进行,docker-compose 会进行解析为指定的 ip,用于连接

服务操作

# 构建,启动
docker-compose -f ./docker-compose.yml up

# 关闭,删除容器
docker-compose -f ./docker-compose.yml down

# 查看容器
docker-compose -f ./docker-compose.yml ps

# 查看日志
docker-compose -f ./docker-compose.yml logs -f

  目录