Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

简而言之就是,一个容器的运行可能需要依赖其他容器,例如 一个springboot项目可能要用到 redis mysql 等其他容器。使用Docker Compose对多个容器进行编排,定义多个容器之间的依赖关系,顺利运行多个容器。

而 Docker Compose 的用途仅限于对多个容器的编排,无法完成资源分配等其他功能。

Docker Compose 使用的基本步骤

  • 使用 Dockerfile 定义应用程序的环境
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序

docker-compose.yml 的配置案例如下:

# yaml 配置实例
version: '3'
services:web:build: .ports:- "5000:5000"volumes:- .:/code- logvolume01:/var/loglinks:- redisredis:image: redis
volumes:logvolume01: {}

01 Dockerfile 基础使用

什么是 Dockerfile?Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

1.1 使用Dockerfile构建镜像

构建镜像之前为其单独创建一个目录

编辑 Dockerfile 文件

例如构建一个 nginx 镜像的 dockerfile 文件内容如下

FROM centos  # 基础镜像
MAINTAINER qh # 镜像维护者
RUN yum install wget -y # 指向命令下载 wget
RUN yum install nginx -y # 指向命令下载 nginx
COPY index.html /usr/share/nginx/html/ # 从上下文目录中复制文件到容器指定路径
EXPOSE 80 # 声明端口
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"] # 指定命令行参数

使用 build 命令构建镜像

docker build -t="qh/nginx:v1" .

-t= 用于指定镜像名称和版本 . 指定是当前目录下的dockerfile(也可以指定其他目录)

查看镜像是否构建成功

docker images

启动构建的镜像

docker run -d -p 80 --name html2 qh/nginx:v1
docker ps
curl <host.ip>:<port>

1.2 Dockerfile 指令

FROM 和 MAINTAINER

FROM 和 MAINTAINER 是构建镜像的两个基础指令

FROM 指定基础镜像,必须为第一个命令,指定的基础镜像必须是可以从dockerhub中下载的
MAINTAINER 维护者信息

格式:FROM <image>FROM <image>:<tag>FROM <image>@<digest>
例如:FROM mysql:5.6MAINTAINER <name>

其中 tag或digest 是可选的,如果不使用这两个值时,会使用latest版本的基础镜像

RUN

用于执行后面跟着的命令行命令。有以下俩种格式:

# shell 格式:
RUN <命令行命令>  # <命令行命令> 等同于,在终端操作的 shell 命令。、
RUN yum install wget -y # exec 格式:
RUN ["可执行文件", "参数1", "参数2"]
RUN ["./test.php", "dev", "offline"] # 等价于 RUN ./test.php dev offline

CMD

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同,RUN是在构建镜像时执行,而CMD是构建容器后调用,也就是在容器启动时才进行调用

CMD指令的主要作用是为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

格式:CMD command param1 param2 (执行shell内部命令)CMD ["可执行文件", "参数1", "参数2"] (执行可执行文件,优先)CMD ["参数1", "参数2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
示例:CMD echo "This is a test." | wc -CMD ["/usr/bin/wc","--help"]

ENTRYPOINT

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序

ENTRYPOINT指令可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参

ENTRYPOINT ["可执行文件", "参数1", "参数2"]
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参

COPY

复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

COPY  <源路径1>...  <目标路径>
COPY index.html /usr/share/nginx/html/

其中源路径可以是源文件或者源目录,也可以是通配符表达式;目标路径是容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

ADD

ADD 指令和 COPY 的使用格类似,但是 ADD 指令可以在本地文件添加到容器时,将tar类型文件自动解压到目标路径(网络压缩资源不会被解压)。另外,ADD 指令可以访问网络资源,类似wget

ADD  <源路径1>...  <目标路径>
ADD abc.tar /usr/share/

EXPOSE

指定于外界交互的端口。但是,EXPOSE并不会让容器的端口访问到主机,要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口

格式:EXPOSE <port> [<port>...]
示例:EXPOSE 80 443EXPOSE 8080

02 YML 配置文件

YAML 可以理解成一种配置管理语言,YAML 的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲。

YAML 的配置文件后缀为 .yml

2.1 YAML 基本语法

  • 大小写敏感:区分字母大小写
  • 使用缩进表示层级关系:缩进不允许使用tab,只允许空格;缩进的空格数不重要,只要相同层级的元素左对齐即可
  • 使用井号表示注释:#

2.2 YAML 数据类型

YAML 支持对象、数组和纯量三种数据类型

对象

对象是键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)

对象键值对使用冒号结构表示 key: value,冒号后面要加一个空格。

也可以使用 key:{key1: value1, key2: value2, ...}

还可以使用缩进表示层级关系;

key: child-key: valuechild-key2: value2

数组

数组是一组按次序排列的值,又称为序列(sequence) / 列表(list)

- 开头的行表示构成一个数组,两个对象数组如下所示:

-A: 1B: 2C: 3
-a: 1b: 2c: 3

纯量

纯量是最基本的,不可再分的值,包括:字符串、布尔值、整数、浮点数、空值NULL、时间、日期

使用一个例子来快速了解纯量的基本使用:

boolean: - TRUE  #true,True都可以- FALSE  #false,False都可以
float:- 3.14- 6.8523015e+5  #可以使用科学计数法
int:- 123- 0b1010_0111_0100_1010_1110    #二进制表示
null:nodeName: 'node'parent: ~  #使用~表示null
string:- 哈哈- 'Hello world'  #可以使用双引号或者单引号包裹特殊字符- newlinenewline2    #字符串可以拆成多行,每一行会被转化成一个空格
date:- 2018-02-17    #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime: -  2018-02-17T15:02:31+08:00    #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区

2.3 YAML 引用

YAML中引用的概念和C++中的引用类似,就是某个对象的一个别名

& 用来建立锚点,<< 表示合并到当前数据,* 用来引用锚点。例如:

defaults: &defaultsadapter:  postgreshost:     localhostdevelopment:database: myapp_development<<: *defaults

等价于:

defaults:adapter:  postgreshost:     localhostdevelopment:database: myapp_developmentadapter:  postgreshost:     localhost

03 Docker Compose 简介与安装

3.1 Docker Compose 简介

Docker Compose 作用是定义和运行多个 Docker 容器,同时可以对多个容器进行编排

Compose 的两个核心概念:

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

3.2 Docker Compose 安装

使用二进制包安装 Docker Compose

# 下载二进制包
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 将可执行权限应用于二进制文件
sudo chmod +x /usr/local/bin/docker-compose
# 测试是否安装成功
docker-compose --version

Docker Compose 使用Python编写的,所以除了使用二进制包安装,也可以通过 pip 命令安装

# 安装下载 pip
apt install python3-pip -y
pip3 install pip -U
# 更新库
apt-get update
# 升级 pip
pip install --upgrade pip
# 安装docker-compose
pip install docker-compose
# 检查是否安装成功
docker-compose -version

04 Docker Compose 使用

4.1 准备测试环境

创建一个测试目录:

mkdir composetest
cd composetest

在测试目录中创建一个名为 app.py 的文件,并复制粘贴以下内容:

import timeimport redis
from flask import Flaskapp = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)def get_hit_count():retries = 5while True:try:return cache.incr('hits')except redis.exceptions.ConnectionError as exc:if retries == 0:raise excretries -= 1time.sleep(0.5)@app.route('/')
def hello():count = get_hit_count()return 'Hello World! I have been seen {} times.\n'.format(count)

在此示例中,redis 是应用程序网络上的 redis 容器的主机名,该主机使用的端口为 6379。

在 composetest 目录中创建另一个名为 requirements.txt 的文件,内容如下:

flask
redis

4.2 创建 Dockerfile 文件

在 composetest 目录中,创建一个名为 Dockerfile 的文件,内容如下:

FROM python:3.7-alpine # 从 Python 3.7 映像开始构建镜像
WORKDIR /code # 将工作目录设置为 /code# 设置 flask 命令使用的环境变量
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0RUN apk add --no-cache gcc musl-dev linux-headers  # 安装 gcc,以便诸如 MarkupSafe 和 SQLAlchemy 之类的 Python 包可以编译加速# 复制 requirements.txt 并安装 Python 依赖项
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txtCOPY . .  # 将 . 项目中的当前目录复制到 . 镜像中的工作目录
CMD ["flask", "run"] # 容器提供默认的执行命令为:flask run

4.3 创建 docker-compose.yml

在测试目录中创建一个名为 docker-compose.yml 的文件,然后粘贴以下内容:

# yaml 配置
version: '3'
services:web:build: .ports:- "5000:5000"redis:image: "redis:alpine"

该 Compose 文件定义了两个服务:web 和 redis。

  • web:该 web 服务使用从 Dockerfile 当前目录中构建的镜像。然后,它将容器和主机绑定到暴露的端口 5000。此示例服务使用 Flask Web 服务器的默认端口 5000 。
  • redis:该 redis 服务使用 Docker Hub 的公共 Redis 映像。

4.4 使用 compose 命令构建并运行应用程序

在测试目录中,执行以下命令来启动应用程序:

docker-compose up

在后台执行该服务可以加上 -d 参数

docker-compose up -d

参考资料

Docker Dockerfile

Docker Compose 容器编排基础使用相关推荐

  1. Docker Compose容器编排

    Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用.你需要定义一个 YAML 格式的配置文件docker-compose.yml, 写好多个容器之间 ...

  2. 这就是你日日夜夜想要的docker!!!---------Docker Compose容器编排理论+实操

    文章目录 一.Compose简介 1.在Compose中有两个重要的概念 2.docker,dockerfile与docker-compose区别 二.Compose安装与卸载 1.Centos系统安 ...

  3. Docker compose 容器编排

    1. 概述 问题:如果要使用 Docker 运行 LNMP 架构,那么 Nginx.MySQL.PHP. Linux三个服务运行在一个容器里,还是运行在多个容器里呢? 答案是都可以. 你可以分别放在三 ...

  4. Docker学习(六):docker compose容器编排

    Docker-compose 实现对容器集群的快速编排 多服务部署的管理工具 定义docker-compose.yml文件,写好容器之间的调用关系,通过命令完成多个容器的同时启动关闭 解决了容器与容器 ...

  5. 浅述 Docker 的容器编排

    作者 | 天元浪子 来源 | CSDN博客 概述 作为容器引擎,Docker为容器化的应用程序提供了开放标准,使得开发者可以用管理应用程序的方式来管理基础架构,实现快速交付.测试和部署代码.随着容器的 ...

  6. Docker 多容器编排Swarm(六)

    docker swarm简介 Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机 ...

  7. docker Swarm容器编排工具

    目录 一.什么是docker swarm 二.Docker Swarm 基本结构 三.Swarm的几个关键概念 四.swarm的调度策略 五.Swarm Cluster模式特性 六.搭建docker ...

  8. dockers-系统学习-docker compose服务编排

    dockers-系统学习-docker compose服务编排 一.服务编排 1.1.概念 按照一定的业务规则批量管理容器 1.2.问题 微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会 ...

  9. 基于 Docker Compose 容器化搭建 Wordpress

    基于 Docker Compose 容器化搭建 Wordpress 最近由于业务需求帮公司搞了几个 Wordpress 作为官网,中间也是踩了不少坑,倒不是搭建 wordpress 难,主要是 wor ...

最新文章

  1. 射频与微波测量之S参数
  2. 九十三、动态规划系列之股票问题(下)
  3. UNIX环境高级编程8.9竞争条件
  4. Get sdcard directory by adb
  5. Hibernate框架 一对多,多对多映射
  6. Maven学习总结(25)——Eclipse Maven Update 时JDK版本变更问题
  7. 会议录音被误删了用EasyRecovery怎么恢复
  8. 拓端tecdat|R语言文本挖掘、情感分析和可视化哈利波特小说文本数据
  9. 数据库入门教程(SQL Server 2005)----概述
  10. 计算机应用基础张宇答案,计算机应用基础电子教案教学课件作者张宇第5章自测题课件.doc...
  11. freeimage 安装错误
  12. 5. 块定义(AttributeDefinition)
  13. 鸿蒙系统桌面首页怎么修改,如何设置才能恢复Win7/8/10系统被修改的默认主页
  14. 启动U盘安装linux系统
  15. Visual Assist 配色
  16. 生活妙招:疏通蹲便器和地漏中的头发堵塞
  17. children和childNodes 的区别
  18. .sh(shell)文件打印文件夹下所有文件的文件名
  19. 【前端升全栈】 开发项目之数据存储(MySQL数据库)
  20. 【手把手教你】电子合同的巧妙设计

热门文章

  1. Epoch, Batch, Iteration 区别
  2. 【Flutter 专题】114 图解自定义 ACEProgressPainter 对比进度图
  3. 编程之美 笔记之——24点游戏
  4. Shiro权限管理实现(详解)
  5. (转载)酷炫桌面背景图片,实用命令图片
  6. 批处理文件写法(转帖)
  7. 2023年4月应急预案演练、应急处置知识
  8. 科学论文类型分类(letter, perspective, focus, article)以及影响引子,SCI、EI等
  9. 十大经典三维动画制作软件
  10. 长方形图片html圆形,css实现圆角矩形、半圆、圆形效果—border-radius使用详解