在开始之前,需要了解什么是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获取到数据