我们使用Docker的时候,定义Dockerfile文件,然后使用docker build
、docker run
等命令操作容器,对Docker不熟悉的可以前往查看中文文档:Docker文档。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率就有点低了。Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用单个命令,您可以从配置中创建并启动所有服务。
本文将给大家介绍如何通过Compose发布SpringBoot项目,以及Compose得一些常用知识
一、Compose概念
- Docker Compose 将所管理的容器分为三层,分别是
工程(project)
、服务(service)
、容器(container)
. - Docker Compose运行目录下的所有文件
docker-compose.yml
组成一个工程,一个工程包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖,一个服务可包括多个容器实例
二、Compose常用命令
以下命令中出现得[]
里得参数都是可选的
1、ps命令
列出所有运行容器docker-compose ps
2、logs命令
查看容器日志输出,-f
表示查看实时日志,容器名表示启动后的容器名,不指定则查看所有启动的容器docker-compose logs [-f] [容器名]
3、port命令
打印绑定的公共端口,下面命令可以输出demo1服务8080端口所绑定的公共端口docker-compose port demo1 8080
4、build命令
构建或者重新构建服务docker-compose build
5、start命令
启动指定停止的容器, 如下实例中demo1
为一个容器,如果不指定,则启动所有已存在的docker-compose start [demo1]
6、stop命令
停止已运行的容器,不指定则停止所有的docker-compose stop [demo1]
7、rm命令
删除指定容器,必须为已停止的,如果不指定容器名,则删除所有docker-compose rm [demo1]
8、up命令
构建和启动容器,-d
为后台运行docker-compose up [-d]
9、kill命令
通过发送SIGKILL
信号来停止容器,不指定容器名则停止所有启动中的容器docker-compose kill [demo1]
三、Docker Compose配置文件属性
1、version
指定docker-compose.yml文件的写法格式
version:"3"
2、services
多个容器集合
services:
demo1:
demo2:
3、build
配置构建时,Compose会利用它自动构建镜像,该值可以是一个路径,也可以是一个对象,用于指定Dockerfile, .
表示Dockerfile所在目录的镜像
services:
demo1:
build: .
4、command
覆盖容器启动后默认执行的命令
command: bundle exec thin -p 3000
5、dns
配置 dns 服务器,可以是一个值或列表
dns:
- 8.8.8.8
6、dns_search
配置DNS搜索域,可以是一个值或列表
dns_search:
- www.example.com
7、environment
环境变量配置,可以用数组或字典两种方式
environment:
- DEBUG=1
8、env_file
从文件中获取环境变量,可以指定一个文件路径或路径列表,其优先级低于environment
指定的环境变量
env_file: .env
9、expose
暴露端口,只将端口暴露给连接的服务,而不暴露给主机
services:
demo1:
expose:
- 8080
10、image
指定服务所使用的镜像
image: mysql
11、network_mode
设置网络模式
network_mode: "bridge"
12、ports
对外暴露的端口定义,和expose对应
# 暴露端口信息 - "宿主机端口:容器暴露端口"
ports:
- "8763:8763"
- "8763:8763"
13、links
将指定容器连接到当前连接,可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况
services:
demo1:
# 服务名:别名
links:
- demo2:test
14、volumes
卷挂载路径
volumes:
# 宿主机:容器
- /srv
更多命令或者配置属性,可以参考DockerCompose官方文档:Compose command
四、发布SpringBoot项目
1、导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>cn.gjing</groupId>
<artifactId>tools-starter-swagger</artifactId>
<version>1.0.9</version>
</dependency>
2、编写Dockerfile
FROM hub.c.163.com/library/java:8-alpine
WORKDIR /demo
COPY target/demo1-0.0.1-SNAPSHOT.jar demo1.jar
#设置镜像的时区,避免出现8小时的误差
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
EXPOSE 8080
ENTRYPOINT ["java","-Xms256m","-Xmx512m","-jar","demo1.jar"]
3、编写docker-compose.yml文件
version: "3"
services:
demo2:
# 指定启动后的容器名
container_name: demo2
build: ./demo2/ .
ports:
- "8081:8081"
4、编写一个接口,用于启动后测试
/**
* @author Gjing
**/
@RestController
public class DemoController {
@PostMapping("/test")
public String test() {
return "ok";
}
}
5、启动类使用@EnableSwagger注解
6、配置文件
server:
port: 8081
spring:
application:
name: demo2
swagger:
base-package: com.gj.web.api
7、将项目打包后,命令行使用docker-compose up
进行构建并运行镜像,最终效果如下:
8、浏览器访问swagger
本文到此就结束啦,文章中只简单的描述了如何发布一个SpringBoot服务,更多用法大家可以前往官网进行学习,本项目Demo代码地址:Docker-Demo