Docker 容器编排利器:Docker-Compose

本贴最后更新于 2408 天前,其中的信息可能已经沧海桑田

一个项目发布到 Docker 中,我们往往需要先编写 Dockerfile,在这个里面操作 Image 的安装,Container 的加载等操作,但像 Spring Cloud 这种一个项目下 N 个子服务(每个子服务独占一个进程)的大型项目,难道每一个子服务下都去编写 Dockerfile 吗?而且这里面还牵涉到子服务与子服务之间的通讯在 Docker 下如何去配置的问题。这种情况下,我们使用 Docker-Compose 是最适合不过的了。

1. 前言

首先上 Github 上的项目展示案例 liumapp/docker-compose-demo

接下来,我们简单介绍一下 docker-compose 的定义:

Docker Compose 是 Docker 三剑客的最后一个,第一个是 Machine,用来在不同平台下快速安装 Docker 的,第二个是 Swarm,帮助 Docker 在集群中运转,第三个便是 Docker Compose,用来帮助用户运行容器组(请注意,不是单独的容器)。

2. 使用

那么我们如何来使用 Docker Compose 呢?

在案例 liumapp/docker-compose-demo 中,我们使用 Spring Cloud 项目集群为例,来介绍如何通过 Docker Compose 将一个 Spring Cloud 项目群部署到 Docker 中。

2.1 操作步骤

2.1.1 安装 Image

第一步跟 Docker Compose 的关系不大,安装 Image,在案例中我们使用了 docker-maven-plugin 这一个插件来操作,然后编写了一个 build-image.sh 的脚本,一键完成所有项目的 Image 安装。

docker-maven-plugin 的配置如下:

<plugin>
  <groupId>com.spotify</groupId>
  <artifactId>docker-maven-plugin</artifactId>
  <version>1.0.0</version>
  <configuration>
	<imageName>liumapp/${project.artifactId}:${project.version}</imageName>
	<baseImage>java:8</baseImage>
	<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
	<resources>
	  <resource>
		<targetPath>/</targetPath>
		<directory>${project.build.directory}</directory>
		<include>${project.build.finalName}.jar</include>
	  </resource>
	</resources>
  </configuration>
</plugin>

build-image.sh 的内容就不粘贴了,基本就是分别进入各个子服务的目录下,再依次执行

mvn clean package docker:build

来完成 Image 的安装。

2.1.2 编写 docker-compose.yml

docker-compose.yml 应该位于项目的根目录下,且在命名上不能有偏差。

在编写 docker-compose.yml 时,我们要注意,要定义的容器组位于 services 下,每一个 services 的 Id 一般跟子项目的 artifactId 保持一致,并在其下再去定义所采用的 Image、启动失败时是否重启、容器名称、主机名称、及监听和开放的端口号、依赖的服务等等内容。

具体对应的参数项为:

image: ${您采用的Image}
restart: ${是否在失败时重启,是的话为always}
container_name: ${运行时的容器名称}
hostname: ${配置网络的主机名称,可用于容器组内的通讯}
ports: 
  - "1234:1234" ${监听和开放的端口号}
depends_on:
  - docker-compose-eureka ${依赖的服务}

那么案例中的 docker-compose.yml 的内容就不粘贴了,比较多,大家请去项目中查阅。

2.1.3 启动容器组

安装好 Image 后,我们可以使用:

docker-compose up -d

来启动,-d 表示以守护进程的形式运行。

2.1.4 停止容器组

想要关停容器组,我们可以使用:

docker-compose down

来停止。

2.1.5 删除 Image

案例中我们使用了 rm-images.sh 脚本来删除所安装的 Image,其内容为:

docker rmi liumapp/docker-compose-config:v1.0.0
docker rmi liumapp/docker-compose-eureka:v1.0.0
docker rmi liumapp/docker-compose-gateway:v1.0.0
docker rmi liumapp/demo-api-a:v1.0.0
docker rmi liumapp/demo-api-b:v1.0.0
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    491 引用 • 917 回帖
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 302 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...