6、Docker-compose容器编排

时间:2021-02-05 01:06:32

一、是什么

Docker-Compose是docker官方的开源项目,负责实现对Docker容器集群的快速编排。
Compose是Docker公司推出的一个工具软件,可以管理多个Docker容器组成一个应用。你需要定义一个YAML格式的配置文件docker-compose.yml,写了好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器。

6、Docker-compose容器编排

二、能干什么

docker建议我们每一个容器中只运行一个服务,因为docker容器中本身占用的资源极少,所以最好是将每个服务单独分割开来,但是这样我们又面临一个问题?
如果我们需要同时部署好多个服务,难道每个服务都要单独写Dockerfile然后再构建镜像,构建容器吗,这样都累死了,所以docker官方给我们提供了docker-compose多服务部署工具
例如要实现一个web微服务项目除了web服务容器本身,往往还需要再加上后端的数据库mysql服务容器,redis服务容器,注册中心eureka,甚至还包括负载均衡容器等等。。。。。。
Compose允许用户通过一个单独的docker-compose.yml模板文件来定义一组相关联的应用容器为一个项目
可以很容易的用一个配置文件定义多个容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-compose解决了容器与容器之间如何管理编排的问题。

三、从哪下载

https://docs.docker.com/compose/install/

安装步骤

1、curl -SL https://github.com/docker/compose/releases/download/v2.17.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
2、chmod +x /usr/local/bin/docker-compose
3、docker-compose --version

6、Docker-compose容器编排卸载步骤

rm /usr/local/bin/docker-compose

四、Compose核心概念

一个文件

docker-compose.yml

两个要素

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

五、Compose使用的三个步骤

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

六、Compose常用命令

docker-compose -h :查看帮助
docker-compose up:启动所有docker-compose服务
docker-compose up -d:启动所有docker-compose服务并后台运行
docker-compose down:停止并删除容器、网络、卷、镜像
docker-compose exec 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:停止服务 

七、Compose编排微服务

1、改造升级微服务工程docker_boot(https://blog.51cto.com/u_15410237/6145668)

我们依据一个docker微服务小项目(https://blog.51cto.com/u_15410237/6145668)来做改造升级,
以前的基础版如下:

6、Docker-compose容器编排

1、创建一个mysql容器:
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
进入mysql容器:
docker exec -it 容器id /bin/bash
mysql -uroot -p
创建一个表空间
create databases db2023;
进入表空间:
use db2023;
创建表:
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='用户表';
2、创建一个redis容器:
docker run -p 6379:6379 --name myr1 --privileged=true -v /app/redis/redis.conf:/usr/local/redis/redis.conf -v /app/redis/data:/data -d redis:6.0.8 redis-server /usr/local/redis/redis.conf
进入redis容器
redis-cli
创建redis密码
config set requirepass 123456
3、构建服务镜像:
将本地打好的jar包放入linux下面
新建一个Dockerfile文件写入下面内容
构建镜像:
docker build -t lori_docker:1.6 .

Dockerfile

# 基础镜像使用java
FROM java:8

# 作者
MAINTAINER lori

# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp

# 将jar包添加到容器中并更名为lori_docker.jar
ADD docker_boot1-0.0.1-SNAPSHOT.jar lori_docker.jar

# 运行jar包
RUN bash -c 'touch /lori_docker.jar'
ENTRYPOINT ["java","-jar","/lori_docker.jar"]

#暴露6001端口作为微服务
EXPOSE 6001

6、Docker-compose容器编排6、Docker-compose容器编排6、Docker-compose容器编排6、Docker-compose容器编排6、Docker-compose容器编排6、Docker-compose容器编排

2、不用docker-compose,swagger测试

访问服务器下的服务:
http://服务器IP:服务端口号/swagger-ui.html#/

6、Docker-compose容器编排

我们查询一下mysql容器里的数据库,发现有了新增的数据

6、Docker-compose容器编排

我们再来查询redis,也发现有对应的数据

6、Docker-compose容器编排

3、上面的例子会面临哪些问题

1、先后顺序要求固定,先mysql+redis才能微服务访问成功
2、多个run命令
3、容器间的停起或者宕机,有可能导致ip地址对应的容器实例发生变化,映射出错,要么生产IP写死,要么通过服务名调用

4、使用docker-compose

编写docker-compose.yml文件

version: "3"

services:
  microService:
    image: lori_docker:1.8
    container_name: ms01
    ports:
      - "6001:6001"
    volumes:
      - /app/microService:/data
    networks: 
      - lori_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: 
      - lori_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: 'db2023'
      MYSQL_USER: 'lori'
      MYSQL_PASSWORD: 'lori123'
    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:
      - lori_net
    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问

networks: 
   lori_net: 

在包的同级目录下创建docker-compose.yml文件

6、Docker-compose容器编排

把之前服务配置文件中固定写死的mysql和redis的ip换成容器名 6、Docker-compose容器编排6、Docker-compose容器编排

将java项目打包后上传到服务器上 6、Docker-compose容器编排

构建容器

docker build -t lori_docker:1.8 .

6、Docker-compose容器编排

检查配置文件是否有问题,没有任何返回代表没问题
docker-compose config -q