Docker-compose容器编排

Docker-compose容器编排

1. 是什么

Docker-Compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。

3. 去哪下

官网:https://docs.docker.com/compose/compose-file/compose-file-v3/

官网下载:https://docs.docker.com/compose/install/

安装步骤:

1
2
3
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version

image-20220118201507451

image-20220118201532134

4. Compose核心概念

4.1 一文件

docker-compose.yml

4.2 两要素

  1. 服务(service):一个个应用容器实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器
  2. 工程(project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

5. Compose使用的三个步骤

  1. 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
  2. 使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。
  3. 最后,执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线

6. Compose常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker-compose -h                           # 查看帮助
docker-compose up # 启动所有docker-compose服务
docker-compose up -d # 启动所有docker-compose服务并后台运行
docker-compose down # 停止并删除容器、网络、卷、镜像。
docker-compose exec yml里面的服务id # 进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose ps # 展示当前docker-compose编排过的运行的所有容器
docker-compose top # 展示当前docker-compose编排过的容器进程

docker-compose logs yml里面的服务id # 查看容器输出日志
docker-compose config # 检查配置
docker-compose config -q # 检查配置,有问题才有输出
docker-compose restart # 重启服务
docker-compose start # 启动服务
docker-compose stop # 停止服务

7. Compose编排微服务

7.1 改造升级微服务工程docker_boot

1
2
3
4
5
6
7
8
9
10
CREATE TABLE `t_user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL DEFAULT '' COMMENT '用户名',
`password` varchar(50) NOT NULL DEFAULT '' COMMENT '密码',
`sex` tinyint(4) NOT NULL DEFAULT '0' COMMENT '性别 0=女 1=男 ',
`deleted` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '删除标志,默认0不删除,1删除',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用户表'
1
2
3
4
5
6
7
8
9
10
11
12
13
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER zzyy
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为zzyy_docker.jar
ADD docker_boot-0.0.1-SNAPSHOT.jar zzyy_docker.jar
# 运行jar包
RUN bash -c 'touch /zzyy_docker.jar'
ENTRYPOINT ["java","-jar","/zzyy_docker.jar"]
#暴露6001端口作为微服务
EXPOSE 6001
1
docker build -t zzyy_docker:1.6 .

7.2 不用Compose

7.2.1 mysql容器实例

1
docker run -p 3306:3306 --name mysql57 --privileged=true -v /zzyyuse/mysql/conf:/etc/mysql/conf.d -v /zzyyuse/mysql/logs:/logs -v /zzyyuse/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker exec -it mysql57 /bin/bash
mysql -uroot -p
create database db2021;
use db2021;
CREATE TABLE `t_user` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`username` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '用户名',
`password` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '密码',
`sex` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '性别 0=女 1=男 ',
`deleted` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT '删除标志,默认0不删除,1删除',
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

7.2.2 redis容器实例

1
docker run  -p 6379:6379 --name redis608 --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf

7.2.3 微服务工程

1
docker run -d -p 6001:6001 zzyy_docker:1.6

上面三个容器实例依次顺序启动成功

image-20220118210538756

7.3 swagger测试

1
2
#http://localhost:你的微服务端口/swagger-ui.html#/
http://192.168.48.111:6001/swagger-ui.html

7.4 上面成功了,有哪些问题?

  1. 先后顺序要求固定,先mysql+redis才能微服务访问成功
  2. 多个run命令……
  3. 容器间的启停或宕机,有可能导致IP地址对应的容器实例变化,映射出错,要么生产IP写死(可以但是不推荐),要么通过服务调用

7.5 使用Compose

  1. 服务编排,一套带走,安排

  2. 编写docker-compose.yml文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    version: "3"

    services:
    microService:
    image: zzyy_docker:1.6
    container_name: ms01
    ports:
    - "6001:6001"
    volumes:
    - /app/microService:/data
    networks:
    - atguigu_net
    depends_on:
    - redis
    - mysql

    redis:
    image: redis:6.0.8
    ports:
    - "6379:6379"
    volumes:
    - /app/redis/redis.conf:/etc/redis/redis.conf
    - /app/redis/data:/data
    networks:
    - atguigu_net
    command: redis-server /etc/redis/redis.conf

    mysql:
    image: mysql:5.7
    environment:
    MYSQL_ROOT_PASSWORD: '123456'
    MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
    MYSQL_DATABASE: 'db2021'
    MYSQL_USER: 'zzyy'
    MYSQL_PASSWORD: 'zzyy123'
    ports:
    - "3306:3306"
    volumes:
    - /app/mysql/db:/var/lib/mysql
    - /app/mysql/conf/my.cnf:/etc/my.cnf
    - /app/mysql/init:/docker-entrypoint-initdb.d
    networks:
    - atguigu_net
    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问

    networks:
    atguigu_net:
  3. 第二次修改微服务工程docker_boot

    通过服务名访问,IP无关

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    server.port=6001

    # ========================alibaba.druid相关配置=====================
    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    #spring.datasource.url=jdbc:mysql://192.168.48.111:3306/db2021?useUnicode=true&characterEncoding=utf-8&useSSL=false
    spring.datasource.url=jdbc:mysql://mysql:3306/db2021?useUnicode=true&characterEncoding=utf-8&useSSL=false
    spring.datasource.username=root
    spring.datasource.password=123456
    spring.datasource.druid.test-while-idle=false

    # ========================redis相关配置=====================
    spring.redis.database=0
    #spring.redis.host=192.168.48.111
    spring.redis.host=redis
    spring.redis.port=6379
    spring.redis.password=
    spring.redis.lettuce.pool.max-active=8
    spring.redis.lettuce.pool.max-wait=-1ms
    spring.redis.lettuce.pool.max-idle=8
    spring.redis.lettuce.pool.min-idle=0

    # ========================mybatis相关配置===================
    mybatis.mapper-locations=classpath:mapper/*.xml
    mybatis.type-aliases-package=com.atguigu.docker.entities

    # ========================swagger=====================
    spring.swagger2.enabled=true

    Dockefile:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 基础镜像使用java
    FROM java:8
    # 作者
    MAINTAINER zzyy
    # VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
    VOLUME /tmp
    # 将jar包添加到容器中并更名为zzyy_docker.jar
    ADD docker_boot-0.0.1-SNAPSHOT.jar zzyy_docker.jar
    # 运行jar包
    RUN bash -c 'touch /zzyy_docker.jar'
    ENTRYPOINT ["java","-jar","/zzyy_docker.jar"]
    #暴露6001端口作为微服务
    EXPOSE 6001

    构建镜像:

    1
    docker build -t zzyy_docker:1.6 .
  4. 执行 docker-compose up 或者执行 docker-compose up -d

  5. 进入mysql容器实例并新建库db2021+新建表t_user

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    docker exec -it 容器实例id /bin/bash
    mysql -uroot -p
    create database db2021;
    use db2021;
    CREATE TABLE `t_user` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `username` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '用户名',
    `password` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '密码',
    `sex` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '性别 0=女 1=男 ',
    `deleted` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT '删除标志,默认0不删除,1删除',
    `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    PRIMARY KEY (`id`)
    ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

    image-20220118212024813

  6. Compose常用命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Compose常用命令
    docker-compose -h # 查看帮助
    docker-compose up # 启动所有docker-compose服务
    docker-compose up -d # 启动所有docker-compose服务并后台运行
    docker-compose down # 停止并删除容器、网络、卷、镜像。
    docker-compose exec yml里面的服务id # 进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
    docker-compose ps # 展示当前docker-compose编排过的运行的所有容器
    docker-compose top # 展示当前docker-compose编排过的容器进程

    docker-compose logs yml里面的服务id # 查看容器输出日志
    dokcer-compose config # 检查配置
    dokcer-compose config -q # 检查配置,有问题才有输出
    docker-compose restart # 重启服务
    docker-compose start # 启动服务
    docker-compose stop # 停止服务
  7. 关停

    image-20220118211918740


Docker-compose容器编排
https://flepeng.github.io/042-云原生-01-Docker-compose-Docker-compose容器编排/
作者
Lepeng
发布于
2021年3月12日
许可协议