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使用的三个步骤:
- 编写 Dockerfile 定义各个应用容器,并构建出对应的镜像文件
- 编写
docker-compose.yml
,定义一个完整的业务单元,安排好整体应用中的各个容器服务 - 执行
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-c
创建docker-compse.yml核心,参考
version: '' # 版本 servers: # 服务 服务1: web # 服务的配置 build network images 服务2: redis 服务3: 服务4: ... # 其他配置 网络,全局的规则 数据卷 volumes: configs: networks:
五、docker-c
- 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/,显示查看请求正常,如下: