Docker-compose容器编排

一、docker-compose

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

Docker-Compose可以管理多个Docker容器组成一个应用。需要定义一个yaml格式的配置文件 docker-compose.yml,配置好多个容器之间的调用关系,然后只需要一个命令就能同时启动/关闭这些容器。

Docker建议我们每个容器中只运行一个服务,因为Docker容器本身占用资源极少,所以最好是将每个服务单独的分割开来。但是如果我们需要同时部署多个服务,每个服务单独构建镜像构建容器就会比较麻烦。所以 Docker 官方推出了 docker-compose 多服务部署的工具。

Compose允许用户通过一个单独的 docker-compose.yml 模板文件来定义一组相关联的应用容器为一个项目(project)。可以很容易的用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。

核心概念:

  • 服务(service):一个个应用容器实例
  • 工程(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml中定义

Compose使用的三个步骤:

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

二、安装docker-compose

Docker-Compose的版本需要和Docker引擎版本对应,可以参照官网上的对应关系。https://docs.docker.com/compose/compose-file/compose-file-v3/

安装Compose,可以参考官网:https://docs.docker.com/compose/install/standalone/

 上面的命令下载docker-compose后,需要添加执行权限,然后才可以使用

# 例如从github下载 2.23.3 版本的docker-compose
# 下载下来的文件放到 /usr/local/bin目录下,命名为 docker-compose
curl -SL https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

# 如果GitHub下载速度比较慢的话使用下面的地址:
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 添加权限 chmod +x /usr/local/bin/docker-compose # 验证 docker-compose version

卸载Compose:直接删除 usr/local/bin/docker-compose文件即可

三、docker-compose常用命令

执行命令时,需要在对应的docker-compose.yml文件所在目录下执行。查看帮助:

docker-compose -h

创建并启动docker-compose服务:(类似 docker run)

docker-compose up
# 后台运行
docker-compose up -d

停止并删除容器、网络、卷、镜像:(类似 docker stop +  docker rm)

docker-compose down

进入容器实例内部:

docker-compose exec <yml里面的服务id> /bin/bash

展示当前docker-compose编排过的运行的所有容器:

docker-compose ps

展示当前docker-compose编排过的容器进程:

docker-compose top

查看容器输出日志:

docker-compose log <yml里面的服务id>

检查配置:

docker-compose config
# 有问题才输出
docker-compose config -q

重启服务:

docker-compose restart

启动服务:(类似 docker start)

docker-compose start

停止服务:

docker-compose stop

四、docker-compose配置规则

创建docker-compse.yml核心,参考官网地址:https://docs.docker.com/compose/compose-file/compose-file-v3/

version: '' # 版本
servers:  # 服务
  服务1: web
     # 服务的配置
     build
     network
     images
  服务2: redis
  服务3:
  服务4:
  ...
# 其他配置 网络,全局的规则 数据卷
volumes:
configs:
networks:

五、docker-compose案例

以部署优步旅游项目为例进行容器编排案例演示,这个项目需要使用的中间件

  • tomcat
  • MySQL
  • elasticsearch
  • kibana
  • RabbitMQ

5.1.将项目打成jar包

这里由于后期微服务项目部署都是jar包的形式,这里需要设置jar包中项目的连接MySQL、elasticsearh和rabbitmq都需要通过编排后的容器名来使用,这里提前规划好容器名,如下:

  • mysql
  • es
  • myrabbitmq

1)在application.yaml中设置rabbitmq和mysql通过容器名来访问

2)设置elasticsearch通过容器名访问

3)这个项目的前端是vue实现了,需要设置后端的地址,这里需要在index.html中修改,ip就写你的部署的Linux主机的ip,端口就是项目application.yaml中设置的端口

4)打成jar包

5.2.利用java包构建基础镜像

在根目录创建/myfile,将打好的jar包上传到此目录下面,利用java:8镜像编写Dockerfile内容如下:

# java:8完成
FROM java:8
# 作者
MAINTAINER Augus<Auguses@126.com>

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

#将jar包添加到容器中并更名为augus_docker.jar
ADD hotel-demo-0.0.1-SNAPSHOT.jar hotel_docker.jar

#运行jar包
ENTRYPOINT ["java","-jar", "hotel_docker.jar"]
#暴露8089端口作为微服务
EXPOSE 8089

这里需要将之前的jar包添加到镜像中,然后进行镜像的生成如下:

docker build -t hotel:1 .

执行如下:

执行后查看镜像是否生成如下:

5.3.docker-compose实现容器编排

这里利用上一步制作的镜像实现,在/myfile包下创建:docker-compose.yml 内容如下:

# docker-compose文件版本号
version: "3"

# 配置各个容器服务
services:
  hotelService:
    image: hotel:1
    container_name: hs  # 容器名称,如果不指定,会生成一个服务名加上前缀的容器名
    ports:
      - "8089:8089"
    volumes:
      - /app/hotelService:/data
    networks:
      - hotel_network
    depends_on:  # 配置该容器服务所依赖的容器服务
      - rabbitmq
      - elasticsearch
      - kibana
      - mysql

  rabbitmq:
    image: rabbitmq:3.12-management
    container_name: myrabbitmq
    ports:
      - "5672:5672"
      - "15672:15672"
    networks:
      - hotel_network

  elasticsearch:
    image: elasticsearch:7.17.5
    container_name: es
    restart: always
    volumes: # 数据卷挂载路径设置,将本机目录映射到容器目录
      - /app/elasticsearch/data:/usr/share/elasticsearch/data
      - /app/elasticsearch/logs:/usr/share/elasticsearch/logs
      - /app/elasticsearch/plugins:/usr/share/elasticsearch/plugins
    ports:
      - 9200:9200
      - 9300:9300
    environment:
      # 修改jvm内存
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      # 指定单节点启动
      - discovery.type=single-node
    networks:
      - hotel_network

  kibana:
    image: kibana:7.17.5
    container_name: kibana
    restart: always
    ports:
      - 5601:5601
    environment:
      - ELASTICSEARCH_HOSTS=http://es:9200
    networks:
      - hotel_network

  mysql:
    image: mysql:5.7
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: '123456'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
      MYSQL_DATABASE: 'mydb'
      MYSQL_USER: 'springboot'
      MYSQL_PASSWORD: 'springboot'
    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:
      - hotel_network
    command: --default-authentication-plugin=mysql_native_password # 解决外部无法访问

networks:
  # 创建 hotel_network 网桥网络
  hotel_network:

编写完成docker-compose.yml后,进行语法检查:

# 进行语法检查
docker-compose config -q

如果语法检查没有任何问题,进行创建、启动:

docker-compose up -d

执行后如下:

生成容器后需要将上面的端口设置允许访问,参考如下:

# 查询端口是否开放
firewall-cmd --query-port=8080/tcp
# 开放80端口
firewall-cmd --permanent --add-port=3306/tcp

#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload

5.4.基础数据准备

1)在MySQL中创建库mydb,然后导入tb_hotel.sql中的数据信息,导入如下:

2)给elasticsearch安装ik和拼音分词器

根据上面的docker-compose文件中elasticsearch容器构建中得到,容器的插件路径映射到本地:/app/elasticsearch/plugins,进入后分别创建两个目录

# 创建路径,将ik分词器的安装包放入该目录
mkdir analysis-ik
# 创建路径,将拼音分词器的安装包放入该目录
mkdir py

然后分别进入目录。对安装包进行进行解压后如下:

注意:需要重启一下elasticsearch容器

3)利用kibana创建索引库

创建索引库如下:

DELETE /hotel

# 创建索引库
PUT /hotel
{
  "mappings": {
    "properties": {
      "id":{
        "type": "keyword"
      },
      "name":{
        "type": "text",
        "analyzer": "ik_max_word",
        "copy_to": "{all}"
      },
      "address":{
        "type": "keyword",
        "index": false
      },
      "price":{
        "type": "integer"
      },
      "score":{
        "type": "integer"
      },
      "brand":{
        "type": "keyword",
        "copy_to": "{all}"
      },
      "city":{
        "type": "keyword"
      },
      "starName":{
        "type": "keyword"
      },
      "business":{
        "type": "keyword",
        "copy_to": "{all}"
      },
      "location":{
        "type": "geo_point"
      },
      "pic":{
        "type": "keyword",
        "index": false
      },
      "all":{
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }
}

4)给索引库中导入数据,这里就需要利用之前编写的测试代码完成,就是将MySQL中tb_hotel表中的数据读入到索引库

在测试类:HotelDemoApplicationTests.java,方法如下:

    @Test
    void some1() throws IOException {
        List<Hotel> hotels = service.list();
        System.out.println(hotels);
        BulkRequest request=new BulkRequest();
        for (Hotel hotel : hotels) {
            HotelDoc doc=new HotelDoc(hotel);
            request.add(new IndexRequest("hotel").id(hotel.getId().toString()).source(JSON.toJSONString(doc),XContentType.JSON));
        }
        client.bulk(request,RequestOptions.DEFAULT);
    }

5)测试访问rabbitmq,保证rabbitmq可以访问,如下

访问地址:http://192.168.42.129:15672/#/

5.5.测试访问

在浏览器访问项目地址:http://192.168.42.129:8089/,显示查看请求正常,如下:

posted @ 2023-11-29 15:37  酒剑仙*  阅读(160)  评论(0)    收藏  举报