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

简介: 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

查看容器宿主机端口

目录
相关文章
|
4月前
|
人工智能 前端开发 Docker
从本地到云端:用 Docker Compose 与 Offload 构建可扩展 AI 智能体
在 AI 智能体开发中,开发者常面临本地调试与云端部署的矛盾。本文介绍如何通过 Docker Compose 与 Docker Offload 解决这一难题,实现从本地快速迭代到云端高效扩容的全流程。内容涵盖多服务协同、容器化配置、GPU 支持及实战案例,助你构建高效、一致的 AI 智能体开发环境。
445 2
从本地到云端:用 Docker Compose 与 Offload 构建可扩展 AI 智能体
|
6月前
|
关系型数据库 应用服务中间件 nginx
Docker一键安装中间件(RocketMq、Nginx、MySql、Minio、Jenkins、Redis)
本系列脚本提供RocketMQ、Nginx、MySQL、MinIO、Jenkins和Redis的Docker一键安装与配置方案,适用于快速部署微服务基础环境。
|
5月前
|
运维 Kubernetes 开发者
解锁现代开发与部署:Docker入门指南
解锁现代开发与部署:Docker入门指南
220 100
|
3月前
|
监控 Kubernetes 安全
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
蒋星熠Jaxonic,技术探索者,以代码为笔,在二进制星河中书写极客诗篇。专注Docker与容器化实践,分享从入门到企业级应用的深度经验,助力开发者乘风破浪,驶向云原生新世界。
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
|
4月前
|
关系型数据库 数据库 PostgreSQL
docker 安装 Postgres 17.6
本文介绍如何通过Docker安装和配置PostgreSQL 17.6。内容包括拉取镜像、导出配置文件、运行容器并挂载数据与配置文件目录,以及进入容器使用psql操作数据库的完整步骤,便于持久化管理和自定义配置。
523 3
docker 安装 Postgres 17.6
|
3月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
564 6
|
3月前
|
Java Linux 虚拟化
【Docker】(1)Docker的概述与架构,手把手带你安装Docker,云原生路上不可缺少的一门技术!
1. Docker简介 1.1 Docker是什么 为什么docker会出现? 假定您在开发一款平台项目,您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。 您正在开发的应用依赖于您当前的配置且还要依赖于某些配置文件。 您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。 **要求:**希望尽可能多在本地模拟这些环境而不产生重新创建服务器环境的开销 问题: 要如何确保应用能够在这些环境中运行和通过质量检测? 在部署过程中不出现令人头疼的版本、配置问题 无需重新编写代码和进行故障修复
398 2
|
4月前
|
运维 数据可视化 开发者
2025年 三个 Docker Compose 可视化管理器测评
本文对比了三款主流的 Docker Compose 可视化管理工具。随着 Docker 的普及,Compose 已成为多容器应用部署的标准,但 YAML 配置复杂、协作困难等问题也日益突出。三款工具各有侧重:Docker Desktop 适合个人本地开发,Portainer 适合小团队运维管理,而 Websoft9 则通过 GitOps 实现了强大的版本控制与团队协作能力。文章从可视化编辑、部署便捷性、版本管理等方面进行评测,为不同使用场景提供了推荐方案,展望了未来 Compose 管理向 GitOps 深度融合的发展趋势。
542 1
2025年 三个 Docker Compose 可视化管理器测评
|
数据可视化 开发工具 git
GitOps 驱动的 Docker Compose 可视工具化来了,图形化编辑器上玩转容器编排
Docker Compose 简化了多容器应用的部署,但随着应用复杂度上升,文本配置方式逐渐暴露出维护难、协作效率低等问题。基于 GitOps 的可视化 Docker Compose 工具应运而生,通过图形界面降低使用门槛,提升配置准确性和团队协作效率。结合 GitOps,实现配置变更的版本追踪、自动化部署与环境一致性,为多容器应用管理提供高效、安全的解决方案。

热门文章

最新文章