Docker Compose 容器编排基础使用
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 容器编排基础使用相关推荐
- Docker Compose容器编排
Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用.你需要定义一个 YAML 格式的配置文件docker-compose.yml, 写好多个容器之间 ...
- 这就是你日日夜夜想要的docker!!!---------Docker Compose容器编排理论+实操
文章目录 一.Compose简介 1.在Compose中有两个重要的概念 2.docker,dockerfile与docker-compose区别 二.Compose安装与卸载 1.Centos系统安 ...
- Docker compose 容器编排
1. 概述 问题:如果要使用 Docker 运行 LNMP 架构,那么 Nginx.MySQL.PHP. Linux三个服务运行在一个容器里,还是运行在多个容器里呢? 答案是都可以. 你可以分别放在三 ...
- Docker学习(六):docker compose容器编排
Docker-compose 实现对容器集群的快速编排 多服务部署的管理工具 定义docker-compose.yml文件,写好容器之间的调用关系,通过命令完成多个容器的同时启动关闭 解决了容器与容器 ...
- 浅述 Docker 的容器编排
作者 | 天元浪子 来源 | CSDN博客 概述 作为容器引擎,Docker为容器化的应用程序提供了开放标准,使得开发者可以用管理应用程序的方式来管理基础架构,实现快速交付.测试和部署代码.随着容器的 ...
- Docker 多容器编排Swarm(六)
docker swarm简介 Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机 ...
- docker Swarm容器编排工具
目录 一.什么是docker swarm 二.Docker Swarm 基本结构 三.Swarm的几个关键概念 四.swarm的调度策略 五.Swarm Cluster模式特性 六.搭建docker ...
- dockers-系统学习-docker compose服务编排
dockers-系统学习-docker compose服务编排 一.服务编排 1.1.概念 按照一定的业务规则批量管理容器 1.2.问题 微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会 ...
- 基于 Docker Compose 容器化搭建 Wordpress
基于 Docker Compose 容器化搭建 Wordpress 最近由于业务需求帮公司搞了几个 Wordpress 作为官网,中间也是踩了不少坑,倒不是搭建 wordpress 难,主要是 wor ...
最新文章
- 射频与微波测量之S参数
- 九十三、动态规划系列之股票问题(下)
- UNIX环境高级编程8.9竞争条件
- Get sdcard directory by adb
- Hibernate框架 一对多,多对多映射
- Maven学习总结(25)——Eclipse Maven Update 时JDK版本变更问题
- 会议录音被误删了用EasyRecovery怎么恢复
- 拓端tecdat|R语言文本挖掘、情感分析和可视化哈利波特小说文本数据
- 数据库入门教程(SQL Server 2005)----概述
- 计算机应用基础张宇答案,计算机应用基础电子教案教学课件作者张宇第5章自测题课件.doc...
- freeimage 安装错误
- 5. 块定义(AttributeDefinition)
- 鸿蒙系统桌面首页怎么修改,如何设置才能恢复Win7/8/10系统被修改的默认主页
- 启动U盘安装linux系统
- Visual Assist 配色
- 生活妙招:疏通蹲便器和地漏中的头发堵塞
- children和childNodes 的区别
- .sh(shell)文件打印文件夹下所有文件的文件名
- 【前端升全栈】 开发项目之数据存储(MySQL数据库)
- 【手把手教你】电子合同的巧妙设计
热门文章
- Epoch, Batch, Iteration 区别
- 【Flutter 专题】114 图解自定义 ACEProgressPainter 对比进度图
- 编程之美 笔记之——24点游戏
- Shiro权限管理实现(详解)
- (转载)酷炫桌面背景图片,实用命令图片
- 批处理文件写法(转帖)
- 2023年4月应急预案演练、应急处置知识
- 科学论文类型分类(letter, perspective, focus, article)以及影响引子,SCI、EI等
- 十大经典三维动画制作软件
- 长方形图片html圆形,css实现圆角矩形、半圆、圆形效果—border-radius使用详解