sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Docker确实非常强大,它让我们可以快速地搭建各种软件环境。但Docker也有其瓶颈。当一个系统,依赖的软件环境特别多的时候,就需要我们手动地,拉取每一个镜像,然后按一定顺序启动一个又一个的容器,尤其是在不同的环境下(测试、生产、开发),每次都要重复这个过程,这样是很麻烦的
Docker Compose是“容器编排技术”。是Docker官方的一个开源项目。
简单来讲,就是编排好一个系统中的众多容器的启动顺序,先启动A,再启动B,在启动C。其本质就是,把需要现场手动编写的“docker run”命令,提前在docker-compse的配置文件中写好,需要时,即可一键启动所有相关的容器,方便维护。
1. 编写docker-compose.yml配置文件,建议使用idea编写,再上传给linux,因为idea有很友好的提示
version: "3.0" # 指定docker-compose的版本
- 8081:8080 # 等价于 -p 8081:8080
- /usr/tomcat/webapps:/usr/local/tomcat/webapps
2. 在docker-compose.yml文件所在目录,运行以下命令
3. 在宿主机的/usr/tomcat/webapps下,部署一个应用
注意,如果修改了项目,且又把修改以后的项目打包,然后上传到linux,进而要重新进行服务编排时,务必先删除上一次构建好的SpringBoot项目的镜像文件!
通过docker-compose启动多个容器,并测试容器之间是否能直接通信
1. 编写docker-compose.yml,注意配置了2个tomcat服务
version: "3.0" # 指定docker-compose的版本
- 8081:8080 # 等价于 -p 8081:8080
- /usr/tomcat/webapps:/usr/local/tomcat/webapps
- 8082:8080 # 等价于 -p 8082:8080
- /usr/tomcat/webapps:/usr/local/tomcat/webapps
2. 在docker-compose.yml文件所在目录,运行以下命令
4. 测试这两个tomcat之间是否能够通信,首先查看8081容器、8082容器的IP
我们发现,8081和8082通信成功了。这是因为8081和8082这两个容器,本来就在同一个网段上。
id BIGINT(20) NOT NULL COMMENT '主键ID',
NAME VARCHAR(30) DEFAULT NULL COMMENT '姓名',
gender VARCHAR(10) DEFAULT NULL COMMENT '性别',
birthday DATE DEFAULT NULL COMMENT '生日',
balance DECIMAL(10,2) DEFAULT NULL COMMENT '余额',
manager_id BIGINT(20) DEFAULT NULL COMMENT '上级',
INSERT INTO `user` (id, NAME, gender, birthday, balance, manager_id) VALUES
(1, 'Andy', '男', '1961-9-27', 3500, NULL),
(2, 'Eason', '男', '1974-7-27', 6500, 1),
(3, 'G.E.M', '女', '1991-8-16', 8000, 1),
(4, '容祖儿','女', '1980-6-16', 1500, 1),
(5, '周星驰','男', '1962-6-22', 9000, 2),
(6, '甄子丹','男', '1963-7-27', 8500, 2),
(7, '蔡徐坤','男', '1998-8-2' , 5500, 2),
(8, '王俊凯','男', '1999-9-21', 4500, 3),
(9, '关晓彤','女', '1997-9-17', 4500, 3),
(10, '唐嫣', '女', '1993-12-6', 9500, 4);
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<artifactId>mysql-connector-java</artifactId>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<!-- ====================== Mybatis-Plus代码生成器所需依赖开始 ===================== -->
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<!-- ====================== Mybatis-Plus代码生成器所需依赖结束 ===================== -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<mainClass>com.gao.App</mainClass>
<directory>src/main/java</directory>
<directory>src/main/resources</directory>
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimezone=GMT%2B8
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
public static void main(String[] args) {
AutoGenerator generator = new AutoGenerator();
GlobalConfig globalConfig = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
globalConfig.setOutputDir(projectPath + "\\src\\main\\java");
globalConfig.setAuthor("Gapper");
globalConfig.setOpen(false); // 生成后是否打开资源管理器
globalConfig.setFileOverride(false); // 重新生成文件时,是否覆盖旧文件
// globalConfig.setServiceName("%sService"); // 去掉Service接口的首字母"I"
globalConfig.setIdType(IdType.ASSIGN_ID); // 设置主键生成策略
globalConfig.setDateType(DateType.ONLY_DATE); // 定义生成的实体类中日期的类型
globalConfig.setSwagger2(false); // 开启Swagger2模式
generator.setGlobalConfig(globalConfig);
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8");
dsc.setDriverName("com.mysql.jdbc.Driver");
PackageConfig pc = new PackageConfig();
// pc.setModuleName("mp"); // 设置模块名
pc.setController("controller");
pc.setMapper("mapper"); // 设置Mapper接口的位置
pc.setXml("mapper"); // 设置Mapper.xml的位置
StrategyConfig sc = new StrategyConfig();
sc.setInclude("user"); // 指定表名
sc.setNaming(NamingStrategy.underline_to_camel); // 数据库表映射到实体的命名策略
sc.setTablePrefix(pc.getModuleName() + "_");
sc.setColumnNaming(NamingStrategy.underline_to_camel); // 数据库表字段映射到实体的命名策略
sc.setEntityLombokModel(true);
sc.setRestControllerStyle(true); // restful api风格控制器
sc.setControllerMappingHyphenStyle(true); // url中驼峰转连字符
private IUserService userService;
public String save(@RequestBody User user) {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
使用Docker Compose部署SpringBoot项目
为了完成Docker Compose部署SpringBoot项目的例子,我们需要准备3个文件:
B. SpringBoot项目打出的jar包(记得指定主类的位置,还要指定xml和yml会被构建出来)
把这个三个文件上传到linux,但凡操作过程中,修改了SpringBoot项目,又重新打包上传到linux时,一定要把SpringBoot项目原来的镜像删除,这样才能在又一次执行“docker-compose up”命令的时候,重新根据新的jar包生成新的镜像!
1. springboot项目,如何才能知道mysql容器的ip地址呢?如下:
3. 编写Docker Compose文件:docker-compose.yml
--default-authentication-plugin=mysql_native_password
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
build: ./ # 用于构建springboot项目镜像的Dockerfile文件的路径,该文件的名字必须为Dockerfile
depends_on: # 前置服务,当mysql服务启动好之后,才启动当前服务
4. 编写Dockerfile文件,该文件的名字必须是"Dockerfile" f必须小写!
COPY docker-test-1.0-SNAPSHOT.jar docker-test-1.0-SNAPSHOT.jar
ENTRYPOINT ["java","-jar","docker-test-1.0-SNAPSHOT.jar"]
5. 将jar包、Docker Compose文件、DockerFile文件,都上传到linux,必须保证它们都在同一个目录下:
它会按照docker-compose.yml中所编排的顺序,进行执行,也就是先启动mysql容器,再构建docker-test镜像,并且启动docker-test容器,最终可以看到以下界面:
可以看到有两个服务,第一个是SpringBoot服务,第二个是mysql服务。
查看SpringBoot项目控制台,发现是MySQL中没有对应的user表:
如果此时使用的不是Mybatis-plus框架,而是Hibernate或者Spring-data-jpa的话,则表会被自动创建出来的。
9. 进入MySQL容器,通过命令行进入链接MySQL服务,并创建User表:
这是编码问题,修改user表中name列、gender列的编码即可
ALTER TABLE `user` MODIFY name VARCHAR(20) CHARACTER SET "utf8";
ALTER TABLE `user` MODIFY gender VARCHAR(20) CHARACTER SET "utf8";
标签:compose,Compose,mysql,Docker,com,docker From: https://www.cnblogs.com/qiutian888/p/18278738