Docker Compose快速部署多容器服务实战的实例详解

 更新时间:2022年2月17日 19:19  点击:382 作者:红帽海绵宝宝

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项目

依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--redis-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置文件:

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 RedisTemplate<String, String> redisTemplate;
    @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 "1712229564@qq.com"
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 1712229564@qq.com
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多容器实战内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

原文出处:https://blog.csdn.net/Mr_YanMingXin/article/details/12291470

[!--infotagslink--]

相关文章

  • 浅谈Docker-compose中的depends_on顺序的问题解决

    本文主要介绍了浅谈Docker-compose中的depends_on顺序的问题解决,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-11-03
  • docker 启动elasticsearch镜像,挂载目录后报错的解决

    这篇文章主要介绍了docker 启动 elasticsearch镜像,挂载目录后报错的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-20
  • 详解JS中的compose函数和pipe函数用法

    这篇文章主要介绍了JS中的compose函数和pipe函数用法,想深入了解Javascript的同学,可以参考下...2021-04-27
  • 解决Docker中的error during connect异常情况

    这篇文章主要介绍了解决Docker中的error during connect异常情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-22
  • docker部署confluence的完整步骤

    这篇文章主要介绍了docker部署confluence的完整步骤,这里的镜像并不是小编自己写的是基于他人打包的文中有详细介绍,需要的朋友可以参考下...2021-06-11
  • 教你使用Portainer管理多台Docker容器环境的方法

    这篇文章主要介绍了Portainer管理多台Docker容器环境,本文给大家介绍的非常详细,包括环境准备及管理docker的详细过程,需要的朋友可以参考下...2021-11-11
  • docker swarm外部验证负载均衡时不生效的解决方案

    这篇文章主要介绍了docker swarm外部验证负载均衡时不生效的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-27
  • 解决docker挂载的目录无法读写问题

    这篇文章主要介绍了解决docker挂载的目录无法读写问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-19
  • docker端口映射及外部无法访问问题

    这篇文章主要介绍了docker端口映射及外部无法访问问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-19
  • Docker 解决openjdk容器里无法使用JDK的jmap等命令问题

    这篇文章主要介绍了Docker 解决openjdk容器里无法使用JDK的jmap等命令问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-04
  • 一条命令重启所有已停止的docker容器操作

    这篇文章主要介绍了一条命令重启所有已停止的docker容器操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-20
  • 使用rpm安装指定版本docker(1.12.6)的详细步骤

    为了防止安装高版本的docker引发的错误,需要安装1.12.6版本的docker,下面小编给大家带来了使用rpm安装指定版本的docker(1.12.6)的步骤,感兴趣的朋友一起看看吧...2021-08-11
  • 一文搞定Docker安装ElasticSearch的过程

    通过本文可以帮助大家快速学习Docker安装ElasticSearch的过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧...2021-08-31
  • 在docker中执行linux shell命令的操作

    这篇文章主要介绍了在docker中执行linux shell命令的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-30
  • docker容器与宿主机的数据交互方式总结

    这篇文章主要给大家介绍了关于docker容器与宿主机的数据交互,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-09
  • 安装Docker Desktop报错WSL 2 installation is incomplete的问题(解决报错)

    这篇文章主要介绍了安装Docker Desktop报错WSL 2 installation is incomplete的问题,解决方法很简单只需我们自己手动更新一下,我们根据提示去微软官网下载最新版的wsl2安装后即可正常打开,需要的朋友可以参考下...2021-06-13
  • 详解如何使用Docker部署Django+MySQL8开发环境

    这篇文章主要介绍了详解如何使用Docker部署Django+MySQL8开发环境,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-07-19
  • Docker部署Rancher的方法(无坑)

    这篇文章主要介绍了Docker部署Rancher的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-06
  • .NET 5 部署在docker上运行的方法

    这篇文章主要介绍了.NET 5 部署在docker上运行的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-06
  • Shell脚本构建Docker 半自动化编译打包发布应用操作

    这篇文章主要介绍了Shell脚本构建Docker 半自动化编译打包发布应用操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-30