DockerCompose介绍,安装,使用

news2024/12/26 12:08:02

DockerCompose

1、Compose介绍

将单机服务-通过Dockerfile 构建为镜像 -docker run 成为一个服务

user  8080
net   7000
pay   8181
admin  5000
监控
....
docker run 单机版、一个个容器启动和停止

问题:

前面我们使用Docker的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器,然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而之。

使用 Docker Compose 可以轻松,高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具。

官网文档:https://docs.docker.com/compose

# 容器批量管理
# Compose 定义和运行多个Docker容器,通过Compose, 使用一个yaml文件管理应用服务,通过一个简单的命令,就可以将你的所有服务全部启动
Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application's services. Then, with a single command, you create and start all the services from your configuration.

# 可以在所有环境中使用:开发、生产、ci工作流
Compose works in all environments; production, staging, development, testing, as well as CI workflows. It also has commands for managing the whole lifecycle of your application:

在这里插入图片描述

小结

Compose 项目是Docker官方的开源项目,负责实现Docker容器集群的快速编排

开源代码在https://github.com/docker/compose 上

我们知道使用Dockerfile模板文件可以让用户很方便的定义一个单独的应用容器,其实在工作中,经常会碰到需要多个容器相互配合来完成的某项任务情况,例如工作中的web服务容器本身,往往会在后端加上数据库容器,甚至会有负责均衡器,比如LNMP服务

Compose 就是来做这个事情的,它允许用户通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)

Compose 中有两个重要的概念:

1、服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例,很多的镜像启动

  • 订单服务 image
  • 物流服务 image
  • 用户服务 image
  • 支付服务 image
  • 4个容器后面构成一个服务 service

2、**项目(project)😗*由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml中定义。

Compose 项目是由Python编写的,实际上就是调用了Docker服务提供的API来对容器进行管理,因此,只要所在的操作系统的平台支持Docker API,就可以在其上利用Compose来进行编排管理.

2、Docker 安装Compose

1、下载文件安装

  • 下载compose文件,授权,就可以启动了

2、yum安装

sudo yum update
sudo yum install docker-compose-plugin

3、一般情况下,linux要安装python环境

yum install python-pip      # pip 是 Python 包管理工具

3、尝试使用

https://docs.docker.com/compose/gettingstarted/

在这里插入图片描述

在这里插入图片描述

Dockerfile;一个镜像的构建自动了

DockerCompose 把一个服务,多个容器自动化来启动和构建。批量管理容器

步骤:

1、编写项目文件

2、编写Dockerfile文件打包项目成为服务镜像

3、通过 Compose.yaml 管理构建所有的服务

services:
  # 可以定义多个服务
  web:
    build: .
    ports:
      - "8000:5000"
    depens_on:
      - redis
  redis:
    image: "redis:alpine"

4、docker compose up 启动所有服务

  • 按照 Compose.yaml 定义的来一步步加载

5、会生成镜像

在这里插入图片描述

6、查看服务

# 由于是单机版的docker,这个服务无法查看,集群环境中才可以看到。
[root@iZj6c1wvscj5y05fyq1yiqZ ~]# docker service ls
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.

# 发现一次拉起了两个容器,这个就是  Compose.yaml 定义的服务
# 容器名规律: 项目名-容器服务名-1编号
[root@iZj6c1wvscj5y05fyq1yiqZ ~]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS                    NAMES
292c625ce219   redis:alpine      "docker-entrypoint.s…"   6 minutes ago   Up 3 minutes   6379/tcp                 composetest-redis-1
21f4f7a63283   composetest-web   "python app.py"          6 minutes ago   Up 3 minutes   0.0.0.0:8000->5000/tcp   composetest-web-1

# 

docker compose 命令需在项目目录下使用

[root@iZj6c1wvscj5y05fyq1yiqZ composetest]# docker compose down
[+] Running 3/2
 ✔ Container composetest-redis-1  Removed                                                                    0.2s 
 ✔ Container composetest-web-1    Removed                                                                    0.3s 
 # compose 会自动创建一个服务的网络
 ✔ Network composetest_default    Removed        

在这里插入图片描述

4、Compose命令

# Compose 大部分命令的对象即可以是项目的本身,也可以是指定为项目中的服务或者容器
执行docker compose [COMMAND] --help 或者docker compose help [COMMAND]可以查看命令的帮助信息

# 具体的使用格式,一个是启动一个容器,一个是启动多个容器(服务网络问题-自定一个网络。所有服务按照项目名来定义,编号)
docker compose [-f=<arg>...] [options] [COMMAND] [ARGS]

# 参数选项
-f,--file file指定模板文件,默认是docker-compose.yml模板文件,可以多次指定
-p,--project-name name指定项目名称,默认使用所在目录名称作为项目名称
-v,--version 输出版本信息

# Compose所支持的命令
build              Build or rebuild services (构建项目中的服务容器)
config             Validate and view the Compose file (验证并查看Compose文件)
create             Create services (为服务创建容器)
down               Stop and remove containers, networks, images, and volumes (停止容器并删除由其创建的容器,网络,卷和图像up)
events             Receive real time events from containers (为项目中的每个容器流式传输容器事件)
exec               Execute a command in a running container (这相当于docker exec。使用此子命令,您可以在服务中运行任意命令。默认情况下,命令分配TTY,因此您可以使用命令docker compose exec web sh来获取交互式提示。)
help               Get help on a command (获得一个命令的帮助)
images             List images ()
kill               Kill containers (通过发送SIGKILL信号来强制停止服务容器)
logs               View output from containers (查看服务容器的输出)
pause              Pause services (暂停一个容器)
port               Print the public port for a port binding (打印某个容器端口所映射的公共端口)
ps                 List containers (列出项目中目前所有的容器)
pull               Pull service images (拉取服务依赖镜像)
push               Push service images (推送服务镜像)
restart            Restart services (重启项目中的服务)
rm                 Remove stopped containers (删除所有停止状态的服务容器)
run                Run a one-off command (在指定服务上执行一个命令)
start              Start services (启动已存在的服务容器)
stop               Stop services (停止已存在的服务容器)
top                Display the running processes (显示容器正在运行的进程)
unpause            Unpause services (恢复处于暂停状态的容器)
up                 Create and start containers (自动完成包括构建镜像、创建服务、启动服务并关联服务相关容器的一系列操作)
version            Show the Docker-Compose version information (输出版本)

说明:

一个普通的工作流程以docker compose up -d 启动应用程序开始。

docker compose logs和ps命令可以用来验证应用程序的状态,还能帮助调试。

修改代码后,先执行 docker compose build 构建新的镜像,然后执行 docker compose up -d 取代运行中的容器。

注意,Compose会保留原来容器中所有旧的数据卷,这意味着即使容器更新后,数据库和缓存也依旧在容器内(这很可能造成混淆,因此要特别小心)。

如果你修改了Compose的YAML文件,但不需要构建新的镜像,可以通过up -d参数使Compose以新的配置替换容器。

如果想要强制停止Compose并重新创建所有容器,docker compose stop xxxx 和 docker compose rm xxxx

简单使用:

1、执行命令运行容器:docker compose up -d

2、查看镜像:docker images

3、停止和删除容器: docker compose stop xx 和 docker compose rm xxxx

5、Compose.yaml

模板文件是Compose的核心,涉及的指令关键字比较多,但是大部分的指令与docker run相关的参数的含义是类似的

默认的模板名是docker-compose.yml

# 语法-3层
version: "3.8"
services: # 定义很多服务
  服务1:
  	# 当前的服务配置
  服务2:
    # 当前服务配置
#服务要用的网络、卷、等其他全局规则
volumes:
networks:
configs:
.....

官网链接:https://docs.docker.com/compose/compose-file/#compose-file-structure-and-examples

Compose和Docker兼容性:
    Compose 文件格式有3个版本,分别为1, 2.x 和 3.x
    目前主流的为 3.x 其支持 docker 1.13.0 及其以上的版本
# 常用参数:
version           # 指定 compose 文件的版本
services          # 定义所有的 service 信息, services 下面的第一级别的 key 既是一个 service 的名称
 服务
   build          # 指定包含构建上下文的路径, 或作为一个对象,该对象具有 context 和指定的 dockerfile 
      context     # context: 指定 Dockerfile 文件所在的路径
      dockerfile  # dockerfile: 指定 context 指定的目录下面的 Dockerfile 的名称(默认为 Dockerfile)
      args        # args: Dockerfile 在 build 过程中需要的参数 
   command        # 覆盖容器启动后默认执行的命令, 支持 shell 格式和 [] 格式
   container_name # 指定容器的名称 (等同于 docker run --name 的作用)
   deploy         # v3 版本以上, 指定与部署和运行服务相关的配置
                  # deploy 部分是 docker stack 使用的, docker stack 依赖 docker swarm
   depends_on     # 定义容器启动顺序 (此选项解决了容器之间的依赖关系
   dns            # 设置 DNS 地址(等同于 docker run --dns 的作用)
   entrypoint     # 覆盖容器的默认 entrypoint 指令
   env_file       # 从指定文件中读取变量设置为容器中的环境变量,可以是单个值或者一个文件列表
   environment    # 设置环境变量, environment 的值可以覆盖 env_file 的值
   expose         # 暴露端口, 但是不能和宿主机建立映射关系, 类似于 Dockerfile 的 EXPOSE 指令
   external_links # 连接不在 docker-compose.yml 中定义的容器或者不在 compose 管理的容器
   extra_hosts    # 添加 host 记录到容器中的 /etc/hosts 中
   healthcheck    # v2.1 以上版本, 定义容器健康状态检查
   image          # 指定 docker 镜像, 可以是远程仓库镜像、本地镜像
   labels         # 使用 Docker 标签将元数据添加到容器
   logging        # 设置容器日志服务
   network_mode   # 指定网络模式 (等同于 docker run --net 的作用, 在使用 swarm 部署时将忽略该选项) 
   networks       # 将容器加入指定网络 (等同于 docker network connect 的作用)
                  # networks 可以位于 compose 文件顶级键和 services 键的二级键
   pid: 'host'    # 共享宿主机的 进程空间(PID)
   ports          # 建立宿主机和容器之间的端口映射关系, ports 支持两种语法格式
   	   - "8000:8000"    # 容器的 8000 端口和宿主机的 8000 端口建立映射关系
   volumes        # 定义容器和宿主机的卷映射关系
       - /var/lib/mysql                # 映射容器内的 /var/lib/mysql 到宿主机的一个随机目录中
       - /opt/data:/var/lib/mysql      # 映射容器内的 /var/lib/mysql 到宿主机的 /opt/data
       - ./cache:/tmp/cache            # 映射容器内的 /var/lib/mysql 到宿主机 compose 文件所在的位置
       - ~/configs:/etc/configs/:ro    # 映射容器宿主机的目录到容器中去, 权限只读
       - datavolume:/var/lib/mysql     # datavolume 为 volumes 顶级键定义的目录, 在此处直接调用
   .....
   
# 对于值为时间的可接受的值:
    2.5s
    10s
    1m30s
    2h32m
    5h34m56s

    时间单位: us, ms, s, m, h
# 对于值为大小的可接受的值:
    2b
    1024kb
    2048k
    300m
    1gb

    单位: b, k, m, g 或者 kb, mb, gb
# depends_on示例
version: '3'
services:
    web:
        build: .
        depends_on:
            - db     
            - redis 
    redis:
        image: redis
        ports:
          - "6379:6379"
        environment:
          - root_pwd: "123456"
    db:
   		image: postgres    

# docker compose up 以依赖顺序启动服务,下面例子中 redis 和 db 服务在 web 启动前启动
# 默认情况下使用 docker compose up web 这样的方式启动 web 服务时,也会启动 redis 和 db 两个服务,因为在配置文件中定义了依赖关系
# network示例
version: '3.7'
    services:
    	test:
            image: nginx:1.14-alpine
            container_name: mynginx
            command: ifconfig
            networks:
                app_net:                       # 调用下面 networks 定义的 app_net 网络
                ipv4_address: 172.16.238.10
    networks:
        app_net:
            driver: bridge
            ipam:
                driver: default
                config:
                	- subnet: 172.16.238.0/24
                	- getaway: 172.16.238.1

小结:

以后我们的微服务项目中,如果有多个微服务,则按照他们的启动顺序,配置对应的规则文件即可!

可以去看看你们的公司项目,有没有 docker-compose.yml 文件,有没有做自动编排!

如果下载的网上开源项目,有dockerfile+docker-compose ,那我们可以一键搞定!

网上的项目拉下来,mysql的sql文件导入数据库。 docker-compose up 即可!

dockerfile+docker-compose。

工程、服务、容器

  • Docker Compose 将所管理的容器分为三层,分别是工程(project)、服务(service)、容器(container)
  • Docker Compose 运行目录下的所有文件(docker-compose.yml)组成一个工程,一个工程包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖,一个服务可包括多个容器实例!

到此,Dokcer Compose搞定!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1924457.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解Java泛型:概念、用法与案例分析

个人名片** &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4…

Transformer模型:Encoder的self-attention mask实现

前言 这是对Transformer模型的Word Embedding、Postion Embedding内容的续篇。 视频链接&#xff1a;19、Transformer模型Encoder原理精讲及其PyTorch逐行实现_哔哩哔哩_bilibili 文章链接&#xff1a;Transformer模型&#xff1a;WordEmbedding实现-CSDN博客 Transformer模型…

docker-compose安装PolarDB-PG数据库

文章目录 一. Mac1.1 docker-compose.yaml1.2 部署1.3 卸载4. 连接 二. Win102.1 docker-compose.yaml2.2 部署2.3 卸载 参考官方文档 基于单机文件系统部署 一. Mac 1.1 docker-compose.yaml mkdir -p /Users/wanfei/docker-compose/polardb-pg && cd /Users/wanfei…

Linux - 综合使用shell脚本,输出网站有效数据

综合示例: shell脚本实现查看网站分数 使用编辑器编辑文件jw.sh为如下内容: #!/bin/bash save_file"score" # 临时文件 semester20102 # 查分的学期, 20102代表2010年第二学期 jw_home"http://jwas3.nju.edu.cn:8080/jiaowu" # 测试网站首页地址 jw_logi…

zigbee开发工具:2、zigbee工程建立与配置

本文演示基于IAR for 8051&#xff08;版本10.10.1&#xff09;如何建立一个开发芯片cc2530的zigbee的工程&#xff0c;并配置这个工程&#xff0c;使其能够将编译的代码进行烧录&#xff0c;生成.hex文件。IAR for 8051&#xff08;版本10.10.1&#xff09;支持工程使用C语言&…

STM32智能交通灯系统教程

目录 引言环境准备智能交通灯系统基础代码实现&#xff1a;实现智能交通灯系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;交通管理与优化问题解决方案与优化收尾与总结 1. 引言 智能交通灯系统通过STM…

Python游戏开发:四连珠(内附完整代码)

四连珠&#xff08;Connect Four&#xff09;是一款经典的棋类游戏&#xff0c;由两名玩家在7列6行的网格上轮流下棋。玩家的目标是将自己的棋子在垂直、水平或对角线上连成一条线&#xff0c;通常是四个棋子。如果一方成功做到这一点&#xff0c;那么他就赢得了游戏。如果所有…

视频监控汇聚平台:通过SDK接入大华DSS视频监控平台的源代码解释和分享

目录 一、视频监控汇聚平台 1、概述 2、视频接入能力 3、视频汇聚能力 二、大华DSS平台 1、DSS平台概述 2、大华DSS平台的主要特点 &#xff08;1&#xff09;高可用性 &#xff08;2&#xff09;高可靠性 &#xff08;3&#xff09;易维护性 &#xff08;4&#xf…

《昇思25天学习打卡营第2天|02快速入门》

课程目标 这节课准备再学习下训练模型的基本流程&#xff0c;因此还是选择快速入门课程。 整体流程 整体介绍下流程&#xff1a; 数据处理构建网络模型训练模型保存模型加载模型 思路是比较清晰的&#xff0c;看来文档写的是比较连贯合理的。 数据处理 看数据也是手写体数…

【算法】平衡二叉树

难度&#xff1a;简单 题目 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 示例&#xff1a; 示例1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true 示例2&#xff1a; 输入&#xff1a;root [1,2,2,3,3,null,null,4,4] 输出&…

炒鸡清晰的防御综合实验(内含区域划分,安全策略,用户认证,NAT认证,智能选路,域名访问)

实验拓扑图如下&#xff1a; 前面六个条件在之间的实验中做过了&#xff0c;详细步骤可以去之前的文章看 这里简写一下大致步骤 第一步&#xff1a; 先将防火墙之外的配置给配置好&#xff0c;比如&#xff0c;PC的IP,交换上的Vlan划分。 第二步&#xff1a; 在浏览器上登…

用SurfaceView实现落花动画效果

上篇文章 Android子线程真的不能刷新UI吗&#xff1f;(一&#xff09;复现异常 中可以看出子线程更新main线程创建的View&#xff0c;会抛出异常。SurfaceView不依赖main线程&#xff0c;可以直接使用自己的线程控制绘制逻辑。具体代码怎么实现了&#xff1f; 这篇文章用Surfa…

【算法专题】快速排序

1. 颜色分类 75. 颜色分类 - 力扣&#xff08;LeetCode&#xff09; 依据题意&#xff0c;我们需要把只包含0、1、2的数组划分为三个部分&#xff0c;事实上&#xff0c;在我们前面学习过的【算法专题】双指针算法-CSDN博客中&#xff0c;有一道题叫做移动零&#xff0c;题目要…

小公司的Git工作流程

项目初始化 git init并添加.gitignore文件 Git使用 通过git add . 把代码推到暂存区通过git commit -m “你的说明”&#xff0c;将暂存区的代码推到本地仓库将本地仓库的代码通过git push 推到远程仓库远程仓库(gitee/gitlab/github)同事就可以通过命令git pull将你推上去的…

信息学奥赛初赛天天练-46-CSP-J2020阅读程序2-进制转换、十进制转k进制、等比数列通项公式、等比数列求和公式应用

PDF文档公众号回复关键字:20240713 2020 CSP-J 阅读程序2 1阅读程序(程序输入不超过数组或字符串定义的范围&#xff1b;判断题正确填 √&#xff0c;错误填 。除特殊说明外&#xff0c;判断题 1.5 分&#xff0c;选择题 3 分&#xff0c;共计 40 分) 01 #include <iostre…

java各种锁介绍

在 Java 中&#xff0c;锁是用来控制多个线程对共享资源进行访问的机制。主要有以下几种类型的锁&#xff1a; 1.互斥锁&#xff08;Mutex Lock)&#xff1a;最简单的锁&#xff0c;一次只允许一个线程访问共享资源。如果一个线程获得了锁&#xff0c;其他线程必须等待锁被释放…

DEBUG:jeston卡 远程ssh编程

问题 jeston 打开网页 gpt都不方便 而且只需要敲命令就行 解决 下载MobaXterm(window执行) liunx需要虚拟机 软件 远程快速复制命令

【kubernetes】Helm包管理器基本概念与Chart实战

概念&#xff1a;基础架构与常用命令 三个重要概念&#xff1a; 1.chart 创建Kukernetes应用程序所必需的一组信息。 2.config 包含了可以合并到打包的chart中的配置信息&#xff0c;用于创建一个可发布的对象。 3.release 是一个与特走配置相结合的chart的运行实例。 常用命…

聊点基础---Java和.NET开发技术异同全方位分析

1. C#语言基础 1.1 C#语法概览 欢迎来到C#的世界&#xff01;对于刚从Java转过来的开发者来说&#xff0c;你会发现C#和Java有很多相似之处&#xff0c;但C#也有其独特的魅力和强大之处。让我们一起来探索C#的基本语法&#xff0c;并比较一下与Java的异同。 程序结构 C#程序…

数学建模·非线性规划

整型规划 适用于一个变量或多个变量的值只能是整型的情况 整形规划的分类 0-1背包问题 对于一个物品来说&#xff0c;只有选和不选两种情况 表现为单下标&#xff0c;单变量问题 例&#xff1a;建设学校问题 对于每个学校来说只有选和不选两种情况&#xff0c;在数学上我们用…