首页 > 其他分享 >5. Docker Compose

5. Docker Compose

时间:2024-07-01 20:10:14浏览次数:20  
标签:compose Compose mysql Docker com docker

Docker Compose安装

先安装Docker Compose

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

为docker-compose添加可执行权限

sudo chmod +x /usr/local/bin/docker-compose

测试安装是否成功

docker compose version

问题

Docker确实非常强大,它让我们可以快速地搭建各种软件环境。但Docker也有其瓶颈。当一个系统,依赖的软件环境特别多的时候,就需要我们手动地,拉取每一个镜像,然后按一定顺序启动一个又一个的容器,尤其是在不同的环境下(测试、生产、开发),每次都要重复这个过程,这样是很麻烦的

截图.png

Docker Compose是什么

Docker Compose是“容器编排技术”。是Docker官方的一个开源项目。

Docker Compose有什么用

简单来讲,就是编排好一个系统中的众多容器的启动顺序,先启动A,再启动B,在启动C。其本质就是,把需要现场手动编写的“docker run”命令,提前在docker-compse的配置文件中写好,需要时,即可一键启动所有相关的容器,方便维护。

Docker Compose三大概念

☐ 工程

☐ 容器

☐ 服务

Docker Compose快速起步

通过docker-compose启动一个tomcat容器

1. 编写docker-compose.yml配置文件,建议使用idea编写,再上传给linux,因为idea有很友好的提示

version: "3.0" # 指定docker-compose的版本

services: # 服务

tomcat8081: # 服务名称

image: tomcat:9 # 镜像

ports:

- 8081:8080 # 等价于 -p 8081:8080

volumes: # 数据卷

- /usr/tomcat/webapps:/usr/local/tomcat/webapps

2. 在docker-compose.yml文件所在目录,运行以下命令

docker compose up

3. 在宿主机的/usr/tomcat/webapps下,部署一个应用

截图.png

4. 访问

截图.png

注意,如果修改了项目,且又把修改以后的项目打包,然后上传到linux,进而要重新进行服务编排时,务必先删除上一次构建好的SpringBoot项目的镜像文件!

Docker Compose启动多个容器

通过docker-compose启动多个容器,并测试容器之间是否能直接通信

1. 编写docker-compose.yml,注意配置了2个tomcat服务

version: "3.0" # 指定docker-compose的版本

services: # 服务

tomcat8081: # 服务名称

image: tomcat:8 # 镜像

ports:

- 8081:8080 # 等价于 -p 8081:8080

volumes: # 数据卷

- /usr/tomcat/webapps:/usr/local/tomcat/webapps

tomcat8082: # 服务名称

image: tomcat:8 # 镜像

ports:

- 8082:8080 # 等价于 -p 8082:8080

volumes: # 数据卷

- /usr/tomcat/webapps:/usr/local/tomcat/webapps

2. 在docker-compose.yml文件所在目录,运行以下命令

docker compose up

截图.png

3. 访问8081、8082

截图.png

截图.png

4. 测试这两个tomcat之间是否能够通信,首先查看8081容器、8082容器的IP

截图.png

接着,进入8081容器,向8082容器发送一个请求:

curl 172.18.0.3:8080

截图.png

我们发现,8081和8082通信成功了。这是因为8081和8082这两个容器,本来就在同一个网段上。

5. 查看docker网络

docker network ls

截图.png

Docker Compose部署应用

截图.png

开发一个简单的SpringBoot项目

1. 创建表

DROP DATABASE IF EXISTS test;

CREATE DATABASE test;

USE test;

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user`

(

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 '上级',

PRIMARY KEY (id)

)CHARSET=utf8;

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);

2. 引入依赖

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>2.4.2</version>

</parent>

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<dependency>

<groupId>com.baomidou</groupId>

<artifactId>mybatis-plus-boot-starter</artifactId>

<version>3.4.0</version>

</dependency>

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>8.0.21</version>

</dependency>

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

<version>1.18.12</version>

</dependency>

<!-- ====================== Mybatis-Plus代码生成器所需依赖开始 ===================== -->

<dependency>

<groupId>com.baomidou</groupId>

<artifactId>mybatis-plus-generator</artifactId>

<version>3.4.0</version>

</dependency>

<dependency>

<groupId>org.apache.velocity</groupId>

<artifactId>velocity-engine-core</artifactId>

<version>2.0</version>

</dependency>

<!-- ====================== Mybatis-Plus代码生成器所需依赖结束 ===================== -->

</dependencies>

<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

<configuration>

<mainClass>com.gao.App</mainClass>

</configuration>

</plugin>

</plugins>

<resources>

<resource>

<directory>src/main/java</directory>

<includes>

<include>**/*.xml</include>

</includes>

</resource>

<resource>

<directory>src/main/resources</directory>

<includes>

<include>**/*.yml</include>

</includes>

</resource>

</resources>

</build>

3. applicatoin.yml

spring:

datasource:

driver-class-name: com.mysql.cj.jdbc.Driver

url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimezone=GMT%2B8

username: root

password: 123

logging:

level:

com.gao: debug

pattern:

console: '%p%m%n'

4. 生成代码

package com.gao.test;

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 class CodeGenerator {

public static void main(String[] args) {

// 1. 创建代码生成器

AutoGenerator generator = new AutoGenerator();

// 2. 全局配置

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);

// 3. 配置数据源

DataSourceConfig dsc = new DataSourceConfig();

dsc.setUrl("jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8");

dsc.setDriverName("com.mysql.jdbc.Driver");

dsc.setUsername("root");

dsc.setPassword("123");

dsc.setDbType(DbType.MYSQL);

generator.setDataSource(dsc);

// 4. 包配置

PackageConfig pc = new PackageConfig();

pc.setParent("com.gao");

// pc.setModuleName("mp"); // 设置模块名

pc.setController("controller");

pc.setEntity("entity");

pc.setService("service");

pc.setMapper("mapper"); // 设置Mapper接口的位置

pc.setXml("mapper"); // 设置Mapper.xml的位置

generator.setPackageInfo(pc);

// 5. 策略配置

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中驼峰转连字符

generator.setStrategy(sc);

// 6. 执行

generator.execute();

}

}

5. controller

@RestController

@RequestMapping("/user")

public class UserController {

@Autowired

private IUserService userService;

@RequestMapping("save")

public String save(@RequestBody User user) {

userService.save(user);

return "save ok";

}

}

6. 启动类

@SpringBootApplication

@MapperScan("com.gao.mapper")

public class App {

public static void main(String[] args) {

SpringApplication.run(App.class, args);

}

}

7. 测试

截图.png

使用Docker Compose部署SpringBoot项目

为了完成Docker Compose部署SpringBoot项目的例子,我们需要准备3个文件:

A. Docker Compose文件

B. SpringBoot项目打出的jar包(记得指定主类的位置,还要指定xml和yml会被构建出来)

C. Dockfile

把这个三个文件上传到linux,但凡操作过程中,修改了SpringBoot项目,又重新打包上传到linux时,一定要把SpringBoot项目原来的镜像删除,这样才能在又一次执行“docker-compose up”命令的时候,重新根据新的jar包生成新的镜像

1. springboot项目,如何才能知道mysql容器的ip地址呢?如下:

截图.png

2. 将springboot项目打包

截图.png

截图.png

3. 编写Docker Compose文件:docker-compose.yml

version: "3.0"

services:

mysql: # mysql服务名

image: mysql:8

command: # 允许外部访问

--default-authentication-plugin=mysql_native_password

ports:

- 3306:3306

environment:

MYSQL_ROOT_PASSWORD: '123'

MYSQL_ALLOW_EMPTY_PASSWORD: 'no'

MYSQL_DATABASE: 'test'

docker-test: # springboot服务名

hostname: woniu

build: ./ # 用于构建springboot项目镜像的Dockerfile文件的路径,该文件的名字必须为Dockerfile

ports:

- 8080:8080

depends_on: # 前置服务,当mysql服务启动好之后,才启动当前服务

- mysql

4. 编写Dockerfile文件,该文件的名字必须是"Dockerfile" f必须小写!

FROM java:8u102

MAINTAINER gao

COPY docker-test-1.0-SNAPSHOT.jar docker-test-1.0-SNAPSHOT.jar

ENTRYPOINT ["java","-jar","docker-test-1.0-SNAPSHOT.jar"]

EXPOSE 8080

5. 将jar包、Docker Compose文件、DockerFile文件,都上传到linux,必须保证它们都在同一个目录下:

截图.png

6. 执行以下命令

docker compose up

它会按照docker-compose.yml中所编排的顺序,进行执行,也就是先启动mysql容器,再构建docker-test镜像,并且启动docker-test容器,最终可以看到以下界面:

截图.png

7. 在另外一个客户端中,键入:docker ps

截图.png

可以看到有两个服务,第一个是SpringBoot服务,第二个是mysql服务。

8. 测试,发现报错

截图.png

查看SpringBoot项目控制台,发现是MySQL中没有对应的user表:

截图.png

如果此时使用的不是Mybatis-plus框架,而是Hibernate或者Spring-data-jpa的话,则表会被自动创建出来的。

9. 进入MySQL容器,通过命令行进入链接MySQL服务,并创建User表:

截图.png

并创建User表:

截图.png

10. 再次测试,发现出现了另外一个新的错误

截图.png

这是编码问题,修改user表中name列、gender列的编码即可

ALTER TABLE `user` MODIFY name VARCHAR(20) CHARACTER SET "utf8";

ALTER TABLE `user` MODIFY gender VARCHAR(20) CHARACTER SET "utf8";

11. 再次测试,成功:

截图.png

查看MySQL容器中的数据:

截图.png

标签:compose,Compose,mysql,Docker,com,docker
From: https://www.cnblogs.com/qiutian888/p/18278738

相关文章

  • 4. Docker实战
    Docker安装Mysql首先确认当前系统中,是否有mysql镜像文件,结果发现没有再使用dockersearch命令来搜索hub.docker.com上的mysql镜像文件 我们就使用starts最多的,官方的mysql镜像。使用dockerpullmysql命令,来下载mysql:latest,也就是mysql最新版的镜像 根据mysql镜像创建并运行一......
  • 3. Docker File
    DockerFileDockerFile是一个脚本程序。DockerFile这个脚本程序就是用来创建Docker镜像的。使用DockerFile的三个固定步骤☐编写DockerFile文件:手动编写一个DockerFile文件,语法必须符合DockerFile的语法规则☐dockerbuild:使用“dockerbuildDockerFile文件名”来创建出一个Do......
  • 2. Docker基础
    Docker深入演示例子为了加深大家对docker技术中的三大概念的理解,我再演示一个例子:拉取tomcat镜像,并部署web应用,并且运行。 dockersearchtomcat在仓库中搜索tomcat镜像,部分截图如下:dockerpulltomcat拉取tomcat镜像这里为什么tomcat镜像的大小有529MB?tomcat 不会这么大啊。......
  • 1. Docker快速起步
    Docker先安装Docker,再讲课没有Docker的日子里在以前的开发时代,开发人员把自己开发好的war交付给运维人员,运维人员为了把war部署到服务器上且保证能运行,就必须由运维人员在服务器上搭建好运行环境! 可这样带来的问题是,如果开发环境与部署环境不一致(比如版本),则会导致无法在服务器环......
  • 一键部署Docker脚本
    bashdocker_install.sh#!/bin/bash#auther:maqinghang#blog:https://www.cnblogs.com/maqinghang#加载操作系统的变量,主要是ID变量。./etc/os-releaseDOCKER_VERSION=20.10.24#指定Docker的版本DOCKER_COMPOSE_VERSION=2.23.0#指定docker-conpose的版本FILE......
  • Linux容器篇-Docker镜像的使用
    文章目录前言一、列出镜像列表二、获取一个新镜像三、查找镜像四、拉取镜像五、删除镜像六、创建镜像1、更新镜像2、构建镜像七、设置镜像标签总结前言当运行容器时,使用的镜像如果在本地中不存在,docker就会自动从docker镜像仓库中下载,默认是从DockerHub公共......
  • 【Docker】Docker安全与最佳实践:保护你的容器化应用程序
    Docker安全与最佳实践:保护你的容器化应用程序一、保持Docker更新*1\.使用容器编排工具2.蓝绿部署3.滚动更新4.就地更新5.监控和回滚二、最小权限原则三、网络隔离四、其他安全措施前言Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到......
  • docker
    dockerDocker是一个开源项目,诞生于2013年初,最初是dotCloud公司内部的一个业余项目。它基于Google公司推出的Go语言实现。加了Linux基金会,遵从了Apache2.0协议,项目代码在上进行维护。容器化技术,区分于虚拟机,又类虚拟机,兼具虚拟机隔离的优点,又有速度快的优点容器......
  • Docker 镜像安装
    ​​​前言Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。在安装Docker时,我们经常需要用到镜像安装,为此我整理了一下如何通过镜像源来安装Docker的......
  • 初始docker
    前置知识通过面向对象的知识来了解docker中的镜像和容器就很好理解了,docker是C/S架构镜像:是一个只读的模板,可以用来创建容器。类容器:是docker的运行实例,提供了一个独立的可移植的环境,可以在这个环境中运行应用程序。实例,1个或多个docker仓库:用来存储docker镜像的地方,最......