Docker-02:Docker Compose安装以及入门使用

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Docekr Compose管理工具安装以及入门使用

1. 介绍

Docker

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose,我们可以使用 YAML 文件来配置我们自己应用程序。最终我们从配置中创建并启动所有服务。

官方推荐用 Compose 基本上是一个三步过程:

  • 使用 Dockerfile 定义应用程序的环境,方便在任何地方复制它
  • docker-compose.yml 中定义构成应用程序的服务,可以在隔离环境中一起运行
  • 运行 docker compose up 命令启动并运行整个应用程序.

2. docker-compose.yml结构

YAMLDocker 应用程序定义服务、网络和卷的 YAML 文件。 docker-compose.yml 应该包含: versionservicesnetworksvolumesconfigssecrets 六大部分。

2.1. 示例


version: "3.9" 
services:
  web:
    build: .
    ports:
      - "8000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    depends_on:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

2.2. 常用字段

字段 描述
build 指定 Dockerfile 文件名,要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定
dockerfile 构建镜像上下文路
context 可以是 dockerfile 的路径,或者是指向 git 仓库的 url 地址
image 指定镜像
command 执行命令,覆盖默认命令
container name 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法 scale
deploy 指定部署和运行服务相关配置,只能在 Swarm 模式使用
environment 添加环境变量
networks 加入网络
ports 暴露容器端口,与 -p 相同,但端口不能低于 60
volumes 挂载宿主机路径或命令卷
hostname 容器主机名
restart 重启策略,默认 no,always,no-failure,unless-stoped

3. 安装

3.1. 下载

目前 Docker Compose 有两种下载路径,一种是通过 Github 下载,另外一种通过 daocloud

第一种 Github 在国内受制于网速,速度很慢,还不容易成功。所以推荐使用第二种。

使用 curl 命令,并且制定了下载后输出路径。

3.1.1. daocloud下载


curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

3.1.2. Github下载-不推荐


curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

3.2. 赋可执行权


chmod +x /usr/local/bin/docker-compose

3.3. 检查安装


cd /docker-compose version

20220820164640

4. 使用示例

docker-compose.yml 结构 章节中,我们知道 docker-compose.ymlversionservicesnetworksvolumesconfigssecrets 六大部分组成。 这里我们围绕这六大部分如何使用,我们通过一个样例来说明。

演示样例分为三个步骤:

  • 准备一个可被启动的应用服务,比如常见的 RedisTomcatNginx 都可以。
  • 定义 Dockerfile 文件,这是我们对应用服务的定义
  • 定义 docker-compose

4.1. 准备应用服务

这是一个基于 SpringBoot Web 的服务,定义 Controller 层,详细如下:


@Slf4j
@RequestMapping("/demo")
@RestController
public class AntiReptileController {

    @Autowired
    private AsynService asynService;

    @RequestMapping("")
    public String demo(){
        return "demo";
    }

    @RequestMapping("/asyn")
    public String asyn(){
        String selector = asynService.selector();
        asynService.update(selector);
        log.warn("阅读执行完毕");
        return selector;
    }
}

这个 Web 服务,我们定义一个资源,在浏览器被访问(地址:http://ip:port/demo/asyn ) ,可以观察到响应内容如下:

{
    "code": 0,
    "data": "Selector http-nio-9090-exec-1",
    "message": "SUCCESS"
}

如果服务不能正常启动,则展示的非上述内容。

接下来将样例通过 Maven 打包,形成的 Jar 包,名称为 demo-will.jar ,这个 Jar 包就是我们要启动的服务,下一步,我们要开始编写 Dockerfile

4.2. 编写Dockerfile


FROM openjdk:8
ADD  demo-will.jar /demo.jar
ENTRYPOINT ["java", "-jar", "demo.jar"]
  • FROM: 定制的镜像都是基于 FROM 的镜像,这里的 openjdk 就是定制需要的基础镜像
  • ADD: 复制指令,从上下文目录中复制文件或者目录到容器里指定路径。 和 COPY 的使用格类似,官方推荐使用 COPY
  • ENTRYPOINT: 同 CMD

4.3. 编写docker-compose


version: "3.9"
services:
  myapp:
    container_name: boot-app
    build: .
    ports:
      - "9090:9090"
  • version: 指定 yml 版本
  • myapp: 服务的名称,可自定义,此处为了特殊说明,叫做 myapp
  • container_name: 容器的名字,也可以自定义
  • build: 构建所依赖的 Dockerfile 的路径,此处 . 说明在当前路径下,也可以使用相对路径如 ../src/ 等
  • ports: 说明宿主机和容器之间的端口映射,,这里可指定多个端口映射,此处定义 容器端口 9090 映射到宿主机端口 9090

4.4. 启动

在含有 docker-compose.yml 文件的路径下,执行操作 docker-compose up 后服务将完成下载依赖并启动 docker-compose.yml 中定义所有的容器。


docker-compose up

启动日志如下:


Building with native build. Learn about native build in Compose here: https://docs.docker.com/go/compose-native-build/
Creating boot-app ... done
Attaching to boot-app
boot-app | 13:29:00,582 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
boot-app | 13:29:00,582 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [jar:file:/demo.jar!/BOOT-INF/classes!/logback.xml]
boot-app | 13:29:00,601 |-INFO in ch.qos.logback.core.joran.spi.ConfigurationWatchList@2d8e6db6 - URL [jar:file:/demo.jar!/BOOT-INF/classes!/logback.xml] is not of type file
boot-app | 13:29:00,667 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
boot-app | 13:29:00,675 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:117 - no applicable action for [springProperty], current ElementPath  is [[configuration][springProperty]]
boot-app | 13:29:00,679 |-INFO in ch.qos.logback.core.joran.action.ConversionRuleAction - registering conversion word clr with class [org.springframework.boot.logging.logback.ColorConverter]
boot-app | 13:29:00,679 |-INFO in ch.qos.logback.core.joran.action.ConversionRuleAction - registering conversion word wex with class [org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter]
boot-app | 13:29:00,679 |-INFO in ch.qos.logback.core.joran.action.ConversionRuleAction - registering conversion word wEx with class [org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter]
boot-app | 13:29:00,679 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
boot-app | 13:29:00,683 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [console]
boot-app | 13:29:00,686 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
boot-app | 13:29:00,742 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]
boot-app | 13:29:00,747 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [debug]
boot-app | 13:29:00,758 |-INFO in c.q.l.core.rolling.SizeAndTimeBasedRollingPolicy@598446861 - Archive files will be limited to [50 MB] each.
boot-app | 13:29:00,762 |-INFO in c.q.l.core.rolling.SizeAndTimeBasedRollingPolicy@598446861 - No compression will be used
boot-app | 13:29:00,764 |-INFO in c.q.l.core.rolling.SizeAndTimeBasedRollingPolicy@598446861 - Will use the pattern logs/spring.application.name_IS_UNDEFINED/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log for the active file
boot-app | 13:29:00,774 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@4534b60d - The date pattern is 'yyyy-MM-dd' from file name pattern 'logs/spring.application.name_IS_UNDEFINED/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log'.
boot-app | 13:29:00,774 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@4534b60d - Roll-over at midnight.
boot-app | 13:29:00,776 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@4534b60d - Setting initial period to Sat Aug 20 13:29:00 UTC 2022
boot-app | 13:29:00,778 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
boot-app | 13:29:00,781 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[debug] - Active log file name: logs/spring.application.name_IS_UNDEFINED/debug.log
boot-app | 13:29:00,781 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[debug] - File property is set to [logs/spring.application.name_IS_UNDEFINED/debug.log]
boot-app | 13:29:00,782 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]
boot-app | 13:29:00,782 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [error]
boot-app | 13:29:00,783 |-INFO in c.q.l.core.rolling.SizeAndTimeBasedRollingPolicy@1067938912 - Archive files will be limited to [50 MB] each.
boot-app | 13:29:00,783 |-INFO in c.q.l.core.rolling.SizeAndTimeBasedRollingPolicy@1067938912 - No compression will be used
boot-app | 13:29:00,783 |-INFO in c.q.l.core.rolling.SizeAndTimeBasedRollingPolicy@1067938912 - Will use the pattern logs/spring.application.name_IS_UNDEFINED/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log for the active file
boot-app | 13:29:00,789 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@619a5dff - The date pattern is 'yyyy-MM' from file name pattern 'logs/spring.application.name_IS_UNDEFINED/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log'.
boot-app | 13:29:00,789 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@619a5dff - Rollover at start of every month.
boot-app | 13:29:00,789 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@619a5dff - Setting initial period to Sat Aug 20 13:29:00 UTC 2022
boot-app | 13:29:00,789 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
boot-app | 13:29:00,792 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[error] - Active log file name: logs/spring.application.name_IS_UNDEFINED/error.log
boot-app | 13:29:00,792 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[error] - File property is set to [logs/spring.application.name_IS_UNDEFINED/error.log]
boot-app | 13:29:00,792 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to INFO
boot-app | 13:29:00,792 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [console] to Logger[ROOT]
boot-app | 13:29:00,793 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [debug] to Logger[ROOT]
boot-app | 13:29:00,793 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [error] to Logger[ROOT]
boot-app | 13:29:00,793 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [io.github.rothschil] to INFO
boot-app | 13:29:00,793 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
boot-app | 13:29:00,794 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@1ed6993a - Registering current configuration as safe fallback point
boot-app | 
boot-app | 
boot-app |   .   ____          _            __ _ _
boot-app |  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
boot-app | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
boot-app |  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
boot-app |   '  |____| .__|_| |_|_| |_\__, | / / / /
boot-app |  =========|_|==============|___/=/_/_/_/
boot-app |  :: Spring Boot ::                (v2.6.8)
boot-app | 
boot-app | 2022-08-20 13:29:01.443  INFO 1 --- [           main] io.github.rothschil.WillApplication      : Starting WillApplication using Java 1.8.0_312 on 5f0d3b19101b with PID 1 (/demo.jar started by root in /)
boot-app | 2022-08-20 13:29:01.447  INFO 1 --- [           main] io.github.rothschil.WillApplication      : No active profile set, falling back to 1 default profile: "default"
boot-app | 2022-08-20 13:29:03.099  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 9090 (http)
boot-app | 2022-08-20 13:29:03.116  INFO 1 --- [           main] o.a.coyote.http11.Http11NioProtocol      : Initializing ProtocolHandler ["http-nio-9090"]
boot-app | 2022-08-20 13:29:03.118  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
boot-app | 2022-08-20 13:29:03.118  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.63]
boot-app | 2022-08-20 13:29:03.214  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
boot-app | 2022-08-20 13:29:03.215  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1668 ms
boot-app | 2022-08-20 13:29:04.253  WARN 1 --- [           main] ion$DefaultTemplateResolverConfiguration : Cannot find template location: classpath:/templates/ (please add some templates or check your Thymeleaf configuration)
boot-app | 2022-08-20 13:29:04.487  INFO 1 --- [           main] o.a.coyote.http11.Http11NioProtocol      : Starting ProtocolHandler ["http-nio-9090"]
boot-app | 2022-08-20 13:29:04.655  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
boot-app | 2022-08-20 13:29:04.655  INFO 1 --- [           main] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
boot-app | 2022-08-20 13:29:04.659  INFO 1 --- [           main] o.s.web.servlet.DispatcherServlet        : Completed initialization in 3 ms
boot-app | 2022-08-20 13:29:04.667  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 9090 (http) with context path ''
boot-app | 2022-08-20 13:29:04.689  INFO 1 --- [           main] io.github.rothschil.WillApplication      : Started WillApplication in 3.718 seconds (JVM running for 4.397)

4.5. 验证

我们打开容器所在宿主机端口 http://192.168.147.128:9090/demo/asyn


{
    "code": 0,
    "data": "Selector http-nio-9090-exec-1",
    "message": "SUCCESS"
}

5. 常用命令

字段 描述
up 创建和启动容器
build 重新构建服务
docker-compose ls 列出容器
exec 在容器里面执行命令
scale 指定一个服务容器启动数量
top 显示容器进程
docker-compose logs 查看容器输出
docker-compose port 查看容器宿主机端口
down 删除容器、网络、数据卷和镜像
stop/start/restart 停止/启动/重启服务

5.1. 查看所有运行的容器


docker-compose ps

查看所有运行的容器

5.2. 查看容器端口


docker-compose port myapp 9090

查看容器宿主机端口

目录
相关文章
|
8天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
35 2
|
14天前
|
关系型数据库 MySQL API
|
10天前
|
运维 开发者 Docker
Docker Compose:简化容器化应用的部署与管理
Docker Compose:简化容器化应用的部署与管理
|
11天前
|
Cloud Native 持续交付 Docker
Docker容器化技术:从入门到实践
Docker容器化技术:从入门到实践
|
11天前
|
Docker 微服务 容器
使用Docker Compose实现微服务架构的快速部署
使用Docker Compose实现微服务架构的快速部署
24 1
|
16天前
|
运维 持续交付 虚拟化
docker入门详解!!!
本文介绍了容器技术的发展历程,从物理机到虚拟化再到容器化,重点讲解了Docker的诞生及其优势。Docker通过轻量级的容器技术,实现了资源的高效利用、快速启动、环境一致性、持续交付和部署等优点。文章还详细解析了Docker的架构和工作原理,包括Docker Daemon、REST接口、Docker Client等组件,以及容器与虚拟机的差异。
54 2
|
22天前
|
负载均衡 监控 开发者
深入浅出:掌握 Docker Compose 的高级用法
【10月更文挑战第22天】本文深入探讨了 Docker Compose 的高级用法,包括环境变量、服务扩展、网络配置和数据卷管理。通过实例详细介绍了如何利用这些功能提升开发效率和应用部署的灵活性。适合希望深入了解 Docker Compose 的开发者阅读。
|
21天前
|
Prometheus 监控 Cloud Native
基于Docker安装Grafana和Prometheus
Grafana 是一款用 Go 语言开发的开源数据可视化工具,支持数据监控和统计,并具备告警功能。通过 Docker 部署 Grafana 和 Prometheus,可实现系统数据的采集、展示和告警。默认登录用户名和密码均为 admin。配置 Prometheus 数据源后,可导入主机监控模板(ID 8919)进行数据展示。
56 2
|
10天前
|
NoSQL Redis Docker
【赵渝强老师】使用Docker Compose管理容器
Docker Compose 通过 YAML 文件管理多个容器,简化复杂系统的部署和管理。本文介绍了 Docker Compose 的基本概念,并通过一个包含 Redis DB 和 Python Web 模块的示例,展示了如何使用 Docker Compose 部署和管理多容器应用。手动部署和 Docker Compose 部署的对比突显了 Docker Compose 在系统复杂度增加时的优势。
|
11天前
|
Docker 容器
【赵渝强老师】使用二进制包方式安装Docker
本文介绍了在企业生产环境中无法直接访问外网时,如何使用Docker官方提供的二进制包进行Docker的离线安装。文章详细列出了从安装wget、下载Docker安装包、解压、复制命令到启动Docker服务的具体步骤,并提供了相关命令和示例图片。最后,还介绍了如何设置Docker为开机自启模式。