您的位置:首页 > 房产 > 建筑 > 06Docker-Compose和微服务部署

06Docker-Compose和微服务部署

2024/12/23 8:45:10 来源:https://blog.csdn.net/qq_57005976/article/details/139484688  浏览:    关键词:06Docker-Compose和微服务部署

Docker-Compose

概述

Docker Compose通过一个单独的docker-compose.yml模板文件来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署

  • 一般一个docker-compose.yml对应完整的项目,项目中的服务和中间件对应不同的容器
    在这里插入图片描述

Compose文件实质就是集成了多个docker run命令,只是语法变成通过指令定义集群中的每个容器运行时的参数信息

docker run 参数docker compose 指令说明
–namecontainer_name容器名称
-pports端口映射
-eenvironment环境变量
-vvolumes数据卷配置
–networknetworks网络
-d不需要指定, 默认就是后台运行运行方式
EXPOSE在微服务集群部署中,像MySQL和Reids等中间件仅仅是供给给集群内的服务使用的,所以不需要对外暴露端口暴露端口
在这里插入图片描述

安装DockerCompose

在Linux中使用命令去github下载DockerCompose安装包并修改文件权限(下载速度可能较慢),可以自己在浏览器中下载安装包上传到/usr/local/bin目录

# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 修改文件权限
chmod +x /usr/local/bin/docker-compose
# 检测docker-compose是否安装成功
docker-compose

设置DockerCompose自动补全功能,如果出现错误Failed connect to raw.githubusercontent.com:443; Connection refused就修改hosts文件

# 自动补全的命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
# 出现错误后需要修改自己的hosts文件(重启一下网络systemctl start network),再配置自动补全的命令
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
# 如出现TCP connection reset by peer错误需要重复发起命令多试几次

DockerCompose命令

docker compose [OPTIONS] [COMMAND]: OPTIONS和COMMAND都是可选参数,常见命令参考官方文档

类型参数或指令说明
Options-f指定compose文件的路径和名称,如果文件在当前目录且名称为docker-compose.yml则不用指定
-p指定project名称, project就是当前compose文件中设置的多个service的集合
Commandsup创建并启动所有service容器
down停止并移除所有容器、网络
ps列出所有启动的容器
logs查看指定容器的日志
stop停止容器
start启动容器
restart重启容器
top查看运行的进程
exec在指定的运行中容器中执行命令

部署微服务集群

单体项目部署

基于docker-compose.yml文件一键部署项目

# 1.进入root目录
cd /root# 2.删除旧容器
docker rm -f $(docker ps -qa)# 3.删除hmall镜像
docker rmi hmall# 4.清空MySQL数据
rm -rf mysql/data# 5.启动所有, -d参数是后台启动
docker compose up -d
# 结果:
[+] Building 15.5s (8/8) FINISHED=> [internal] load build definition from Dockerfile                                    0.0s=> => transferring dockerfile: 358B                                                    0.0s=> [internal] load .dockerignore                                                       0.0s=> => transferring context: 2B                                                         0.0s=> [internal] load metadata for docker.io/library/openjdk:11.0-jre-buster             15.4s=> [1/3] FROM docker.io/library/openjdk:11.0-jre-buster@sha256:3546a17e6fb4ff4fa681c3  0.0s=> [internal] load build context                                                       0.0s=> => transferring context: 98B                                                        0.0s=> CACHED [2/3] RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo   0.0s=> CACHED [3/3] COPY hm-service.jar /app.jar                                           0.0s=> exporting to image                                                                  0.0s=> => exporting layers                                                                 0.0s=> => writing image sha256:32eebee16acde22550232f2eb80c69d2ce813ed099640e4cfed2193f71  0.0s=> => naming to docker.io/library/root-hmall                                           0.0s
[+] Running 4/4✔ Network hmall    Created                                                             0.2s✔ Container mysql  Started                                                             0.5s✔ Container hmall  Started                                                             0.9s✔ Container nginx  Started                                                             1.5s# 6.查看镜像
docker compose images
# 结果
CONTAINER           REPOSITORY          TAG                 IMAGE ID            SIZE
hmall               root-hmall          latest              32eebee16acd        362MB
mysql               mysql               latest              3218b38490ce        516MB
nginx               nginx               latest              605c77e624dd        141MB# 7.查看容器
docker compose ps
# 结果
NAME                IMAGE               COMMAND                  SERVICE             CREATED             STATUS              PORTS
hmall               root-hmall          "java -jar /app.jar"     hmall               54 seconds ago      Up 52 seconds       0.0.0.0:8080->8080/tcp, :::8080->8080/tcp
mysql               mysql               "docker-entrypoint.s…"   mysql               54 seconds ago      Up 53 seconds       0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
nginx               nginx               "/docker-entrypoint.…"   nginx               54 seconds ago      Up 52 seconds       80/tcp, 0.0.0.0:18080-18081->18080-18081/tcp, :::18080-18081->18080-18081/tcp

定义docker-compose.yml文件指定要创建的容器

version: "3.8"services:mysql: # 创建mysql容器的参数信息image: mysql# 镜像名称container_name: mysql# 容器名称ports:# 端口映射- "3306:3306"environment:# 环境变量TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123volumes:# 数据卷挂载- "./mysql/conf:/etc/mysql/conf.d"- "./mysql/data:/var/lib/mysql"- "./mysql/init:/docker-entrypoint-initdb.d"networks:- hm-nethmall: # 创建Java应用容器的参数信息build: # 基于Dockerfile文件构建自定义镜像context: .dockerfile: Dockerfilecontainer_name: hmallports:- "8080:8080"networks:- hm-netdepends_on: # 依赖容器,创建容器时会先创建依赖的容器- mysqlnginx:image: nginxcontainer_name: nginxports:- "18080:18080"- "18081:18081"volumes:- "./nginx/nginx.conf:/etc/nginx/nginx.conf"- "./nginx/html:/etc/nginx/html"depends_on:- hmall # 前端依赖后端networks:- hm-net
networks: # 需要创建的网络hm-net:name: hmall

微服务部署步骤

第一步: 在cloud-demo项目中编写docker-compose文件构建镜像并运行容器

version: "3.2"
services:nacos: # 注册中心和配置中心image: nacos/nacos-server # 基于nacos/nacos-server镜像构建environment: # 环境变量MDOE: standalone # 单点模式启动ports: # 端口映射,暴露了8848端口- "8848:8848"mysql:image: mysql:5.7.25 # 基于5.7.25版本的MySQL镜像构建environment:MYSQL_ROOT_PASSWORD: 123456 # 设置数据库root账户的密码volumes: # 数据卷挂载,这里挂载了mysql的data和conf目录- "$PWD/mysql/data:/var/lib/mysql"  # $PWD用于获取当前文件所在的目录- "$PWD/mysql/conf:/etc/mysql/conf.d"# 微服务不需要暴露端口,如果暴露了端口网关的身份认证和权限校验就形同虚设了userservice: # 基于Dockerfile文件临时构建build: ./user-service orderservice: # 基于Dockerfile文件临时构建build: ./order-service# 网关需要暴露端口,它是其他微服务的入口gateway: # 基于Dockerfile文件临时构建build: ./gatewayports:- "10010:10010"

第二步: 使用Docker Compose部署时, 所有的服务之间都可以用服务名互相访问,那么就可以修改cloud-demo项目中所有服务的yml配置文件

  • 将数据库,nacos地址URL中的localhost重命名为docker-compose中的服务名
spring:cloud:nacos:# server-addr: localhost:80 #Nacos地址server-addr: nacos:8848 # 使用compose中的服务名来互相访问,用nacos替换localhostconfig:file-extension: yaml # 文件后缀名

第三步: 使用maven打包工具, 在每一个服务的pom.xml文件指定将微服务打包为app.jar(打包名需要与Dockerfile文件中一致)

<build><!--指定服务打包的最终名称--><finalName>app</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

第四步: 将打包好的app.jar和Dockerfile构建镜像文件拷贝到cloud-demo目录中对应的gateway, order-service, user-service子目录中

FROM openjdk:8
COPY ./app.jar /tmp/app.jar
ENTERPOINT java -jar /tmp/app.jar

第五步: 将cloud-demo项目文件夹上传至虚拟机得到最终的目录结构

cloud-demo
- gateway- app.jar- Dockerfile.yml
- order-service- app.jar- Dockerfile.yml
- user-service- app.jar- Dockerfile.yml
- mysql- data- conf
- docker-compose.yml

第六步: 执行docker-compose up -d命令部署项目,docker-compose logs -f查看日志

  • nacos连接失败是由于nacos启动较慢,userservice在nacos之前启动会导致userservice注册失败
# 后台创建镜像部署容器
docker-compose up -d# 查看日志发现阿里巴巴nacos连接失败
docker-compose logs -f
com.alibaba.nacos.api.exception.NacosException: failed to req API:/nacos/v1/ns/instance/list after all servers([nacos:8848]) tried: java.net.ConnectException: Connection refused (Connection refused)# 建议nacos单独先启动其他服务后启动,此时可以重启gateway userservice orderservice服务
docker-compose restart gateway userservice orderserivce # 再次查看查看userservice启动日志
docker-compose logs -f userservice

第七步: 打开浏览器访问http://虚拟机IP地址/user/1?authorization=admin查看数据
在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com