docker-compose教程

1. docker-compose是什么?

1. 1 简介

 compose、machine 和 swarm 是docker 原生提供的三大编排工具。

 简称docker三剑客。Compose 项目是 Docker 官方的开源项目,定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Compose 中有两个重要的概念:

【官方解释】:

  • 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。

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

【个人理解】:

  • 服务是一个应用程序的逻辑单元,它可以由一个或多个容器组成。每个服务都拥有自己的配置,包括镜像、端口映射、环境变量、卷和网络等。

  • 项目是一个包含多个服务的集合。它定义了应用程序的整体架构,并提供了管理所有服务的工具。

【服务和项目的例子】

  • 一个 Web 应用程序可以包含以下服务:

  • web:运行应用程序代码的服务。

  • db:运行数据库的服务。

  • cache:运行缓存服务的服务。

  • 一个 Docker Compose 项目可以包含以下文件:

  • docker-compose.yml:定义所有服务的配置文件。

  • Dockerfile:构建服务镜像的配置文件。

Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
在这里插入图片描述

在这里插入图片描述

1.2 Docker Compose, Docker Swarm 和 Kubernetes 对比

Docker Compose

  • 单机部署:Docker Compose 通常用于单机部署,因为它没有集群管理功能。
  • 简单易用:Docker Compose 使用 YAML 文件定义应用,语法简单易懂,易于上手。
  • 开发和测试:Docker Compose 非常适合在开发和测试环境中使用,因为它可以快速启动和停止应用,并方便地进行配置更改。

Docker Swarm

  • 集群管理:Docker Swarm 是一个集群管理工具,可以管理多个 Docker 主机,并把它们作为一个集群来使用。
  • 服务发现和负载均衡:Docker Swarm 提供服务发现负载均衡功能,可以自动发现集群中的服务并进行负载均衡。
  • 高可用性:Docker Swarm 可以自动重启失败的容器,并确保应用的高可用性
  • 生产环境部署:Docker Swarm 非常适合在生产环境中使用,因为它可以提供高可用性、可扩展性和容错性。

Kubernetes

  • 集群管理:k8s 是一个集群管理工具,可以管理多个 Docker 主机,并把它们作为一个集群来使用。
  • 功能强大:Kubernetes 是一个功能强大的容器编排工具,它提供了丰富的功能,例如服务发现负载均衡自动扩展滚动更新健康检查等。
  • 高可用性:Docker Swarm 可以自动重启失败的容器,并确保应用的高可用性
  • 复杂性高:Kubernetes 的学习曲线比较陡峭,需要掌握大量的概念和配置选项。
  • 生产环境部署:Kubernetes 非常适合在生产环境中使用,因为它可以提供高可用性、可扩展性和容错性。

总结

特征Docker ComposeDocker SwarmKubernetes
功能简单中等强大
复杂性中等
部署方式单机集群集群
服务发现
负载均衡
高可用性
滚动更新、健康检查、高级调度等
适用场景开发和测试生产环境生产环境

2. docker compose安装

2.1 二进制包

# 1. 安装
$ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose# 国内用户可以使用以下方式加快下载
$ sudo curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose$ sudo chmod +x /usr/local/bin/docker-compose# 2. 卸载
$ sudo rm /usr/local/bin/docker-compose

2.2 pip安装

# 1. 安装
$ sudo pip install -U docker-compose# 2. 卸载
$ sudo pip uninstall docker-compose# 3. 查看版本
docker-compose --versiom

3. compose模版文件

Docker Compose YAML 文件解释

version: '3'services:mysql:build:context: ./mysqlenvironment:MYSQL_ROOT_PASSWORD: adminrestart: alwayscontainer_name: mysqlvolumes:- /data/edu-bom/mysql/test:/var/lib/mysqlimage: mysql/mysql:5.7ports:- 3306:3306networks:net:eureka:build:context: ./edu-eureka-bootrestart: alwaysports:- 8761:8761container_name: edu-eureka-boothostname: edu-eureka-bootimage: edu/edu-eureka-boot:1.0depends_on:- mysqlnetworks:net:networks:net:volumes:vol:

详细解释:

  1. version: 指定 Docker Compose 文件的版本。此处为 3。

  2. services: 定义服务部分,包含应用程序的不同组件。

  3. mysql: 定义名为 “mysql” 的服务,用于构建和运行 MySQL 数据库。

  4. build: 指示 Docker Compose 从 ./mysql 目录构建 Docker 镜像。

  5. environment: 设置环境变量,包括 MySQL 数据库的 root 用户密码。

  6. restart: 指定容器在意外停止后自动重启。

  7. container_name: 指定容器的名称为 “mysql”。

  8. volumes: 将主机上的 /data/edu-bom/mysql/test 目录挂载到容器的 /var/lib/mysql 目录,用于存储数据库数据。

  9. image: 指定使用官方的 MySQL 5.7 镜像。

  10. ports: 将容器的 3306 端口映射到主机的 3306 端口,以便访问 MySQL 数据库。

  11. networks: 将 “mysql” 服务连接到名为 “net” 的网络。

  12. eureka: 定义名为 “eureka” 的服务,用于构建和运行 Eureka 服务发现服务器。

  13. build: 指示 Docker Compose 从 ./edu-eureka-boot 目录构建 Docker 镜像。

  14. restart: 指定容器在意外停止后自动重启。

  15. ports: 将容器的 8761 端口映射到主机的 8761 端口,以便访问 Eureka 服务发现服务器。

  16. container_name: 指定容器的名称为 “edu-eureka-boot”。

  17. hostname: 指定容器的主机名为 “edu-eureka-boot”。

  18. image: 指定使用 edu/edu-eureka-boot:1.0 镜像。

  19. depends_on: 指定 “eureka” 服务依赖于 “mysql” 服务,确保数据库启动后再启动 Eureka 服务。

  20. networks: 将 “eureka” 服务连接到名为 “net” 的网络。

  21. networks: 定义名为 “net” 的网络。

  22. volumes: 定义名为 “vol” 的卷,但未被任何服务使用。

4. docker-compose命令

up

docker-compose up [options] [SERVICE...]

该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务启动服务,并关联服务相关容器的一系列操作。

可以说,大部分时候都可以直接通过该命令来启动一个项目。

如果使用 docker-compose up -d,将会在后台启动并运行所有的容器。

默认情况,如果服务容器已经存在,docker-compose up 将会尝试停止容器,然后重新创建(保持使用 volumes-from 挂载的卷),以保证新启动的服务匹配 docker-compose.yml 文件的最新内容。如果用户不希望容器被停止并重新创建,可以使用 docker-compose up --no-recreate这样将只会启动处于停止状态的容器,而忽略已经运行的服务。如果用户只想重新部署某个服务,可以使用 docker-compose up --no-deps -d <SERVICE_NAME> 来重新创建服务并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。

选项:

  • -d 在后台运行服务容器。
    - --no-color 不使用颜色来区分不同的服务的控制台输出。
  • --no-deps 不启动服务所链接的容器。
  • --force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用。
  • --no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。
  • --no-build 不自动构建缺失的服务镜像。
  • -t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。

start

docker-compose start [SERVICE...]

启动已经存在的服务容器

down

docker-compose down

此命令将会停止 up 命令所启动的容器,并移除网络

stop

docker-compose stop [options] [SERVICE...]

停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。

选项:

  • -t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。

ps

docker-compose ps [options] [SERVICE...]

列出项目中目前的所有容器。

选项:

  • -q 只打印容器的 ID 信息。

logs

docker-compose logs [options] [SERVICE...]

查看服务容器的输出。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color 来关闭颜色。

build

docker-compose build [options] [SERVICE...]

构建(重新构建)项目中的服务容器。

服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db

可以随时在项目目录下运行 docker-compose build 来重新构建服务。

选项:

  • --force-rm 删除构建过程中的临时容器。
  • --no-cache 构建镜像过程中不使用 cache(这将加长构建过程)。
  • --pull 始终尝试通过 pull 来获取更新版本的镜像。

restart

docker-compose restart [options] [SERVICE...]

重启项目中的服务

选项:

  • -t, --timeout TIMEOUT 指定重启前停止容器的超时(默认为 10 秒)。

rm

docker-compose rm [options] [SERVICE...]

删除所有停止状态的)服务容器。推荐先执行docker-compose stop 命令来停止容器。

选项:

  • -f, --force 强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。
  • -v 删除容器所挂载的数据卷。

top

docker-compose top

查看各个服务容器内运行的进程。

images

docker-compose images

列出 Compose 文件中包含的镜像。

run

docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]

在指定服务上执行一个命令。

使用举例:

1.在web服务器运行python脚本

2. 在 Web 服务容器中运行 shell 命令,并映射端口,设置环境变量,使用卷,连接网络:

docker-compose run -p 8080:80 -e MY_VAR=value -v my_volume:/path/to/file/in/container --network my_network web bash

这将在 “web” 服务的容器中打开一个交互式 shell,并进行以下操作:

  • 将容器的 80 端口映射到主机的 8080 端口。
  • 设置环境变量 MY_VAR 的值为 “value”。
  • 将名为 “my_volume” 的卷挂载到容器中的 /path/to/file/in/container 路径。
  • 连接到名为 “my_network” 的网络。

3. 在数据库容器中运行 SQL 命令,使用环境变量,连接网络:

docker-compose run -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=password --network my_network db psql -U postgres mydatabase

这将在 “db” 服务的容器中使用 PostgreSQL 客户端连接到 “mydatabase” 数据库,并进行以下操作:

  • 设置环境变量 POSTGRES_USER 的值为 “postgres”。
  • 设置环境变量 POSTGRES_PASSWORD 的值为 “password”。
  • 连接到名为 “my_network” 的网络。

4. 在 Web 服务容器中运行 Python 脚本,使用卷,连接网络:

docker-compose run -v my_volume:/path/to/file/in/container --network my_network web python my_script.py

这将在 “web” 服务的容器中运行名为 “my_script.py” 的 Python 脚本,并进行以下操作:

  • 将名为 “my_volume” 的卷挂载到容器中的 /path/to/file/in/container 路径。
  • 连接到名为 “my_network” 的网络。

port

docker-compose port [options] SERVICE PRIVATE_PORT

打印某个容器端口所映射的公共端口。

选项:

  • --protocol=proto 指定端口协议,tcp(默认值)或者 udp。
  • --index=index 如果同一服务存在多个容器,指定命令对象容器的序号(默认为 1)。
# 下面结果表示:将web服务的5000端口映射到了宿主机的5001端口$ docker-compose port web 50000.0.0.0:5001

5. 简单示例

参考链接:
[Docker] Docker Compose 基础教程(概念/基础操作)
全网最详细的Docker-Compose详细教程
Docker Compose

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

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

相关文章

月入30000的软件测试人员,简历是什么样子的?

我们都知道&#xff0c;简历是一个人进入职场的敲门砖。从某种层面来说&#xff0c;简历也像一个人的具象身份证&#xff0c;或者专业资格证。所以&#xff0c;一份简历的好坏&#xff0c;不仅关乎个人的“脸面”&#xff0c;更关乎你是不是一个有“含金量”的技术人员。 所以…

SVG画双色虚线并带有流动效果

实现效果 HTML代码 <svg xmlns"http://www.w3.org/2000/svg" viewBox"0 0 100 100" version"1.1"><polyline points"10,20 10,40 80,40 80,60" stroke-width"2" stroke-dasharray"10 10" fill"non…

C语言数据结构排序、插入排序、希尔排序(多组并排、一组排完排另一组)、选择排序、堆排序、冒泡排序等的介绍

文章目录 前言打印数组函数一、插入排序二、希尔排序三、选择排序四、堆排序五、冒泡排序总结 前言 C语言数据结构排序、插入排序、希尔排序&#xff08;多组并排、一组排完排另一组&#xff09;、选择排序、堆排序、冒泡排序等的介绍 打印数组函数 打印数组函数定义 // 打印…

如何以定投策略投资场外个股期权?

场外个股期权为投资者提供了一种灵活且富有潜力的投资工具。与传统的投资方式不同&#xff0c;场外个股期权以其低门槛、高灵活性和潜在的较高回报吸引了众多投资者。对于希望长期稳健增值的投资者来说&#xff0c;利用定投策略来投资场外个股期权是一个值得考虑的选项。 文章…

什么样的男士内裤比较好?按这个方法选男士内裤不会出错!

男士内裤作为日常穿着的重要服饰&#xff0c;其舒适度与卫生性对男士们的健康至关重要。随着时代的变迁&#xff0c;男士内裤的款式与材质也日益丰富多样&#xff0c;为男士们提供了更多选择。 目前市场上&#xff0c;男士内裤主要分为三角、平角和四角三大类别。其中&#xf…

结构体+结构体内存对齐+结构体实现位段

结构体内存对齐实现位段 一.结构体1.结构体的声明2.结构体变量成员访问操作符3.结构体传参4.匿名结构体5.结构的自引用 二.结构体内存对齐1.对齐规则2.为什么存在内存对齐&#xff1f;3.修改默认对齐数 三.结构体实现位段1.什么是位段2.位段的内存分配3.位段的跨平台问题4.位段…

帮助客服高效工作的快捷回复软件

在繁忙的客服工作中&#xff0c;对于客服团队来说&#xff0c;每天面对大量的客户咨询&#xff0c;如何快速、准确地回应每一位客户的需求&#xff0c;成为了他们日常工作中的一大挑战。而快捷回复软件的出现&#xff0c;无疑是客服人员的福音。今天&#xff0c;我要向大家介绍…

MySQL 关键特性一:插入缓冲、双写缓冲

前言 ​ 本文主要介绍 mysql 的几大特性之几&#xff0c;如&#xff1a;双写缓冲和插入缓存。 双写缓冲 基本概念 ​ 双写缓冲&#xff08;doublewrite buffer&#xff09;是MySQL/InnoDB中用于支持原子页面更新的一种机制。在传统的数据库系统中&#xff0c;为了保证数据的…

Android Dialog使用汇总

Dialog分类 AlertDialog Dialog 类是对话框的基类&#xff0c;官方建议我们不要直接实例化它&#xff0c;而是使用其子类来获取实例。AlertDialog是系统提供的一个直接子类&#xff0c;它能帮助我们快速构建出不同类型的弹窗。接下来就看下各种类型弹窗的使用。 1、普通对话框…

wpf工程中加入Hardcodet.NotifyIcon.Wpf生成托盘

1、在项目中用nuget引入Hardcodet.NotifyIcon.Wpf。如下图所示。 2、在App.xaml中创建托盘界面&#xff0c;代码是写在 App.xaml 里面 注意在application中一定要加入这一行代码&#xff1a; xmlns:tb"http://www.hardcodet.net/taskbar" 然后在<Application.R…

html 使用svg矢量图时无法 调整宽高问题解决,不能像图片一样设置宽高比例问题

引入的路径后加 #svgView(preserveAspectRatio(none)) 具体代码如下 修改前 <img src"/assets/svgs/full_screen_full.svg" class"im"> 修改后 <img src"/assets/svgs/full_screen_full.svg#svgView(preserveAspectRatio(none))" cla…

免费注册US.KG域名支持接入CF

注册地址&#xff1a; https://register.us.kg/auth/register 号码和地址我是随便填的&#xff0c;不知道对以后有没有影响 收到激活邮件&#xff0c;可能在垃圾箱里 接下来是有个KYC验证&#xff0c;需要填写信息和上传KYC照片&#xff0c;我也是乱填的和乱上传的。可以去找…

ERPNext - 用Python打造您的企业资源规划解决方案

文章目录 ERPNext - 用Python打造您的企业资源规划解决方案第一部分&#xff1a;背景第二部分&#xff1a;ERPNext是什么&#xff1f;第三部分&#xff1a;如何安装ERPNext&#xff1f;第四部分&#xff1a;ERPNext基本使用方法第五部分&#xff1a;场景应用示例第六部分&#…

Excel 文件损坏了打不开怎么办?几种 Excel 文件修复方法帮助你

当你想要打开电脑 Excel 文件的时候发现系统提示文件被损坏或者其他一些原因导致无法打开&#xff0c;这时候应该怎么办呢&#xff1f;别急下面为大家总结了 Excel 文件修复的一些方法。 更改信任中心 Excel 软件具有内置的安全功能会限制有潜在风险的文件&#xff0c;当 Exc…

挑战你的数据结构技能:复习题来袭【6】

1. (单选题)设无向图的顶点个数为n,则该图最多有&#xff08;&#xff09;条边 A. n-1 B. n(n-1)/2 C. n(n1)/2 D. 0 答案&#xff1a;B 分析&#xff1a; 2. (单选题)含有n个顶点的连通无向图,其边的个数至少为()。 A. n-1 B. n C. n1 D. nlog2n 答案&#xff1a;A…

yolov10代码阅读

一 数据处理 在v8之后&#xff0c;v9和v10都是参考v8的数据增强处理&#xff0c;主要有以下&#xff0c;具体其中一些增强并未用到&#xff0c;可以参考具体配置 二 模型结构 以yolov10x为例子&#xff0c;整个模型结构如下 a. 对于SCDown&#xff0c;是 Spatial-channel d…

AI编程新手快速体验SpringCloud Alibaba 集成AI功能

上周六写了一篇文章 震撼发布&#xff01;Spring AI 框架重磅上线&#xff0c;Java 集成 AI 轻松搞定&#xff01; 部分同学可能没有科学上网的条件&#xff0c;本地ollama 集成又比较笨重。趁着周六&#xff0c;写一篇基于SpringCloud Alibaba 集成AI的文章。 先简单介绍…

鱼哥赠书活动第25期:618火热来袭,网络安全书单推荐

鱼哥赠书活动第25期&#xff1a;&#x1f31f;618火热来袭&#xff0c;网络安全书单推荐&#x1f680; &#x1f3f0; 1. 《内网渗透实战攻略》&#xff1a;&#x1f6e1;️2. 《Kali Linux高级渗透测试&#xff08;原书第4版&#xff09;》&#xff1a;&#x1f396;️ 3. 《C…

openGauss系数据库逻辑复制实现双写

本篇关于逻辑复制实现双写的案例&#xff0c;本来准备了3个环境&#xff0c;分别是306、501和505&#xff0c;奈何在5版本向3版本订阅的时候&#xff0c;出现了报错&#xff0c;但也将整个过程都记录下来吧。 环境准备 节点信息 MogDB# select version(); …

nc解决自定义参照字段前台保存后只显示主键的问题

nc解决自定义参照字段前台保存后只显示主键的问题 自定义参照类VoucherRefModel.java package nc.ui.jych.ref;import nc.ui.bd.ref.AbstractRefModel;/*** desc 凭证号参照* author hanh**/ public class VoucherRefModel extends AbstractRefModel {Overridepublic String[…