# docker_springcloudalibaba_docker_compose **Repository Path**: xiyg_admin/docker_springcloudalibaba_docker_compose ## Basic Information - **Project Name**: docker_springcloudalibaba_docker_compose - **Description**: Docker搭建部署SpringCloud微服务项目 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-03-19 - **Last Updated**: 2024-03-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: Docker, SpringCloud, docker-compose, DockFile, Linux ## README # docker_springcloudalibaba_docker_compose - [docker教程](https://zhuanlan.zhihu.com/p/442442997) - [docker-compose教程](https://blog.csdn.net/pushiqiang/article/details/78682323) - [dockerFile文件编写](https://blog.csdn.net/dongdong9223/article/details/83059265) - [docker-compose编排文件编写](https://blog.csdn.net/dongdong9223/article/details/83059265) - [【idea使用Maven插件 docker插件进行部署】](https://blog.csdn.net/weixin_42173451/article/details/120974734) - [ 【idea不通过maven插件,通过docker插件部署】](https://xinchen.blog.csdn.net/article/details/100051325) ![输入图片说明](images/content.png) #### 介绍 Docker搭建部署SpringCloud微服务项目 技术选型:SpringCloud&SpringCloud Alibaba&Docker 微服务模块划分: ``` 员工模块:ems-employees 部门模块:ems-departments 网关模块:ems-gateway 公共模块:ems-commons ``` 文件结构 ![输入图片说明](images/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202024-03-20%20120250.png) 其他环境: - 自己另外在另一台电脑上搭建用vmware虚拟机,装linux系统,linux被外部电脑访问需设置网络为桥接模式。 - Mysql8.0+、nacos1.3+、JDK1.8 前置准备知识: `SpringCloud、SpringCloud alibaba、Docker、Docker-Compose、Dockerfile` 数据库结构: 一个部门表和一个员工表,员工表里面有个部门ID和部门表主键相关联 数据库sql脚本 ``` use ems SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for department -- ---------------------------- DROP TABLE IF EXISTS `department`; CREATE TABLE `department` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(80) DEFAULT NULL COMMENT '部门名称', `created_at` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Table structure for employee -- ---------------------------- DROP TABLE IF EXISTS `employee`; CREATE TABLE `employee` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(40) DEFAULT NULL, `birthday` datetime DEFAULT NULL COMMENT '生日', `salary` double(10,2) DEFAULT NULL COMMENT '工资', `department_id` int(11) DEFAULT NULL COMMENT '部门信息', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; SET FOREIGN_KEY_CHECKS = 1; ``` #### 部署流程# - 先在服务器安装Docker,然后在Docker中安装mysql、nacos镜像,并启动容器 - 在员工、部门等微服务模块中指定nacos注册中心地址,使服务注册进去 - 把springcloud微服务模块打包成jar包上传至服务器,然后通过Dockerfile构建成镜像 - 最后通过docker-compose构建编排项目,将这些微服务镜像打包成一整个项目并启动 #### 环境搭建# 1.Centos7.X安装Docker 网上操作教程很多,略 2.Docker安装mysql、nacos镜像 2.1 安装mysql 1、没有指定版本一般安装的都是最新的8.0+ `docker pull mysql` 2、docker启动mysql,简单演示就没有创建数据卷了 ``` docker run --name=mysql01 -it -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql ``` 3、启动成功 ``` 启动成功 ``` 4、进入mysql容器 `docker exec -it mysql01 /bin/bash` 5、登陆mysql `mysql -u root -p` 6、授权所有用户可以登录 `GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION;` 7、刷新权限   ``` FLUSH PRIVILEGES; ``` 8、使用客户端连接(使用navicat工具测试连接) 2.2 安装nacos ``` docker pull nacos/nacos-server:1.3.0 ``` 1、运行nacos ``` docker run --name nacos-quick -e MODE=standalone -p 8848:8848 -d nacos/nacos-server:1.3.0 ``` 2、查看nacos运行日志 ``` docker logs -f b1aacab47d2a ``` 3.访问注册中心 ``` http://IP:8848/nacos 账户名密码均为nacos ``` #### 3.搭建SpringCloud微服务模块 [具体搭建教程详见https://www.cnblogs.com/cg-ww/p/15761545.html](https://www.cnblogs.com/cg-ww/p/15761545.html) #### 4.编写Dockerfile docker中需要有JDK1.8的镜像,安装JDK `docker pull openjdk:8` 在idea中编写员工模块Dockerfile ``` FROM openjdk:8 ENV APP_HOME=/apps WORKDIR $APP_HOME COPY ./ems-employess-1.0-SNAPSHOT.jar ./employess.jar EXPOSE 8086 ENTRYPOINT ["java","-jar"] CMD ["employess.jar"] ``` 部门模块Dockerfile ``` FROM openjdk:8 ENV APP_HOME=/apps WORKDIR $APP_HOME COPY ./ems-departments-0.0.1-SNAPSHOT.jar ./departments.jar EXPOSE 8085 ENTRYPOINT ["java","-jar"] CMD ["departments.jar"] ``` 网关模块Dockerfile ``` FROM openjdk:8 ENV APP_HOME=/apps WORKDIR $APP_HOME COPY ./ems-gateway-1.0-SNAPSHOT.jar ./gateway.jar EXPOSE 8888 ENTRYPOINT ["java","-jar"] CMD ["gateway.jar"] ``` 然后在idea 中登录docker所在服务器 [具体连接教程详见https://blog.csdn.net/cnds123321/article/details/121945088](https://blog.csdn.net/cnds123321/article/details/121945088) [上传文件到linux具体详见https://blog.csdn.net/seashouwang/article/details/122041213](https://blog.csdn.net/seashouwang/article/details/122041213) 3.Dockerfile文件上传 然后把项目的文件上传到服务自己建的ems文件夹中 ![输入图片说明](images/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202024-03-20%20114927.png) 4.编写docker-compose.yml 直接利用dockerfile文件的路径打包成镜像,最后编排运行 ``` version: "3.1" networks: ems: volumes: data: services: employee: build: context: ./employee dockerfile: Dockerfile ports: - "8085:8085" networks: - ems department: build: context: ./department dockerfile: Dockerfile ports: - "8086:8086" networks: - ems gateway: build: context: ./gateway dockerfile: Dockerfile ports: - "8888:8888" networks: - ems nacos: image: nacos/nacos-server:1.3.1 ports: - "8848:8848" environment: - "MODE=standalone" networks: - ems mysql: image: mysql ports: - "3306:3306" #只写一个端口随机使用宿主机一个端口进行容器端口映射 environment: - "MYSQL_ROOT_PASSWORD=root" - "MYSQL_DATABASE=ems" volumes: - data:/var/lib/mysql #- ./ems.sql:/docker-entrypoint-initdb.d/ems.sql networks: - ems ``` 5.项目启动 在服务器ems文件夹中输入 `docker-compose up -d department` `docker-compose up -d employee` `docker-compose up -d gateway` 6.测试 ![输入图片说明](images/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202024-03-20%20115210.png) #### 总结# 还有很多可以优化的地方,因为本节是着重演示部署流程,细节方面就没有优化了 遇到的解决的问题: - gateway网关配置成功,但访问报错:spring-boot-starter-parent与spring-cloud-alibaba版本不一致造成。 - 执行 docker-compose up 提示命令找不到:是因为安装docker是默认没有安装docker-compose编排,需要自己在linux上安装。[安装参考https://blog.csdn.net/sinat_17358633/article/details/128764036](https://blog.csdn.net/sinat_17358633/article/details/128764036) - 不需要打包的不配置maven插件 - linux连接sftp失败,需要在linux安装ftp工具 这就是一整个部署的大概流程,但每次项目代码如果有更改,又需要手动重新生成镜像然后在服务器重新运行,还是不太方便,后续会出Jenkins+Docker自动化部署SpringCloud,实现代码提交自动进行编译打包上传并部署,简化在部署方面的操作。