在开始之前,需要了解什么是Docker Compose。
假如我们现在有几十上百个微服务需要部署,如果我们手动去buid 构建镜像,那工作量;在或者如果我们的某一个服务出了问题,宕机了,需要重启,但是这个服务又有其他的依赖,这时候我们应该怎么做;Docker Compose就是来解决这类问题的
那么Docker Compose 到底是什么呢?下图来自官方文档,大概意思:通过yaml文件的方式去定义、配置多个容器,并通过命令去启动它,我们可以使用它去对容器进行编排
接下来就开始使用Docker Compose,在使用之前,需要知道,Docker Compose 只是Docker 的一个开源项目,并没有集成在Docker 中,所以我们需要先安装Docker Compose
# 下载Docker Compose,官方的下载地址太慢了,所以我重新找了一个
curl -L https://get.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 给 Docker Compose 文件可执行权限
chmod +x docker-compose
# 查看版本
然后就可以使用Docker Compose,官方给了一个快速开始的python单页面应用,有兴趣的小伙伴可以去尝试(传送门)
接下来先了解docker-compose.yaml规则,这是整个的核心(官方文档),可以分为三层来编排
# 第一层 版本,与docker 引擎版本对应的,向下兼容
version: ''
# 第二层 服务
service:
服务1:
服务配置
服务2:
服务配置
.....
# 第三层 其他配置 网络、卷、全局规则
volumes:
netwoeks:
configd:
.....
接下来就写一个自己的服务并且上线,首先编写自己的服务,就写一个hello world 吧
# 接口
@RestController
public class HelloController {
@Autowired
private RedisTemplate redisTemplate;
@GetMapping("/")
public String hello() {
Long views = redisTemplate.opsForValue().increment("views");
return "hello world! 当前浏览量:" + views;
}
}
# yaml配置,注意,现在是连接redis,相当于在局域网内通过域名访问Redis,但是现在在本地肯定是运行不了的
server:
port: 8080
spring:
redis:
host: redis
然后编写dockerfile文件,生成镜像
FROM java:8
COPY *.jar /hello.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/hello.jar","&"]
现在还需要一个docker-compose.yaml文件,通过这个文件去一键构建镜像,服务启动,就像是吧docker运行容器的指令写到文件中
# 版本
version: '3.8'
# 需要构建的镜像
services:
# hello镜像,我们自己的服务
hello:
# 构建当前路径下的dockerfile
build: .
# 也可以执行构建的文件
# dockerfile: Dockerfile
# 指定镜像名
image: hello
# 依赖的服务镜像
depends_on:
- redis
# 映射的端口
ports:
- "8083:8080"
# redis 服务
redis:
# redis的镜像
image: "library/redis:alpine"
接下来就是将服务打包并上传到服务器中,至少得有服务jar包,dockerfile,docker-compose.yaml这三个文件,如果你有其他的文件也并上传
现在就可以启动构建镜像并运行了,通过 “docker-compose up” 命令,可以看到,执行后会自动去拉取镜像、创建容器,如果没有error或者exited,那这个项目就是运行成功的
# 构建镜像并在前台运行
docker-compose up
# 重新构建
docker-compose up --build
# 构建镜像并在后台运行
docker-compose up -d
# 停止,如果是前台运行,可以直接在当前控制台按 CTRL + C 停止
docker-compose down
接下来就测试哈我们的接口,首先看容器,这是我们通过docker-compose创建的容器,然后访问我们的接口,可以看到能访问并且也能从Redis获取到数据