我們使用Docker的時(shí)候,定義Dockerfile文件,然后使用docker build、docker run等命令操作容器,對(duì)Docker不熟悉的可以前往查看中文文檔:Docker文檔。然而微服務(wù)架構(gòu)的應(yīng)用系統(tǒng)一般包含若干個(gè)微服務(wù),每個(gè)微服務(wù)一般都會(huì)部署多個(gè)實(shí)例,如果每個(gè)微服務(wù)都要手動(dòng)啟停,那么效率就有點(diǎn)低了。Compose是一個(gè)用于定義和運(yùn)行多容器Docker應(yīng)用程序的工具。使用Compose,您可以使用YAML文件來配置應(yīng)用程序的服務(wù)。然后,使用單個(gè)命令,您可以從配置中創(chuàng)建并啟動(dòng)所有服務(wù)。

本文將給大家介紹如何通過Compose發(fā)布SpringBoot項(xiàng)目,以及Compose得一些常用知識(shí)
一、Compose概念
- Docker Compose 將所管理的容器分為三層,分別是
工程(project)、服務(wù)(service)、容器(container). - Docker Compose運(yùn)行目錄下的所有文件
docker-compose.yml組成一個(gè)工程,一個(gè)工程包含多個(gè)服務(wù),每個(gè)服務(wù)中定義了容器運(yùn)行的鏡像、參數(shù)、依賴,一個(gè)服務(wù)可包括多個(gè)容器實(shí)例
二、Compose常用命令
以下命令中出現(xiàn)得[]里得參數(shù)都是可選的
1、ps命令
列出所有運(yùn)行容器
docker-compose ps
2、logs命令
查看容器日志輸出,-f表示查看實(shí)時(shí)日志,容器名表示啟動(dòng)后的容器名,不指定則查看所有啟動(dòng)的容器
docker-compose logs [-f] [容器名]
3、port命令
打印綁定的公共端口,下面命令可以輸出demo1服務(wù)8080端口所綁定的公共端口
docker-compose port demo1 8080
4、build命令
構(gòu)建或者重新構(gòu)建服務(wù)
docker-compose build
5、start命令
啟動(dòng)指定停止的容器, 如下實(shí)例中demo1為一個(gè)容器,如果不指定,則啟動(dòng)所有已存在的
docker-compose start [demo1]
6、stop命令
停止已運(yùn)行的容器,不指定則停止所有的
docker-compose stop [demo1]
7、rm命令
刪除指定容器,必須為已停止的,如果不指定容器名,則刪除所有
docker-compose rm [demo1]
8、up命令
構(gòu)建和啟動(dòng)容器,-d為后臺(tái)運(yùn)行
docker-compose up [-d]
9、kill命令
通過發(fā)送SIGKILL信號(hào)來停止容器,不指定容器名則停止所有啟動(dòng)中的容器
docker-compose kill [demo1]
三、Docker Compose配置文件屬性
1、version
指定docker-compose.yml文件的寫法格式
version:"3"
2、services
多個(gè)容器集合
services:
demo1:
demo2:
3、build
配置構(gòu)建時(shí),Compose會(huì)利用它自動(dòng)構(gòu)建鏡像,該值可以是一個(gè)路徑,也可以是一個(gè)對(duì)象,用于指定Dockerfile, .表示Dockerfile所在目錄的鏡像
services:
demo1:
build: .
4、command
覆蓋容器啟動(dòng)后默認(rèn)執(zhí)行的命令
command: bundle exec thin -p 3000
5、dns
配置 dns 服務(wù)器,可以是一個(gè)值或列表
dns:
- 8.8.8.8
6、dns_search
配置DNS搜索域,可以是一個(gè)值或列表
dns_search:
- www.example.com
7、environment
環(huán)境變量配置,可以用數(shù)組或字典兩種方式
environment:
- DEBUG=1
8、env_file
從文件中獲取環(huán)境變量,可以指定一個(gè)文件路徑或路徑列表,其優(yōu)先級(jí)低于environment指定的環(huán)境變量
env_file: .env
9、expose
暴露端口,只將端口暴露給連接的服務(wù),而不暴露給主機(jī)
services:
demo1:
expose:
- 8080
10、image
指定服務(wù)所使用的鏡像
image: mysql
11、network_mode
設(shè)置網(wǎng)絡(luò)模式
network_mode: "bridge"
12、ports
對(duì)外暴露的端口定義,和expose對(duì)應(yīng)
# 暴露端口信息 - "宿主機(jī)端口:容器暴露端口"
ports:
- "8763:8763"
- "8763:8763"
13、links
將指定容器連接到當(dāng)前連接,可以設(shè)置別名,避免ip方式導(dǎo)致的容器重啟動(dòng)態(tài)改變的無法連接情況
services:
demo1:
# 服務(wù)名:別名
links:
- demo2:test
14、volumes
卷掛載路徑
volumes:
# 宿主機(jī):容器
- /srv
更多命令或者配置屬性,可以參考DockerCompose官方文檔:Compose command
四、發(fā)布SpringBoot項(xiàng)目
1、導(dǎo)入依賴
<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
#設(shè)置鏡像的時(shí)區(qū),避免出現(xiàn)8小時(shí)的誤差
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:
# 指定啟動(dòng)后的容器名
container_name: demo2
build: ./demo2/ .
ports:
- "8081:8081"
4、編寫一個(gè)接口,用于啟動(dòng)后測(cè)試
/**
* @author Gjing
**/
@RestController
public class DemoController {
@PostMapping("/test")
public String test() {
return "ok";
}
}
5、啟動(dòng)類使用@EnableSwagger注解
6、配置文件
server:
port: 8081
spring:
application:
name: demo2
swagger:
base-package: com.gj.web.api
7、將項(xiàng)目打包后,命令行使用docker-compose up進(jìn)行構(gòu)建并運(yùn)行鏡像,最終效果如下:

8、瀏覽器訪問swagger
2.jpg

本文到此就結(jié)束啦,文章中只簡(jiǎn)單的描述了如何發(fā)布一個(gè)SpringBoot服務(wù),更多用法大家可以前往官網(wǎng)進(jìn)行學(xué)習(xí),本項(xiàng)目Demo代碼地址:Docker-Demo