原文地址:http://www.linzichen.cn/article/1597479427321626624

在上篇 docker-compose(一):SpringBoot + Docker 案例 一文中,通过一个简单的 SpringBoot 项目整合了基于容器运行的 mysql 和 redis,并通过 nginx 做了接口的代理转发。在运维方面,其实是存在几个痛点的:

  • 容器启动的先后顺序要求固定,SpringBoot 容器启动一定要在其所依赖的容器启动完成后,方可启动。
  • 多个容器,需要执行多条 run 命令。
  • 作为一个整体项目,各个容器之间没有被统一编排,统一管理。

针对以上问题,我们可以使用 Docker 官方的开源项目 docker compose 来实现对 Docker 容器集群的快速编排。

简介

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分类似。

其代码目前在 https://github.com/docker/compose 上开源。

Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。

我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Compose 中有两个重要的概念:

  • 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。

安装卸载

官方下载地址:https://docs.docker.com/compose/install/

在官方页面中,我们选择安装独立版本的 docker compose【Install the Compose standalone】

第一步:

根据页面上的链接进行安装,但是国内访问 github 速度超慢,可以用以下地址来替代:

curl -L https://get.daocloud.io/docker/compose/releases/download/v2.12.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

第二步:

开放权限

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

第三步:

查看版本

[root@localhost /]# docker-compose version
Docker Compose version v2.12.2

卸载:

如果使用上述方式安装的,那么卸载命令为

 rm /usr/local/bin/docker-compose

使用 Docker compose 发布 SpringBoot

1. 准备镜像

在使用 docker compose 之前,我们需要先把项目中依赖的镜像下载下来。

[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        1.22      404359394820   13 days ago     142MB
redis        6.0       5e9f874f2d50   11 months ago   112MB
mysql        5.7       c20987f18b13   11 months ago   448MB

2. 编写 docker-compose.yml

最终我们需要有三个文件:

  • SpringBoot 的 jar 文件
  • Dockerfile 文件
  • docker-compose.yml 文件

所以我们在服务器 /mydocker/app 中存放这三个文件。

docker-compose.yml:

version: "3"services:# 给SpringBoot起一个自定义的服务名myappService:# 将来 Dockerfile 构建的镜像名及版本号image: myapp:1.2# 指定容器名称container_name: myapp# 开放端口ports:- "12311:12311"# 配置容器连接的自定义网络,跟mysql、redis 属于同一个网络networks:- app_net# 容器启动时依赖于以下服务depends_on:- redisServer- mysqlServer# mysql服务mysqlServer:image: mysql:5.7ports:- "3306:3306"volumes:- /mydocker/mysql/data:/var/lib/mysql- /mydocker/mysql/conf.d:/etc/mysql/conf.denvironment:MYSQL_ROOT_PASSWORD: 'root'networks:- app_net# redis 服务redisServer:image: redis:6.0ports:- "6379:6379"volumes:- /mydocker/redis/data:/data- /mydocker/redis/redis.conf:/usr/local/etc/redis/redis.confnetworks:- app_netcommand: redis-server# nginx 服务nginxServer:image: nginx:1.22volumes:- /mydocker/nginx/nginx.conf:/etc/nginx/nginx.conf- /mydocker/nginx/default.conf:/etc/nginx/conf.d/default.conf- /mydocker/nginx/html:/usr/share/nginx/htmlports:- "80:80"networks:- app_net
networks:app_net:

3. 修改application.yml

docker-compose.yml 中定义了 mysqlServerredisServer,所以配置文件中服务地址不再写对应的ip了,而是改成服务名。

server:port: 12311
spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://mysqlServer/db_docker?serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useSSL=falseusername: rootpassword: rootredis:host: redisServerport: 6379

4.编写 Dockerfile

# 基于java8
FROM openjdk:8
# 创建容器的工作目录
WORKDIR /app
# 将jar包添加到容器中,并改命为 demo.jar
ADD spring-docker-compose-0.0.1-SNAPSHOT.jar /app/myapp.jar
# 暴露端口
EXPOSE 12311
# 运行jar包
ENTRYPOINT ["java", "-jar"]
CMD ["myapp.jar"]

5.上传服务器

将 SpringBoot 打成jar,然后上传至服务器,需要保证 jar包、Dockerfile、docker-compose.yml 在同一个目录下。这里上传到 /mydocker/app 目录下:

[root@localhost /]# cd /mydocker/app
[root@localhost app]# ll
总用量 27800
-rw-r--r--. 1 root root     1362 12月  5 16:13 docker-compose.yml
-rw-r--r--. 1 root root      284 11月 23 20:00 Dockerfile
-rw-r--r--. 1 root root 28458970 12月  5 16:16 spring-docker-compose-0.0.1-SNAPSHOT.jar

6.构建SpringBoot 镜像

需要保证构建的镜像名称及版本号,和 docker-compose.yml 中定义的一致。

[root@localhost app]# docker build -t myapp:1.2 .# 查看镜像是否构建成功
[root@localhost app]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
myapp        1.2       e786e60a85aa   9 minutes ago   554MB
nginx        1.22      404359394820   2 weeks ago     142MB
openjdk      8         e24ac15e052e   11 months ago   526MB
redis        6.0       5e9f874f2d50   11 months ago   112MB
mysql        5.7       c20987f18b13   11 months ago   448MB

7.执行docker-compose up

[root@localhost app]# docker-compose up

出现以下日志,就说明命令执行没有问题。

默认情况,docker-compose up 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。
当通过 Ctrl-C 停止命令时,所有容器将会停止。
如果使用 docker-compose up -d,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。

8. 查看运行容器

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED              STATUS              PORTS                                                  NAMES
fa60e0fabf10   myapp:1.2    "java -jar myapp.jar"    About a minute ago   Up About a minute   0.0.0.0:12311->12311/tcp, :::12311->12311/tcp          myapp
002f18d9ba02   redis:6.0    "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp              app-redisServer-1
56b831972238   mysql:5.7    "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   app-mysqlServer-1
b9162bf9fb8e   nginx:1.22   "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, :::80->80/tcp                      app-nginxServer-1

docker-compose 使用对比

通过上面对比图可以发现,在服务不多的情况下,使用 docker-compose 和 不使用区别不大。

但是前者需要多少个服务,就得 docker run 多少次,在服务多或者搭建集群的场景下还是适合用 docker-compose。

docker run 时需要注意服务的启动顺序,比如 启动SpringBoot时需要先启动 mysql 和 redis,而 docker-compose 只需要指定 depends_on 即可。

总体来说,使用 docker-compose 可以将一组应用容器组成一个完整的业务单元,一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理。当服务器上一个镜像运行了很多个容器后,我们很难搞清哪个容器对应哪个服务,使用 docker-compose 可以一目了然的发现各个容器之间的协作关系,方便运维管理。

docker-compose(二):SpringBoot + Docker Compose相关推荐

  1. Docker系列(二): 搭建docker镜像仓库-Nexus、Harbor

    Docker介绍及环境搭建参考: Docker系列一: docker介绍&&安装(含离线安装) Docker系列(二): 搭建docker镜像仓库-Nexus.Harbor Docke ...

  2. Docker学习二:Docker镜像与容器

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  3. Docker(十二):Docker+Jenkins+Nginx+Spring Boot 自动化部署项目

    前言 虽然Docker已经是风靡全球的容器技术了,统一环境避免环境问题上是Docker的主要吸引点之一,但使用时详细还是会遇到不少问题的,比如个人搭建时曾思考过这些问题: Jenkins官网既然有Do ...

  4. 【云原生 | 从零开始学Docker】二、Docker的常用指令学习以及使用

    该篇文章已经被专栏<从零开始学docker>收录 Docker常用命令使用 一.如何去学习命令 二.镜像常用命令 2.1查看本地所有镜像 2.2 搜索镜像 2.3下载镜像 2.4 删除镜像 ...

  5. docker(二)基本操作

    一.一个完成的流程 1.安装docker #指定镜像 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/c ...

  6. Docker学习五:Docker 数据管理

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  7. Docker学习四:Docker 网络

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  8. Docker学习一:Docker简介与安装

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  9. Docker学习三:Docker 数据管理

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  10. Docker容器虚拟化技术---Docker安装和操作1

    一.Docker安装 Docker在主流的操作系统和云平台上都可以使用,包括Linux操作 系统(如Ubuntu.Debian.CentOS.Redhat等).MacOS操作系统和 Windows操作 ...

最新文章

  1. 关于expanded一级二级菜单数据的分组排序
  2. 用Python实现快速排序
  3. Linux 写时复制机制原理
  4. 温度补偿计算公式_一种工业用温度测量模块的设计与实现
  5. LeetCode 1690. 石子游戏 VII(博弈DP)
  6. 文本处理算法_python 文本处理
  7. vue - 组件的创建
  8. “智享未来 知行合一”,开为科技助力企业开启人工智能新时代
  9. elastic 常用操作
  10. java重定向cookie_web Java response sendRedirect()如何能携带设定的cookie | 学步园
  11. python列表快速排序_python 实现快速排序
  12. php做抖音在微信中播放,微信小程序实现抖音播放效果的实例代码
  13. C#随机生成姓名、电话类
  14. Linux 下的桌面指针时钟
  15. Python——枚举(enum)
  16. 支付宝支付与提现转账问题小结
  17. HBase master,slaver web端口配置
  18. Cortex-M3和Cortex-M4 Fault异常基础知识
  19. 数加平台在数据挖掘项目中的实践
  20. 无星的RN学习之旅(六)-第三方App跳转,苹果商店跳转,loading框

热门文章

  1. LeetCode509(力扣509) :斐波那契数列 C++ 多种思路与详细解析
  2. 质数检验(埃拉托色筛选法、根号x复杂度算法)
  3. IDEA搭建单模块springboot-web项目、多模块springboot-web项目
  4. 研发团队管理激励机制
  5. OpenCV——去雾
  6. 服务器H110芯片组,技嘉(GIGABYTE) H110M-S2 主板 (Intel H110/LGA 1151)
  7. JAVA处理Excel的三种实现方式(二)
  8. 前端js,join()方法
  9. 5码默认版块_速看!在阜阳,“5折乘公交”优惠来了
  10. 如何将视频文件中的音频提取出来?