1 什么是Docker Compose
前面我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知。
使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具
2 安装Docker Compose
安装命令:
[root@iZ2ze4m2ri7irkf6h6n8zoZ ~]# curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose [root@iZ2ze4m2ri7irkf6h6n8zoZ ~]# chmod +x /usr/local/bin/docker-compose
检查是否安装成功:
[root@iZ2ze4m2ri7irkf6h6n8zoZ ~]# docker-compose -v
3 Docker Compose文件格式的简单介绍
Docker Compose文件一般命名为docker-compose.yml,并且执行Docker-compose命令时在该文件所在目录下执行。
Docker Compose 分为三层,分别是工程(project)、服务(service)/引用标签、容器(container)
例如:
docker-compose.yml # 一个文件代表一个project serveices: # 服务 container-name: # 容器 build: - xxx:xxx network: # 引用标签 xxx:
下面是一个标准的docker-compose.yml文件
version: "3" # 指定版本 services: # services proxy: # 自定义容器名称 build: ./proxy # Dockerfile所在目录,用于构建容器 networks: # 自定义容器网络 - frontend app: build: ./app networks: - frontend - backend db: image: postgres networks: - backend networks: frontend: driver: custom-driver-1 backend: driver: custom-driver-2 driver_opts: foo: "1" bar: "2"
4 Docker Compose常用命令
ps:列出所有运行容器
docker-compose ps
logs:查看服务日志输出
docker-compose logs
port:打印绑定的公共端口,下面命令可以输出 eureka 服务 8761 端口所绑定的公共端口
docker-compose port eureka 8761
build:构建或者重新构建服务
docker-compose build
start:启动指定服务已存在的容器
docker-compose start eureka
stop:停止已运行的服务的容器
docker-compose stop eureka
rm:删除指定服务的容器
docker-compose rm eureka
up:构建、启动容器
docker-compose up
kill:通过发送 SIGKILL 信号来停止指定服务的容器
docker-compose kill eureka
pull:下载服务镜像
docker-compose pull eureka
scale:设置指定服务运气容器的个数,以 service=num 形式指定
docker-compose scale user=3 movie=3
run:在一个服务上执行一个命令
docker-compose run web bash
5 使用Docker Compose一键部署Spring Boot+Redis实战
5.1 构建应用
5.1.1 Spring Boot项目
依赖:
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-data-redis
配置文件:
spring: redis: #host: 127.0.0.1 host: ymx.redis port: 6379 password: jedis: pool: max-active: 8 max-wait: -1 max-idle: 500 min-idle: 0 lettuce: shutdown-timeout: 0
controller代码:
@RestController public class HelloController { @Autowired private RedisTemplateredisTemplate; @RequestMapping("/hello/{id}") public String hello(@PathVariable("id") Integer id) { return redisTemplate.opsForValue().get(String.valueOf(id)); } @RequestMapping("/save/{id}/{name}") public String save(@PathVariable("id") Integer id, @PathVariable("name") String name) { try { redisTemplate.opsForValue().set(String.valueOf(id), "Hello " + name + "!"); } catch (Exception e) { return "false"; } return "success"; }
5.1.2 Redis配置文件
只是将redis自带的redis.conf做了一点修改
#注释掉bind 127.0.0.1 # bind 127.0.0.1 -::1 #修改protected-mode yes->no protected-mode no
5.2 打包应用并构建目录
5.2.1 打包Spring Boot项目
5.2.2 上传redis.conf配置文件
5.2.3 目录结构
- mycompose - docker-compose.yml - rd - Dockerfile - redis.conf - sp - Dockerfile - sp_redis-0.0.1-SNAPSHOT.jar
5.3 编写Dockerfile
5.3.1 Spring Boot容器的Dockerfile
FROM java:8 MAINTAINER YMX "[email protected]" COPY sp_redis-0.0.1-SNAPSHOT.jar /root/sp_redis-0.0.1-SNAPSHOT.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar","/root/sp_redis-0.0.1-SNAPSHOT.jar"]
5.3.2 redis容器的Dockerfile
FROM redis MAINTAINER ymx [email protected] COPY redis.conf /usr/local/etc/redis/redis.conf EXPOSE 6379 CMD ["redis-server","/usr/local/etc/redis/redis.conf" ]
5.4 编写docker-compose.yml
version: "2.8" # 表示该 Docker-Compose 文件使用的是 Version 2 file services: sp-demo: # 指定服务名称 build: ./sp # 指定 Dockerfile 所在路径 ports: # 指定端口映射 - "9001:8080" links: - re-demo:ymx.redis # 进行容器链接 re-demo: build: ./rd
5.5 运行并测试部署结果
运行:
[root@iZ2ze4m2ri7i mycompose]# docker-compose up Creating network "mycompose_default" with the default driver Building re-demo Sending build context to Docker daemon 96.77kB Step 1/5 : FROM redis latest: Pulling from library/redis ......
测试:
[root@iZ2ze4m2ri7i mycompose]# curl http://localhost:9001/save/2/Ymx success [root@iZ2ze4m2ri7i mycompose]# curl http://localhost:9001/hello/2 Hello Ymx!
6 小总结
在Spring Boot配置文件中,redis的host没有使用localhost或者127.0.0.1,而是使用了域名ymx.redis,这一域名在docker-compose.yml文件中进行了映射,进而Spring Boot的容器能够链接到redis容器,但是这一情况依赖于一个默认条件,就是docker的网络默认是桥接模式,两个容器都在同一子网中,因此才能够互相访问。
因此,links并不是唯一的容器网络解决方案,在容器较多时,需要使用networks进行网络的管理。
参考文章:
https://www.jianshu.com/p/658911a8cff3
https://www.jianshu.com/p/3004fbce4d37
https://blog.csdn.net/luo15242208310/article/details/88642187
https://blog.csdn.net/qq_36781505/article/details/86612988
到此这篇关于Docker Compose快速部署多容器服务实战的文章就介绍到这了,更多相关Docker Compose多容器实战内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!